CSS 實(shí)現(xiàn)七彩圓環(huán)loading動(dòng)畫(huà)

前言

??CSS 實(shí)現(xiàn)七彩圓環(huán)loading動(dòng)畫(huà),速速來(lái)Get吧~

??文末分享源代碼。記得點(diǎn)贊+關(guān)注+收藏!

1.實(shí)現(xiàn)效果

在這里插入圖片描述

2.實(shí)現(xiàn)步驟

  • 定義父容器寬度為--w,每個(gè)圓環(huán)之間的gap間距為--gap,圓環(huán)的border邊框?qū)挒?-border;
:root {
 --border: 5px;
 --gap: 30px;
 --w: 200px;
}
  • 如何繪制一個(gè)半圓環(huán)?
  • 定義一個(gè)div元素,假設(shè)寬為200px,高為200px/2(即為寬度的一半),圓角,設(shè)置border邊框
在這里插入圖片描述
div{
    width: 200px;
    height: 100px;
    border: 5px solid #e94545;
    border-radius: 50%;
}
  • 修改border-radius為50% 50% 0 0/100% 100% 0 0
在這里插入圖片描述
 + border-radius: 50% 50% 0 0/100% 100% 0 0;
 + border-radius: 50%;
  • 去掉底部邊框,就可以得到一個(gè)半圓環(huán)了
在這里插入圖片描述
 + border-bottom: none;
  • 在父容器內(nèi)定義七個(gè)半圓環(huán),為每個(gè)圓環(huán)添加自定義變量,--c表示當(dāng)前圓環(huán)的邊框顏色,--i表示當(dāng)前圓環(huán)的索引位置(從0開(kāi)始,依次+1)
 <section>
  <div class="loader-item" style="--c: #e94545; --i: 0"></div>
  <div class="loader-item" style="--c: #eb8f34; --i: 1"></div>
  <div class="loader-item" style="--c: #eecf69; --i: 2"></div>
  <div class="loader-item" style="--c: #215221; --i: 3"></div>
  <div class="loader-item" style="--c: #87bb80; --i: 4"></div>
  <div class="loader-item" style="--c: #87ceeb; --i: 5"></div>
  <div class="loader-item" style="--c: #c393eb; --i: 6"></div>
</section>
section {
  width: var(--w);
  height: var(--w);
  position: relative;
}
  • 為每個(gè)半圓環(huán)添加樣式,基于父容器absolute定位,水平居中,left為50% - 寬度的一半
  • 第一個(gè)圓環(huán)的寬度為--w,每個(gè)圓環(huán)的高度都為寬度的一半
在這里插入圖片描述
  • 每個(gè)圓環(huán)間的gap為--gap,所以第二個(gè)圓環(huán)的寬度為w-gap*2
在這里插入圖片描述
  • 第三個(gè)半圓環(huán)的寬度為w-gap22
在這里插入圖片描述
  • 可以得到,每個(gè)圓環(huán)的寬度為calc(var(--w) - var(--gap) * 2 * var(--i)),i為當(dāng)前圓環(huán)的索引位置(從0開(kāi)始,依次+1)
在這里插入圖片描述
.loader-item {
    --width: calc(var(--w) - var(--gap) * 2 * var(--i));
    width: var(--width);
    height: calc(var(--width) / 2);
    border: var(--border) solid var(--c);
    border-radius: 50% 50% 0 0/100% 100% 0 0;
    border-bottom: none;
    position: absolute;
    left: calc(50% - var(--width) / 2);
 }
  • 為每個(gè)半圓環(huán)設(shè)置top,第一個(gè)圓環(huán)為0,第二個(gè)為gap,第三個(gè)為gap*2,可得到top為 calc(var(--gap) * var(--i))
在這里插入圖片描述
.loader-item{
 + top: calc(var(--gap) * var(--i));
}
  • 為每個(gè)圓環(huán)添加旋轉(zhuǎn)動(dòng)畫(huà),哎嘛呀,這轉(zhuǎn)的也太不和諧了
在這里插入圖片描述
.loader-item{
 + animation: rotate 2s cubic-bezier(0.11, 0.85, 0.22, 1.3) infinite;
}
@keyframes rotate {
    0%,
    25% {
      transform: rotate(0deg);
    }
    100% {
      transform: rotate(360deg);
    }
}
  • 添加transform-origin,設(shè)置為 50% 100%,這才對(duì)了,和諧多了
在這里插入圖片描述
.loader-item{
 + transform-origin: 50% 100%;
}
  • 設(shè)置動(dòng)畫(huà)延遲,第一個(gè)圓環(huán)延遲-0ms,第二個(gè)延遲-60ms,第三個(gè)延遲-120ms,即calc(-60ms *
    var(--i)),i為當(dāng)前圓環(huán)的索引位置(從0開(kāi)始,依次+1)
在這里插入圖片描述
.loader-item{
 + animation-delay: calc(-60ms * var(--i));
}
  • 父容器添加hover事件,當(dāng)hover時(shí)候,將每個(gè)圓環(huán)的亮度提示,并暫停動(dòng)畫(huà),就完成了啦~
在這里插入圖片描述
 section:hover .loader-item {
  filter: brightness(1.5);
  animation-play-state: paused;
 }
  • 每個(gè)半圓環(huán),添加0.5的transition過(guò)渡效果
.loader-item{
 + transition: all 0.5s;
}

3.實(shí)現(xiàn)代碼

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
  </head>
  <link rel="stylesheet" href="../common.css" />
  <style>
    :root {
      --border: 5px;
      --gap: 15px;
      --w: 200px;
    }
    section {
      width: var(--w);
      height: var(--w);
      position: relative;
    }
    .loader-item {
      --width: calc(var(--w) - var(--gap) * 2 * var(--i));
      width: var(--width);
      height: calc(var(--width) / 2);
      border: var(--border) solid var(--c);
      border-radius: 50% 50% 0 0/100% 100% 0 0;
      border-bottom: none;
      position: absolute;
      left: calc(50% - var(--width) / 2);
      top: calc(var(--gap) * var(--i));
      transform-origin: 50% 100%;
      animation: rotate 2s cubic-bezier(0.11, 0.85, 0.22, 1.3) infinite;
      animation-delay: calc(-60ms * var(--i));
      transition: all 0.5s;
    }
    section:hover .loader-item {
      filter: brightness(1.5);
      animation-play-state: paused;
    }
    @keyframes rotate {
      0%,
      25% {
        transform: rotate(0deg);
      }
      100% {
        transform: rotate(360deg);
      }
    }
  </style>
  <body>
    <section>
      <div class="loader-item" style="--c: #e94545; --i: 0"></div>
      <div class="loader-item" style="--c: #eb8f34; --i: 1"></div>
      <div class="loader-item" style="--c: #eecf69; --i: 2"></div>
      <div class="loader-item" style="--c: #215221; --i: 3"></div>
      <div class="loader-item" style="--c: #87bb80; --i: 4"></div>
      <div class="loader-item" style="--c: #87ceeb; --i: 5"></div>
      <div class="loader-item" style="--c: #c393eb; --i: 6"></div>
    </section>
  </body>
</html>

4.寫(xiě)在最后??

看完本文如果覺(jué)得對(duì)你有一丟丟幫助,記得點(diǎn)贊+關(guān)注+收藏鴨 ??
更多相關(guān)內(nèi)容,關(guān)注??蘇蘇的bug,??蘇蘇的github,??蘇蘇的碼云~
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容