最终效果如图一,gif图片稍微有点卡顿,事实上代码在浏览器里执行得很流畅。这里面用到的css3技术非常简单,分别是border-radius、伪元素、css3关键帧以及animation动画。

  首先整理一下大概的思路:整个圆分为AB两部分,左右都是半圆,上面盖了一个背景色为白色的小圆,如右图,简单布局如下:

  

<style>
.loading{margin:100px auto; width: 8em; height: 8em; position: relative;}
.loading .progress{position: absolute; width: 6em; height:6em; background-color: white; border-radius: 50%; left: 1em; top: 1em; line-height: 6em; text-align: center;
}
.left,.right{width: 4em;height: 8em;overflow: hidden; position: relative; float: left;}
.left{ border-radius: 8em 0 0 8em;}
.right{ border-radius: 0 8em 8em 0;}
.left:after,.right:after{content:""; position:absolute; display:block; width: 4em;height: 8em; background-color: white;border-radius: 8em 0 0 8em;background-color: red;}
.right:after{content:""; position:absolute; display:block; border-radius: 0 8em 8em 0; }
</style>
<div class="loading">
<div class="left"></div>
<div class="right"></div>
<div class="progress">85%</div>
</div>

  布局使用了伪元素,很容易看懂就不解释了,整个动画过程分为4步:        

  第1步,开始红色部分是隐藏的(相对于图中的位置以圆心为中心点旋转180度),B以圆心为中心点旋转后出现在视野里,直到旋转度数达到180度;

  第2步:此时B静止不动,A开始旋转到180度,在视觉上看起来就像是B继续在旋转;

  第3步:此时整个圆都出现在用户视野,就如图二的样子,要使loading动画循环播放,此时应该让B继续旋转到360度,A静止不动;

  第4步:第3步执行完之后,B消失在用户视野并静止不动,A继续旋转到360度即回到原点完成一个回合。

  用示意图表示如下:

  

  为了便于计算,假设一个回合的时间为4s,每一步用时1s钟,每一步占整个动画的25%,总结起来就是:

  0%—25%:B旋转到180deg

  25%—50%:B静止,A旋转到180deg

  50%—75%:A静止,B继续旋转到360deg回到原点

  75%—100%:B静止,A继续旋转到360deg回到原点结束一个回合

  用关键帧表示如下:

  

  // B执行的关键帧
@-webkit-keyframes rotateB{
25%,50%{transform:rotateZ(180deg);}
75%,100%{transform:rotateZ(360deg);}
}
// A执行的关键帧
@-webkit-keyframes rotateA{
0%,25%{transform:rotateZ(0deg);}
50%,75%{transform:rotateZ(180deg);}
100%{transform:rotateZ(360deg);}
}

  重点就是这个关键帧,最后,附上整个demo

  

<style>
.loading{margin:100px auto; width: 8em; height: 8em; position: relative;}
.loading .progress{position: absolute; width: 6em; height:6em; background-color: white; border-radius: 50%; left: 1em; top: 1em; line-height: 6em; text-align: center;
}
.left,.right{width: 4em;height: 8em;overflow: hidden; position: relative; float: left;}
.left{ border-radius: 8em 0 0 8em;}
.right{ border-radius: 0 8em 8em 0;}
.left:after,.right:after{content:""; position:absolute; display:block; width: 4em;height: 8em; background-color: white;border-radius: 8em 0 0 8em;background-color: red;}
.right:after{content:""; position:absolute; display:block; border-radius: 0 8em 8em 0; }
@-webkit-keyframes rotateB{
25%,50%{transform:rotateZ(180deg);}
75%,100%{transform:rotateZ(360deg);}
}
@-webkit-keyframes rotateA{
0%,25%{transform:rotateZ(0deg);}
50%,75%{transform:rotateZ(180deg);}
100%{transform:rotateZ(360deg);}
}
.left:after{-webkit-animation:rotateA 2s infinite linear; transform-origin:right center; }
.right:after{-webkit-animation:rotateB 2s infinite linear; transform-origin:left center;}
</style>
<div class="loading">
<div class="left"></div>
<div class="right"></div>
<div class="progress">85%</div>
</div>

5月11日更新:

附上一个用到这个知识点做的时钟,demo:

源码:

<style>
*{margin: 0; padding: 0;}
.loading{margin:100px auto; width: 25em; height: 8em; position: relative;}
.clock{position: relative; width: 8em; height: 8em; display: inline-block;}
.loading .progress{position: absolute; width: 6em; height:6em; background-color: white; border-radius: 50%; left: 1em; top: 1em; line-height: 6em; text-align: center;
}
.progress span{ font: 50px/2em Arial;}
.left,.right{width: 4em;height: 8em;overflow: hidden; position: relative; float: left;}
.left{ border-radius: 8em 0 0 8em;}
.right{ border-radius: 0 8em 8em 0;}
.left div,.right div{content:""; position:absolute; display:block; width: 4em;height: 8em; background-color: white;border-radius: 8em 0 0 8em; transition:all .3s; transform-origin:right center; transform:rotateZ(-180deg);}
.right div{content:""; position:absolute; display:block; border-radius: 0 8em 8em 0;transform-origin:left center; }
.clock:nth-child(1) .left div,.clock:nth-child(1) .right div{
background-color: red;
}
.clock:nth-child(2) .left div,.clock:nth-child(2) .right div{
background-color: green;
}
.clock:nth-child(3) .left div,.clock:nth-child(3) .right div{
background-color: blue;
}
</style>
<div class="loading">
<div class="clock hours">
<div class="left"><div></div></div>
<div class="right"><div></div></div>
<div class="progress"><span>0</span></div>
</div>
<div class="clock minutes">
<div class="left"><div></div></div>
<div class="right"><div></div></div>
<div class="progress"><span>0</span></div>
</div>
<div class="clock seconds">
<div class="left"><div></div></div>
<div class="right"><div></div></div>
<div class="progress"><span>0</span></div>
</div>
</div>
<script>
/*
by:王美建 CSS3 时钟
*/
setInterval(function(){
var time = new Date(),
H = time.getHours(),
M = time.getMinutes(),
S = time.getSeconds();
showHours("hours",H,12);
showHours("minutes",M,30);
showHours("seconds",S,30);
},30) function showHours(oClass,num,n){
var aEle = getByClass(oClass)[0].children,
Rdeg = num > n ? n : num,
Ldeg = num > n ? num - n : 0;
aEle[2].innerHTML = "<span>"+num+"</span>"; aEle[1].children[0].style.transform = "rotateZ("+ (360/(2*n)*Rdeg-180) +"deg)";
aEle[0].children[0].style.transform = "rotateZ("+ (360/(2*n)*Ldeg-180) +"deg)";
}
function getByClass(oClass){
return document.getElementsByClassName(oClass);
}
</script>

本文出处:By:王美建 http://www.cnblogs.com/wangmeijian/p/4449150.html 转载请保留出处。

简单的CSS3 Loading动画的更多相关文章

  1. css3 loading动画 三个省略号

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  2. 分享web前端七款HTML5 Loading动画特效集锦

    以前我们大部分的Loading动画都是利用gif图片实现的,这种图片实现Loading动画的方法虽然也很不错,但是作为HTML5开发者来说,如果能利用HTML5和CSS3实现这些超酷的Loading动 ...

  3. 7 款华丽的 HTML5 Loading 动画特效

    我们在进行大数据的传输或者复杂操作的等待时,最好能有一个Loading等待的小动画提示用户.本文将为大家分享一些超华丽的基于HTML5的Loading加载动画特效,希望你会喜欢. 1.HTML5 Ca ...

  4. 2款不同样式的CSS3 Loading加载动画 附源码

    原文:2款不同样式的CSS3 Loading加载动画 附源码 我们经常看到的Loading加载很多都是转圈圈的那种,今天我们来换一种有创意的CSS3 Loading加载动画,一种是声波形状的动画,另一 ...

  5. 【常见】CSS3进度条Loading动画

    现在,GIF 格式的进度条已经越来越少,CSS 进度条如雨后春笋般涌现.CSS3的崛起,更使得动态效果得以轻松实现,未来,必定是CSS3的天下,所以今天我就来分享一下几个常见的CSS3进度条Loadi ...

  6. 纯css3 加载loading动画特效

    最近项目中要实现当页面还没有加载完给用户提示正在加载的loading,本来是想做个图片提示的,但是图片如果放大电脑的分辨率就会感觉到很虚,体验效果很不好.于是就采用css3+js实现这个loading ...

  7. CSS3效果:animate实现点点点loading动画效果(二)

    box-shadow实现的打点效果 简介 box-shadow理论上可以生成任意的图形效果,当然也就可以实现点点点的loading效果了. 实现原理 html代码,首先需要写如下html代码以及cla ...

  8. 10个样式各异的CSS3 Loading加载动画

    前几天我在园子里分享过2款很酷的CSS3 Loading加载动画,今天又有10个最新的Loading动画分享给大家,这些动画的样式都不一样,实现起来也并不难,你很容易把它们应用在项目中,先来看看效果图 ...

  9. 纯CSS3文字Loading动画特效

    纯CSS3文字Loading动画特效是一款个性的loading文字加载动画. 在线演示本地下载

随机推荐

  1. es7----proxy

    proxy是代理的意思,es7新增这个可以代理某个变量的“增删改查”,vue的核心原理就是这个~~ 基本使用方法: let json = {a: 123, c: 999} let p = new Pr ...

  2. 设计模式之Mixin模式

    介绍 mixin模式就是一些提供能够被一个或者一组子类简单继承功能的类,意在重用其功能.在面向对象的语言中,我们会通过接口继承的方式来实现功能的复用.但是在javascript中,我们没办法通过接口继 ...

  3. 关于Web安全的那些事(XSS攻击)

    概述 XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联系人发 ...

  4. 控制台console对象常用的一些方法

    console.log():调试中最常用的方法,用于在控制台窗口显示信息. console.log(123); console.warn():输出信息时,在最前面加一个黄色三角,表示警告 consol ...

  5. OnContextMenu事件(转)

    用oncontextmenu事件单禁用右键菜单 一个页面中,BODY中用oncontextmenu='return false'来取消鼠标右键:在JS中设置oncontextmenu='return ...

  6. 一个由SEO优化展开的meta标签大讲解

    您的个人网站即使做得再精彩,在“浩瀚如海”的网络空间中,也如一叶扁舟不易为人发现,如何推广个人网站,人们首先想到的方法无外乎以下几种: ● 在搜索引擎中登录自己的个人网站 ● 在知名网站加入你个人网站 ...

  7. 用Emacs将文件加密保存

    为Emacs安装ps-ccrypt插件. 如果你在使用elpa(Emacs的一个插件管理器), 可以M-x list-packages, 从插件列表中找到 ps-ccrypt, 在该项上按i将其标记为 ...

  8. python技巧 is 和 ==

    is 判断变量是否指向同一个对象 == 判断变量引用的对象是否相等 In [2]: a=[1,2] In [3]: b=a In [4]: a == b Out[4]: True In [5]: a ...

  9. 利用VBS下载EXE文件手法记录

    1.信息来源 疑似朝鲜通过鱼叉攻击韩国统一部记者的APT事件整理 https://mp.weixin.qq.com/s/4IFV31MBNbANnCVaJj7ZPQ https://twitter.c ...

  10. Replication监控及自动故障切换

    首先在相应的机器上增加授权 GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.108' IDENTIFIED BY 'repl';GRANT RE ...