zoukankan      html  css  js  c++  java
  • react实现svg实线、虚线、方形进度条

    一年前刚到新公司就接到可视化大屏项目,一看Ui,“头很方”!因为查了现有的一些图标库,没有直接可以拿来用的。以下是UI的一小小部分:

    而如今从无到有,写出react-super-progress圆形进度通用组件,能写出虚线、实线、方形、圆形、渐变色、饼图等各种进度,也算是一种进步吧;下面是各类实现效果截图:

    github地址:https://github.com/lvzhiyi/react-super-progress;

    详细文档地址:http://120.78.184.181/progress-docs/#/elements/components/Progress;

    npm:    npm install react-super-progress -S

     下面进入正题,分享出实现原理与组件实现步骤:

    一、首先要掌握几个重要的api

       svg 基础知识、重点掌握属性 strokeDasharray、基本元件(原型、矩形)、defs预定义属性

    二、圆形进度实现

       1、基本流程

           ----> 利用svg基础元件circle我们能画出圆形

           ---->  图形颜色填充为空白(fiill: none)

       ---->  利用svg边框属性storke可以画出代边框的圆形,storke-width控制边框宽度,也就是原型厚度

           ----> 重点:利用strokeDasharray属性控制圆圈进度

      前三步相对简单没有过多逻辑,这里不再赘述;

          这里重点解释一下第四步:在没有strokeDasharray属性的时候,边框默认是实线且不可控制进度;strokeDasharray属性接收任意数量字符串数字为属性,用来表示边框虚线的构成形式,奇数位表示虚线的实体部分,偶数位表示虚线空白部分。举例说明:

      strokeDasharray="10 20 30 20" 对应效果   ------>  

      而对应的我们使用 strokeDasharray="当前进度对应周长 圆形总周长"算法来实现对进度的控制,也就是第一个参数通过当前进度乘以对应周长控制实体虚线部分,总周长来控制空白部分(也可以用剩余百分比控制(1 - 进度值),这里为了便于计算,效果是一样的);距离说明:

      比如当前进度75%,圆形周长为c:

      对应的 ----> strokeDasharray = "(75 / 100 * c)  (c)" ----> 

      从而实现对圆圈进度的控制!方形进度同理。饼图按照 半径(r)/ 宽度(width)1:4的比例提供参数值即可实现。

    二、虚线进度的实现

      虚线进度与实现进度实现的原理大不相同,与strokeDasharray毫无关系,原理也相对简单:将方形元件旋转渲染至某个角度即可。

           ----> 

      主要使用了transform属性 ----> transform=" rotate( 90,  50 50) " ----> 第一个属性值90代表旋转角度,后面一对属性值(50, 50)代表旋转的圆心位置;

    二、关于渐变色

      1、普通进度圈的渐变色是根据svg预定义属性defs创建渐变色块,在圆圈内使用stroke属性引用 ----> stroke="#colors"

      2、虚线进度因为是由不同元件旋转渲染而成,所以通过渐变值分割成对应数量的渐变值数值,应用在每一个元件上;分割对应的渐变值相对复杂一些,感兴趣的可参见源码分析。

     

     

      

  • 相关阅读:
    CF1539 VP 记录
    CF1529 VP 记录
    CF875C National Property 题解
    CF1545 比赛记录
    CF 1550 比赛记录
    CF1539E Game with Cards 题解
    CF1202F You Are Given Some Letters... 题解
    vmware Linux虚拟机挂载共享文件夹
    利用SOLR搭建企业搜索平台 之九(solr的查询语法)
    利用SOLR搭建企业搜索平台 之四(MultiCore)
  • 原文地址:https://www.cnblogs.com/lvzhiyiboke/p/10241287.html
Copyright © 2011-2022 走看看