CSS3动画

html-css023

CSS3动画,第1张

transform 不会使DOM脱离文档流,当通过 translateX 等属性值移动了元素后,它仍然占据原来的位置。

好处是, transform 制作的动画会直接进入合成阶段,避开重排重绘,可以通过 Performance 录制面板来查看 transform 动画的效率。

MDN animation

深入浅出CSS动画

MDN animate()

监听 CSS animation 动画的事件:

这些监听事件对 animate() 是无效的。

页面顶部经常会见到水平无限轮播的公告。

由于轮播的内容是动态的,可能很多,也可能很少,如果公告内容的宽度没有超过最大宽度限制,那么就不应该轮播,如果超过了,则发起轮播。

假设我们永远只有一条最新的公告

原理:当一次动画执行结束时,影子内容的头部刚好对准轮播内容的初始位置,那么下次动画开始时,轮播内容将重新回到初始位置,由于影子内容与轮播内容相同,那么就给人造成一种无限轮播的错觉。

逻辑实现:父元素设置了 overflow: hidden ,又想要获取父元素、子元素的真实宽度,那么可以通过 scrollWidth 获取。

兼容性:如果不支持 animate() ,那么我们可以动态创建 <style>+ @keyframes ,插入 <head>, 但也要记得移除。

CSS3 animation动画

1、@keyframes 定义关键帧动画

2、animation-name 动画名称

3、animation-duration 动画时间

4、animation-timing-function 动画曲线

linear 匀速

ease 开始和结束慢速

ease-in 开始是慢速

ease-out 结束时慢速

ease-in-out 开始和结束时慢速

steps 动画步数

5、animation-delay 动画延迟

6、animation-iteration-count 动画播放次数 n|infinite

7、animation-direction

normal 默认动画结束不返回

Alternate 动画结束后返回

8、animation-play-state 动画状态

paused 停止

running 运动

9、animation-fill-mode 动画前后的状态

none 不改变默认行为

forwards 当动画完成后,保持最后一个属性值(在最后一个关键帧中定义)

backwards 在 animation-delay 所指定的一段时间内,在动画显示之前,应用开始属性值(在第一个关键帧中定义)

both 向前和向后填充模式都被应用

10、animation:name duration timing-function delay iteration-count direction同时设置多个属性

举例 等待条:

效果:

方法/步骤

首先,先在<body></body>中加入门

然后写好大门的css,如下:[由于本人设计不好,所以这里的门都是用颜色块代替的,大家在用的时候可以换成各种门的背景]

div{

margin:0

padding:0

}

.door{

width:450px

height:450px

position:relative

background:#a1a1a1

}

.door .leftDoor,.door .rightDoor{

position:absolute

width:224px

height:400px

top:57px

top:50px

background:#d1d1d1

}

.door .leftDoor{

left:0

border-right:1px solid #999

box-shadow:inset -2px -2px 10px rgba(0, 0, 0, 0.1)

-webkit-animation:leftDoor 5s 1

-moz-animation:leftDoor 5s 1

-o-animation:leftDoor 5s 1

animation:leftDoor 5s 1

-webkit-transform-origin: 0% 40%

-moz-transform-origin: 0% 40%

-o-transform-origin: 0% 40%

transform-origin: 0% 40%

}

.door .rightDoor{

right:0

border-left:1px solid #999

box-shadow:inset 2px -2px 10px rgba(0, 0, 0, 0.1)

-webkit-animation:rightDoor 5s 1

-moz-animation:rightDoor 5s 1

-o-animation:rightDoor 5s 1

animation:rightDoor 5s 1

-webkit-transform-origin: 100% 40%

-moz-transform-origin: 100% 40%

-o-transform-origin: 100% 40%

transform-origin: 100% 40%

}

先为左边的门添加动画

@-webkit-keyframes leftDoor {

0%,100% {

-webkit-transform-origin: 0% 40%

}

0{

-webkit-transform:perspective(0) rotateY(0)

}

100% {

-webkit-transform:perspective(600px) rotateY(70deg)

}

}

@-moz-keyframes leftDoor {

0%,100% {

-moz-transform-origin: 0% 40%

}

0{

-moz-transform:perspective(0) rotateY(0)

}

100% {

-moz-transform:perspective(600px) rotateY(70deg)

}

}

@-o-keyframes leftDoor {

0%,100% {

-o-transform-origin: 0% 40%

}

0{

-o-transform:perspective(0) rotateY(0)

}

100% {

-o-transform:perspective(600px) rotateY(70deg)

}

}

@keyframes leftDoor {

0%,100% {

transform-origin: 0% 40%

}

0{

transform:perspective(0) rotateY(0)

}

100% {

transform:perspective(600px) rotateY(70deg)

}

}

然后为右边的门添加css3动画,由于左右门对称,只要变化相应的地方就行了

@-webkit-keyframes rightDoor {

0%,100% {

-webkit-transform-origin: 100% 40%

}

0{

-webkit-transform:perspective(0) rotateY(0)

}

100% {

-webkit-transform:perspective(600px) rotateY(-70deg)

}

}

@-moz-keyframes rightDoor {

0%,100% {

-moz-transform-origin: 100% 40%

}

0{

-moz-transform:perspective(0) rotateY(0)

}

100% {

-moz-transform:perspective(600px) rotateY(-70deg)

}

}

@-o-keyframes rightDoor {

0%,100% {

-o-transform-origin: 100% 40%

}

0{

-o-transform:perspective(0) rotateY(0)

}

100% {

-o-transform:perspective(600px) rotateY(-70deg)

}

}

@keyframes rightDoor {

0%,100% {

transform-origin: 100% 40%

}

0{

transform:perspective(0) rotateY(0)

}

100% {

transform:perspective(600px) rotateY(-70deg)

}

}

5

这里的动画主要用到的是rotate和perspective

6

如果想要动画点击后才开门,可以加入一个按钮,然后js控制