vue实现简洁文件上传进度条功能

 更新时间:2024年06月05日 10:26:58   作者:一天只码五十行  
这篇文章主要介绍了vue实现简洁文件上传进度条功能,实现原理是通过performance.now()获取动画的时间戳,用于创建流畅的动画,结合示例代码介绍的非常详细,需要的朋友可以参考下

一、效果展示

缓若江海凝清光

二、代码

const uploadProgress = ref(); //上传进度
//进度丝滑更新
//进度,时常
const ProgressChange = (targetPercent: number, duration: number) => {
  //performance.now() 是浏览器提供的一个高性能时间 API,它返回一个 DOMHighResTimeStamp,
  //这个时间戳提供了当前页面从加载到现在所经过的毫秒数,具有很高的精度,适合用来测量脚本执行时间、动画帧间隔等
  const startTime = performance.now();
  //获取当前进度
  const startPercent = uploadProgress.value;
  const step = (currentTime: number) => {
    // 计算当前进度
    const elapsedTime = currentTime - startTime;
    // 修改进度条的百分比实现动画效果
    let currentPercent = easeInOut(
      elapsedTime,
      startPercent,
      targetPercent - startPercent,
      duration
    );
    // 确保百分比不超过100且不小于0
    currentPercent = Math.min(Math.max(currentPercent, 0), 100);
    // 更新进度条
    uploadProgress.value = Math.round(currentPercent);
    // 如果动画未结束,继续执行动画
    if (currentPercent < 100 && elapsedTime < duration) {
      requestAnimationFrame(step);
    } else {
      uploadProgress.value = Math.round(targetPercent); // 确保最终值准确无误
    }
  };
  // 使用函数使动画更加平滑
  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));
    };
  }

三、实现原理

1.通过performance.now()获取动画的时间戳,用于创建流畅的动画。

2.通过一个缓动函数来实现动画的过渡效果。

3.通过requestAnimationFrame这个API来更新动画帧,优化显示效果。

到此这篇关于vue:实现丝滑文件上传进度条的文章就介绍到这了,更多相关vue上传进度条内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue Router初始化路由信息详解

    Vue Router初始化路由信息详解

    这篇文章主要为大家详细介绍了Vue Router初始化路由信息的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解一下
    2023-11-11
  • vue使用swiper插件实现垂直轮播图

    vue使用swiper插件实现垂直轮播图

    这篇文章主要介绍了vue使用swiper插件实现垂直轮播图,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • 一个例子轻松学会Vue.js

    一个例子轻松学会Vue.js

    这篇文章主要为大家详细介绍了一个例子,帮助大轻松学会Vue.js,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • vue实现一拉到底的滑动验证

    vue实现一拉到底的滑动验证

    这篇文章主要为大家详细介绍了vue简单的一拉到底的滑动验证,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • vue.config.js中configureWebpack与chainWebpack区别及说明

    vue.config.js中configureWebpack与chainWebpack区别及说明

    这篇文章主要介绍了vue.config.js中configureWebpack与chainWebpack区别及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • vue cli 3.0下配置开发环境下的sourcemap问题

    vue cli 3.0下配置开发环境下的sourcemap问题

    这篇文章主要介绍了vue cli 3.0下配置开发环境下的sourcemap问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Vue.js子组件向父组件通信的方法实例代码详解

    Vue.js子组件向父组件通信的方法实例代码详解

    这篇文章主要介绍了Vue.js子组件向父组件通信的方法实例代码,非常不错,具有一定的参考价借鉴价值,需要的朋友可以参考下
    2018-12-12
  • vue-autoui自匹配webapi的UI控件的实现

    vue-autoui自匹配webapi的UI控件的实现

    这篇文章主要介绍了vue-autoui自匹配webapi的UI控件的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Vue中props的详解

    Vue中props的详解

    这篇文章主要介绍了Vue中props的详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • 解决vuecli3.0热更新失效的问题

    解决vuecli3.0热更新失效的问题

    今天小编就为大家分享一篇解决vuecli3.0热更新失效的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09

最新评论