加载中...

matery加载动画


之前一直想给博客(Matery 主题)加个预加载动画,但是找了很多教程都失败了。

今天终于找到了可行方案,在这里记录下

点击看效果

实现原理:

<body> 元素中的最前面加上加载动画 <div> 块,页面加载之后立即展示加载动画,然后有个 js 方法监听页面加载完成事件,在页面加载完成之后通过设置 class 样式将加载动画 <div> 块隐藏。

步骤:

在 Matery 主题配置文件 _config.yml 中新增配置属性 preloader

# 是否开启页面加载动画 true 开启,false 关闭
preloader:
  enable: true

在 Matery 主题目录 /layout/_widget 下新增文件 loading.ejs,将以下内容写入 loading.ejs

<% if (theme.preloader.enable) { %>
<div id="loading-box">
    <div class="loading-left-bg"></div>
    <div class="loading-right-bg"></div>
    <div class="spinner-box">
        <div class="configure-border-1">
            <div class="configure-core"></div>
        </div>
        <div class="configure-border-2">
            <div class="configure-core"></div>
        </div>
        <div class="loading-word">加载中...</div>
    </div>
</div>
<script>
    window.addEventListener('load', function(){
        document.body.style.overflow = 'auto';
        document.getElementById('loading-box').classList.add("loaded")
    }, false)
</script>
<% } %>

接着在 Matery 主题目录 /css 下新增 loading.css ,并将以下内容写入 loading.css。(这里的 css 是我魔改另外一个 css 的,比原来的 css 兼容性更好)

#loading-box .loading-left-bg {
  position: fixed;
  z-index: 1000;
  width: 50%;
  height: 100%;
  background-color: #37474f;
  -webkit-transition: all 0.5s;
  -moz-transition: all 0.5s;
  -o-transition: all 0.5s;
  -ms-transition: all 0.5s;
  transition: all 0.5s;
}

#loading-box .loading-right-bg {
  position: fixed;
  z-index: 1000;
  width: 50%;
  height: 100%;
  background-color: #37474f;
  transition: all 0.5s;
  right: 0;
}

#loading-box > .spinner-box {
  position: fixed;
  z-index: 1001;
  display: -webkit-box;
  display: -moz-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: box;
  display: flex;
  -webkit-box-pack: center;
  -moz-box-pack: center;
  -o-box-pack: center;
  -ms-flex-pack: center;
  -webkit-justify-content: center;
  justify-content: center;
  -webkit-box-align: center;
  -moz-box-align: center;
  -o-box-align: center;
  -ms-flex-align: center;
  -webkit-align-items: center;
  align-items: center;
  width: 100%;
  height: 100vh;
}

#loading-box .spinner-box .configure-border-1 {
  position: absolute;
  padding: 3px;
  width: 115px;
  height: 115px;
  background: #ffab91;
  -webkit-animation: configure-clockwise 3s ease-in-out 0s infinite alternate;
  -moz-animation: configure-clockwise 3s ease-in-out 0s infinite alternate;
  -o-animation: configure-clockwise 3s ease-in-out 0s infinite alternate;
  -ms-animation: configure-clockwise 3s ease-in-out 0s infinite alternate;
  animation: configure-clockwise 3s ease-in-out 0s infinite alternate;
}

#loading-box .spinner-box .configure-border-2 {
  left: -115px;
  padding: 3px;
  width: 115px;
  height: 115px;
  background: #3ff9dc;
  -webkit-transform: rotate(45deg);
  -moz-transform: rotate(45deg);
  -o-transform: rotate(45deg);
  -ms-transform: rotate(45deg);
  transform: rotate(45deg);
  -webkit-animation: configure-xclockwise 3s ease-in-out 0s infinite alternate;
  -moz-animation: configure-xclockwise 3s ease-in-out 0s infinite alternate;
  -o-animation: configure-xclockwise 3s ease-in-out 0s infinite alternate;
  -ms-animation: configure-xclockwise 3s ease-in-out 0s infinite alternate;
  animation: configure-xclockwise 3s ease-in-out 0s infinite alternate;
}

#loading-box .spinner-box .loading-word {
  position: absolute;
  color: #ffffff;
  font-size: 0.8rem;
}

#loading-box .spinner-box .configure-core {
  width: 100%;
  height: 100%;
  background-color: #37474f;
}

#loading-box.loading .loading-left-bg {
  -webkit-transform: translate(-100%, 0);
  -moz-transform: translate(-100%, 0);
  -o-transform: translate(-100%, 0);
  -ms-transform: translate(-100%, 0);
  transform: translate(-100%, 0);
}

#loading-box.loading .loading-right-bg {
  -webkit-transform: translate(100%, 0);
  -moz-transform: translate(100%, 0);
  -o-transform: translate(100%, 0);
  -ms-transform: translate(100%, 0);
  transform: translate(100%, 0);
}

#loading-box.loading .spinner-box {
  display: none;
}
div.loaded div.loading-left-bg {
  transform: translate(-100%, 0);
}

div.loaded div.loading-right-bg {
  transform: translate(100%, 0);
}

div.loaded div.spinner-box {
  display: none !important;
}

@-moz-keyframes configure-clockwise {
  0% {
    -webkit-transform: rotate(0);
    -moz-transform: rotate(0);
    -o-transform: rotate(0);
    -ms-transform: rotate(0);
    transform: rotate(0);
  }

  25% {
    -webkit-transform: rotate(90deg);
    -moz-transform: rotate(90deg);
    -o-transform: rotate(90deg);
    -ms-transform: rotate(90deg);
    transform: rotate(90deg);
  }

  50% {
    -webkit-transform: rotate(180deg);
    -moz-transform: rotate(180deg);
    -o-transform: rotate(180deg);
    -ms-transform: rotate(180deg);
    transform: rotate(180deg);
  }

  75% {
    -webkit-transform: rotate(270deg);
    -moz-transform: rotate(270deg);
    -o-transform: rotate(270deg);
    -ms-transform: rotate(270deg);
    transform: rotate(270deg);
  }

  100% {
    -webkit-transform: rotate(360deg);
    -moz-transform: rotate(360deg);
    -o-transform: rotate(360deg);
    -ms-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}

@-webkit-keyframes configure-clockwise {
  0% {
    -webkit-transform: rotate(0);
    -moz-transform: rotate(0);
    -o-transform: rotate(0);
    -ms-transform: rotate(0);
    transform: rotate(0);
  }

  25% {
    -webkit-transform: rotate(90deg);
    -moz-transform: rotate(90deg);
    -o-transform: rotate(90deg);
    -ms-transform: rotate(90deg);
    transform: rotate(90deg);
  }

  50% {
    -webkit-transform: rotate(180deg);
    -moz-transform: rotate(180deg);
    -o-transform: rotate(180deg);
    -ms-transform: rotate(180deg);
    transform: rotate(180deg);
  }

  75% {
    -webkit-transform: rotate(270deg);
    -moz-transform: rotate(270deg);
    -o-transform: rotate(270deg);
    -ms-transform: rotate(270deg);
    transform: rotate(270deg);
  }

  100% {
    -webkit-transform: rotate(360deg);
    -moz-transform: rotate(360deg);
    -o-transform: rotate(360deg);
    -ms-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}

@-o-keyframes configure-clockwise {
  0% {
    -webkit-transform: rotate(0);
    -moz-transform: rotate(0);
    -o-transform: rotate(0);
    -ms-transform: rotate(0);
    transform: rotate(0);
  }

  25% {
    -webkit-transform: rotate(90deg);
    -moz-transform: rotate(90deg);
    -o-transform: rotate(90deg);
    -ms-transform: rotate(90deg);
    transform: rotate(90deg);
  }

  50% {
    -webkit-transform: rotate(180deg);
    -moz-transform: rotate(180deg);
    -o-transform: rotate(180deg);
    -ms-transform: rotate(180deg);
    transform: rotate(180deg);
  }

  75% {
    -webkit-transform: rotate(270deg);
    -moz-transform: rotate(270deg);
    -o-transform: rotate(270deg);
    -ms-transform: rotate(270deg);
    transform: rotate(270deg);
  }

  100% {
    -webkit-transform: rotate(360deg);
    -moz-transform: rotate(360deg);
    -o-transform: rotate(360deg);
    -ms-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}

@keyframes configure-clockwise {
  0% {
    -webkit-transform: rotate(0);
    -moz-transform: rotate(0);
    -o-transform: rotate(0);
    -ms-transform: rotate(0);
    transform: rotate(0);
  }

  25% {
    -webkit-transform: rotate(90deg);
    -moz-transform: rotate(90deg);
    -o-transform: rotate(90deg);
    -ms-transform: rotate(90deg);
    transform: rotate(90deg);
  }

  50% {
    -webkit-transform: rotate(180deg);
    -moz-transform: rotate(180deg);
    -o-transform: rotate(180deg);
    -ms-transform: rotate(180deg);
    transform: rotate(180deg);
  }

  75% {
    -webkit-transform: rotate(270deg);
    -moz-transform: rotate(270deg);
    -o-transform: rotate(270deg);
    -ms-transform: rotate(270deg);
    transform: rotate(270deg);
  }

  100% {
    -webkit-transform: rotate(360deg);
    -moz-transform: rotate(360deg);
    -o-transform: rotate(360deg);
    -ms-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}

@-moz-keyframes configure-xclockwise {
  0% {
    -webkit-transform: rotate(45deg);
    -moz-transform: rotate(45deg);
    -o-transform: rotate(45deg);
    -ms-transform: rotate(45deg);
    transform: rotate(45deg);
  }

  25% {
    -webkit-transform: rotate(-45deg);
    -moz-transform: rotate(-45deg);
    -o-transform: rotate(-45deg);
    -ms-transform: rotate(-45deg);
    transform: rotate(-45deg);
  }

  50% {
    -webkit-transform: rotate(-135deg);
    -moz-transform: rotate(-135deg);
    -o-transform: rotate(-135deg);
    -ms-transform: rotate(-135deg);
    transform: rotate(-135deg);
  }

  75% {
    -webkit-transform: rotate(-225deg);
    -moz-transform: rotate(-225deg);
    -o-transform: rotate(-225deg);
    -ms-transform: rotate(-225deg);
    transform: rotate(-225deg);
  }

  100% {
    -webkit-transform: rotate(-315deg);
    -moz-transform: rotate(-315deg);
    -o-transform: rotate(-315deg);
    -ms-transform: rotate(-315deg);
    transform: rotate(-315deg);
  }
}

@-webkit-keyframes configure-xclockwise {
  0% {
    -webkit-transform: rotate(45deg);
    -moz-transform: rotate(45deg);
    -o-transform: rotate(45deg);
    -ms-transform: rotate(45deg);
    transform: rotate(45deg);
  }

  25% {
    -webkit-transform: rotate(-45deg);
    -moz-transform: rotate(-45deg);
    -o-transform: rotate(-45deg);
    -ms-transform: rotate(-45deg);
    transform: rotate(-45deg);
  }

  50% {
    -webkit-transform: rotate(-135deg);
    -moz-transform: rotate(-135deg);
    -o-transform: rotate(-135deg);
    -ms-transform: rotate(-135deg);
    transform: rotate(-135deg);
  }

  75% {
    -webkit-transform: rotate(-225deg);
    -moz-transform: rotate(-225deg);
    -o-transform: rotate(-225deg);
    -ms-transform: rotate(-225deg);
    transform: rotate(-225deg);
  }

  100% {
    -webkit-transform: rotate(-315deg);
    -moz-transform: rotate(-315deg);
    -o-transform: rotate(-315deg);
    -ms-transform: rotate(-315deg);
    transform: rotate(-315deg);
  }
}

@-o-keyframes configure-xclockwise {
  0% {
    -webkit-transform: rotate(45deg);
    -moz-transform: rotate(45deg);
    -o-transform: rotate(45deg);
    -ms-transform: rotate(45deg);
    transform: rotate(45deg);
  }

  25% {
    -webkit-transform: rotate(-45deg);
    -moz-transform: rotate(-45deg);
    -o-transform: rotate(-45deg);
    -ms-transform: rotate(-45deg);
    transform: rotate(-45deg);
  }

  50% {
    -webkit-transform: rotate(-135deg);
    -moz-transform: rotate(-135deg);
    -o-transform: rotate(-135deg);
    -ms-transform: rotate(-135deg);
    transform: rotate(-135deg);
  }

  75% {
    -webkit-transform: rotate(-225deg);
    -moz-transform: rotate(-225deg);
    -o-transform: rotate(-225deg);
    -ms-transform: rotate(-225deg);
    transform: rotate(-225deg);
  }

  100% {
    -webkit-transform: rotate(-315deg);
    -moz-transform: rotate(-315deg);
    -o-transform: rotate(-315deg);
    -ms-transform: rotate(-315deg);
    transform: rotate(-315deg);
  }
}

@keyframes configure-xclockwise {
  0% {
    -webkit-transform: rotate(45deg);
    -moz-transform: rotate(45deg);
    -o-transform: rotate(45deg);
    -ms-transform: rotate(45deg);
    transform: rotate(45deg);
  }

  25% {
    -webkit-transform: rotate(-45deg);
    -moz-transform: rotate(-45deg);
    -o-transform: rotate(-45deg);
    -ms-transform: rotate(-45deg);
    transform: rotate(-45deg);
  }

  50% {
    -webkit-transform: rotate(-135deg);
    -moz-transform: rotate(-135deg);
    -o-transform: rotate(-135deg);
    -ms-transform: rotate(-135deg);
    transform: rotate(-135deg);
  }

  75% {
    -webkit-transform: rotate(-225deg);
    -moz-transform: rotate(-225deg);
    -o-transform: rotate(-225deg);
    -ms-transform: rotate(-225deg);
    transform: rotate(-225deg);
  }

  100% {
    -webkit-transform: rotate(-315deg);
    -moz-transform: rotate(-315deg);
    -o-transform: rotate(-315deg);
    -ms-transform: rotate(-315deg);
    transform: rotate(-315deg);
  }
}

然后找到 Matery 主题目录 /layout/_partial 下找到 head.ejs,并在 <head> 标签中添加以下内容引入 loading.css 文件。

<link
  rel="stylesheet"
  type="text/css"
  href="https://cdn.jsdelivr.net/gh/olig48/resources@latest/css/loading.css"
/>

再找到 Matery 主题目录 /layout 下找到 layout.ejs,然后在 <body> 标签下(最前面)引入 loading.ejs

<%- partial('_widget/loading') %>

至此,就完成了!

参考链接:https://juejin.im/post/6844904145250598919


文章作者: Muryor
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Muryor !
评论
  目录