笔记 - CSS动画

动画:24帧
游戏:30帧
现在大部分显示器的最低刷新频率为60Hz,即每秒60帧。

setInterval()制作动画

setInterval()可被用于实现css动画,使用position: relative并改变其属性(比如left)。
e.g.
html

<div id="demo"></div>

css

#demo {
  width: 100px;
  height: 100px;
  border: 1px solid red;
  position: relative;
  left:0;
}

js

var n=1;
var id = setInterval(() => {
  if (n<=200){
    demo.style.left=n+'px';
    n=n+1;
  }
  else{
    clearInterval(id);
  }
}, 1000/60);



tips:关于停止setInterval()

setInterval()在窗口和工作接口上提供的setInterval()方法重复调用函数或执行代码片段,每次调用之间有固定的时间延迟。它返回一个时间间隔ID,该ID唯一地标识时间间隔,因此您可以稍后通过调用clearInterval()来删除它。

因此可利用clearInterval()清除唯一的ID停止setInterval()

var id = setInterval(() => {
  if (condition){
    statements ...
  }
  else{
    clearInterval(id)
  }
}, 1000/60)


tips:paint flashing观察性能
develop tool中打开rendering 勾上Paint flashing,能观察到CSS是否重新渲染

transform做动画

html

<div id="demo"></div>

css

#demo {
  width: 100px;
  height: 100px;
  border: 1px solid red;
  transition: all is linear;
}

/* 设置transform动画 */
#demo.end {
  transform: translateX(200px);
}

js

setTimeout(()=>{
  demo.classList.add('end');
}, 3000);

transform制作的动画图形并非缓慢移动,而是急速闪现在目标位置。
transform触发的css渲染次数远远少于setInterval()

浏览器渲染原理

  1. 构建 DOM - HTML tree
  2. 构建 CSSOM - CSS tree
  3. 合并 DOM, CSSOM -> Render tree
  4. 根据渲染树构成 Layout (文档流,盒模型,计算大小、位置),形成线框。
  5. Paint, 绘制边框颜色,文字颜色,阴影等。
  6. Compose 根据层叠关系合成,展示画面。

执行js脚本 -> 构建style -> 形成layout -> 绘制页面 -> 合成最终画面

渲染的三种更新方式中,layout和paint可能会被省略。根据颜色和位置大小的改编决定哪种会被省略。

  • 完全更新:对布局位置的修改会触发(div.remove()),元素relayout
  • 跳过layout更新:修改背景颜色会触发,repaint + composite
  • 跳过layout + paint更新:元素位移(transform)会触发,composite。需要全屏查看,iframe有问题。

tips: 查看元素渲染
csstrigger.com 提供了所有css元素在不同浏览器上的渲染过程。

CSS优化

transform 用法

MDN文档有语法格式 https://developer.mozilla.org/zh-CN/docs/Web/CSS/transform
transform属性均可组合使用。比如放大的同时位移。

translate 位移

X: 横轴
Y: 纵轴
Z: 从显示器到屏幕的距离。通过perspective属性设置视点。

transform: translate3d(x, y, z)
transform: translateX(x_value) translateY(y_value)
transform: translate(x_value, y_value)

/* 绝对居中的一种写法(IE不支持) */
top: 50%;
left: 50%;
transform: translate(-50%, -50%)
scale 缩放

倍数缩放

  • transform: scale(1.5) 整体放大1.5倍
  • scaleX(x_value), scaleY(y_value), scaleZ(z_value) X, Y, Z 按比缩放
  • scale3d(x_value, y_value, z_value) X, Y, Z三轴各自按比缩放
  • transform: scale(x_value, y_value) X轴,Y轴各自缩放
  • transform: scale(x_value, y_value, z_value) 相当于于scale3d函数,X, Y, Z三轴各自按比缩放
rotate 旋转
  • transform: rotate( deg | turn | rad )
  • transform: = rotate3d(x_value, y_value, z_value)
  • transform: rotateX( x_value )
  • transform: rotateY( y_value )
  • transform: rotateZ( z_value )
skew 倾斜
  • transform: skew(deg)
    用法基本同上,xyz三轴均可。

transition 过渡

添加中间帧
transition: 属性 时长 过渡方式 延迟

  • all可以代表所有属性
  • 过渡方式: linear, ease, ease-in, ease-out, ease-in-out, cubic-bezier, step-start, step-end, steps
  • background颜色可以过渡
  • opacity透明度可以过渡
    不适用的情况:
  • display: block => display: none 不显示则无结果。虽然看不见但位置还在。如果想要消失效果,使用visibility: visible => visibility: hidden

animation

标准写法:
animation: 时长 | 过渡方式 | 延迟 | 次数 | 方向 | 填充模式 | 是否暂停 | 动画名

  • 百分数
#example{
  animation: time forwards identifier;
}
@keyframes identifier {
  0% { attributes;}
  66% { attributes;}
  100% { attributes;}
}
  • from to
#example{
  animation: time forwards identifier;
}
@keyframes identifier {
from { attributes;}
66% { attributes;}
to { attributes;}
}

forwards: 属于填充模式 让动画停在最后一帧。

回流 (Reflow)

当Render Tree中部分或全部元素的尺寸、结构、或某些属性发生改变时,浏览器重新渲染部分或全部文档的过程称为回流。

会导致回流的操作:

  • 页面首次渲染
  • 浏览器窗口大小发生改变
  • 元素尺寸或位置发生改变
    -元素内容变化(文字数量或图片大小等等)
  • 元素字体大小变化
  • 添加或者删除可见的DOM元素
  • 激活CSS伪类(例如::hover)
  • 查询某些属性或调用某些方法

一些常用且会导致回流的属性和方法:
clientWidth、clientHeight、clientTop、clientLeft
offsetWidth、offsetHeight、offsetTop、offsetLeft
scrollWidth、scrollHeight、scrollTop、scrollLeft
scrollIntoView()、scrollIntoViewIfNeeded()
getComputedStyle()
getBoundingClientRect()
scrollTo()

重绘 (Repaint)

当页面中元素样式的改变并不影响它在文档流中的位置时(例如:color、background-color、visibility等),浏览器会将新样式赋予给元素并重新绘制它,这个过程称为重绘。
性能影响
回流(reflow)比重绘(repaint)的代价要更高。
有时即使仅仅回流一个单一的元素,它的父元素以及任何跟随它的元素也会产生回流。
现代浏览器会对频繁的回流或重绘操作进行优化:
浏览器会维护一个队列,把所有引起回流和重绘的操作放入队列中,如果队列中的任务数量或者时间间隔达到一个阈值的,浏览器就会将队列清空,进行一次批处理,这样可以把多次回流和重绘变成一次。
当你访问以下属性或方法时,浏览器会立刻清空队列:

clientWidth、clientHeight、clientTop、clientLeft
offsetWidth、offsetHeight、offsetTop、offsetLeft
scrollWidth、scrollHeight、scrollTop、scrollLeft
width、height
getComputedStyle()
getBoundingClientRect()
因为队列中可能会有影响到这些属性或方法返回值的操作,即使你希望获取的信息与队列中操作引发的改变无关,浏览器也会强行清空队列,确保你拿到的值是最精确的。

Reflow & Repaint 部分 引用自:https://juejin.cn/post/6844903569087266823

一颗小红心:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351

推荐阅读更多精彩内容

  • 1. CSS 定位 (1) div分层 布局是屏幕上面的(x y轴),定位是垂直于屏幕的(z轴) 内联子元素 > ...
    HikariXyc阅读 553评论 0 0
  • Get Started • 动画的原理• 浏览器渲染原理• CSS动画优化• transform全解• trans...
    茜Akane阅读 370评论 0 1
  • CSS CSS3 布局属性 标签的权值为1,类选择符的权值为10,ID选择符的权值最高为100 !importan...
    53cfdb355418阅读 420评论 0 0
  • css性能介绍 浏览器渲染步骤 根据HTML构建HTML树(DOM),DOM,也就是文档对象模型(Document...
    郑馋师阅读 80评论 0 0
  • CSS动画详解 1.动画的原理 人的视觉暂留而形成,一帧一帧其实都是类似静止的图片 定义: 由许多静止的画面 (帧...
    雨溪滩阅读 673评论 0 0