/* 清除浏览器 默 认边距 */ * { padding : ; margin : ; } body { /* 这段 代码 是为了居中 显示 ,不是重点,看不懂的话可以无视 */ height : vh ; dis play : flex ; align-items : center ; justify-content : center ; /* 添加 背景图 */ background : url(img/bg.jpg) center / cover ; } .animate { width : px ; height : px ; background : url(img/rect.png) ; /* 动画: 动画名(loading) 时长(0.6秒) 运行方式(step-end) 动画 次数 (无限) */ animation : loading s step-end infinite ; } /* 定义动画:动画名(loading) */ @keyframes loading { from { background-position : } /* 第 一个 数字代表x轴坐标,第二个数字代表y轴坐标 */ 10% { background-position : -px } /* x坐标:-130 y坐标:0 */ 20% { background-position : -px } /* x坐标:-260 y坐标:0 */ 30% { background-position : -px } /* x坐标:-390 y坐标:0 */ 40% { background-position : -px } /* x坐标:-520 y坐标:0 */ 50% { background-position : -px } /* x坐标:0 y坐标:-130 */ 60% { background-position : -px -px } /* x坐标:-130 y坐标:-130 */ 70% { background-position : -px -px } /* x坐标:-260 y坐标:-130 */ 80% { background-position : -px -px } /* x坐标:-390 y坐标:-130 */ 90% { background-position : -px -px } /* x坐标:-520 y坐标:-130 */ to { background-position : } /* 最后一帧 不显示 ,可以随便写 */ } /* 定义动画:动画名(animate) */ @keyframes animate { from { background-position : } to { background-position : -px } }
咦?条形图只需要定义两行? 一个 from 一个 to ???
是的,这就是为什么推荐制作Css Sprite的时候做成一行的原因。
你只需要定义一开始的时候图像在原点,然后最后的时候图像有多宽,你就写负多少:
这个图是2600像素,所以to里面的 background-position 就是 -2600px 。
数了一下这张Css Sprite里面一共有 12 个元素,所以 steps() 括号里面要写12。
div 盒子的宽高应该正好和Css Sprite里面的 一个 元素的宽高相对应:用Css Sprite的 宽 2600 除以 12 等于 216.666… 无限循环。
咱们取 一个 近似值,就 216px 吧。
所以宽高设置为 216 * 300 ,怎么设置呢?要让加载动画结束之后(也就是定义加载动画的最后一帧)div 就变成这个宽高。
/* 清除浏览器 默 认边距 */ * { padding : ; margin : ; } body { /* 这段 代码 是为了居中 显示 ,不是重点,看不懂的话可以无视 */ height : vh ; dis play : flex ; align-items : center ; justify-content : center ; /* 添加 背景图 */ background : url(img/bg.jpg) center / cover ; } .animate { width : px ; height : px ; background : url(img/rect.png) ; /* 动画: 动画名(loading) 时长(0.6秒) 运行方式(step-end) 动画 次数 (无限) */ animation : loading s step-end infinite ; } /* 定义动画:动画名(loading) */ @keyframes loading { from { background-position : } /* 第 一个 数字代表x轴坐标,第二个数字代表y轴坐标 */ 10% { background-position : -px } /* x坐标:-130 y坐标:0 */ 20% { background-position : -px } /* x坐标:-260 y坐标:0 */ 30% { background-position : -px } /* x坐标:-390 y坐标:0 */ 40% { background-position : -px } /* x坐标:-520 y坐标:0 */ 50% { background-position : -px } /* x坐标:0 y坐标:-130 */ 60% { background-position : -px -px } /* x坐标:-130 y坐标:-130 */ 70% { background-position : -px -px } /* x坐标:-260 y坐标:-130 */ 80% { background-position : -px -px } /* x坐标:-390 y坐标:-130 */ 90% { background-position : -px -px } /* x坐标:-520 y坐标:-130 */ /* 修改 最后一帧,以便动画结束后盒子就应用最后一帧的样式 */ to { /* 下 一个 动画的宽高 */ width : px ; height : px ; /* 下 一个 动画的Css Sprite */ background-image : url(img/animate.png) ; } } /* 定义动画:动画名(animate) */ @keyframes animate { from { background-position : } to { background-position : -px } }
重点是如何进行 调用 ,先来看一下语法:
/* 清除浏览器 默 认边距 */ * { padding : ; margin : ; } body { /* 这段 代码 是为了居中 显示 ,不是重点,看不懂的话可以无视 */ height : vh ; dis play : flex ; align-items : center ; justify-content : center ; /* 添加 背景图 */ background : url(img/bg.jpg) center / cover ; } .animate { width : px ; height : px ; background : url(img/rect.png) ; /* 动画: 动画名(loading) 时长(0.6秒) 运行方式(step-end) 动画 次数 (3次) 填充模式(双向) */ animation : loading s step-end both, /* 动画可以定义多个,每个动画用逗号分隔。*/ /* 第二个动画的动画名(animate) 时长(0.8秒) 运行方式(step-end) 延时(1.8秒) 动画 次数 (无限) */ animate s steps ( ) s infinite ; } /* 定义动画:动画名(loading) */ @keyframes loading { from { background-position : } /* 第 一个 数字代表x轴坐标,第二个数字代表y轴坐标 */ 10% { background-position : -px } /* x坐标:-130 y坐标:0 */ 20% { background-position : -px } /* x坐标:-260 y坐标:0 */ 30% { background-position : -px } /* x坐标:-390 y坐标:0 */ 40% { background-position : -px } /* x坐标:-520 y坐标:0 */ 50% { background-position : -px } /* x坐标:0 y坐标:-130 */ 60% { background-position : -px -px } /* x坐标:-130 y坐标:-130 */ 70% { background-position : -px -px } /* x坐标:-260 y坐标:-130 */ 80% { background-position : -px -px } /* x坐标:-390 y坐标:-130 */ 90% { background-position : -px -px } /* x坐标:-520 y坐标:-130 */ /* 修改 最后一帧,以便动画结束后盒子就应用最后一帧的样式 */ to { /* 下 一个 动画的宽高 */ width : px ; height : px ; /* 下 一个 动画的Css Sprite */ background-image : url(img/animate.png) ; } } /* 定义动画:动画名(animate) */ @keyframes animate { from { background-position : } to { background-position : -px } }
不过感觉最后这个跳动的卡通小人还是有点大,像素颗粒感明显,所以我们绝定缩小一下加载动画最后一帧给定的宽高:
/* 清除浏览器 默 认边距 */ * { padding : ; margin : ; } body { /* 这段 代码 是为了居中 显示 ,不是重点,看不懂的话可以无视 */ height : vh ; dis play : flex ; align-items : center ; justify-content : center ; /* 添加 背景图 */ background : url(img/bg.jpg) center / cover ; } .animate { width : px ; height : px ; background : url(img/rect.png) ; /* 动画: 动画名(loading) 时长(0.6秒) 运行方式(step-end) 动画 次数 (3次) 填充模式(双向) */ animation : loading s step-end both, /* 动画可以定义多个,每个动画用逗号分隔。*/ /* 第二个动画的动画名(animate) 时长(0.8秒) 运行方式(step-end) 延时(1.8秒) 动画 次数 (无限) */ animate s steps ( ) s infinite ; } /* 定义动画:动画名(loading) */ @keyframes loading { from { background-position : } /* 第 一个 数字代表x轴坐标,第二个数字代表y轴坐标 */ 10% { background-position : -px } /* x坐标:-130 y坐标:0 */ 20% { background-position : -px } /* x坐标:-260 y坐标:0 */ 30% { background-position : -px } /* x坐标:-390 y坐标:0 */ 40% { background-position : -px } /* x坐标:-520 y坐标:0 */ 50% { background-position : -px } /* x坐标:0 y坐标:-130 */ 60% { background-position : -px -px } /* x坐标:-130 y坐标:-130 */ 70% { background-position : -px -px } /* x坐标:-260 y坐标:-130 */ 80% { background-position : -px -px } /* x坐标:-390 y坐标:-130 */ 90% { background-position : -px -px } /* x坐标:-520 y坐标:-130 */ /* 修改 最后一帧,以便动画结束后盒子就应用最后一帧的样式 */ to { /* 下 一个 动画的宽高 */ width : px ; height : px ; /* 下 一个 动画的Css Sprite */ background-image : url(img/animate.png) ; } } /* 定义动画:动画名(animate) */ @keyframes animate { from { background-position : } to { background-position : -px } }
注意:宽高一定要 按比 例缩小,不能宽缩小三分之一,高缩小一半。要宽和高都同时缩小一半才能保持住比例。
运行结果:
看起来怎么和咱们预想中的 效果 不太一样呢?
因为盒子缩小了一半,但是Css Sprite却并没有缩小,那么大家还记得之前的章节中我们讲过的如果 Css Sprite尺寸不吻合时怎么办 吗?
对没错!(大概率是不记得了)就是 background-size: cover;
/* 清除浏览器 默 认边距 */ * { padding : ; margin : ; } body { /* 这段 代码 是为了居中 显示 ,不是重点,看不懂的话可以无视 */ height : vh ; dis play : flex ; align-items : center ; justify-content : center ; /* 添加 背景图 */ background : url(img/bg.jpg) center / cover ; } .animate { width : px ; height : px ; background : url(img/rect.png) ; /* 动画: 动画名(loading) 时长(0.6秒) 运行方式(step-end) 动画 次数 (3次) 填充模式(双向) */ animation : loading s step-end both, /* 动画可以定义多个,每个动画用逗号分隔。*/ /* 第二个动画的动画名(animate) 时长(0.8秒) 运行方式(step-end) 延时(1.8秒) 动画 次数 (无限) */ animate s steps ( ) s infinite ; } /* 定义动画:动画名(loading) */ @keyframes loading { from { background-position : } /* 第 一个 数字代表x轴坐标,第二个数字代表y轴坐标 */ 10% { background-position : -px } /* x坐标:-130 y坐标:0 */ 20% { background-position : -px } /* x坐标:-260 y坐标:0 */ 30% { background-position : -px } /* x坐标:-390 y坐标:0 */ 40% { background-position : -px } /* x坐标:-520 y坐标:0 */ 50% { background-position : -px } /* x坐标:0 y坐标:-130 */ 60% { background-position : -px -px } /* x坐标:-130 y坐标:-130 */ 70% { background-position : -px -px } /* x坐标:-260 y坐标:-130 */ 80% { background-position : -px -px } /* x坐标:-390 y坐标:-130 */ 90% { background-position : -px -px } /* x坐标:-520 y坐标:-130 */ /* 修改 最后一帧,以便动画结束后盒子就应用最后一帧的样式 */ to { /* 下 一个 动画的宽高 */ width : px ; height : px ; /* 下 一个 动画的Css Sprite */ background-image : url(img/animate.png) ; /* Css Sprite的最短边(这里是高)刚好能够覆盖住盒子 */ background-size : cover ; } } /* 定义动画:动画名(animate) */ @keyframes animate { from { background-position : } to { background-position : -px } }
尺寸的问题是 解决 了,怎么速度又不对了?
原来是因为Css Sprite缩小了一半,所以现在的宽只有 1300 px了。
可是我们定义的动画是 -2600 px,于是乎动画在相同的时间移动了 2 倍的距离,看起来就会导致速度加快。
解决 办法也很简单,把定义的动画距离也同比例缩小:
/* 清除浏览器 默 认边距 */ * { padding : ; margin : ; } body { /* 这段 代码 是为了居中 显示 ,不是重点,看不懂的话可以无视 */ height : vh ; dis play : flex ; align-items : center ; justify-content : center ; /* 添加 背景图 */ background : url(img/bg.jpg) center / cover ; } .animate { width : px ; height : px ; background : url(img/rect.png) ; /* 动画: 动画名(loading) 时长(0.6秒) 运行方式(step-end) 动画 次数 (3次) 填充模式(双向) */ animation : loading s step-end both, /* 动画可以定义多个,每个动画用逗号分隔。*/ /* 第二个动画的动画名(animate) 时长(0.8秒) 运行方式(step-end) 延时(1.8秒) 动画 次数 (无限) */ animate s steps ( ) s infinite ; } /* 定义动画:动画名(loading) */ @keyframes loading { from { background-position : } /* 第 一个 数字代表x轴坐标,第二个数字代表y轴坐标 */ 10% { background-position : -px } /* x坐标:-130 y坐标:0 */ 20% { background-position : -px } /* x坐标:-260 y坐标:0 */ 30% { background-position : -px } /* x坐标:-390 y坐标:0 */ 40% { background-position : -px } /* x坐标:-520 y坐标:0 */ 50% { background-position : -px } /* x坐标:0 y坐标:-130 */ 60% { background-position : -px -px } /* x坐标:-130 y坐标:-130 */ 70% { background-position : -px -px } /* x坐标:-260 y坐标:-130 */ 80% { background-position : -px -px } /* x坐标:-390 y坐标:-130 */ 90% { background-position : -px -px } /* x坐标:-520 y坐标:-130 */ /* 修改 最后一帧,以便动画结束后盒子就应用最后一帧的样式 */ to { /* 下 一个 动画的宽高 */ width : px ; height : px ; /* 下 一个 动画的Css Sprite */ background-image : url(img/animate.png) ; /* Css Sprite的最短边(这里是高)刚好能够覆盖住盒子 */ background-size : cover ; } } /* 定义动画:动画名(animate) */ @keyframes animate { from { background-position : } to { background-position : -px } }
运行结果:
<!DOCTYPE html> < html > < head > < Meta charset = " UTF-8 " > < Meta name = " viewport " content = " width=device-width, initial-scale=1.0 " > < title > 动画实战 </ title > < style > /* 清除浏览器 默 认边距 */ * { padding : ; margin : ; } body { /* 这段 代码 是为了居中 显示 ,不是重点,看不懂的话可以无视 */ height : vh ; dis play : flex ; align-items : center ; justify-content : center ; /* 添加 背景图 */ background : url(http://img.mukewang.com/wiki/5eda029f08f198f513660768.jpg) center / cover ; } .animate { width : px ; height : px ; background : url(http://img.mukewang.com/wiki/5eda0279091a5 419 06500260.jpg) ; /* 动画: 动画名(loading) 时长(0.6秒) 运行方式(step-end) 动画 次数 (3次) 填充模式(双向) */ animation : loading s step-end both, /* 动画可以定义多个,每个动画用逗号分隔。*/ /* 第二个动画的动画名(animate) 时长(0.8秒) 运行方式(step-end) 延时(1.8秒) 动画 次数 (无限) */ animate s steps ( ) s infinite ; } /* 定义动画:动画名(loading) */ @keyframes loading { from { background-position : } /* 第 一个 数字代表x轴坐标,第二个数字代表y轴坐标 */ 10% { background-position : -px } /* x坐标:-130 y坐标:0 */ 20% { background-position : -px } /* x坐标:-260 y坐标:0 */ 30% { background-position : -px } /* x坐标:-390 y坐标:0 */ 40% { background-position : -px } /* x坐标:-520 y坐标:0 */ 50% { background-position : -px } /* x坐标:0 y坐标:-130 */ 60% { background-position : -px -px } /* x坐标:-130 y坐标:-130 */ 70% { background-position : -px -px } /* x坐标:-260 y坐标:-130 */ 80% { background-position : -px -px } /* x坐标:-390 y坐标:-130 */ 90% { background-position : -px -px } /* x坐标:-520 y坐标:-130 */ /* 修改 最后一帧,以便动画结束后盒子就应用最后一帧的样式 */ to { /* 下 一个 动画的宽高 */ width : px ; height : px ; /* 下 一个 动画的Css Sprite */ background-image : url(http://img.mukewang.com/wiki/5ed9b321092b587026000300.jpg) ; /* Css Sprite的最短边(这里是高)刚好能够覆盖住盒子 */ background-size : cover ; } } /* 定义动画:动画名(animate) */ @keyframes animate { from { background-position : } to { background-position : -px } } </ style > </ head > < body > < div class = " animate " > </ div > </ body > </ html >
大家可以打开编辑器运行一下项目 代码 ,毕竟在 gif 动图上的 效果 不如直接在浏览器里面来的痛快。
只要有一张好的Css Sprite,就可以做出来各种各样炫酷的 效果 。那么屏幕前的你是不是蠢蠢欲动了呢?
快去网上 搜索 一下 序列帧 ,然后下载一张自己满意的Css Sprite去练练手吧!
查看更多关于连接两个Css Sprite的动画的详细内容...