作者:_island
https://juejin.cn/post/6992141459977682951
前言
在一些前端項(xiàng)目中,它們會(huì)涉及文件的上傳 / 下載 功能,當(dāng)文件在進(jìn)行上傳 / 下載時(shí),我們?cè)撛趺锤玫南蛴脩?hù)進(jìn)行進(jìn)度反饋呢?我們常見(jiàn)的有彈窗式進(jìn)度條、吸頂式進(jìn)度條 ...
本篇章將給大家?guī)?lái)按鈕式進(jìn)度條,并手把手帶領(lǐng)大家一步步的從零手寫(xiě)按鈕式進(jìn)度條 ?????
話(huà)不多說(shuō),先看看成品再碼
實(shí)現(xiàn)效果
1.gif原理
創(chuàng)建一個(gè)div
作為按鈕的總體,在按鈕里邊放入3
個(gè)div
,分別是進(jìn)度條元素,圖標(biāo)元素,文本元素,我們將按鈕設(shè)置為相對(duì)定位,將進(jìn)度條元素設(shè)置為絕對(duì)定位,利用top
和left
值來(lái)控制進(jìn)度條,讓我們用碼實(shí)現(xiàn)!
2.png用碼實(shí)現(xiàn)
碼出基本樣式
<div class="button">
<span class="text">download</span>
</div>
復(fù)制代碼
.button {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
position: relative;
display: flex;
align-items: center;
justify-content: center;
width: 160px;
height: 40px;
color: black;
background: white;
border-radius: 10px;
margin: 015px;
font-size: 18px;
text-decoration: none;
overflow: hidden;
}
復(fù)制代碼
3.png
很快,我們按鈕的基本樣式已經(jīng)寫(xiě)出來(lái)了,接下來(lái)我們先實(shí)現(xiàn)進(jìn)度條效果,在.button
元素下創(chuàng)建一個(gè)span
標(biāo)簽,并綁定上一個(gè)progress
類(lèi)名作為進(jìn)度條元素。這里不能使用偽元素,因?yàn)楹罄m(xù)我們需要使用JavaScript
來(lái)控制按鈕的狀態(tài)。而偽元素是不能通過(guò)JavaScript
被查找到的。
后續(xù)我會(huì)出一篇關(guān)于偽元素的文章 關(guān)注我 不迷路 ?? ??
<div class="button">
<span class="text">download</span>
<span class="progress"></span>
</div>
復(fù)制代碼
把進(jìn)度條元素的樣式寫(xiě)上
.progress {
content: '';
position: absolute;
top: 90%;
left: -100%;
width: 100%;
height: 100%;
background: #4776E6;
background: -webkit-linear-gradient(to right, #8E54E9, #4776E6);
background: linear-gradient(to right, #8E54E9, #4776E6);
transition: all 4s;
}
復(fù)制代碼
我們先把overflow
的hidden
屬性注釋掉,可以看到現(xiàn)在.progress
元素位于按鈕元素的左下邊。露出10%
的高度顯示在按鈕可見(jiàn)范圍中。后面我們通過(guò)JavaScript
的API
來(lái)獲取到.progress
元素,控制該元素的left
值就可以實(shí)現(xiàn)進(jìn)度條效果啦!
4.png碼出下載效果
我們使用JavaScript
中querySelectorAll
方法,獲取.button
和.progress
元素,及.text
元素。
const btn = document.querySelectorAll('.button')[0];
const pr = document.querySelectorAll('.progress')[0];
const text = document.querySelectorAll('.text')[0];
復(fù)制代碼
給.button
元素添加點(diǎn)擊事件,當(dāng)按鈕被點(diǎn)擊時(shí)我們將按鈕的left
值設(shè)置為0
,也就是進(jìn)度100%
的效果。
btn.addEventListener('click', () => {
pr.style.left = '0';
});
復(fù)制代碼
5.gif
接下來(lái),我們把按鈕元素的overflow
屬性設(shè)置為hidden
時(shí)。
6.gif
到了這里,我們已經(jīng)完成了進(jìn)度條效果,但對(duì)比效果圖還是差了那么一點(diǎn)點(diǎn),當(dāng)進(jìn)度條到100%
之后,我們需要將.progress
元素的top
值設(shè)置為0
,把整塊元素上移。在點(diǎn)擊事件后加入以下代碼:
setTimeout(() => {
pr.style.top = '0';
pr.style.transitionDuration = '1s';
text.style.color = 'white';
text.innerText = 'downloaded';
}, 4000);
復(fù)制代碼
另外,在.progress
元素上移后它會(huì)將我們的.text
元素覆蓋上去,為此我們需要將.text
的層級(jí)提升下。
.text{
z-index: 10;
}
復(fù)制代碼
7.gif引入圖標(biāo)
在HTML
中引入 font awesome
這個(gè)圖標(biāo)庫(kù)。
<link href="https://cdn.bootcdn.net/ajax/libs/font-awesome/5.15.3/css/all.css" rel="stylesheet">
復(fù)制代碼
我們需要用到的圖標(biāo)分別:
<i class="fa fa-arrow-down" aria-hidden="true"></i>
<i class="fa fa-download" aria-hidden="true"></i>
<i class="fa fa-check" aria-hidden="true"></i>
復(fù)制代碼
我們?cè)?/span>.button
元素中插入這個(gè)i
標(biāo)簽,為了圖標(biāo)不被進(jìn)度條元素覆蓋,同樣把層級(jí)設(shè)置為10
。
<i class="fa fa-arrow-down" aria-hidden="true"></i>
復(fù)制代碼
i {
margin: 0 8px 0 0;
font-size: 16px;
z-index: 10;
}
復(fù)制代碼
8.png
給這個(gè)圖標(biāo)設(shè)置一個(gè)循環(huán)動(dòng)畫(huà),這樣可以用來(lái)吸引用戶(hù)眼球從而促使去點(diǎn)擊它 。
@keyframes tapDownload {
0% {
transform: translateY(2px);
}
100% {
transform: translateY(0);
}
}
.fa-arrow-down{
animation: tapDownload 1s ease infinite;
}
復(fù)制代碼
9.gif
加了這個(gè)動(dòng)效之后,用戶(hù)是不是更有點(diǎn)擊欲啦?
動(dòng)態(tài)更換圖標(biāo)
同樣,我們使用JavaScript
中querySelectorAll
方法,獲取icon
元素。
const icon = document.querySelectorAll('.fa')[0];
復(fù)制代碼
通過(guò)對(duì)比上面三個(gè)圖標(biāo)元素,我們發(fā)現(xiàn)它們都有共同的類(lèi)名為fa,而不同的是后面fa-*
這個(gè)類(lèi),當(dāng)按鈕狀態(tài)改變時(shí)就將對(duì)應(yīng)的類(lèi)名移除后再添加上新的類(lèi)名即可,在按鈕的點(diǎn)擊事件中添加以下代碼:
btn.addEventListener('click', () => {
pr.style.left = '0';
icon.classList.remove('fa-arrow-down');
icon.classList.add('fa-download');
text.innerText = 'downloading';
setTimeout(() => {
// 忽略了一些代碼
icon.style.color = 'white';
icon.classList.remove('fa-download');
icon.classList.add('fa-check');
}, 4000);
});
復(fù)制代碼
在下載過(guò)程中,我們給下載圖標(biāo)的fa-download
類(lèi)綁定一個(gè)幀動(dòng)畫(huà)。
@keyframes downloading {
0% {
transform: scale(.7);
}
100% {
transform: scale(1);
}
}
.fa-download {
animation: downloading 1s ease infinite alternate-reverse;
}
復(fù)制代碼
10.gif最后
本文帶著大家從零實(shí)現(xiàn)到一個(gè)進(jìn)度條按鈕,使用前端三件套HTML
CSS
JavaScript
進(jìn)行進(jìn)度條式按鈕開(kāi)發(fā)。還引入的font awesome
庫(kù)。希望大家能從中有所收獲,寫(xiě)出更好更炫酷的動(dòng)畫(huà)效果。
閱讀原文:原文鏈接
該文章在 2025/7/21 10:18:14 編輯過(guò)