跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScript大前端

Vue2.x 使用 SVG 实现不封闭圆形进度条及组件封装

在 Vue2.x 项目中利用 SVG 技术实现不封闭圆形进度条的方法。核心原理是通过 stroke-dasharray 和 stroke-dashoffset 属性控制圆弧的显示与缺口位置。文章详细讲解了计算周长、缺口比例及偏移量的逻辑,并提供了完整的组件封装代码,支持渐变、动画、自定义内容等特性。同时分析了 SVG 方案与 Canvas 方案的优缺点,讨论了浏览器兼容性、性能优化及常见坑点(如反向旋转、缺口对齐),并给出了防抖处理和深色模式适配的技巧。

星河入梦发布于 2026/4/6更新于 2026/7/2148 浏览
Vue2.x 使用 SVG 实现不封闭圆形进度条及组件封装

Vue2.x 使用 SVG 实现不封闭圆形进度条及组件封装

引言

在 Vue2.x 项目中实现不封闭圆形进度条是常见的前端需求。本文介绍基于 SVG 的实现方案,通过组件化封装满足灵活配置的需求。

技术原理

不封闭圆形进度条概念

不封闭圆形进度条即带有缺口的圆环。技术上主要通过 SVG 的描边属性控制实线与空白区域的比例。

实现方式对比

  1. SVG 方案:使用 <circle> 标签配合 stroke-dasharray 和 stroke-dashoffset 属性。可控性强,无外部依赖。
  2. Canvas 方案:底层绘图,代码量大,需处理高清屏像素比。
  3. CSS 方案:利用 border-radius 或 conic-gradient,灵活性较差。 推荐使用手写 SVG 方案,符合 Vue 组件化思想。

核心技术

SVG 描边属性

  • stroke-dasharray:定义虚线模式(实线长度,空白长度)。
  • stroke-dashoffset:定义起始偏移量,控制缺口位置。
  • stroke-linecap:设置端点样式(round 为圆角)。

数据驱动

将计算后的属性绑定到 Vue 响应式数据上。当进度变化时,自动更新 SVG 属性。

路径计算

若需更复杂的缺口形状,可使用 <path> 结合贝塞尔曲线绘制。通过三角函数计算极坐标转笛卡尔坐标。

方案对比

SVG 优势

  • 体积小,无外部依赖。
  • 矢量图形,清晰度无敌。
  • DOM 节点,交互性强。
  • SEO 友好。

兼容性与性能

  • Android 4.4+ 支持良好,旧版本需注意锯齿问题。
  • 大量渲染时需优化重绘,使用 requestAnimationFrame 和 will-change。

组件实现

通用组件封装

封装 GapProgress 组件,支持以下 Props:

  • percentage:进度百分比。
  • gap:缺口大小。
  • size:画布大小。
  • gradient:是否启用渐变。
  • animation:是否开启动画。
<template>
  <div :style="containerStyle">
    <svg :width="size" :height="size" :viewBox="`0 0 ${size} ${size}`">
      <!-- 背景圆环 -->
      <circle :cx="center" :cy="center" :r="radius" fill="none" :stroke="bgColor" :stroke-width="strokeWidth" />
      <!-- 进度圆环 -->
      <circle :cx="center" :cy="center" :r="radius" fill="none" :stroke="progressColor" :stroke-width="strokeWidth" :stroke-dasharray="dashArray" :stroke-dashoffset="dashOffset" stroke-linecap="round" :transform="`rotate(${rotate} ${center} ${center})`" :style="transitionStyle" />
    </svg>
    <div v-if="$slots.default">
      <slot :percentage="displayPercentage"></slot>
    </div>
  </div>
</template>
<script>
export default {
  name: 'GapProgress',
  props: {
    percentage: { type: Number, default: 0 },
    gap: { type: Number, default: 15 },
    size: { type: Number, default: 120 },
    strokeWidth: { type: Number, default: 8 }
  },
  computed: {
    center() { return this.size / 2; },
    radius() { return (this.size - this.strokeWidth) / 2; },
    circumference() { return 2 * Math.PI * this.radius; },
    dashArray() { return `${this.progressLength}, ${this.circumference}`; },
    dashOffset() { return this.gapLength / 2; }
  }
};
</script>

常见问题

进度条反向旋转

原因:stroke-dasharray 变小时渲染机制导致视觉回退。 解决:确保 dashoffset 同步调整,或单向增加进度值。

缺口位置对不齐

原因:不同浏览器对 transform-origin 解析差异。 解决:显式指定 SVG transform 属性中的旋转中心。

动画卡顿

原因:主线程占用过高。 解决:使用 requestAnimationFrame,减少重绘,添加 will-change。

优化建议

计算属性缓存

避免在模板中直接计算复杂公式,使用 computed 缓存结果。

深色模式适配

使用 CSS 变量动态切换颜色。

数据防抖

接口数据频繁变化时,使用防抖处理防止动画抖动。

总结

实现不封闭圆形进度条主要依赖 SVG 描边属性。通过组件封装可复用性高。注意浏览器兼容性测试,避免过度设计。

目录

  1. Vue2.x 使用 SVG 实现不封闭圆形进度条及组件封装
  2. 引言
  3. 技术原理
  4. 不封闭圆形进度条概念
  5. 实现方式对比
  6. 核心技术
  7. SVG 描边属性
  8. 数据驱动
  9. 路径计算
  10. 方案对比
  11. SVG 优势
  12. 兼容性与性能
  13. 组件实现
  14. 通用组件封装
  15. 常见问题
  16. 进度条反向旋转
  17. 缺口位置对不齐
  18. 动画卡顿
  19. 优化建议
  20. 计算属性缓存
  21. 深色模式适配
  22. 数据防抖
  23. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 空气质量地图:借助百度天气接口和 Leaflet 进行 WebGIS 可视化
  • RISC-V 智能家居中控系统全链路实战:硬件、固件与通信
  • 双指针算法:盛最多水的容器
  • Rust 异步编程实战:构建高性能网络应用
  • VSCode Copilot 无法连接网络问题解决方案
  • WorkBuddy 使用指南:配置 QQ 机器人实现桌面智能体
  • iPhone 两秒出图,目前最快的移动端 Stable Diffusion 模型
  • LangChain 学习实战:核心难点解析与国产模型集成指南
  • JavaScript 生成 UUID 的常见方法与避坑指南
  • 仿射频分复用(AFDM):扩展 OFDM 实现场景灵活性与弹性
  • C++ 模板与 String 类核心指南
  • Java 并发包 LinkedBlockingQueue 详解
  • gpt-oss-20b-WEBUI 实现教育场景自动答疑机器人
  • 常见 AIGC 降重工具评测与推荐
  • 前端报错排查指南
  • AIGC 时代大模型幻觉问题深度治理:技术体系、工程实践与未来演进
  • Visual C++ 运行库安装与修复指南
  • 文心大模型 4.5 系列开源:技术突破与生态开放
  • 人工智能 AI 产品经理与传统产品经理的工作差异详解
  • 机器人避障与导航系统开发理论与实践

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online