css偏方:你有几种方法让DOM消失?

html-css013

css偏方:你有几种方法让DOM消失?,第1张

其实这是我在某次面试前端实习生时候遇到的一个问题,面试官说你有多少种让DOM隐藏的方法,能说多少说多少,当时脑抽,因为是“能说多少说多少”就觉得那肯定有好多,总结一下当时想出来的“偏方”。

两者不同:如果设置 display:none,将隐藏整个元素,如果设置 visibility:hidden,元素的内容将不可见,但元素仍保持原来的位置和大小。

思来想去既然是隐藏,我是不是还可以说 opacity:0,问了一下这个答案行不行,他说行,还有吗?

当然有:

设置position为position:absolute或fixed,可以通过z-index遮掩。

设置父元素为 overflow:hidden ,将想要隐藏的元素移出父元素范围。

通过css的clip属性,将DOM裁剪。

通过css的transform属性

a. transform: skew(90deg) 拉伸90度,当然不一定是90

b. transform: scale(0) 缩放到0

c. transform: rotateX(90deg) 当然角度不一定是90,也不一定是沿x轴

=。=面试完之后我就去群里边问了一下,大部分人说的答案都是 display: none和 visibility: hidden斗胆猜测一下这两个应该是面试官想要的答案。

虽然答案可能就这两个,但是我还是有用到过我的“偏方”去做隐藏元素,

我遇到的情况是,我需要为DOM元素做一个fadeout+fadein的动画,元素带有click事件,fadeout之后只是opacity为0,然后就有了 元素隐藏了之后点击事件还存在 这个bug。

当然解决方案有很多,可以通过js,也可以通过css,css可以通过延时+transform来做,也算是我的偏方吧,可能解决方案并不完美,望留言指教。

当然这只是一些自己瞎琢磨出来的方法,希望有和我一样爱闹腾的同学补充一下下,也希望大神见到后不吝指教,感激不尽。

这是一款很酷的带定时消失功能的css3消息提示框插件。

HTML

html结构非常简单:用一个wrapper div作为包裹容器,里面放一个用于显示信息的p标签和一个用来做进度条的div。

Your settings have been saved successfully!

为了给包裹div设置不同的颜色,给它设置两个class:tn-box和tn-box-color-1。

CSS

.tn-box {

width: 360px

position: relative

margin: 0 auto 20px auto

padding: 25px 15px

text-align: left

border-radius: 5px

box-shadow:

0 1px 1px rgba(0,0,0,0.1),

inset 0 1px 0 rgba(255,255,255,0.6)

opacity: 0

cursor: default

display: none

}

.tn-box-color-1{

background: #ffe691

border: 1px solid #f6db7b

}

设置包裹div的初始dispaly:none,并给设置它的透明度为0。

进度条的样式如下:

.tn-progress {

width: 0

height: 4px

background: rgba(255,255,255,0.3)

position: absolute

bottom: 5px

left: 2%

border-radius: 3px

box-shadow:

inset 0 1px 1px rgba(0,0,0,0.05),

0 -1px 0 rgba(255,255,255,0.6)

}

动画开始前,进度条的宽度为0。

在demo中,使用一个checkbox来作为按钮触发消息提示框动画。

input.fire-check:checked ~ section .tn-box {

display: block

animation: fadeOut 5s linear forwards

}

input.fire-check:checked ~ section .tn-box .tn-progress {

animation: runProgress 4s linear forwards 0.5s

}

因为按钮的动作发生在消息提示框之前,所以可以使用一般通用选择器来完成按钮操作。

如果你想使用javascript来完成按钮动作,你可以像下面这样写样式:

.tn-box.tn-box-active {

display: block

animation: fadeOut 5s linear forwards

}

.tn-box.tn-box-active .tn-progress {

animation: runProgress 4s linear forwards 0.5s

}

tn-box-active是在按钮按下时被加到tn-box div中的class。

下面是消息框淡入淡出动画效果:

@keyframes fadeOut {

0% { opacity: 0}

10% { opacity: 1}

90% { opacity: 1transform: translateY(0px)}

99% { opacity: 0transform: translateY(-30px)}

100% { opacity: 0}

}

下面是进度条的动画效果:

@keyframes runProgress {

0% { width: 0%background: rgba(255,255,255,0.3)}

100% { width: 96%background: rgba(255,255,255,1)}

}

我们使它运动到进度条宽度的96%,颜色上使用RGBA。

transform:属性应用 2D 或 3D 转换。该属性允许我们对元素进行旋转(rotate)、缩放(scale)、移动(translate)、倾斜,扭曲(skew),设置基点位置transform-origin:50% top

 rotate:         是transform的值,定义2D或3D的旋转,在一个给定度数顺时针旋转的元素。负值是允许的,这样是元素逆时针旋转。

                     2D:rotate( angle )定义 2D 旋转,在参数中规定角度。

                     3D:rotate3d( x , y , z , angle )定义 3D 旋转。

                     事例:2D:transform: rotate(45deg)3D:ransform: rotate3d(0,0,0,45deg)

scale:           是transform的值,定义 2D 或3D缩放,表示对当前元素的缩放。

                    2D:scale(x,y)定义 2D 缩放,对当前元素的宽度是原始大小的x倍,高度是原始大小的y倍。

                    3D:scale3d( x , y , z )定义 3D 缩放,对当前元素在x轴,y轴,z轴的缩放。

                    事例:2D:scale: scale(2,3)3D:ransform: scale3d(0,0,1)

translate  :是transform的值,定义 2D 或3D转换,表示对当前元素的位移。

                    2D:translate( x , y )定义 2D 转换,沿着 X 和 Y 轴移动元素。

                   3D:translate3d( x , y , z )定义 3D 转化。

                   事例:2D:transform: translate(50px,100px)3D:ransform: translate3d(50px,100px,50px)

skew:       是transform的值,定义倾斜,表示对当前元素的倾斜角度。

                   skew( x-angle , y-angle )定义 2D 倾斜,分别表示X轴和Y轴倾斜的角度,如果第二个参数为空,则默认为0,参数为负表示向相反方向倾斜

                   事例:transform: skew(1deg,2deg)

transition属性:允许CSS属性值在一定的时间区间内平滑的过渡,只能设置 初始值和结束值,需要事件的触发,例如单击、获取焦点、失去焦点等

                        transition : transition-property   transition-duration   transition-timing-function   transition-delay

                        transition-property :规定应用过渡的 CSS 属性的名称。

                      transition-duration :定义过渡效果花费的时间。默认是 0。

                      transition-timing-function :规定过渡效果的时间曲线。默认是 "ease"。

                      transition-delay :规定过渡效果延迟的时间。默认是 0。

                      事例:  transition : width 2s ease-in-out  1s

animation属性:通过帧动画对当前元素的某些属性进行帧动画的播放,功能相似于transition,但更加的精确、可以控制到每一帧,高版本的浏览器还支持css或者JS控制停止动画 以及获取动画当前                            状态等,请用百分比来规定变化发生的时间,或用关键词 "from" 和 "to",等同于 0% 和 100%。0% 是动画的开始,100% 是动画的完成。

      @keyframes fadeIn {

                    0% {opacity:0}

                  100% {opacity:1}

         }

                          事例:animation:fadeIn 5s infinite(fadeIn是帧动画的名称)infinite 无限循环

@keyframes fadeIn {

0% {opacity:0}

100% {opacity:1}

}

@keyframes fadeout {

0% {opacity:1}

100% {opacity:0}

}

@keyframes pendulu {

from {transform:rotate3d(0,0,1,0)}

5.5% {transform:rotate3d(0,0,1,-11deg)}

7% {transform:rotate3d(0,0,1,-12deg)}

16% {transform:rotate3d(0,0,1,9deg)}

17.5% {transform:rotate3d(0,0,1,10deg)}

26.5% {transform:rotate3d(0,0,1,-7deg)}

28% {transform:rotate3d(0,0,1,-8deg)}

36.5% {transform:rotate3d(0,0,1,5deg)}

38% {transform:rotate3d(0,0,1,6deg)}

46.5% {transform:rotate3d(0,0,1,-4deg)}

48% {transform:rotate3d(0,0,1,-5deg)}

57% {transform:rotate3d(0,0,1,3deg)}

58.5% {transform:rotate3d(0,0,1,4deg)}

66.5% {transform:rotate3d(0,0,1,-2deg)}

68% {transform:rotate3d(0,0,1,-3deg)}

75% {transform:rotate3d(0,0,1,1.5deg)}

76.5% {transform:rotate3d(0,0,1,2.5deg)}

82.5% {transform:rotate3d(0,0,1,-1deg)}

84% {transform:rotate3d(0,0,1,-2deg)}

90% {transform:rotate3d(0,0,1,1.5deg)}

95% {transform:rotate3d(0,0,1,-1deg)}

to {transform:rotate3d(0,0,1,0)}

}

@keyframes scale {

0% {transform:scale(0.9)}

100% {transform:scale(1)}

}

@keyframes cloud {

0% {transform:translateX(0)}

25% {transform:translateX(30%)}

50% {transform:translateX(60%)}

75% {transform:translateX(30%)}

100% {transform:translateX(0)}

}

@keyframes  fadeInDown

{

0% {

    opacity: 0

    filter: alpha(opacity=0)

    -webkit-transform: translate3d(0, -100%, 0)

    transform: translate3d(0, -100%, 0)

}

100% {

    opacity: 1

    filter: alpha(opacity=100)

    -webkit-transform: none

    /* transform: none*/

}}

@-webkit-keyframes bounceIn {

0%,20%,40%,60%,80%,100% {

-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1)

transition-timing-function:cubic-bezier(.215,.61,.355,1)

}

0% {

opacity:0

filter:alpha(opacity=0)

-webkit-transform:scale3d(2,2,2)

transform:scale3d(2,2,2)

}

40% {

-webkit-transform:scale3d(.9,.9,.9)

transform:scale3d(.9,.9,.9)

}

60% {

-webkit-transform:scale3d(1.03,1.03,1.03)

transform:scale3d(1.03,1.03,1.03)

}

80% {

opacity:1

filter:alpha(opacity=100)

-webkit-transform:scale3d(.97,.97,.97)

transform:scale3d(.97,.97,.97)

}

100% {

-webkit-transform:scale3d(1,1,1)

transform:scale3d(1,1,1)

}

}

.rotate2d {

-webkit-animation-timing-function:linear

animation-timing-function:linear

-webkit-animation-name:rotate2d

animation-name:rotate2d

}

.box-bottle {

position:absolute

left:70%

width:pr(99)

height:pr(97)

background:url("#{$imgPath}btn-bottle.png")no-repeat

background-size:100%

transform-origin:35% 68%

opacity:0

z-index:10

div {

position:absolute

width:pr(18)

height:pr(35)

transform:translate3d(-150%,-20%,0)rotate3d(0,0,1,100deg)

transition:opacity .5s linear 1.5s

}

i {

position:absolute

width:pr(18)

height:pr(35)

background-repeat:no-repeat

background-size:100%

transform-origin:3000% 50%

opacity:0

&:nth-child(1) {

transition:transform 1s ease-out 1s,opacity .2s linear .9s

background-image:url("#{$imgPath}water1.png")

}

&:nth-child(2) {

transition:transform 1.1s ease-out .9s,opacity .2s linear .8s

background-image:url("#{$imgPath}water2.png")

}

&:nth-child(3) {

transition:transform 1.2s ease-out .8s,opacity .2s linear .7s

background-image:url("#{$imgPath}water3.png")

}

&:nth-child(4) {

transition:transform 1.3s ease-out .7s,opacity .2s linear .6s

background-image:url("#{$imgPath}water4.png")

}

&:nth-child(5) {

transition:transform 1.4s ease-out .6s,opacity .2s linear .5s

background-image:url("#{$imgPath}water5.png")

}

&:nth-child(6) {

transition:transform 1.5s ease-out .5s,opacity .2s linear .4s

background-image:url("#{$imgPath}water6.png")

}

}

&.active {

opacity:1

animation:pour 2.5s both

div {

opacity:0

}

i {

opacity:1

&:nth-child(1) {

transform:rotate3d(0,0,1,-25deg)

}

&:nth-child(2) {

transform:rotate3d(0,0,1,-25deg)translate3d(130%,50%,0)

}

&:nth-child(3) {

transform:rotate3d(0,0,1,-25deg)translate3d(260%,0,0)

}

&:nth-child(4) {

transform:rotate3d(0,0,1,-25deg)translate3d(0,150%,0)

}

&:nth-child(5) {

transform:rotate3d(0,0,1,-25deg)translate3d(130%,200%,0)

}

&:nth-child(6) {

transform:rotate3d(0,0,1,-25deg)translate3d(260%,150%,0)

}

}

}

}