css3中的transform、transition、translate、animation

html-css014

css3中的transform、transition、translate、animation,第1张

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)

}

}

}

}

过渡使用 trainsition 属性,让元素的样式变化,不再瞬间完成,而是可以设定时间,在时间段内逐渐完成。

对单独的div元素做分别做设置进行属性说明:

1、设置在3秒内完成颜色的变化

2、可以分别对不同的属性分开做时间长度的设定,记得用逗号隔开

3、延迟delay:想在某个属性开始执行样式变化后的多少秒,才让另一个属性开始进行样式的动态变化,就可以使用延迟。用法就是:

2s 1s width ,意思就是在高度开始发生变化后的1s后,width的宽度才开始展现变化,然后在2s内完成宽度从30px到60px的变化。

delay的真正意义在于,它指定了动画发生的顺序,使得多个不同的transition可以连在一起,形成复杂效果

3、变化的速度:默认不设定,就是逐渐放慢的,默认值是ease

还可以额外指定设置:

linear:匀速

ease-in:加速

ease-out:减速

上述的三个情况,可以综合写为:

对应的变化就是,div的宽度瞬间变化为60px,然后高度在宽度变化后的1s之后才开始发生变化,在3秒内逐渐加速完成。

重点:

兼容性:各大浏览器基本已经支持无前缀的transition,所以可以直接使用不加前缀;

transition的变化设置,是只对有明确数值设置变化的,对于none,block这类的文字描述无效;

有效性:transition是一次性的,无法重复,除非反复触发。

1、相比于过渡属性transition的设置,动画animation的实现支持更为复杂的动态样式效果。

对单独的div元素做分别做设置进行属性说明:

1、使用animation动画属性,最重要的就是配合有“关键帧”——@keyframes

样式设置如下:

这样的设置,就是将1s分为3帧,每帧显示不同的背景颜色,然后动画效果只显示1次。

注意动画执行完成之后,就恢复元素原来定义的样式设置,如果原来没有这个样式的定义,那也是动画执行完成后恢复没有的状态。

@keyframes的写法比较松泛:

0%等同于from,100%等同于to:

如上面的写法就等同于:

下面的关键帧的写法也是有效的:

当然,(1)也是有延迟效果的设置:设置延迟多少秒后执行动画

(2)每帧之间是平滑过渡的,当然也可以设置为分步过渡,这样就有卡顿的效果:

解释:该动画,在停留1秒后开始执行,执行3次,每次执行时间为2秒,在2秒时间执行完成rainbow定义的关键帧样式,然后分步执行,有卡顿效果。

2、动画持续:动画效果默认只播放一次,加入infinite关键字,可以让动画无限次播放

3、指定动画播放的次数,直接写数值:

4、如果想要让动画结束后,停留在结束状态的样式,而不是默认变为起始状态,就可以添加关键字:

animation-fill-mode属性:

none:默认值,回到动画没开始时的状态

forwards:让动画停留在结束状态

backwards:让动画回到第一帧的状态

4、如果想要将帧数的设置,反向执行,就可以使用animation-direction属性:

normal:动画循环播放时,每次都是从结束状态跳回到起始状态,再开始播放

reverse:动画执行,先从结束帧的样式执行跳回到起始帧的样式。例如:

所有的transform属性设置,都不会改变元素占据的位置,还是保留的

1、旋转rotate

通过rotate设置旋转角度,来旋转元素

以div元素为例:

···

<body>

<div class="transform"></div>

</body>

···

2、位移translate

设置X轴、Y轴方向的位移值

设置X轴方向的位移值

设置Y轴方向的位移值

3、缩放scale

设置元素水平方向和垂直方向同时缩放

设置元素水平方向缩放

设置元素垂直方向缩放

只设置一个参数,设置元素水平方向和垂直方向,同一比例同时缩放

4、扭曲:skew,设置元素的平面XY轴的扭曲角度

设置元素X轴,Y轴的扭转角度

只设置一个参数,元素X轴,Y轴的扭转角度相同

设置元素X轴的扭转角度

设置元素Y轴的扭转角度

两个animation的类名调用,相当于你这个标签中同时出现了animation属性,那么应该就是会后面一个className覆盖了前面一个className中的animation,所以,你看到的就是一个动画效果。

如果你希望两个效果是同时存在的话,那么你可以在一个keyframes中把动画效果都写上,比如你的neon2这个类是from、to的形式,而shake-horizontal是从0到100的形式,那么就结合一下,都用0到100的形式来处理,放在一个className中。

如果是有先后顺序,后面可能会用到其中一个,而你又不想重写,只是想临时调用的话,那么就只有通过setTimeout的方式,在第一个animation结束之后把这个className给remove了,同时再addClass第二个动画效果进来。