上一篇博客已经实现了第一种加载中特效

最近用在新网站后发现问题,刷新频率高的情况下,动画太多反而引起不适。

故又用同样方案,重做了一个好看又干净的 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>