背景
当我第一次了解 CSS 中的关键帧动画时,CSSLoad.net 的想法就出现了。当时,我有一个专门用于加载动画图形的项目,但这更令人鼓舞,因为原生动画比光栅图像的限制更少。任何大小、任何速度、任何颜色和其他功能,没有服务器负载。所有动画都随着页面加载而运行。这就是我 preloaders.net 用户多年来一直要求的功能。
我创建了该网站的第一个版本,但它并没有什么用,因为它对动画的控制太少。在发布一年后,当我看到 CSS-Tricks 上的“弹性动画加载动画”文章后,我萌生了开发该项目第二个版本的想法。最大的想法是为用户提供纯 CSS 加载动画,并让他们以最小的努力自由地生成所需的动画。瞧,第二个版本已经准备好了!
感谢 Chris 的想法,以及 Jacques 在同一篇文章中提供的 Windows 8 加载动画想法。现在让我们深入了解一下。
重用工具
正如我所说,我在加载图像动画生成器的开发方面有经验,所以我心想:为什么要重新发明轮子?我从 preloaders.net 上使用的一些表单元素中借鉴了一些想法,比如 jQuery、颜色选择器、Tigra 滑动器 和我自己的一些代码片段(比如我自己的“尺寸滚动器”)。事实上,我经常制作自己的插件,因为这在代码效率和减少代码量方面非常有用。只编写你需要的代码通常比使用一刀切的解决方案更好。
现在,用于选择加载程序组件的表单控件已经准备好了。我将跳过这段代码,因为你可以在网站上看到它,而且它非常无聊。我们可以继续进行应用程序的“精华”部分:CSS 动画生成器。
选择选项
借鉴了我自己的图像动画和其他来自网络的动画的想法,我创建了几个 CSS 加载程序。我列出了用户应该能够更改的选项:
- 颜色
- 动画速度
- 尺寸
- 反转动画的能力

简单示例
以下是一个特定加载程序动画的示例。为了简便起见,我会保留未加前缀的代码,但网站生成的代码使用所有正确的代码前缀。
#noTrespassingOuterBarG {
height: 20px;
width: 160px;
border: 1px solid #000000;
overflow: hidden;
background-color: #FFFFFF;
}
.noTrespassingBarLineG {
background-color: #000000;
float: left;
width: 14px;
height: 120px;
margin-right: 24px;
margin-top: -28px;
transform: rotate(45deg);
}
.noTrespassingAnimationG {
width: 236px;
animation-name: noTrespassingAnimationG;
animation-duration: 1.3s;
animation-iteration-count: infinite;
animation-timing-function: linear;
}
@keyframes noTrespassingAnimationG {
0% {
margin-left: 0px;
}
100% {
margin-left:- 38px;
}
}
<div id="noTrespassingOuterBarG">
<div id="noTrespassingFrontBarG" class="noTrespassingAnimationG">
<div class="noTrespassingBarLineG">
</div>
<div class="noTrespassingBarLineG">
</div>
<div class="noTrespassingBarLineG">
</div>
<div class="noTrespassingBarLineG">
</div>
<div class="noTrespassingBarLineG">
</div>
<div class="noTrespassingBarLineG">
</div>
</div>
</div>
更多注意事项
在开发任何应用程序之前,你必须考虑约束和限制。在这种情况下,我决定以下限制是合理的:
- 总动画持续时间不能小于 0。
- 主要 DIV 和内部 DIV 的大小不能小于 5 像素。
- 动画应该尽可能地在更多浏览器中工作。
- CSS 类名必须与用户通常使用的类名不同。我在每个类名末尾添加了一个“G”,代表“Generated(生成)”。
每个动画一个函数
其他一切都非常简单。每个动画都有自己的函数,它们具有相同的参数列表:firstColor、secondColor、width、height、animationSpeed、isReverse 和一个公共函数,用于决定调用哪个函数。每个控件都会在更改时调用此公共函数。以下是一个示例函数:
function noTrespassing(firstColor, secondColor, width, height, animationSpeed, isReverse) {
var toReturn='';
if (isReverse) {
var begin = Math.round(width*38/160) * (-1);
var end = 0;
}
else {
var begin = 0;
var end = Math.round(width*38/160) * (-1);
}
toReturn += '<style>#noTrespassingOuterBarG{height:'+height+'px;width:'+width+'px;border:'+Math.ceil(height/20)+'px solid #'+firstColor+';overflow:hidden;background-color:#'+secondColor+'}.noTrespassingBarLineG{background-color:#'+firstColor+';float:left;width:'+Math.round(width*14/160)+'px;height:'+Math.round(width*120/160)+'px;margin-right:'+Math.round(width*24/160)+'px;margin-top:-'+Math.round(width*28/160)+'px;';
toReturn += addPrefix('[prefix]transform:rotate(45deg);');
toReturn += '}.noTrespassingAnimationG{width:'+Math.round(width*236/160)+'px;';
toReturn += addPrefix('[prefix]animation-name:noTrespassingAnimationG;[prefix]animation-duration:'+animationSpeed+'s;[prefix]animation-iteration-count:infinite;[prefix]animation-timing-function:linear;');
toReturn += '}#noTrespassingFrontBarG{}';
toReturn += addPrefix('@[prefix]keyframes noTrespassingAnimationG{0%{margin-left:'+begin+'px;}100%{margin-left:'+end+'px;}}');
toReturn += '</style><div id="noTrespassingOuterBarG"><div id="noTrespassingFrontBarG" class="noTrespassingAnimationG"><div class="noTrespassingBarLineG"></div><div class="noTrespassingBarLineG"></div><div class="noTrespassingBarLineG"></div><div class="noTrespassingBarLineG"></div><div class="noTrespassingBarLineG"></div><div class="noTrespassingBarLineG"></div></div></div>';
return toReturn;
}
此函数中的变量不言自明。你可以看到动画代码是如何根据特定表单元素更改事件进行更改的。我认为这里没有必要深入细节,除了 `addPrefix` 函数。此函数只是通过一个全局前缀数组变量循环来替换代码中的 `[prefix]` 部分,该变量会在代码对话框中选择时进行更改。
就是这样!其他内容你可以在项目的代码源代码中找到。我们希望收到一些建议、问题,当然还有批评。
太酷了。
如果它比 5kb 的 GIF 更出色,我认为它值得一试。尤其是在你需要更大尺寸的加载程序时。
真的很棒!我认为 CSS 动画没有得到应有的重视。
只是可惜像 IE9 这样的浏览器都不支持它……这让人难以将其视为一种酷炫的补充……
好吧,我认为这只是时间问题 :) 我相信人们很快就会转向新浏览器,并忘记他们对 IE6 的深深爱恋(以及其他过时的软件)。新技术总能胜出。
我之前多次使用过 preloaders.net,但当我发现 aPNG (维基百科、MozillaWiki、caniuse.com*) 时,我立即联系了他们,告诉他们这件事。
Timur 马上回复我,告诉我他们将立即在 preloaders.net 中添加 aPNG 功能。我有幸与他们一起测试了该网站的新功能和可用性,并提供了一些设计建议。
Timur 和他的团队在为 prealoaders.net 添加 aPNG 功能方面做得非常出色。
然后我发现了 CSSLoad.net,知道它和 prelaoders.net 一样,是一项很棒的服务。
*在撰写本文时(2012 年 12 月 8 日),aPNG 文件的支持非常少:只有从 3.0 版本开始的 Firefox、从 9.5 版本开始的 Opera 以及从 10 版本开始的 Opera Mobile 支持它。谷歌 Chrome 一直不支持,Safari 也一样。你甚至不要问 IE 是否支持。
这让你不禁思考,使用简单的 GIF 作为回退,CSS 加载程序是否实际上是目前最可行的选择,因为它们的支持比 aPNG 广泛得多。
你好 Ricardo :) 很高兴你看到这篇文章。
是的,Ricardo 确实给了我们很多帮助,我们非常感谢他。可惜 Chrome 还没有支持 APNG。它越来越受欢迎,CSS 动画也是如此。每天都有越来越多的人从 CSSLoad 下载动画,这似乎表明它们不再仅仅是花哨的东西。它们正在成为开发实践中的流行选择。
太棒了!(而且似乎很容易实现 :) 迫不及待想在自己的网站上试用它!
很棒,而且非常简单。
可以动画化文本(如果可能的话,可以使用给定的字体)吗?
(顺便说一下,这是我在这个很棒的网站上的第一篇帖子,它帮助我很多 :))
这是一个非常有趣的想法。奇怪的是,我在 Preloaders.net 上部署它的时候没有想到这个想法。非常感谢 Asme。
再次问候 Asme 和大家。正如承诺的那样,文本动画已准备就绪。
CSS 动画文本加载器
试试看 :)
我记得以前必须用 Flash 做这些的时候。然后出现了 Swish(这使得事情变得非常容易)。现在我们只需使用 HTML 和 CSS 就能实现相同的效果,并且还拥有使用它们的全部优势。
Timur,很棒的工作,感谢你构建了这个功能。
嗨 Timur,你的 cssload.net 第二版非常令人印象深刻。感谢分享你的经验。今天学到了新东西。
非常感谢你的评价,Wilson :) 希望在不久的将来做得更好。