
服务器配置或者网络等原因,若一个页面原本加载速度过慢,
或者 js css 加载完成初始化成功之前,页面先会暂时很扭曲,用户体验会很差。
就需要给 html5 页面加上一个加载中的 loading 动画。
我在百度找了十多种,都发现一个共同的问题,就是代码很牛,效果很好,就是不会用,
于是我找了一个完全是原生 JavaScript + CSS3 的方案,集成到 js 和 css 中来实现。
无需其他任何依赖,也不需要自己再实现代码。
本文并非原创,而是在别人的基础上,改进和封装了他的代码。
主要修改地方包括:
- 尽最大可能做到只需要在正确位置引入一个 js 和一个 css 即可。无需加入其他任何代码。
- 需要注意的是,为了更早加载完成 DIV#loader-wrapper,建议将 loading.js 放在 body 第一行。或者翻到下半页采取方案 2。
- 取消了原文通过 jquery 隐藏 load_title 的方案,直接在 css 142 行改进成结束 load_title 自己消失。
原文中举得例子:http://crusader12.com/C12HoverAlls/
参考的原文地址 : http://www.ibloger.net/article/401.html
正文开始
直接上代码:
loading.css (调整背景色代码在 103 行)
| .chromeframe { | |
| margin: .2em 0; | |
| background: #ccc; | |
| color: #000; | |
| padding: .2em 0 | |
| } | |
| #loader-wrapper { | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 100%; | |
| z-index: 999999 | |
| } | |
| #loader { | |
| display: block; | |
| position: relative; | |
| left: 50%; | |
| top: 50%; | |
| width: 150px; | |
| height: 150px; | |
| margin: -75px 0 0 -75px; | |
| border-radius: 50%; | |
| border: 3px solid transparent; | |
| border-top-color: #FFF; | |
| -webkit-animation: spin 2s linear infinite; | |
| -ms-animation: spin 2s linear infinite; | |
| -moz-animation: spin 2s linear infinite; | |
| -o-animation: spin 2s linear infinite; | |
| animation: spin 2s linear infinite; | |
| z-index: 1001 | |
| } | |
| #loader:before { | |
| content: ""; | |
| position: absolute; | |
| top: 5px; | |
| left: 5px; | |
| right: 5px; | |
| bottom: 5px; | |
| border-radius: 50%; | |
| border: 3px solid transparent; | |
| border-top-color: #FFF; | |
| -webkit-animation: spin 3s linear infinite; | |
| -moz-animation: spin 3s linear infinite; | |
| -o-animation: spin 3s linear infinite; | |
| -ms-animation: spin 3s linear infinite; | |
| animation: spin 3s linear infinite | |
| } | |
| #loader:after { | |
| content: ""; | |
| position: absolute; | |
| top: 15px; | |
| left: 15px; | |
| right: 15px; | |
| bottom: 15px; | |
| border-radius: 50%; | |
| border: 3px solid transparent; | |
| border-top-color: #FFF; | |
| -moz-animation: spin 1.5s linear infinite; | |
| -o-animation: spin 1.5s linear infinite; | |
| -ms-animation: spin 1.5s linear infinite; | |
| -webkit-animation: spin 1.5s linear infinite; | |
| animation: spin 1.5s linear infinite | |
| } | |
| @-webkit-keyframes spin { | |
| 0% { | |
| -webkit-transform: rotate(0deg); | |
| -ms-transform: rotate(0deg); | |
| transform: rotate(0deg) | |
|     } | |
| 100% { | |
| -webkit-transform: rotate(360deg); | |
| -ms-transform: rotate(360deg); | |
| transform: rotate(360deg) | |
|     } | |
| } | |
| @keyframes spin { | |
| 0% { | |
| -webkit-transform: rotate(0deg); | |
| -ms-transform: rotate(0deg); | |
| transform: rotate(0deg) | |
|     } | |
| 100% { | |
| -webkit-transform: rotate(360deg); | |
| -ms-transform: rotate(360deg); | |
| transform: rotate(360deg) | |
|     } | |
| } | |
| #loader-wrapper .loader-section { | |
| position: fixed; | |
| top: 0; | |
| width: 51%; | |
| height: 100%; | |
| background: #1abc9c;/* 背景色 原 #1abc9c */ | |
| z-index: 1000; | |
| -webkit-transform: translateX(0); | |
| -ms-transform: translateX(0); | |
| transform: translateX(0) | |
| } | |
| #loader-wrapper .loader-section.section-left { | |
| left: 0 | |
| } | |
| #loader-wrapper .loader-section.section-right { | |
| right: 0 | |
| } | |
| .loaded #loader-wrapper .loader-section.section-left { | |
| -webkit-transform: translateX(-100%); | |
| -ms-transform: translateX(-100%); | |
| transform: translateX(-100%); | |
| -webkit-transition: all .7s .3s cubic-bezier(0.645,0.045,0.355,1.000); | |
| transition: all .7s .3s cubic-bezier(0.645,0.045,0.355,1.000) | |
| } | |
| .loaded #loader-wrapper .loader-section.section-right { | |
| -webkit-transform: translateX(100%); | |
| -ms-transform: translateX(100%); | |
| transform: translateX(100%); | |
| -webkit-transition: all .7s .3s cubic-bezier(0.645,0.045,0.355,1.000); | |
| transition: all .7s .3s cubic-bezier(0.645,0.045,0.355,1.000) | |
| } | |
| .loaded #loader { | |
| opacity: 0; | |
| -webkit-transition: all .3s ease-out; | |
| transition: all .3s ease-out | |
| } | |
| /* 原版 load_title 是从上面飘出去,感觉太二了注销掉了,结束自动消失 */ | |
| .loaded #loader-wrapper { | |
| visibility: hidden; | |
|     /*-webkit-transform: translateY(-100%);*/ | |
|     /*-ms-transform: translateY(-100%);*/ | |
|     /*transform: translateY(-100%);*/ | |
|     /*-webkit-transition: all .3s 1s ease-out;*/ | |
|     /*transition: all .3s 1s ease-out*/ | |
| } | |
| .no-js #loader-wrapper { | |
| display: none | |
| } | |
| .no-js h1 { | |
| color: #222 | |
| } | |
| #loader-wrapper #load_title { | |
| font-family: 'Open Sans'; | |
| color: #FFF; | |
| font-size: 19px; | |
| width: 100%; | |
| text-align: center; | |
| z-index: 9999999999999; | |
| position: absolute; | |
| top: 60%; | |
| opacity: 1; | |
| line-height: 30px | |
| } | |
| #loader-wrapper #load_title span { | |
| font-weight: normal; | |
| font-style: italic; | |
| font-size: 13px; | |
| color: #FFF; | |
| opacity: .5 | |
| } | 
loading.js ( 基于 javascript,无需其他依赖,只能放在 body 内或者 body 后。推荐放在 body 第一行引入该 js! 或者如果觉得在 body 里引 js 不太好的话,往下翻,我在后面还写了个方案 2)
| // 这个 js 建议放在 body 第一行 | |
| document.body.innerHTML += ('<div id="loader-wrapper"><div id="loader"></div><div class="loader-section section-left"></div><div class="loader-section section-right"></div><div id="load_title">正在加载中,请稍后</div></div>'); | |
| window.onload = function () { | |
|     // 直接用等于可能覆盖原来的 class,所以采用 原内容 + 空格 loaded。就算 body 原来没有 class 也不会报错 | |
| document.body.className += ' loaded'; | |
| } | 
代码安放位置 <font style="color: red;">(loading.css 建议放在 head 里,loading.js 必须放在 body 内或 body 后,越靠前效果越好,推荐放在 body 第一行)</font>
| <!DOCTYPE html> | |
| <html lang="zh-CN"> | |
| <head> | |
| <title>title</title> | |
| ... | |
|     <link rel="stylesheet" href="css/loading.css"> | |
| ... | |
| </head> | |
| <body> | |
| <script src="js/loading.js"></script> | |
| ... | |
| ... | |
| ... | |
| </body> | 
<font style="color: red;"> 方案 2 不引入 js,而是在页面内实现代码逻辑 </font>
<font style="color: red;">CSS 还是同上不变,不需要引入方案 1 的 js,直接在 html 的 body 开头加上 <div id="loader-wrapper">...</div> , 在 body 末尾加 onload 事件 ,最终效果与方案 1 等价 </font>
| </font> | |
|  <!DOCTYPE html> | |
| <html lang="zh-CN"> | |
| <head> | |
| <title>title</title> | |
| ... | |
|     <!-- 引入 css --> | |
|     <link rel="stylesheet" href="css/loading.css"> | |
| ... | |
| </head> | |
| <body> | |
|     <!-- 手动加入 DIV#loader-wrapper --> | |
|     <div id="loader-wrapper"> | |
| <div id="loader"></div> | |
| <div class="loader-section section-left"></div> | |
| <div class="loader-section section-right"></div> | |
| <div id="load_title">正在加载中,请稍后</div> | |
|     </div> | |
| ... | |
| ... | |
| ... | |
| <script type="text/javascript"> | |
| window.onload = function () { | |
|             /* window 中所有元素加载完成后,给 body 加个 class -> loaded,也可以通过 jquery || vue 实现等价代码 */ | |
| document.body.className += ' loaded'; | |
|         } | |
|     </script> | |
| </body> | 
