创建剪切动画
对于剪切动画,使用clip-path代替width/height,避免DOM重排导致性能过低。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| .animate { width: 200px; height: 200px; background: #000; animation: 1s clip; } @keyframes clip { 0% { clip-path: inset(0 0 0 0); } 100% { clip-path: inset(0 100% 100% 0); } }
|
clip-path也能用来进行其他规则/不规则图形的剪切
1 2 3 4 5
| .clip { clip-path: polygon(0 100%, 50% 0, 100% 100%, 0 30%, 100% 30%); clip-path: circle(30px at 35px 35px); clip-path: ellipse(30px 25px at 35px 35px); }
|
优化动画性能
除了使用transform3d开启gpu加速,还可以使用will-change强制gpu加速优化动画性能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| .animate { width: 200px; height: 200px; background: #000; animation: 1s clip; will-change: clip-path; } @keyframes clip { 0% { clip-path: inset(0 0 0 0); } 100% { clip-path: inset(0 100% 100% 0); } }
|
实现长宽比
使用padding模拟,然后子元素使用绝对定位
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| .container { width: 200px; } .container:after { display: block; content: ' '; padding-top: 100%; }
.container { width: 200px; } .container:after { display: block; content: ' '; padding-top: calc(100% * 9 / 16); }
|
垂直居中
我们常用的方式:
- dislay: inline-block
- top: 50% + transform: tranlsateY(-50%)
- display: flex
其余还有padding上下撑高
、display: table
、position + margin: auto
、绝对定位 + margin
等等,这些属于不常用、特殊场景才能用、CSS3之前的hack方式,CSS3之后就不必使用这些来实现垂直居中,就不多说了。
其中display: flex
属于万金油,大多数场景可以直接用它,但还是有些特殊的场景不能用:
- 子元素需要文字截断,为了兼容4.X的Android浏览器,必须使用其他方式(一般是transform)
- 子元素需要多行布局,4.x的Android不支持flex-wrap,不能多行布局