CSS动画

今天我要总结的是有关于CSS动画相关的知识已经一些注意点。
CSS中的动画离不开浏览器的渲染,首先先介绍一下浏览器的渲染相关的问题。

浏览器的渲染

首先是浏览器的渲染过程:

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

    以下为图解:
    截屏2022-07-09 11.57.49.png

如何更新

接下来涉及到的是如果我们需要修改动画如何做到更新呢?一般来讲我们采用JS来进行样式更新,而且加类比加样式更方便一点。
有三种更新方式,

  • 第一种:全走
    div.remove()会触发当前消失,其他元素relayout
  • 第二种:跳过layout
    改变背景颜色,直接repaint+composite
  • 第三种跳过layout和paint
    改变transform,只需要composite(注意要全屏查看效果)
    以下为图解:


    截屏2022-07-09 12.07.08.png

CSS优化

  • JS优化:使用requestAnimationFrame代替setTimeout或者setInterval
  • CSS优化:使用will-change或者translate

CSS动画的两种做法

我们通过transform可以实现元素由a状态到达b状态,但是我们看不到变化的过程,这时我们需要添加transition属性,来让变化可视。

transition属性

transtion属性的作用是补充关键帧。
下面有关它的语法:

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

其中它的过渡方式有:

  • linear 线性变化(匀速)
  • ease 缓动
  • ease-in 淡入
  • ease-out 淡出
  • ease-in-out 淡入且淡出
  • cubic-bezier 定时函数
  • step-start
  • step-end
  • steps
    一些注意事项:
  • display:none=>block 无法过渡
  • 一般改成visibility:hidden=>visible (不用display)
  • background颜色可以过渡
  • opacity透明度可以过渡
    过渡必须有起始 比如hover和非hover状态的过渡
    但是如果除了起始,还有中间点的情况,两种办法:
  • 第一种:使用两次transform
  • a===transfom===>b
  • b===transform===>c
  • 使用setTimeout或者监听transitionend事件来知道到了中间点
    <style>
        #demo {
            width: 100px;
            height: 100px;
            margin: 50px;
            border: 1px solid red;
            transition: transform 1s linear;
        }

        #demo.b {
            transform: translateX(200px);
        }

        #demo.c {
            transform: translateX(200px) translateY(200px);
        }
    </style>

做好动画,下面是js代码

    <script>
        button.onclick = () => {
            demo.classList.add('b')
            setTimeout(() => {
                demo.classList.add('c')
            }, 1000)
        }
    </script>

即可实现上述要求
第二种用法是使用animation

animation

作用:声明关键帧,添加动画
animation的缩写语法
animation:时长|过渡方式|延迟|次数|方向|填充模式|是否暂停|动画名

  • 时长:1s或者1000ms
  • 过渡方式:与transition取值一样,比如linear
  • 次数:3或者2.4或者infinite(无限)
  • 方向:reverse(反向)|alternate(交替)|alternate-reverse
  • 填充模式:none|forwards|backwards|both
  • 是否暂停:paused|running
    以上所有属性均有对应的单独属性
@keyframes完整语法

一种是from to

@keyframes xxx {
from {
transform: translateX(0%);
}

to {
transform: translateX(100%);
}
}

另一种是百分数

@keyframes xxx {
0% {
top: 0;
left: 0;
}

50% {
top: 50px;
}

100% {
top: 100px;
left: 50px;
}

注意:加个forawards即可以实现让动画停留在最后一帧

我们在使用CSS的时候虽然CSS的属性比较简单,但是它们组合起来却可以实现很复杂的效果,所以说,CSS的上限取决于我们的想象力,只要我们的想象力足够丰富,那么CSS便可以实现更多天马行空的效果。

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

推荐阅读更多精彩内容

  • CSS 中的 transform,transition 和 animation 是分开的三部分内容,其中 tran...
    teabyii阅读 1,250评论 0 25
  • CSS 中的 transform,transition 和 animation 是分开的三部分内容,其中 tran...
    单纯的土豆阅读 692评论 0 4
  • CSS 动画知识总结 一个简单的例子 使用 left 将 div 从左往右移动[http://js.jirengu...
    一轮鱼丸阅读 368评论 0 0
  • Get Started • 动画的原理• 浏览器渲染原理• CSS动画优化• transform全解• trans...
    茜Akane阅读 332评论 0 1
  • 动画:24帧游戏:30帧现在大部分显示器的最低刷新频率为60Hz,即每秒60帧。 setInterval()制作动...
    Emist阅读 193评论 0 0