需求
制作个loading动画,设计提供了每一帧282x282的图,一共60帧
图片过多我就不考虑切换background-image
属性达到效果
一、gif图
出于偷懒的方式,先采用的用ps直接导出gif图,视觉上看图周围有白边
发现是gif 支持颜色少(最大256色)、Alpha 透明度支持差,图像锯齿毛边比较严重
.loading-gif {
z-index: 999;
width: 141px;
height: 141px;
background: url(../assets/images/loading.gif) no-repeat center;
background-size: contain;
position: fixed;
top: 50%;
transform: translate(-50%, -50%);
left: 50%;
}
二、css3帧动画
在线sprite生成器可以用来把多张图片合成一张sprite图
css3帧动画有两种写法
transform:translate3d()
来实现
但是这个遇到的问题是图片会闪烁,未解决所以pass
<div class="sprite-box">
<div class="loading-sprite"></div>
</div>
.sprite-box {
width: 282px;
height: 282px;
overflow: hidden;
position: relative;
transform: scale(0.5);
}
.loading-sprite {
position: absolute;
top: 0;
display: block;
width: 16920px;
height: 282px;
will-change: transform;
background: url("/static/loading.png") no-repeat center;
animation: sprite 2s steps(60) infinite;
}
@keyframes sprite {
from {
transform: translate3d(0, 0, 0);
}
to {
transform: translate3d(-16920px, 0, 0);
}
}
- 改变
background-position
的值来实现动画帧切换
<div class="loading-sprite"></div>
.loading-sprite {
width: 141px;
height: 141px;
background: url("/static/loading.png");
background-size: 8319px;
// will-change: transform;
animation: sprite 2s steps(60) infinite;
position: fixed;
top: 50%;
transform: translate(-50%, -50%);
left: 50%;
}
@keyframes sprite {
0% {
background-position: 0 0;
}
100% {
background-position: -8460px 0;
}
}
找到一个性能对比的文章,文章说
transform:translate3d()
方案性能最优
帧动画的多种实现方式与性能对比