vue實(shí)現(xiàn)簡潔文件上傳進(jìn)度條功能
一、效果展示

二、代碼
const uploadProgress = ref(); //上傳進(jìn)度
//進(jìn)度絲滑更新
//進(jìn)度,時常
const ProgressChange = (targetPercent: number, duration: number) => {
//performance.now() 是瀏覽器提供的一個高性能時間 API,它返回一個 DOMHighResTimeStamp,
//這個時間戳提供了當(dāng)前頁面從加載到現(xiàn)在所經(jīng)過的毫秒數(shù),具有很高的精度,適合用來測量腳本執(zhí)行時間、動畫幀間隔等
const startTime = performance.now();
//獲取當(dāng)前進(jìn)度
const startPercent = uploadProgress.value;
const step = (currentTime: number) => {
// 計(jì)算當(dāng)前進(jìn)度
const elapsedTime = currentTime - startTime;
// 修改進(jìn)度條的百分比實(shí)現(xiàn)動畫效果
let currentPercent = easeInOut(
elapsedTime,
startPercent,
targetPercent - startPercent,
duration
);
// 確保百分比不超過100且不小于0
currentPercent = Math.min(Math.max(currentPercent, 0), 100);
// 更新進(jìn)度條
uploadProgress.value = Math.round(currentPercent);
// 如果動畫未結(jié)束,繼續(xù)執(zhí)行動畫
if (currentPercent < 100 && elapsedTime < duration) {
requestAnimationFrame(step);
} else {
uploadProgress.value = Math.round(targetPercent); // 確保最終值準(zhǔn)確無誤
}
};
// 使用函數(shù)使動畫更加平滑
const easeInOut = (t: number, b: number, c: number, d: number) => {
t /= d / 2;
if (t < 1) return (c / 2) * t * t * t + b;
t -= 2;
return (c / 2) * (t * t * t + 2) + b;
};
requestAnimationFrame(step);
};
//選擇文件
const handleFileChange = async (event: any) => {
uploadProgress.value = 0;
const file = event.target.files[0];
fileNmae.value = file.name;
if (file) {
const reader = new FileReader();
const updateProgress = (event: ProgressEvent) => {
if (event.lengthComputable) {
const totalDuration = 1000; // 1秒,單位為毫秒
const percentComplete = (event.loaded / event.total) * 100;
ProgressChange(percentComplete, totalDuration);
}
};
reader.readAsDataURL(file);
reader.onprogress = updateProgress;
reader.onload = (e) => {
if (typeof e.target?.result == "string") {
imageUrl.value = e.target.result;
}
reader.onprogress = null;
fileInfo.size = Number((file.size / 1024).toFixed(2));
};
}三、實(shí)現(xiàn)原理
1.通過performance.now()獲取動畫的時間戳,用于創(chuàng)建流暢的動畫。
2.通過一個緩動函數(shù)來實(shí)現(xiàn)動畫的過渡效果。
3.通過requestAnimationFrame這個API來更新動畫幀,優(yōu)化顯示效果。
到此這篇關(guān)于vue:實(shí)現(xiàn)絲滑文件上傳進(jìn)度條的文章就介紹到這了,更多相關(guān)vue上傳進(jìn)度條內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
更強(qiáng)大的vue ssr實(shí)現(xiàn)預(yù)取數(shù)據(jù)的方式
這篇文章主要介紹了更強(qiáng)大的 vue ssr 預(yù)取數(shù)據(jù)的方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
優(yōu)雅的將ElementUI表格變身成樹形表格的方法步驟
這篇文章主要介紹了優(yōu)雅的將ElementUI表格變身成樹形表格的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Vue處理循環(huán)數(shù)據(jù)流程示例精講
這篇文章主要介紹了Vue處理循環(huán)數(shù)據(jù)流程,這個又是一個編程語言,?模版語法里面必不可少的一個,?也是使用業(yè)務(wù)場景使用最多的一個環(huán)節(jié)。所以學(xué)會使用循環(huán)也是重中之重了2023-04-04
Vue中引用assets中圖片的實(shí)現(xiàn)方式
這篇文章主要介紹了Vue中引用assets中圖片的實(shí)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10
vue2中使用viewer.js的實(shí)現(xiàn)示例
本文主要介紹了vue2中使用viewer.js的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-10-10
Vue項(xiàng)目打包部署到GitHub Pages的實(shí)現(xiàn)步驟
本文主要介紹了Vue項(xiàng)目打包部署到GitHub Pages的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04

