CSS重新梳理-CSS动画

浏览器的渲染原理

渲染步骤

-根据HTML构建HTML树(DOM)
-根据CSS构建CSS树(CSSOM)
-将两棵树合并成一颗渲染树(render tree)
-Layout布局(文档流、盒模型、计算大小和位置)
-Paint绘制(把边框颜色、文字颜色、阴影等画出来)
-Compose合成(根据层叠关系展示画面)

三棵树长啥样?

image.png

image.png

image.png

如何更新样式

一般来说用JS更新样式

例如:
-div.style.background = 'red'
-div.style.dispay = 'none'
-div.classList.add('red')
-div.remove()直接删掉节点

三种更新样式的方式

1.全走
div.remove() 会触发当前消失,其它元素relayout


image.png

2.跳过layout
直接repaint+composite


image.png

3.跳过layout和paint
改变transform,只需composite
注意必须全屏查看效果,在iframe里看会出现问题


image.png

我们并不知道那个属性触发了什么流程,但是有人一个个试过并且将这些属性分享了

https://csstriggers.com/

tramsform 更好的做动画方式

原理

示例

transform: translateX(0 =>300px);

transition过度属性可以自动脑部中间帧

性能

由于过程中并没有repaint,所以transform性能比改left性能好。

transform常用功能

-位移 translate
-缩放 scale
-旋转 rotate
-倾斜 skew
注意:这些功能一般都需要配合transition过度,inline元素不支持transform,需要先变成block

translate常用写法示例

translateX(<length-percentage>);
translateY(<length-percentage>);
translate(<length-percentage>,<length-percentage>);
translate3d(x,y,z);

更多用法参考MDN

scale常用写法示例

scaleX(<number>);
scaleY(<number>);
scale(<number>,<number>);

scale使用较少,因为容易出现模糊的情况

rotate常用写法示例

rotate(<angle>|<zero>]);
rotateX(<angle>|<zero>]);
rotateY(<angle>|<zero>]);
rotateZ(<angle>|<zero>]);

另外,还有rotate3d,由于很复杂这里不做说明,需要的时候再去查阅MDN文档。
rotate常用于制作loading的动画

skew常用写法示例

这个是真的很少很少用,有需要的时候再查阅吧!

**transform可以组合使用

过渡 transition

作用

补充中间帧

语法

transition: 属性名|时长|过度方式|延迟
transition: left 200ms linear;
可以用逗号分隔不同属性;
transition: left 200ms, top 400ms;
可以用all代表所有属性;
transition: all 200ms;

常用的过度方式是 linear,具体的过度方式可以查阅MDN
并不是所有的属性都能用过渡
display:none => block无法使用过渡,一般会改成visibility:hidden=> visible
display 和 visibility的区别是:display:none是彻底消失,不在文档流中占位,浏览器也不会解析该元素;visibility:hidden是视觉上消失了,可以理解为透明度为0的效果,在文档流中占位,浏览器会解析该元素。

过度必须要有起始

一般只有一次动画,或者两次
比如hover和非hover状态的过渡

制作动画的方法

使用两次transform

.a===transform===>.b
.b===transform===>.c
**使用setTimeout或者监听transitionend事件来指导是否已经进行到中间点。

使用animation

#demo.start{
animation: xxx 1.5s;
}
@keyframes xxx{
0%{
transform:none;
}
50%{
transform: translateX(200px);
}
100%{
transform: translateX(200px),
translateY(200px);
}}

keyframes的完整语法

form to
@keyframes xxx{
from{
transform: translateX(200px);
}
to{
transform: translateX(200px),
translateY(200px);
}}
百分数写法
@keyframes xxx{
0%{
transform:none;
}
50%{
transform: translateX(200px);
}
100%{
transform: translateX(200px),
translateY(200px);
}}

animation的缩写语法

缩写语法

animation: 时长|过渡方式|延迟|次数|方向|填充方式|是否暂停|动画名;

时长: 1s或者1000ms
过渡方式:跟transition取值一样,例如linear
次数:可以是整数也可以是小数或者infinite
方向:reverse|alternate|alternate-reverse
填充模式:none|forwards|backwards|both
是否暂停:paused|running
以上的所有属性都有对应的单独属性

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Get Started • 动画的原理• 浏览器渲染原理• CSS动画优化• transform全解• trans...
    茜Akane阅读 2,976评论 0 1
  • css性能介绍 浏览器渲染步骤 根据HTML构建HTML树(DOM),DOM,也就是文档对象模型(Document...
    郑馋师阅读 1,031评论 0 0
  • 引用CSS方式 内部引用 html文件中写一个 标签,并将样式写入到里面,举例: 外部引用 通过 标签实现,里面有...
    dawsonenjoy阅读 3,529评论 0 0
  • 看了很多视频、文章,最后却通通忘记了,别人的知识依旧是别人的,自己却什么都没获得。此系列文章旨在加深自己的印象,因...
    DCbryant阅读 5,879评论 0 4
  • 动画:24帧游戏:30帧现在大部分显示器的最低刷新频率为60Hz,即每秒60帧。 setInterval()制作动...
    Emist阅读 1,742评论 0 0

友情链接更多精彩内容