热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用css3制作旋转加载动画的几种方法

以WebKit为核心的浏览器,例如Safari和Chrome,对HTML5有着很好的支持,在移动平台中这两个浏览器对应的就是iOS和Android。最近在开发一个移动平台的webapp,那么就有机会

以WebKit为核心的浏览器,例如Safari和Chrome,对HTML5有着很好的支持,在移动平台中这两个浏览器对应的就是iOS和Android。最近在开发一个移动平台的web app,那么就有机会利用CSS3去实现一些很酷的效果,这些效果原来更多的是利用图片来实现。最近的一个改进就是利用css3制作旋转加载动画。以下将分别介绍几种实现的方案。

方案1,图片辅助

传统做法是直接用动态的GIF图片,这个方案是用PNG图片加上背景颜色来模拟静止的加载图片,然后利用css中的animation处理图片的旋转。相比传统方案,这个方案的好处是可以直接通过修改CSS来改变背景色,可以修改大小和旋转速度。如下是具体的CSS代码:

 

 
  1. @-webkit-keyframes rotate { 
  2.   from {-webkit-transform:rotate(0deg);} 
  3.   to {-webkit-transform:rotate(360deg);} 
  4. p#spinner { 
  5.   height: 30px; 
  6.   width: 30px; 
  7.   overflow: hidden; 
  8.   background: #000; 
  9.   -webkit-mask-image: url("data:image/png[...]"); 
  10.   -webkit-mask-size: 30px 30px; 
  11.   -webkit-animation-name: rotate; 
  12.   -webkit-animation-duration: 1.5s; 
  13.   -webkit-animation-iteration-count: infinite; 
  14.   -webkit-animation-timing-function: linear; 

具体效果查看这里:Demo1

这个方案,只有safari可以很好地支持。chrome下支持不是很好,所以这是一个不太成熟的方案。

方案2, 纯CSS实现

方案的思路是,首先用css渲染12个静态的bar,每个bar间隔30度的角度,给每个bar添加背景变淡的动画,但是相邻bar的动画效果延迟1/12秒,来保证12个bar是按顺序变亮然后变暗。从而模拟出旋转的效果。

这个旋转效果是伪旋转,所有的bar都没有真正做到旋转。

 

 
  1. @-webkit-keyframes fade { 
  2.     from {opacity: 1;} 
  3.     to {opacity: 0.25;} 
  4. div.spinner { 
  5.     position: relative; 
  6.     width: 30px; 
  7.     height: 30px; 
  8.     display: inline-block; 
  9. div.spinner div { 
  10.     width: 20%; 
  11.     height: 40%; 
  12.     background: #000; 
  13.     position: absolute; 
  14.     left: 100%; 
  15.     top: 100%; 
  16.     opacity: 0; 
  17.     -webkit-animation: fade 1s linear infinite; 
  18.     -webkit-border-radius: 30px; 
  19. div.spinner div.bar1 { 
  20.     -webkit-transform:rotate(0deg) translate(0, -142%); 
  21.         -webkit-animation-delay: 0s; 
  22. [......] 
  23. div.spinner div.bar12 { 
  24.     -webkit-transform:rotate(330deg) translate(0, -142%);  
  25.     -webkit-animation-delay: -0.0833s; 

具体效果查看这里:Demo2

safari和chrome都能很好地渲染这个效果,并且也很容易定义实际大小,因为所有的bar的高度,宽度有是用百分比来定义的。缺点也很明显,需要定义12个bar,并且每个bar都要定义独立的css,相对来说html和css的代码量有点多。

方案3,这个方案类似sencha touch中实现的效果

方案的基本思想是:首先利用html和css呈现4个bar,再通过css的伪元素: before和:after定义每个bar的前后内容,这样使得由原始的4个bar产生12个bar的效果,其次通过css设置让12个bar的透明度逐渐递减,最后应用css3中旋转动画达到实际loading的效果。

 

 
  1. .x-loading-spinner { 
  2.     font-size: 250%; 
  3.     height: 1em; 
  4.     width: 1em; 
  5.     position: relative; 
  6.     -webkit-transform-origin: 0.5em 0.5em; 
  7. .x-loading-spinner > span, .x-loading-spinner > span:before, .x-loading-spinner > span:after { 
  8.     display: block; 
  9.     position: absolute; 
  10.     width: 0.1em; 
  11.     height: 0.25em; 
  12.     top: 0; 
  13.     -webkit-transform-origin: 0.05em 0.5em; 
  14.     -webkit-border-radius: 0.05em; 
  15.     border-radius: 0.05em; 
  16.     content: " "; 
  17. .x-loading-spinner > span.x-loading-top { 
  18.     background-color: rgba(170, 170, 170, 0.99); 
  19. .x-loading-spinner > span.x-loading-top::after { 
  20.     background-color: rgba(170, 170, 170, 0.9); 
  21. .x-loading-spinner > span.x-loading-left::before { 
  22.     background-color: rgba(170, 170, 170, 0.8); 
  23. .x-loading-spinner > span.x-loading-left { 
  24.     background-color: rgba(170, 170, 170, 0.7); 
  25. .x-loading-spinner > span.x-loading-left::after { 
  26.     background-color: rgba(170, 170, 170, 0.6); 
  27. .x-loading-spinner > span.x-loading-bottom::before { 
  28.     background-color: rgba(170, 170, 170, 0.5); 
  29. .x-loading-spinner > span.x-loading-bottom { 
  30.     background-color: rgba(170, 170, 170, 0.4); 
  31. .x-loading-spinner > span.x-loading-bottom::after { 
  32.     background-color: rgba(170, 170, 170, 0.35); 
  33. .x-loading-spinner > span.x-loading-right::before { 
  34.     background-color: rgba(170, 170, 170, 0.3); 
  35. .x-loading-spinner > span.x-loading-right { 
  36.     background-color: rgba(170, 170, 170, 0.25); 
  37. .x-loading-spinner > span.x-loading-right::after { 
  38.     background-color: rgba(170, 170, 170, 0.2); 
  39. .x-loading-spinner > span.x-loading-top::before { 
  40.     background-color: rgba(170, 170, 170, 0.15); 
  41. .x-loading-spinner > span { 
  42.     left: 50%; 
  43.     margin-left: -0.05em; 
  44. .x-loading-spinner > span.x-loading-top { 
  45.     -webkit-transform: rotate(0deg); 
  46.     -moz-transform: rotate(0deg); 
  47. .x-loading-spinner > span.x-loading-right { 
  48.     -webkit-transform: rotate(90deg); 
  49.     -moz-transform: rotate(90deg); 
  50. .x-loading-spinner > span.x-loading-bottom { 
  51.     -webkit-transform: rotate(180deg); 
  52.     -moz-transform: rotate(180deg); 
  53. .x-loading-spinner > span.x-loading-left { 
  54.     -webkit-transform: rotate(270deg); 
  55.     -moz-transform: rotate(270deg); 
  56. .x-loading-spinner > span::before { 
  57.     -webkit-transform: rotate(30deg); 
  58.     -moz-transform: rotate(30deg); 
  59. .x-loading-spinner > span::after { 
  60.     -webkit-transform: rotate(-30deg); 
  61.     -moz-transform: rotate(-30deg); 
  62. .x-loading-spinner { 
  63.     -webkit-animation-name: x-loading-spinner-rotate; 
  64.     -webkit-animation-duration: 0.5s; 
  65.     -webkit-animation-iteration-count: infinite; 
  66.     -webkit-animation-timing-function: linear; 
  67.  
  68. @-webkit-keyframes x-loading-spinner-rotate { 
  69.     from { 
  70.     -webkit-transform: rotate(30deg); 
  71.     } 
  72.     to { 
  73.     -webkit-transform: rotate(330deg); 
  74.     } 

具体效果查看这里:Demo3

这个方案是3个方案中应用css技术最彻底的一个,html的代码最少,并且也真正做到了旋转效果。缺点是不易扩展,chrome浏览器支持不是很理想。

综上分析,方案1浏览器支持不好,但是实现简单,方案2的html代码太多,但扩展好,浏览器支持不错,方案3的扩展性不好,浏览器支持也不好,但是较好地利用了css的特性。

如果开发桌面web系统,推荐方案2,如果是mobile系统,则方案2和方案3各有优势。

 

原文转自: 乐搏学院http://www.learnbo.com/

推荐阅读
  • 使用 Vue 集成 iScroll 实现移动端表格横向滚动与固定列功能 ... [详细]
  • 为了实现跨浏览器兼容的禁用文本选择功能,可以通过在全局CSS样式中定义一个特定的类来禁止用户选中文本。具体做法是在全局样式表中添加一个名为 `.no-select` 的类,并在需要禁用文本选择的元素上应用该类。这样可以确保在不同浏览器中都能达到一致的效果。此外,还可以结合JavaScript进一步增强用户体验,例如在某些交互场景下动态启用或禁用文本选择功能。 ... [详细]
  • 二分查找算法详解与应用分析:本文深入探讨了二分查找算法的实现细节及其在实际问题中的应用。通过定义 `binary_search` 函数,详细介绍了算法的逻辑流程,包括初始化上下界、循环条件以及中间值的计算方法。此外,还讨论了该算法的时间复杂度和空间复杂度,并提供了多个应用场景示例,帮助读者更好地理解和掌握这一高效查找技术。 ... [详细]
  • Unity3D 中 AsyncOperation 实现异步场景加载及进度显示优化技巧
    在Unity3D中,通过使用`AsyncOperation`可以实现高效的异步场景加载,并结合进度条显示来提升用户体验。本文详细介绍了如何利用`AsyncOperation`进行异步加载,并提供了优化技巧,包括进度条的动态更新和加载过程中的性能优化方法。此外,还探讨了如何处理加载过程中可能出现的异常情况,确保加载过程的稳定性和可靠性。 ... [详细]
  • 深入解析Linux内核中的进程上下文切换机制
    在现代操作系统中,进程作为核心概念之一,负责管理和分配系统资源,如CPU和内存。深入了解Linux内核中的进程上下文切换机制,需要首先明确进程与程序的区别。进程是一个动态的执行流,而程序则是静态的数据和指令集合。进程上下文切换涉及保存当前进程的状态信息,并加载下一个进程的状态,以实现多任务处理。这一过程不仅影响系统的性能,还关系到资源的有效利用。通过分析Linux内核中的具体实现,可以更好地理解其背后的原理和技术细节。 ... [详细]
  • NOIP2000的单词接龙问题与常见的成语接龙游戏有异曲同工之妙。题目要求在给定的一组单词中,从指定的起始字母开始,构建最长的“单词链”。每个单词在链中最多可出现两次。本文将详细解析该题目的解法,并分享学习过程中的心得体会。 ... [详细]
  • 本文介绍了使用 Python 编程语言高效抓取微博文本和动态网页图像数据的方法。通过详细的示例代码,展示了如何利用爬虫技术获取微博内容和动态图片,为数据采集和分析提供了实用的技术支持。对于对网络数据抓取感兴趣的读者,本文具有较高的参考价值。 ... [详细]
  • 在List和Set集合中存储Object类型的数据元素 ... [详细]
  • 本文详细介绍了批处理技术的基本概念及其在实际应用中的重要性。首先,对简单的批处理内部命令进行了概述,重点讲解了Echo命令的功能,包括如何打开或关闭回显功能以及显示消息。如果没有指定任何参数,Echo命令会显示当前的回显设置。此外,文章还探讨了批处理技术在自动化任务执行、系统管理等领域的广泛应用,为读者提供了丰富的实践案例和技术指导。 ... [详细]
  • 在PHP中实现腾讯云接口签名,以完成人脸核身功能的对接与签名配置时,需要注意将文档中的POST请求改为GET请求。具体步骤包括:使用你的`secretKey`生成签名字符串`$srcStr`,格式为`GET faceid.tencentcloudapi.com?`,确保参数正确拼接,避免因请求方法错误导致的签名问题。此外,还需关注API的其他参数要求,确保请求的完整性和安全性。 ... [详细]
  • 本文详细探讨了使用纯JavaScript开发经典贪吃蛇游戏的技术细节和实现方法。通过具体的代码示例,深入解析了游戏逻辑、动画效果及用户交互的实现过程,为开发者提供了宝贵的参考和实践经验。 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 在今天的实践中,我深入学习了网页图像抓取技术,通过编写爬虫程序批量获取网站上的图片资源。具体来说,我选择了一个包含大量高质量图片的网站作为练习对象,并成功实现了将这些图片批量下载到本地存储。这一过程不仅提升了我对爬虫技术的理解,还增强了我的编程能力。 ... [详细]
  • 在前一篇文章中,我们介绍了如何使用Requests库发送GET请求。本文将深入探讨如何通过Requests库发送POST请求,包括参数格式、请求封装等关键技巧,并通过“历史上的今天”API实例进行详细说明。 ... [详细]
  • 本文介绍了如何利用摄像头捕捉图像,并将捕获的图像数据保存为文件。通过详细的代码示例,展示了摄像头调用的具体实现方法,适用于多种应用场景,如安全监控、图像处理等。 ... [详细]
author-avatar
Wo-们是平行线
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章