只想說, 本文最重要的是對 CSS
, 僞元素
, keyframe
的分享, 以及讀者對這些東西的真正掌握
, 我並不是慫恿
你們在每個頁面的前面都去加一個酷炫的加載css
不一樣的頁面, 對加載的設計
也就可能不一樣. 本文設計的加載適合大多數頁面.html
而且, 本文假設讀者已經很是熟悉僞元素
, CSS 動畫屬性
和keyframe
, 若是讀者想重溫, 下面兩篇文章可作參考less
在開始一塊兒構建它前, 咱們先看看它最後的效果
動畫
正如你所看到的, 咱們將經歷 4 個步驟
spa
出現
滑入
劃出
消失
咱們只須要 animation-direction: alternate
來完成步驟 1 和 2, 步驟 3 和 步驟 4 咱們可使用 reverse
, 另外, 咱們可使用 animation-iteration-count: infinite
重複動畫設計
首先, 咱們先書寫好基本的 HTML
結構code
<!doctype html> <html> <head> <!-- <link rel="preload"> for CSS, JS, and font files --> <style type="text/css"> /* * All the CSS for the loader * Minified and vendor prefixed */ </style> </head> <body> <div class="loader"> <!-- HTML for the loader --> </div> <header /> <main /> <footer /> <!-- Tags for CSS and JS files --> </body> </html>
一開始咱們先實現 logo
自己, 而不是最終版本的效果htm
父級元素 logo
, 不一樣顏色的方塊都是它的子元素blog
<div class="logo"> <div class="white"></div> <div class="orange"></div> <div class="red"></div> </div>
咱們用 less
來實現圖片
.logo { position: relative; width: 100px; height: 100px; border: 4px solid black; box-sizing: border-box; background-color: white; & > div { position: absolute; } .red { top: 0; bottom: 0; left: 0; width: 27%; border-right: 4px solid black; background-color: #EA5664; } /* Similar code for div.orange and div.white */ }
logo
的效果圖以下
接下來, 咱們將進入棘手(有趣
)的部分
CSS 不容許咱們直接對 div.logo
的邊框進行設置達到咱們想要的效果, 因此咱們必須去除
原有的邊框, 採用其餘的辦法來實現
咱們要把四個邊框
分割開來, 而後讓它們有序
地出現, 因此, 咱們可使用覆蓋整個 div
的兩個透明的僞元素
廢話少說, 就讓咱們開始吧, 咱們先作出它最初始的樣子. 咱們讓 div.logo :: before
絕對位於 div.logo
的左上角,表明方塊的上邊框和右邊框, 讓 div.logo::after
絕對定位 div.logo
的右下角, 表明方塊的下邊框和左邊框
如今, less 代碼變成了這樣
.logo { position: relative; width: 100px; height: 100px; box-sizing: border-box; background-color: white; &::before, &::after { content: ''; position: absolute; width: 100%; height: 100%; box-sizing: border-box; border: 4px solid transparent; } &::before { top: 0; left: 0; border-top-color: black; border-right-color: black; } &::after { bottom: 0; right: 0; border-bottom-color: red; // Red for demo purposes only border-left-color: red; } }
如今效果
長這樣
接下來, 咱們就用 keyframe
作 div.logo::before
的第一個動畫
咱們將 width
和 height
初始都爲 0
, 而後用 keyframe
將 width
和height
調整到 100%
隨着咱們在相應的時間把邊框從透明
變爲黑色
, 咱們想要的最開始的效果就出來了
該代碼展現了僞元素的初始動畫
div.logo { &::before, &::after { /* ... */ animation-timing-function: linear; } &::before { /* ... */ animation: border-before 1.5s infinite; animation-direction: alternate; } } @keyframes border-before { 0% { width: 0; height: 0; border-right-color: transparent; } 24.99% { border-right-color: transparent; } 25% { height: 0; width: 100%; border-right-color: black; } 50%, 100% { width: 100%; height: 100%; } }
咱們對 div.logo::after
重複相同的操做, 不要忘了調整時間和反轉 width
和 height
. 如今, 咱們就有了最外層邊框的整個動畫.
最後,咱們一塊兒來設置方塊
的動畫
咱們最大的挑戰是沒法鏈接 keyframes
。由於,咱們最終想要的動畫中每一個小方框都有必定的順序
, 爲此, 咱們做以下改變
0 to 25%
:上邊框和右邊框顯現25 to 50%
:下邊框和左邊框顯現50 to 65%
:紅色小方塊顯現65 to 80%
:橙色小方塊顯現75 to 90%
:白色小方塊顯現紅色小方框 keyframe
以下
@keyframes red { 0%, 50% { width: 0; opacity: 0; } 50.01% { opacity: 1; } 65%, 100% { width: 27%; opacity: 1; } }
重複
上面的代碼,就可完成咱們整個動畫, 是否是很完美
感謝你的閱讀,最後附上 全部的源碼,但我的建議,不要直接閱讀源碼,根據上面的提示在 codepen
中本身來一遍纔是最佳實踐
原文連接
: How to create a beautiful animated loader with nothing but CSS (Julien Benchetrit)