16. CSS动画
最后更新于
这有帮助吗?
最后更新于
这有帮助吗?
动画的出现是人脑的bug
由许多静止的画面(帧),以一定的速度(如每秒30张)连续播放时,肉眼因视觉残象产生错觉而误以为是活动的画面。
帧:每个静止的画面都叫做帧
播放速度:每秒24帧(电影)或者每秒30帧(游戏)
https://jsbin.com/fifesox/1/edit?html,css,js,console,output
把一个div从左往右移动
setInterval
有个问题就是不会自己停下来,需要在一开始获取他的id,然后用clearInterval(id)来让它暂停
在开发者工具中随便选哪个tab,然后敲Esc
键,在三个点那里调出Rendering,选择Paint flashing,就会在浏览器每次渲染的时候高亮。
Google团队写的文章(右上角中文)
查看CSS各属性触发什么
根据HTML构建HTML树(DOM)
根据CSS构建CSS树(CSSOM)
将两棵树合并成一颗渲染树(render tree)
Layout布局(文档流,盒模型,计算大小和位置)
Paint绘制(把边框颜色,文字颜色,阴影等画出来)
Compose合成(根据层叠关系展示画面)
那么这些方法有什么不同吗?
dir.remove()
会触发当前消失,其他元素relayout
例子:http://js.jirengu.com/jagel/1/edit?html,css,js,output
改变背景颜色,直接repaint+composite
例子:http://js.jirengu.com/jidam/1/edit?html,css,js,output
改变transform,只需composite,注意必须全屏查看效果,在iframe里看有问题
例子:http://js.jirengu.com/wusew/1
⚠️如果想知道CSS触发浏览器的哪个流程,直接看https://csstriggers.com/,这个网站已经把所有属性全试过了。
用transform(变形)
直接修改会被合成,需要等一会修改
transition过渡属性可以自动脑补中间帧
并没有repaint(重新绘制)
比改left性能好
答案都在Google写的文章里,谁看完谁牛X
有5%的几率面试的时候会问到,答出用tranformX代替left基本已经满分,但是要把下面两个JS优化和CSS优化也答到。
使用requestAnimationFrame
代替setTimeout
或setInterval
使用will-change
或translate
没错,完全就是死记硬背
完整看MDN
https://developer.mozilla.org/zh-CN/docs/Web/CSS/transform
一定要自己试一遍
translate
常用写法
https://jsbin.com/fifesox/edit?html,css,output
translateX就是x轴上位移
translateZ是垂直于视点位移
https://jsbin.com/fifesox/3/edit?html,css,output
一些使用上的经验
一般都需要配合transition过渡
inline元素不支持transform,需要先变成block
要学会看懂MDN的语法示例,有助于自学
scale
常用写法
http://js.jirengu.com/jucal/1/edit?html,css,output
rotate
http://js.jirengu.com/jiquq/1/edit?html,css,output
常用写法
skew
http://js.jirengu.com/tazer/1/edit?html,css,output
经验
用得较少,用到时再搜skew MDN文档
组合使用的时候用空格隔开即可
实践:http://js.jirengu.com/nonud/1/edit?html,css,output
方方心得:
CSS需要你有想象力,而不是逻辑
CSS给出的属性都很简单,但是可以组合得很复杂
https://jsbin.com/cotufom/1/edit?html,css,output
补充中间帧
opacity从1到0,尽管元素消失,但是还是占着位置的。
⚠️并不是所有属性都能过渡
display:none => block 没法过渡
一般改成visibility:hidden => visible
display和visibility的区别自己搜一下
background颜色可以过渡吗
opacity透明度可以过渡吗
过渡必须要有起始,一般只有一次动画,或者两次,比如hover和非hover状态的过渡
.a === transform ===> .b
.b === transform ===> .c
如何知道到了中间点呢?
用setTimeout或者监听transitionend事件
http://js.jirengu.com/buwah/1/edit?html,css,js,output
声明关键帧
添加动画
http://js.jirengu.com/peran/1/edit?html,css,output
搜索css animation stop at end
网友给出的答案是加个forwards
http://js.jirengu.com/lodoy/1/edit?html,css,output
一种写法是from to
另一种写法是百分数
时长:1s或者1000ms
过渡方式:跟transition取值一样,如linear
次数:3或者2.4或者infinite
方向:reverse | alternate | alternate-reverse
填充模式:none | forwards | backwards | both
是否暂停:paused | running
以上所有属性都有对应的单独属性
https://jsbin.com/cotufom/2/edit?html,css,output
答疑:https://jsbin.com/diwilum/edit?html,css,js,output
按照屏幕上敲的,为什么不动
方方:#demo.start, .start和demo之间不能用空格,修改之后如下
https://jsbin.com/diwilum/3/edit?html,css,js,output
搜索讲的很清楚