css动画总结

198 阅读2分钟

浏览器渲染过程

  1. 根据HTML构建HTML树
  2. 根据CSS构建CSS树
  3. 将两棵树合并成一棵渲染树
  4. Layout 布局(文档流、盒模型、计算位置与大小)
  5. Paint 绘制(边框、背景、文字颜色)
  6. Compose 合成(根据层叠关系展示画面)

3种渲染(更新)方式

  • 1-6全走一遍 (如使用left属性改变位置)
  • 跳过Layout,直接5和6(如使用background属性改变颜色)
  • 跳过Layout和Paint,只需Compose(如使用transform属性)

从上述可知不同的属性触发的更新流程也不同 所以我们可以在这里查找属性对应的更新流程啦~

关于css动画优化

  1. js优化:使用requestAminationFrame代替setTimeout或者setInteral
  2. css优化:使用will-change或translate

transform

  • 位移 translate
  • 缩放 scale
  • 旋转 rotate
  • 倾斜 skew

ps:

  • 一般配合transition过渡
  • inline元素不支持transform 需要先变成block
  • translate(-50%,-50%) 可做绝对定位元素的居中
  • transform:none 取消所有
  • rotate一般用于制作加载中的效果
  • translateZ(length)时父容器有perspective

使用transform只能看到更新前与更新后的变化 看不到中间过程 这时候可以使用transition来补充中间帧 展示过渡效果

transition 过渡

  • 作用: 补充中间帧
  • 语法:属性名 时长 过渡方式 延迟时间

ps:并不是所有属性都能过渡 如:display:block--------display:none就不行 所以想要盒子消失禁用display:none 使用visibility:hidden更优

当过渡存在中间点时 有两种方法:

  1. 两次使用transform
  2. 使用animation

两次transform

a------transform------b
b------transform------c
使用js来控制增加类选择器 监听中间点

#demo{
  width: 100px;height: 100px;border: 1px solid red;margin: 50px;transition: transform 1s linear;
}
#demo.b{
  transform: translateX(200px);
}
#demo.c{
  transform: translateX(200px) translateY(100px);
}

animation 过渡

  • 作用:声明关键帧 添加动画
  • 语法:动画属性 时长 过渡方式 延长时间 次数 方向 是否暂停 填充模式
  • @keyframes语法如下设置百分树 另一种是from----to----
#demo.start{
  animation: xxx 1.5s;
}
@keyframes xxx {
  0% {
    transform: none;
  }
  66.66%{
    transform: translateX(200px);
  }
  100%{
    transform: translateX(200px) translateY(100px);
  }
}

问 :如何让动画停在最后一帧? animation加上forwards即可

学习总结

  • 要善于使用MDN等一些学习文档查阅信息 提高学习能力
  • 了解与掌握属性用法的最好办法是写代码实践 多多练习自然就记住了