1.由“2.loading----圆+各种角度旋转”的基础上继续扩展一下,用js来动态的设置animation,来切换效果,具体是:120度动画完(3个)、接着90度动画(4个)、接着60度动画(6个)、最后再45度动画(8个),效果图如下所示:
2.HTML代码:
<div class="loading">
<div class="text">Loading....</div>
<div class="wrapper">
<div id="circle1" class="circlesup1">
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
</div>
<div id="circle2" class="circlesup2">
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
</div>
<div id="circle3" class="circlesup3">
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
</div>
<div id="circle4" class="circlesup4">
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
</div>
<div id="circle5" class="circlesup5">
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
</div>
<div id="circle6" class="circlesup6">
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
</div>
<div id="circle7" class="circlesup7">
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
</div>
<div id="circle8" class="circlesup8">
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
</div>
</div>
</div>
3.思路:
- 每次做动画之前,先清空.circleup的旋转角度,如果没有旋转角度,那么他们会重合在一起,这样是看不出差别的,所以每次我们只需要用js控制需要做动画的.circleup给予他们不同的旋转角度,就可以实现旋转效果。
- 切换动画,则利用setTimeout和setInterval来实现,比如首先一开始做旋转120度的动画,然后用setTimeout控制2s后做90度的动画,接着用setTimeout控制4s后开始60度的动画,接着用setTimeout控制6s后开始45度的动画;最后用setInterval来循环上面的步骤;
4.具题的所有代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
html,body{
height: 100%;
width: 100%;
font-family: 'Open Sans';
overflow: hidden;
background: #403833;
font-weight: 100;
color: #f2f2f2;
font-size: 100%;
}
*{
margin: 0;
padding: 0;
}
.loading{
position: relative;
width: 400px;
height: 400px;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
text-align: center;
line-height: 400px;
}
.text{
animation: scaleSmall 2s infinite;
}
.wrapper{
width: 100%;
height: 100%;
}
.circlesup1{
left: 0;
top: 0;
position: absolute;
width: 100%;
height: 100%;
}
.circlesup2{
position: absolute;
width: 100%;
height: 100%;
left: 0px;
top:0px;
transform-origin: center center;
}
.circlesup3{
position: absolute;
width: 100%;
height: 100%;
left: 0px;
top:0px;
}
.circlesup4{
position: absolute;
width: 100%;
height: 100%;
left: 0px;
top:0px;
}
.circlesup5{
position: absolute;
width: 100%;
height: 100%;
left: 0px;
top:0px;
}
.circlesup6{
position: absolute;
width: 100%;
height: 100%;
left: 0px;
top:0px;
}
.circlesup7{
position: absolute;
width: 100%;
height: 100%;
left: 0px;
top:0px;
}
.circlesup8{
position: absolute;
width: 100%;
height: 100%;
left: 0px;
top:0px;
}
.circle{
position: absolute;
left: 25%;
top: 0;
width: 50%;
height: 50%;
transform-origin: 50% 50%;
animation: test 2s infinite;
}
.circle:nth-child(1){
z-index: 5;
}
.circle:nth-child(2){
animation: test 2s .125s infinite;
}
.circle:nth-child(3){
animation: test 2s .25s infinite;
}
.circle:nth-child(4){
animation: test 2s .375s infinite;
}
.circle:nth-child(5){
animation: test 2s .5s infinite;
}
.circle:after{
content: "";
position: absolute;
width: 20%;
height: 20%;
left: 40%;
bottom: -10%;
border-radius: 50%;
}
.circle:nth-child(1):after{
background: #13A3A5;
}
.circle:nth-child(2):after{
background: #56bebf;
transform: scale(0.8,0.8);
}
.circle:nth-child(3):after{
background: #ffa489;
transform: scale(0.6,0.6);
}
.circle:nth-child(4):after{
background: #ff6d37;
transform: scale(0.4,0.4);
}
.circle:nth-child(5):after{
background: #DB2F00;
transform: scale(0.2,0.2);
}
@keyframes test {
0% {
transform: rotate(0deg);
}
5% {
transform: rotate(0deg);
animation-timing-function: ease-out;
}
70% {
transform: rotate(360deg);
animation-timing-function: ease-in;
}
100% {
transform: rotate(360deg);
}
}
@keyframes scaleSmall {
0%{
transform: scale(0);
}
50%{
transform: scale(1);
}
100%{
transform: scale(0);
}
}
</style>
</head>
<body>
<div class="loading">
<div class="text">Loading....</div>
<div class="wrapper">
<div id="circle1" class="circlesup1">
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
</div>
<div id="circle2" class="circlesup2">
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
</div>
<div id="circle3" class="circlesup3">
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
</div>
<div id="circle4" class="circlesup4">
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
</div>
<div id="circle5" class="circlesup5">
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
</div>
<div id="circle6" class="circlesup6">
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
</div>
<div id="circle7" class="circlesup7">
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
</div>
<div id="circle8" class="circlesup8">
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
</div>
</div>
</div>
</body>
<script>
<!--下面cssTransform这个函数是用来设置transform的-->
function cssTransform(el,attr,val){
if(!el.tranform){//判断只在无el.tranform属性时新创建el.tranform
el.tranform={}//为元素el设置一个属性,为一个空对象
}
if(arguments.length>2){//判断是否有传入val,有则执行封装函数设置transform值的功能
el.tranform[attr]=val;
var sVal="";//用于储存多个transform值
for( var attrs in el.tranform ){
switch(attrs){
case "rotate":
case "rotateX":
case "rotateY":
case "rotateZ":
case "rotate":
case "skewX":
case "skewY":
sVal+=attrs+"("+el.tranform[attrs]+"deg) ";//注意此处的空格要加上
break;
case "translateX":
case "translateY":
case "translateZ":
sVal+=attrs+"("+el.tranform[attrs]+"px) ";//注意单位的变化
break;
case "scale":
case "scaleX":
case "scaleY":
sVal+=attrs+"("+el.tranform[attrs]+") ";//注意单位的变化
break;
}
}
el.style.webkitTransform=el.style.transform=sVal;
}else{//判断是否有传入val,无则执行封装函数获取transform值的功能
var val=el.tranform[attr];//获取由该函数设置的transform值的元素的获取transform值
if(typeof val == "undefined"){//如果想要获取默认值的话
if(attr=="scale" || attr=="scaleX" || attr=="scaleY"){
val=1;
}else{
val=0;
}
}
return val;
}
}
window.onload = function () {
// 不能设置transform为空,不然之后无法获取器相应的值
let wrapper = document.getElementsByClassName('wrapper')
let circleList = wrapper[0].children
function deg(circleList, rotate){
for (let i = 0; i<circleList.length;i++){
// cssTransform(circleList[i],"rotate",0);
circleList[i].style.transform = "rotate(0deg)"
}
for (var i = 0; i < rotate.length; i++) {
let num = i * rotate.deg;
// cssTransform(circleList[i],"rotate",num);
circleList[i].style.transform = "rotate("+num+"deg)"
}
}
deg(circleList,{length:3, deg:120})
setTimeout(function () {
deg(circleList,{length:4, deg:90})
},2000)
setTimeout(function () {
deg(circleList,{length:6, deg:60})
},4000)
setTimeout(function () {
deg(circleList,{length:8, deg:45})
},6000)
setInterval(function () {
console.log('定时器开启');
deg(circleList,{length:3, deg:120})
setTimeout(function () {
deg(circleList,{length:4, deg:90})
},2000)
setTimeout(function () {
deg(circleList,{length:6, deg:60})
},4000)
setTimeout(function () {
deg(circleList,{length:8, deg:45})
},6000)
},8000)
}
</script>
</html>