上一篇博客已经实现了第一种加载中特效
最近用在新网站后发现问题,刷新频率高的情况下,动画太多反而引起不适。
故又用同样方案,重做了一个好看又干净的 loading 加载中动画,用法和之前一样,也是基于原生 js css,无第三方依赖。
loading.js
document.body.innerHTML += ('<div id="preloader-body"><div id="cube-wrapper"><div class="cube-folding"><span class="leaf1"></span><span class="leaf2"></span><span class="leaf3"></span><span class="leaf4"></span></div><span class="loading"data-name="Loading">Loading</span></div></div>'); | |
window.onload = function () { | |
document.getElementById('cube-wrapper').style.display = "none"; | |
document.getElementById('preloader-body').style.display = "none"; | |
} |
loading.css
#preloader-body{ | |
position: fixed; | |
top: 0; | |
left: 0; | |
right: 0; | |
bottom: 0; | |
background-color: #fff; | |
z-index: 9999; | |
} | |
.cube-folding { | |
width: 50px; | |
height: 50px; | |
display: inline-block; | |
-moz-transform: rotate(45deg); | |
-ms-transform: rotate(45deg); | |
-webkit-transform: rotate(45deg); | |
transform: rotate(45deg); | |
font-size: 0; | |
} | |
.cube-folding span { | |
position: relative; | |
width: 25px; | |
height: 25px; | |
-moz-transform: scale(1.1); | |
-ms-transform: scale(1.1); | |
-webkit-transform: scale(1.1); | |
transform: scale(1.1); | |
display: inline-block; | |
} | |
.cube-folding span::before { | |
content: ''; | |
background-color: #007ee5; | |
position: absolute; | |
left: 0; | |
top: 0; | |
display: block; | |
width: 25px; | |
height: 25px; | |
-moz-transform-origin: 100% 100%; | |
-ms-transform-origin: 100% 100%; | |
-webkit-transform-origin: 100% 100%; | |
transform-origin: 100% 100%; | |
-moz-animation: folding 2.5s infinite linear both; | |
-webkit-animation: folding 2.5s infinite linear both; | |
animation: folding 2.5s infinite linear both; | |
} | |
.cube-folding .leaf2 { | |
-moz-transform: rotateZ(90deg) scale(1.1); | |
-ms-transform: rotateZ(90deg) scale(1.1); | |
-webkit-transform: rotateZ(90deg) scale(1.1); | |
transform: rotateZ(90deg) scale(1.1); | |
} | |
.cube-folding .leaf2::before { | |
-moz-animation-delay: 0.3s; | |
-webkit-animation-delay: 0.3s; | |
animation-delay: 0.3s; | |
background-color: #34a4ff; | |
} | |
.cube-folding .leaf3 { | |
-moz-transform: rotateZ(270deg) scale(1.1); | |
-ms-transform: rotateZ(270deg) scale(1.1); | |
-webkit-transform: rotateZ(270deg) scale(1.1); | |
transform: rotateZ(270deg) scale(1.1); | |
} | |
.cube-folding .leaf3::before { | |
-moz-animation-delay: 0.9s; | |
-webkit-animation-delay: 0.9s; | |
animation-delay: 0.9s; | |
background-color: #83c7ff; | |
} | |
.cube-folding .leaf4 { | |
-moz-transform: rotateZ(180deg) scale(1.1); | |
-ms-transform: rotateZ(180deg) scale(1.1); | |
-webkit-transform: rotateZ(180deg) scale(1.1); | |
transform: rotateZ(180deg) scale(1.1); | |
} | |
.cube-folding .leaf4::before { | |
-moz-animation-delay: 0.6s; | |
-webkit-animation-delay: 0.6s; | |
animation-delay: 0.6s; | |
background-color: #5cb6ff; | |
} | |
@-moz-keyframes folding { | |
0%, 10% { | |
-moz-transform: perspective(140px) rotateX(-180deg); | |
transform: perspective(140px) rotateX(-180deg); | |
opacity: 0; | |
} | |
25%, 75% { | |
-moz-transform: perspective(140px) rotateX(0deg); | |
transform: perspective(140px) rotateX(0deg); | |
opacity: 1; | |
} | |
90%, 100% { | |
-moz-transform: perspective(140px) rotateY(180deg); | |
transform: perspective(140px) rotateY(180deg); | |
opacity: 0; | |
} | |
} | |
@-webkit-keyframes folding { | |
0%, 10% { | |
-webkit-transform: perspective(140px) rotateX(-180deg); | |
transform: perspective(140px) rotateX(-180deg); | |
opacity: 0; | |
} | |
25%, 75% { | |
-webkit-transform: perspective(140px) rotateX(0deg); | |
transform: perspective(140px) rotateX(0deg); | |
opacity: 1; | |
} | |
90%, 100% { | |
-webkit-transform: perspective(140px) rotateY(180deg); | |
transform: perspective(140px) rotateY(180deg); | |
opacity: 0; | |
} | |
} | |
@keyframes folding { | |
0%, 10% { | |
-moz-transform: perspective(140px) rotateX(-180deg); | |
-ms-transform: perspective(140px) rotateX(-180deg); | |
-webkit-transform: perspective(140px) rotateX(-180deg); | |
transform: perspective(140px) rotateX(-180deg); | |
opacity: 0; | |
} | |
25%, 75% { | |
-moz-transform: perspective(140px) rotateX(0deg); | |
-ms-transform: perspective(140px) rotateX(0deg); | |
-webkit-transform: perspective(140px) rotateX(0deg); | |
transform: perspective(140px) rotateX(0deg); | |
opacity: 1; | |
} | |
90%, 100% { | |
-moz-transform: perspective(140px) rotateY(180deg); | |
-ms-transform: perspective(140px) rotateY(180deg); | |
-webkit-transform: perspective(140px) rotateY(180deg); | |
transform: perspective(140px) rotateY(180deg); | |
opacity: 0; | |
} | |
} | |
#cube-wrapper { | |
position: fixed; | |
left: 50%; | |
top: 50%; | |
margin-top: -50px; | |
margin-left: -50px; | |
width: 100px; | |
height: 100px; | |
text-align: center; | |
} | |
#cube-wrapper:after { | |
content: ''; | |
position: absolute; | |
left: 0; | |
right: 0; | |
bottom: -20px; | |
margin: auto; | |
width: 90px; | |
height: 6px; | |
background-color: rgba(0, 0, 0, 0.1); | |
-webkit-filter: blur(2px); | |
filter: blur(2px); | |
-moz-border-radius: 100%; | |
-webkit-border-radius: 100%; | |
border-radius: 100%; | |
z-index: 1; | |
-moz-animation: shadow 0.5s ease infinite alternate; | |
-webkit-animation: shadow 0.5s ease infinite alternate; | |
animation: shadow 0.5s ease infinite alternate; | |
} | |
#cube-wrapper .loading { | |
font-size: 12px; | |
letter-spacing: 0.1em; | |
display: block; | |
color: #007ee5; | |
position: relative; | |
top: 25px; | |
z-index: 2; | |
-moz-animation: text 0.5s ease infinite alternate; | |
-webkit-animation: text 0.5s ease infinite alternate; | |
animation: text 0.5s ease infinite alternate; | |
} |
用法与上次完全一致,简单说下。
方案 1 直接引入,立即生效。
demo.html
<!DOCTYPE HTML> | |
<html> | |
<head> | |
<meta charset="UTF-8" /> | |
<title>demo</title> | |
<link rel="stylesheet" href="css/loading.css"/> | |
</head> | |
<body> | |
<!-- 此方案 js 必须引入在 body 第一行 --> | |
<script src="js/loading.js"></script> | |
<!-- 其余代码写在后面即可 --> | |
</body> | |
</html> |
方案 2 不引入 js,将代码写入 html
demo.html
<!DOCTYPE HTML> | |
<html> | |
<head> | |
<meta charset="UTF-8" /> | |
<title>demo</title> | |
<link rel="stylesheet" href="css/loading.css"/> | |
</head> | |
<body> | |
<!-- 写在开头 --> | |
<div id="preloader-body"> | |
<div id="cube-wrapper"> | |
<div class="cube-folding"> | |
<span class="leaf1"></span> | |
<span class="leaf2"></span> | |
<span class="leaf3"></span> | |
<span class="leaf4"></span> | |
</div> | |
<span class="loading"data-name="Loading">Loading</span> | |
</div> | |
</div> | |
<!-- 中间写其他代码 --> | |
<script> | |
// 末尾绑定 window.onload 事件 (也可以用 jquery 或者 vue 实现,只需要在 window 加载完毕后,触发隐藏 2 个 div 即可) | |
window.onload = function () { | |
document.getElementById('cube-wrapper').style.display = "none"; | |
document.getElementById('preloader-body').style.display = "none"; | |
} | |
</script> | |
</body> | |
</html> |