CSS动画

521 阅读1分钟

有三种方式用来实现动画

1.通过设定left

JS代码:

var n = 1
var id = setInterval(() => {
  console.log(n)
  if (n <= 50) {
    demo.style.left = n / 100 * 300 + 'px'
    n = n + 1
  }else{
    clearInterval(id)
  }
}, 1000 / 30)

用定时器不断改变left的值来实现动画

通过用transform + transition

使用transform属性里的translateX来完成移动,然后加上transition的过渡效果。

#demo {
  width: 50px;
  height: 50px;
  background-color: red;
  transition: all 1s;
}
#demo.run{
  transform:translateX(100px);
}

3.animation

animation的核心是定义关键帧,两种写法:

#demo{
    animation:run 1s;
}
@keyframes run {
  from {transform:none;}
  
  to {transform:translateX(100px);}
}
或者
@keyframes run {
  0 {transform:none;}
  100% {transform:translateX(100px);}
}

transition过渡的注意点

一般添加以下属性property name | duration | timing function | delay
要过渡的属性|花费事件|运动曲线|何时开始
谁做过渡给谁加,若要给多个属性添加过渡,中间用逗号分开
并不是所有属性都能过渡
比如display:block变成display:none一般改成visibility: visible 改成hidden
背景色和颜色可以添加过渡,透明度也可以添加过渡,但该元素仍会占空间,不推荐。

animation注意点

关键帧keyframes
animation属性

animation: run 2s linear 1s infinite alternate;
/*动画名|动画周期时间|速度曲线默认ease|何时开始|播放次数默认1次|是否在下个周期逆向播放,默认normal*/

可以修改animation-play-state属性控制动画是否正在运行或暂停,默认running,可改为pause,可修改animation-fill-mode属性规定动画结束后的状态,保持forwards回到起始backwards

浏览器渲染过程和原理

  1. 根据HTML标记并构建DOM树
  2. 根据CSS构建CSS树(CSSOM)
  3. 将两棵树合并成一棵渲染树(render tree
  4. layout布局(文档流,盒模型,计算大小或位置等)
  5. paint绘制(边框颜色,背景颜色,阴影等绘制)
  6. compose合成(根据层叠关系展示画面)

更新样式的三种方式

1.JS / CSS > 样式 > 布局 > 绘制 > 合成
根据浏览器的渲染原理,若是开发者更新了样式(即元素的几何属性,类似于宽高,位置等),则浏览器会检查所有属性然后重新绘制,最后再合成。之前用到的改变left法,就会每次都让浏览器重新布局、渲染和合成
2.JS / CSS > 样式 > 绘制 > 合成
如果开发者只是更新了paint only的属性(例如背景,文字颜色等),由于不影响页面布局,则浏览器直接执行绘制。
3.JS / CSS > 样式 > 合成
在开发者只是更改一个既不更改布局也不需要绘制的属性时,浏览器将只执行合成,例如动画(animation)和transform。
可以用以下网址查询不同的CSS属性会触发的不同过程:
csstriggers.com/