不久前,读者 James Dimick 通过电子邮件向我发送了一些他正在使用的 jQuery 代码,用于制作一个“加载点”效果。您知道,经典的设计模式,其中屏幕(或某个区域)显示“加载中...”并伴随着逐渐增加的点。
加载
加载。
加载..
加载…
加载….
我看了他的代码,说:“哦,是的,我相信我可以做得更有效率。”然后我拿了他的代码,把它改成了两倍长 =)。但公平地说,我把它做成了一个插件,并让它变得更加灵活,功能更强大。
它的作用
您可以像这样在任何元素上调用它
$("#randomArea").Loadingdotdotdot({
"speed": 400,
"maxDots": 4,
"word": "Loading"
});
它完全用“加载”文本(带有动画点)替换该元素的内容。速度是指下一个点放置的速度。maxDots 指的是在它开始循环之前,最多可以有多少个点。
该插件确保“加载中...”水平和垂直都精确地位于调用它的元素的中心。
它的用途是什么?
最有可能的是,您会在执行某个 AJAX 调用之前在元素上使用它。这将向用户提示该区域正在发生某些操作。假设在该 AJAX 调用的成功(或错误)之后,该区域的内容将再次被替换(替换“加载中...”)。
演示和下载
在下载/使用之前查看演示页面。这里有一个“清理”函数,应该在任何实际环境中使用。该插件中调用了一个 setInterval() 函数,在 AJAX 调用成功后应该停止该间隔,以防止浏览器在不再存在的元素上运行它。
有趣的经验
我使用了一种我认为类似于 Doug Neiner 方法 的方法创建了这个插件。因此所有函数、变量和参数都包含在插件的“基础”中。我从 Doug 那里学到的另一件事是,如何让插件根据传递给它的参数执行不同的操作。您在上面看到了默认用法,其中您将速度和 maxDots 作为对象传递给它。但是,它执行的清理操作是通过将一个类似于以下字符串的字符串传递给插件来完成的
$("#randomArea").Loadingdotdotdot("Stop");
这是通过测试typeof参数在执行任何操作之前的类型。
$.fn.Loadingdotdotdot = function(options) {
if (typeof(options) == "string") {
// do something
} else {
// do a different (default) thing
}
};
使用 CSS3 动画
James Dimick 还开始尝试 CSS3 动画,并提出了一些用于此加载点业务的替代技术。其中之一是在 span 中包装这些点,然后使用关键帧动画来无限循环它们的透明度,彼此偏移。
<p id="loading">Loading<span>.</span><span>.</span><span>.</span></p>
@-webkit-keyframes opacity {
0% { opacity: 1; }
100% { opacity: 0; }
}
@-moz-keyframes opacity {
0% { opacity: 1; }
100% { opacity: 0; }
}
#loading {
text-align: center;
margin: 100px 0 0 0;
}
#loading span {
-webkit-animation-name: opacity;
-webkit-animation-duration: 1s;
-webkit-animation-iteration-count: infinite;
-moz-animation-name: opacity;
-moz-animation-duration: 1s;
-moz-animation-iteration-count: infinite;
}
#loading span:nth-child(2) {
-webkit-animation-delay: 100ms;
-moz-animation-delay: 100ms;
}
#loading span:nth-child(3) {
-webkit-animation-delay: 300ms;
-moz-animation-delay: 300ms;
}
请注意供应商前缀和 当前的浏览器支持。
他的下一个想法是使用一个点圆圈,它会像那些 有趣的 AJAX 加载图形 一样进行动画,只是使用纯 CSS3 动画。
更新
1/25/2012:
更新了插件,以包含“word”参数,以便您可以轻松地更改文本。 感谢 Harris Novick。
这是另一种 CSS 动画技术,其中一组点都放在一起(而不是在单独的 span 中),并且通过对它们的父元素的宽度进行动画(隐藏溢出)来显示。
这些旋转器 也值得注意,因为它们属于同一个基本设计模式组。
不错,收藏起来,因为我总是使用图像 :)
很棒的信息……我将在我的网站上尝试这个
感谢分享,但我认为它对网站来说并不必要,并且加载插件所花费的时间可能比让图像自行加载所花费的时间还要长。
*呼*
在说明了显而易见的事实之后,我想补充一点,插件和类似的效果通常是通往更实用应用的桥梁,它为想要学习的人打开了大门。
再次感谢。
我有一个非常类似的 MooTools 插件,叫做 Dotter
http://davidwalsh.name/mootools-dotter
Chris,非常棒的实现。我想我们之间有一场“Dotter”和 jQuery Dots 的对决。
Dotter 获胜
Chris,
感谢您提供 Doug Neiner 工具的参考。我终于开始理解 jQuery 插件的开发了……真是该死的。
我对 CSS3 的实现非常感兴趣。我现在基本上拒绝在任何地方使用 .gif 动画,因此找到一种使用 CSS 作为渐进增强的方式真是太好了。然后我们将使用常规的 dotdotdot 作为后备。
-Jacob
我认为它非常直观,并且更适合设计。感谢您,我会牢记在心。
嘿,Chris,非常棒的分享……我刚刚找到了您的博客,我刚开始学习 Ajax。到目前为止,您的所有文章都非常有帮助。
继续努力,感谢您分享所有这些内容 :)
Webkit 动画的方式太酷了 8)
您可以添加一个文本选项,默认值为“加载”,用户可以使用个性化的文本,也可以用于其他语言,例如在 pt_BR 中将是“Carregando”
很棒的插件创意,恭喜您。
很喜欢 CSS3 动画的效果 :) 插件也很好 :)
您好,
这是一个很好的图像替代方案。我们不能仅仅让它增加点的数量吗?而不是固定数量。它会起作用吗?我们可以显示点的数量,以便我们可以看到实际花费了多少时间。如果访问者看到内容花费了太多时间,可能会感到沮丧。
我们可以吗?
对于 Webkit 版本中使用的元素,是否有 -moz 和 -o(以及核心 CSS3)选项?很有趣的是,可以看看类似的实现,但具有后备功能和/或跨浏览器兼容性。
相当酷的效果。但旧浏览器支持它吗?
很棒,
我已经寻找这样的东西很久了
顺便说一句,我喜欢看到像这样的比较性文章,继续努力
拜托…
您可能希望向用户展示的不仅仅是进度,还有进度量。为此,您可以用多种方式显示终点线。
我个人更喜欢旋转 GIF 或百分比进度条,它们不需要翻译。
这让我想起了 Commodore 64 的时代。
保重
chris
不错的工具,我一直都在寻找类似的东西……感谢分享。
我更喜欢带有动画的图片,或者您切换图片以使它们看起来像是动画的,但感谢您的分享,它可以在制作合适的图片之前使用。
jQuery 的使用很不错,但我怀疑我不会找到很多用途。我唯一用到加载条的时候,是在 150k 以上的 Flash 文件上,但我的所有 jQuery 等内容似乎都直接加载了,而且我确信现在没有多少拨号上网用户了。
在不需要的东西上增加额外的插件会不会反而增加加载时间呢?
我知道您可以使用字体系列和颜色等对其进行样式设置,但我确实认为图形元素可以让加载条等看起来好得多,这个插件可以与一些图形元素一起使用吗?(例如,它将加载 4x 一个花哨的点的图片或类似的东西)我认为这会让更多人想要使用它。
一篇写得很好的文章……
如果点可以淡入而不是直接出现就好了。
我可能只会让它在句点和空格之间切换(字符串操作),而不是搞乱 CSS3 不透明度变化,但也许我只是老派了。
无论如何,这是一个避免使用加载图片的好主意。
我想看看一个用于页面元素第一次加载时的基本加载插件,当页面本身正在打开时。
非常有用的工具!谢谢!
很棒的文章,这段代码肯定很实用!
谢谢。