如何只用 CSS 完成漂亮的加載

圖片描述

爲何要作加載

只想說, 本文最重要的是對 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 自己

圖片描述

一開始咱們先實現 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;
  }
}

如今效果長這樣

圖片描述

接下來, 咱們就用 keyframediv.logo::before 的第一個動畫

咱們將 widthheight 初始都爲 0, 而後用 keyframewidth
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 重複相同的操做, 不要忘了調整時間和反轉 widthheight. 如今, 咱們就有了最外層邊框的整個動畫.

方塊動畫

最後,咱們一塊兒來設置方塊的動畫

咱們最大的挑戰是沒法鏈接 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)

相關文章
相關標籤/搜索