动画的出现是人脑的bug
由许多静止的画面(帧),以一定的速度(如每秒30张)连续播放时,肉眼因视觉残象产生错觉而误以为是活动的画面。
帧:每个静止的画面都叫做帧
播放速度:每秒24帧(电影)或者每秒30帧(游戏)
https://jsbin.com/fifesox/1/edit?html,css,js,console,output
把一个div从左往右移动
setInterval有个问题就是不会自己停下来,需要在一开始获取他的id,然后用clearInterval(id)来让它暂停
如何看CSS在浏览器中的性能?
在开发者工具中随便选哪个tab,然后敲Esc键,在三个点那里调出Rendering,选择Paint flashing,就会在浏览器每次渲染的时候高亮。
Screen Shot 2022-01-02 at 10.15.54 AM Google团队写的文章(右上角中文)
查看CSS各属性触发什么
CSSTriggers.com
将两棵树合并成一颗渲染树(render tree)
Layout布局(文档流,盒模型,计算大小和位置)
Paint绘制(把边框颜色,文字颜色,阴影等画出来)
那么这些方法有什么不同吗?
Screen Shot 2022-01-02 at 1.24.53 PM 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
第三种,跳过layout和paint
改变transform,只需composite,注意必须全屏查看效果,在iframe里看有问题
例子:http://js.jirengu.com/wusew/1
⚠️如果想知道CSS触发浏览器的哪个流程,直接看https://csstriggers.com/,这个网站已经把所有属性全试过了。
用transform(变形)
直接修改会被合成,需要等一会修改
transition过渡属性可以自动脑补中间帧
并没有repaint(重新绘制)
比改left性能好
CSS动画优化(面试可能会问到)
答案都在Google写的文章里,谁看完谁牛X
有5%的几率面试的时候会问到,答出用tranformX代替left基本已经满分,但是要把下面两个JS优化和CSS优化也答到。
使用requestAnimationFrame代替setTimeout或setInterval
使用will-change或translate
没错,完全就是死记硬背
完整看MDN
https://developer.mozilla.org/zh-CN/docs/Web/CSS/transform
一定要自己试一遍
常用写法
https://jsbin.com/fifesox/edit?html,css,output
translateX就是x轴上位移
translateZ是垂直于视点位移
https://jsbin.com/fifesox/3/edit?html,css,output
一些使用上的经验
一般都需要配合transition过渡
inline元素不支持transform,需要先变成block
如何用translate让绝对定位元素居中
Screen Shot 2022-01-02 at 5.13.51 PM 要学会看懂MDN的语法示例,有助于自学
常用写法
http://js.jirengu.com/jucal/1/edit?html,css,output
http://js.jirengu.com/jiquq/1/edit?html,css,output
常用写法
http://js.jirengu.com/tazer/1/edit?html,css,output
经验
用得较少,用到时再搜skew MDN文档
组合使用的时候用空格隔开即可
实践:http://js.jirengu.com/nonud/1/edit?html,css,output
方方心得:
https://jsbin.com/cotufom/1/edit?html,css,output
补充中间帧
opacity从1到0,尽管元素消失,但是还是占着位置的。
⚠️并不是所有属性都能过渡
display:none => block 没法过渡
一般改成visibility:hidden => visible
display和visibility的区别自己搜一下
过渡必须要有起始,一般只有一次动画,或者两次,比如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
搜索keyframes MDN讲的很清楚
一种写法是from to
另一种写法是百分数
过渡方式:跟transition取值一样,如linear
方向:reverse | alternate | alternate-reverse
填充模式:none | forwards | backwards | both
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