搜尋
首頁web前端css教學一文詳解如何css實現動態弧形線條長短變化的Loading動畫

如何使用CSS 實作動態線條 Loading 動畫?以下這篇文章介紹一下使用css實現動態弧形線條長短變化的Loading動畫的3種方法,希望對大家有幫助!

一文詳解如何css實現動態弧形線條長短變化的Loading動畫

有群組朋友問我,使用CSS 如何實現如下Loading 效果:

一文詳解如何css實現動態弧形線條長短變化的Loading動畫

這是一個非常有趣的問題。

我們知道,使用CSS,我們可以非常輕鬆的實現這樣一個動畫效果:

<div></div>
div {
    width: 100px;
    height: 100px;
    border-radius: 50%;
    border: 2px solid transparent;
    border-top: 2px solid #000;
    border-left: 2px solid #000;
    animation: rotate 3s infinite linear;
}
@keyframes rotate {
    100% {
        transform: rotate(360deg);
    }
}

動畫如下:

一文詳解如何css實現動態弧形線條長短變化的Loading動畫

##與要求的線條loading 動畫相比,上述動畫缺少了比較核心的一點在於:

  • 線條在旋轉運動的過程中,長短是會改變的
所以,這裡的困難也轉變為了,如何動態的實現弧形線段的長短變化?解決了這個問題,基本上也解決了上述的線條變換 Loading 動畫。

本文將介紹CSS 當中,幾種有趣的,可能可以動態改變弧形線條長短的方式:

方法一:使用遮罩實作

第一種方法,也是比較容易想到的方式,使用遮罩的方式實作。

我們實現兩個半圓線條,一個是實際能看到的顏色,另外一個則是

和背景色相同的,相對更為粗一點的半圓線條,當兩條當線條移動的速率不一致時,我們從視覺上,也能看到動態變化的弧形線條。

看看示意圖,一看就懂:

一文詳解如何css實現動態弧形線條長短變化的Loading動畫

我們把上述紅色線條,替換成背景白色,整體的動畫效果就非常的相似了,偽代碼如下:

<div></div>
div {
    width: 200px;
    height: 200px;
}
div::before {
    position: absolute;
    content: "";
    top: 0px; left: 0px; right: 0px; bottom: 0px;
    border-radius: 50%;
    border: 3px solid transparent;
    border-top: 3px solid #000;
    border-left: 3px solid #000;
    animation: rotate 3s infinite ease-out;
}
div::after {
    position: absolute;
    content: "";
    top: -2px; left: -2px; right: -2px; bottom: -2px;
    border-radius: 50%;
    border: 7px solid transparent;
    border-bottom: 7px solid #fff;
    border-right: 7px solid #fff;
    animation: rotate 4s infinite ease-in-out;
}
@keyframes rotate {
    100% {
        transform: rotate(0deg);
    }
}

核心就是實現兩條半圓線條,一條黑色,一條背景色,兩段線條以不同的速率運動(透過動畫時間及緩動控制),效果如下:

一文詳解如何css實現動態弧形線條長短變化的Loading動畫

完整的程式碼你可以猛擊-- CodePen Demo - Linear Loading

https://codepen.io/Chokcoco/pen/PvqYNJ

上述方案最大的2 個問題在於:

  • 如果背景色不是純色,會露出餡料

  • 如果要求能展現的線段長度大於半個圓,無法完成

基於此,我們只能另闢蹊徑。

方法二:借助SVG 的stroke-* 能力

在之前非常多的文章中,都有講到過在CSS 配合SVG,我們可以實現各種簡單或複雜的線條動畫,像是簡單的:

一文詳解如何css實現動態弧形線條長短變化的Loading動畫

或自訂複雜路徑的複雜的線條動畫:

一文詳解如何css實現動態弧形線條長短變化的Loading動畫

> ; 對CSS/SVG 實現線條動畫感興趣的,但是還不太了解的,可以看看我的這篇文章--

【Web動畫】SVG 線條動畫入門

#在這裡,我們只需要一個簡單的SVG 標籤

,配合其CSS 樣式stroke-dasharraystroke-dashoffset 即可輕鬆完成上述效果:

<svg class="circular" viewbox="25 25 50 50">
  <circle class="path" cx="50" cy="50" r="20" fill="none" />
</svg>
.circular {
  width: 100px;
  height: 100px;
  animation: rotate 2s linear infinite;
}
.path {
  stroke-dasharray: 1, 200;
  stroke-dashoffset: 0;
  stroke: #000;
  animation: dash 1.5s ease-in-out infinite
}
@keyframes rotate {
  100% {
    transform: rotate(360deg);
  }
}
@keyframes dash {
  0% {
    stroke-dasharray: 1, 200;
    stroke-dashoffset: 0;
  }
  50% {
    stroke-dasharray: 89, 200;
    stroke-dashoffset: -35px;
  }
  100% {
    stroke-dasharray: 89, 200;
    stroke-dashoffset: -124px;
  }
}

簡單解釋下:

  • stroke:類比css 中的border-color,為svg 圖形設定邊框顏色;
  • stroke-dasharray:值是一組數組,沒數量上限,每個數字交替表示劃線與間隔的寬度;
  • stroke-dashoffset:dash模式到路徑開始的距離。
我們利用

stroke-dasharray 將原本完整的線條切割成多段,假設是stroke-dasharray: 10, 10 表示這樣一個圖形:

一文詳解如何css實現動態弧形線條長短變化的Loading動畫

第一個10 表示線段的長度,第二個10 表示兩條可見的線段中間的空隙。

而實際程式碼中的

stroke-dasharray: 1, 200,表示在兩個1px 的線段中間,間隔200px,由於直徑40px 的圓的周長為40 * π ≈ 125.6px,小於200,所以實際如圖下,只有一個點:

一文詳解如何css實現動態弧形線條長短變化的Loading動畫

同理,stroke-dasharray: 89, 200 表示:

一文詳解如何css實現動態弧形線條長短變化的Loading動畫

通过 animation,让线段在这两种状态之间补间变换。而 stroke-dashoffset 的作用则是将线段向前推移,配合父容器的 transform: rotate() 旋转动画,使得视觉效果,线段是在一直在向一个方向旋转。结果如下:

一文詳解如何css實現動態弧形線條長短變化的Loading動畫

完整的代码你可以戳这里:CodePen Demo -- Linear loading

https://codepen.io/Chokcoco/pen/jOGQGJP?editors=1100

OK,还会有同学说了,我不想引入 SVG 标签,我只想使用纯 CSS 方案。这里,还有一种利用 CSS @property 的纯 CSS 方案。

方法三:使用 CSS @property 让 conic-gradient 动起来

这里我们需要借助 CSS @property 的能力,使得本来无法实现动画效果的角向渐变,动起来。

正常来说,渐变是无法进行动画效果的,如下所示:

<div></div>
.normal {
    width: 200px;
    height: 200px;
    border-radius: 50%;
    background: conic-gradient(yellowgreen, yellowgreen 25%, transparent 25%, transparent 100%); 
    transition: background 300ms;
    
    &:hover {
        background: conic-gradient(yellowgreen, yellowgreen 60%, transparent 60.1%, transparent 100%); 
    }
}

将会得到这样一种效果,由于 conic-gradient 是不支持过渡动画的,得到的是一帧向另外一帧的直接变化:

1一文詳解如何css實現動態弧形線條長短變化的Loading動畫

好,使用 CSS @property 自定义变量改造一下:

@property --per {
  syntax: &#39;<percentage>&#39;;
  inherits: false;
  initial-value: 25%;
}

div {
    background: conic-gradient(yellowgreen, yellowgreen var(--per), transparent var(--per), transparent 100%); 
    transition: --per 300ms linear;
    
    &:hover {
        --per: 60%;
    }
}

看看改造后的效果:

1一文詳解如何css實現動態弧形線條長短變化的Loading動畫

在这里,我们可以让渐变动态的动起来,赋予了动画的能力。

我们只需要再引入 mask,将中间部分裁切掉,即可实现上述线条 Loading 动画,伪代码如下:

<div></div>
@property --per {
    syntax: "<percentage>";
    inherits: false;
    initial-value: 10%;
}

div {
    position: relative;
    width: 100px;
    height: 100px;
    border-radius: 50%;
    animation: rotate 11s infinite ease-in-out;

    &::before {
        content: "";
        position: absolute;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        border-radius: 50%;
        background: conic-gradient(transparent, transparent var(--per), #fa7 var(--per), #fa7);
        mask: radial-gradient(transparent, transparent 47.5px, #000 48px, #000);
        animation: change 3s infinite cubic-bezier(0.57, 0.29, 0.49, 0.76);
    }
}

@keyframes change {
    50% {
        transform: rotate(270deg);
        --per: 98%;
    }
    100% {
        transform: rotate(720deg);
    }
}

@keyframes rotate {
    100% {
        transform: rotate(360deg);
        filter: hue-rotate(360deg);
    }
}

这里,我顺便加上了 filter: hue-rotate(),让线条在旋转的同时,颜色也跟着变化,最终效果如下,这是一个纯 CSS 解决方案:

1一文詳解如何css實現動態弧形線條長短變化的Loading動畫

完整的代码你可以猛击这里:Linear Loading Animation

https://codepen.io/Chokcoco/pen/ZEXmJxP?editors=1100

本方案的唯一问题在于,当前 CSS @property 的兼容性稍微不是那么乐观。当然,未来可期。

最后

简单总结一下,本文介绍了 3 种实现动态弧形线条长短变化的 Loading 动画,当然,它们各有优劣,实际使用的时候根据实际情况具体取舍。有的时候,切图也许也是更省时间的一种方式:)

好了,本文到此结束,希望本文对你有所帮助 :)

(学习视频分享:css视频教程

以上是一文詳解如何css實現動態弧形線條長短變化的Loading動畫的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:segmentfault。如有侵權,請聯絡admin@php.cn刪除
' CSS4”更新' CSS4”更新Apr 11, 2025 pm 12:05 PM

自從我第一次介紹了CSS4面中的事情以來,就已經進行了更多的討論。我將在這裡從其他人那裡匯集我最喜歡的想法。有

三種代碼三種代碼Apr 11, 2025 pm 12:02 PM

每次啟動一個新項目時,我都會將我正在查看的代碼分為三種類型,或者如果您願意的話。我認為這些類型可以應用於

https很容易!https很容易!Apr 11, 2025 am 11:51 AM

我對公開哀悼HTTPS的複雜性感到內gui。過去,我從第三方供應商那裡購買了SSL證書,並且遇到了麻煩

HTML數據屬性指南HTML數據屬性指南Apr 11, 2025 am 11:50 AM

您想了解的有關HTML,CSS和JavaScript中數據屬性的所有信息。

了解JavaScript中的不變性了解JavaScript中的不變性Apr 11, 2025 am 11:47 AM

如果您以前從未在JavaScript中使用不變性,則可能會發現很容易將其與為新值或重新分配分配變量的混淆。

具有現代CSS功能的定製樣式表單輸入具有現代CSS功能的定製樣式表單輸入Apr 11, 2025 am 11:45 AM

如今,可以在語義上且易於訪問的同時構建自定義的複選框,無線電按鈕和切換開關。我們甚至不需要

腳註字符腳註字符Apr 11, 2025 am 11:34 AM

有特殊的超級數字字符有時非常適合腳註。他們在這裡:

如何使用HTML,CSS和JavaScript創建動畫倒計時計時器如何使用HTML,CSS和JavaScript創建動畫倒計時計時器Apr 11, 2025 am 11:29 AM

您是否曾經在項目上需要一個倒計時計時器?對於這樣的東西,可以自然訪問插件,但實際上更多

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。