博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用css3制作旋转加载动画的几种方法
阅读量:7207 次
发布时间:2019-06-29

本文共 4699 字,大约阅读时间需要 15 分钟。

以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; 

具体效果查看这里:

这个方案,只有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; 

具体效果查看这里:

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.     } 

具体效果查看这里:

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

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

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

本文转自 powertoolsteam 51CTO博客,原文链接:http://blog.51cto.com/powertoolsteam/831252,如需转载请自行联系原作者

你可能感兴趣的文章
Android 升级下载 它们的定义Updates 兼容版本
查看>>
webstorm 10.0.4 注册码
查看>>
跨平台开源通讯组件elastic communication
查看>>
js dom学习
查看>>
Project Euler 98:Anagramic squares 重排平方数
查看>>
懒与馋的平衡:餐饮O2O市场广阔,发展不易
查看>>
Ubuntu下安装中文输入法
查看>>
(原)使用vectot的.end()报错:iterators incompatible
查看>>
通用软部件(通用管理信息系统)的研究与生产
查看>>
MFC中模态对话框和非模态对话框的差别
查看>>
数据挖掘算法 1 ID3(python)
查看>>
FPGA机器学习之学习的方向
查看>>
WebBrowser控件使用相关
查看>>
【Android】1.1 开发环境安装和配置
查看>>
站点公司亚马逊砸了10亿也没能做成智能手机,技术是须要沉淀和积累的
查看>>
[数据库]SQL Server 用户NT AUTHORITY\IUSR 登录失败
查看>>
轻松学会多线程(四)——synchronized同步keyword知多少
查看>>
Apache Kylin 部署之不完全指南
查看>>
php中将SimpleXMLElement Object数组转化为普通数组
查看>>
docker学习(7) docker-compose使用示例
查看>>