N 種僅僅使用 HTML/CSS 實現(xiàn)各類進度條的方式
作者:chokcoco
來源:SegmentFault 思否社區(qū)
本文將介紹如何使用 HTML/CSS 創(chuàng)建各種基礎(chǔ)進度條及花式進度條及其動畫的方式,通過本文,你可能可以學(xué)會:
通過 HTML 標簽 <meter> 創(chuàng)建進度條 通過 HTML 標簽 <progress> 創(chuàng)建進度條 HTML 實現(xiàn)進度條的局限性 使用 CSS 百分比、漸變創(chuàng)建普通進度條及其動畫 使用 CSS 創(chuàng)建圓環(huán)形進度條 使用 CSS 創(chuàng)建球形進度條 使用 CSS 創(chuàng)建 3D 進度條
HTML 標簽 -- meter & progress
<meter>:用來顯示已知范圍的標量值或者分數(shù)值 <progress>:用來顯示一項任務(wù)的完成進度,通常情況下,該元素都顯示為一個進度條
<p>
<span>完成度:</span>
<meter min="0" max="500" value="350">350 degrees</meter>
</p>
meter {
width: 200px;
}

<p>
<label for="file">完成度:</label>
<progress max="100" value="70"> 70% </progress>
</p>
progress {
width: 200px;
}

meter & progress 之間的差異
<meter>:表示已知范圍內(nèi)的標量測量值或分數(shù)值 <progress>:表示任務(wù)的完成進度
meter & progress 的局限性
我們無法有效的修改 <meter> 和 <progress> 標簽的樣式,譬如背景色,進度前景色等。并且,最為致命的是,瀏覽器默認樣式的表現(xiàn)在不同瀏覽器之間并不一致。這給追求穩(wěn)定,UI 表現(xiàn)一致的業(yè)務(wù)來說,是災(zāi)難性的缺點! 我們無法給他添加一些動畫效果、交互效果,因為一些實際的應(yīng)用場景中,肯定不是簡單的展示一個進度條僅此而已
利用 CSS 實現(xiàn)進度條
使用百分比實現(xiàn)進度條
<div class="g-container">
<div class="g-progress"></div>
</div>
.g-container {
width: 240px;
height: 25px;
border-radius: 25px;
background: #eee;
}
.g-progress {
width: 50%;
height: inherit;
border-radius: 25px 0 0 25px;
background: #0f0;
}

利用 HTML style 屬性填寫完整的 width 值,譬如 <div class="g-progress" style="width: 50%"></div> 或者利用 CSS 自定義屬性 <div class="g-progress" style="--progress: 50%"></div> 配合實際 CSS 中的 width: var(--progress) 完全的自定義樣式,以及可以輕松的添加輔助豐富的動畫和交互效果
.g-progress {
// ...
transition: width .2s linear;
}


單標簽使用漸變實現(xiàn)
<div class="g-container">
<div class="g-progress"></div>
</div>
<div class="g-progress"></div>
.g-progress {
width: 240px;
height: 25px;
border-radius: 25px;
background: linear-gradient(90deg, #0f0, #0ff 70%, transparent 0);
border: 1px solid #eee;
}

<div class="g-progress" style="--progress: 50%"></div>
.g-progress {
background: linear-gradient(90deg, #0f0, #0ff var(--progress), transparent 0);
}
<div class="g-progress" style="--progress: 70%"></div>
@property --progress {
syntax: '<percentage>';
inherits: false;
initial-value: 0%;
}
.g-progress {
margin: auto;
width: 240px;
height: 25px;
border-radius: 25px;
background: linear-gradient(90deg, #0f0, #0ff var(--progress), transparent 0);
border: 1px solid #eee;
transition: .3s --progress;
}

寬度(使用百分比為單位的寬度更為直接) 漸變(控制漸變的過渡點的百分比的值) 漸變的 background-size transfrom: scale()(縮放也能改變寬度大小) clip-path 進行裁剪 ...(等等等等)
圓弧形進度條

<div class="g-progress"></div>
.g-progress {
width: 160px;
height: 160px;
border-radius: 50%;
background: conic-gradient(#FFCDB2 0, #FFCDB2 25%, #B5838D 25%, #B5838D);
}


.g-progress {
background: conic-gradient(#FFCDB2 0, #FFCDB2 25%, #B5838D 25%, #B5838D);
+ mask: radial-gradient(transparent, transparent 50%, #000 50%, #000 0);
}
.g-progress {
width: 160px;
height: 160px;
border-radius: 50%;
mask: radial-gradient(transparent, transparent 50%, #000 51%, #000 0);
background:
conic-gradient(
#FFCDB2 0, #FFCDB2 25%,
#B5838D 25%, #B5838D 50%,
#673ab7 50%, #673ab7 90%,
#ff5722 90.2%, #ff5722 100%
);
}

角向漸變實現(xiàn)圓弧進度條的局限性
當然進度百分比不是類似于 0°、90°、180°、270°、360° 這類數(shù)字時,使用角向漸變時,不同顏色間的銜接處會有明顯的鋸齒。

{
- background: conic-gradient(#FFCDB2 0, #FFCDB2 27%, #B5838D 27%, #B5838D)`
+ background: conic-gradient(#FFCDB2 0, #FFCDB2 27%, #B5838D 27.2%, #B5838D)`
}

對于開頭和結(jié)尾需要圓形的圓弧進度條實現(xiàn)起來較為麻煩

球形進度條



<div class="container">
<div class="wave-change"></div>
<div class="wave"></div>
</div>.container {
width: 200px;
height: 200px;
border: 5px solid rgb(118, 218, 255);
border-radius: 50%;
overflow: hidden;
}
.wave-change {
position: absolute;
width: 200px;
height: 200px;
left: 0;
top: 0;
animation: change 12s infinite linear;
&::before,
&::after{
content: "";
position: absolute;
width: 400px;
height: 400px;
top: 0;
left: 50%;
background-color: rgba(255, 255, 255, .6);
border-radius: 45% 47% 43% 46%;
transform: translate(-50%, -70%) rotate(0);
animation: rotate 7s linear infinite;
z-index: 1;
}
&::after {
border-radius: 47% 42% 46% 44%;
background-color: rgba(255, 255, 255, .8);
transform: translate(-50%, -70%) rotate(0);
animation: rotate 9s linear -4s infinite;
z-index: 2;
}
}
.wave {
position: relative;
width: 200px;
height: 200px;
background-color: rgb(118, 218, 255);
border-radius: 50%;
}
p {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-size: 36px;
color: #000;
z-index: 10;
}
@keyframes rotate {
to {
transform: translate(-50%, -70%) rotate(360deg);
}
}
@keyframes change {
from {
top: 80px;
}
to {
top: -120px;
}
}

CodePen Demo -- Pure Css Wave Progress bar
https://codepen.io/Chokcoco/pen/EXJrdB
CodePen Demo -- Pure Css Wave Progress bar Animation
https://codepen.io/Chokcoco/pen/rNzGbWY
3D 進度條
<div class="demo-cube perspective">
<ul class="cube">
<li class="top"></li>
<li class="bottom"></li>
<li class="front"></li>
<li class="back"></li>
<li class="right"></li>
<li class="left"></li>
</ul>
</div>

.demo-cube {
position: relative;
.cube {
position: absolute;
top: 50%;
left: 50%;
width: 300px;
height: 100px;
transform-style: preserve-3d;
transform: translate(-50%, -50%) rotateX(-33.5deg);
li {
position: absolute;
width: 300px;
height: 100px;
background: linear-gradient(90deg, rgba(156, 39, 176, .3), rgba(255, 34, 109, .8) 70%, rgba(255, 255, 255, .6) 70%, rgba(255, 255, 255, .6));
}
.top {
transform: rotateX(90deg) translateZ(50px);
}
.bottom {
transform: rotateX(-90deg) translateZ(50px);
}
.front {
transform: translateZ(50px);
}
.back {
transform: rotateX(-180deg) translateZ(50px);
}
}
}
利用 CSS Property 給 3D 進度條加上動畫
@property --per {
syntax: '<percentage>';
inherits: false;
initial-value: 0%;
}
.demo-cube .cube {
.top,
.front,
.bottom,
.back {
background: linear-gradient(90deg, rgba(255, 217, 34, .6), rgba(255, 34, 109, .8) var(--per), rgba(255, 34, 109, .1) var(--per), rgba(255, 34, 109, .1));
animation: perChange 6s infinite;
}
}
@keyframes perChange {
0% {
--per: 0%;
}
90%,
to {
--per: 80%;
}
}

擴展延伸



最后

評論
圖片
表情
