css3实现圆环进度条,vue圆形进度条

  css3实现圆环进度条,vue圆形进度条

  这篇文章主要介绍了某视频剪辑软件实现圆环进度条的示例,帮助大家更好的理解和使用前端框架进行开发,感兴趣的朋友可以了解下

  数据展示,一直是各行各业乐此不疲的需求,具体到前端开发行业,则是各种各种图表数据展示,各种表格数据展示,烦不胜烦(繁不胜繁)!

  前几天刚做了折线图、柱状图、饼状图之类的图表数据展示效果,今天又碰到了类似圆环进度条的展示效果。天天跟数据打交道,天天跟接口打交道,项目做了不少,菜逼还是菜逼,都是泪啊!

  其实说白了,是自己对帆布不熟,对CSS3不熟,所以就找了一个现成的轮子:

  模板

  div class=content ref=box

  SVG style= transform:rotate(-90度):width= width :height= width xmlns= http://www。w3。 org/2000/SVG

  圆:r=(宽度-半径)/2

  :cy=宽度/2

  :cx=宽度/2

  :笔画宽度=半径

  :stroke=backgroundColor

  填充=无

  /

  circle ref=$bar

  :r=(宽度-半径)/2

  :cy=宽度/2

  :cx=宽度/2

  :stroke=barColor

  :笔画宽度=半径

  :stroke-linecap=isRound?圆形:方形

  :stroke-dasharray=(宽度-半径)*3.14

  :stroke-dashoffset=isAnimation?(宽度-半径)* 3.14:(宽度-半径)* 3.14 * (100 -进度)/100

  填充=无

  /

  /svg

  div class= center _ text :style= { color,fontSize}

  p v-if=!$老虎机。default class= title " { progress } } %/p

  插槽/插槽

  /div

  /div

  /模板

  脚本

  导出默认值{

  道具:{

  半径:{

  类型:[数字,字符串],

  默认值:20

  }, //进度条厚度

  进度:{

  类型:[数字,字符串],

  默认值:20

  }, //进度条百分比

  条形颜色:{

  类型:字符串,

  默认值: #1890ff

  }, //进度条颜色

  背景颜色:{

  类型:字符串,

  默认值:" rgba(0,0,0,0.3)"

  }, //背景颜色

  isAnimation: {

  //是否是动画效果

  类型:布尔型,

  默认值:真

  },

  isRound: {

  //是否是圆形画笔

  类型:布尔型,

  默认值:真

  },

  id: {

  //组件的id,多组件共存时使用

  类型:[字符串,数字],

  默认值:1

  },

  持续时间:{

  //整个动画时长

  类型:[字符串,数字],

  默认值:1000

  },

  延迟:{

  //延迟多久执行

  类型:[字符串,数字],

  默认值:200

  },

  时间函数:{

  //动画缓动函数

  类型:字符串,

  默认值:"三次贝塞尔曲线(0.99,0.01,0.22,0.94)"

  },

  圆周宽度:{

  //圆环宽度

  类型:数量,

  默认值:100,

  },

  颜色:{

  //文字颜色

  类型:字符串,

  默认值: #000

  },

  fontSize: {

  //文字大小

  类型:字符串,

  默认值:" 18px "

  }

  },

  data() {

  返回{

  宽度:this.circleWidth,

  idStr:` circle _ progress _ key frames _ $ { this。id }

  };

  },

  销毁前(){

  //清除旧组件的样式标签

  文档。getelementbyid(这个。idstr)

  文档。getelementbyid(这个。idstr).移除();

  窗户。addevent侦听器(()={ });

  },

  已安装(){

  让自我=这个;

  这个。setcirclewidth();

  这个。设置动画();

  //此处不能使用window.onresize

  window.addEventListener(

  调整大小,

  去抖(函数(){

  自我。setcirclewidth();

  自我。设置动画(自我);

  }, 300)

  );

  },

  方法:{

  setCircleWidth() {

  让box=this .$ refs.box

  let width=box.clientWidth

  let height=box.clientHeight

  设cW=宽度高度?高度:宽度;

  宽度=顺时针

  },

  setAnimation() {

  让自我=这个;

  if (self.isAnimation) {

  //重复定义判断

  如果(文档。getelementbyid(self。idstr)){

  控制台。警告( vue-圆圈-进度不应有相同的编号样式);

  文档。getelementbyid(self。idstr).移除();

  }

  //生成动画样式文件

  让style=document。createelement( style );

  风格。id=自我。idstr

  风格。type= text/CSS ;

  style.innerHTML=`

  @关键帧circle _ progress _ key frames _ name _ $ { self。id } {

  从{笔画-破折号偏移量:$ {(self。宽度-自我。半径)* 3.14 } px}

  to { stroke-dash offset:$ {((self . width-self . radius)*

  3.14 *

  (100 - self.progress)) /

  100 } px}}。circle_progress_bar${

  自我标识

  } { animation:circle _ progress _ key frames _ name _ $ { self . id } $ {

  自我持续时间

  } ms $ { self . delay } ms $ { self . time function }转发;}`;

  //添加新的样式文件

  document . getelementsbytagname( head )[0]。appendChild(style);

  //向svg元素添加动画类

  自我。$参考文献。$ bar . class list . add(` circle _ progress _ bar $ { self . id } `);

  }

  }

  }

  };

  /脚本

  样式范围。内容{身高:100%;显示器:flexjustify-content:居中;对齐-项目:居中;}。center _ text { position:absolute;}

  /风格

  用法:

  circle progress:id= circle 1 :circle width= 40 :radius= 7 :progress= 30 :is animation= true :background color= # e9e 9e 9 :bar color= # ff 4f 4f /

  circle progress:id= circle 2 :circle width= 40 :radius= 7 :progress= 50 :is animation= true :background color= # e9e 9e 9 :bar color= # ff 902 a /

  circle progress:id= circle 3 :circle width= 40 :radius= 7 :progress= 89 :is animation= true :background color= # e9e 9e 9 :bar color= # FFDB4F /

  circle progress:id= circle 4 :circle width= 40 :radius= 7 :progress= 25 :is animation= true :background color= # e9e 9e 9 :bar color= # b8d 87e /

  在使用的时候,需要注意的是,如果你在你的页面中同时使用两个以上这样的环形进度条,那么你需要为每个环形进度条设置不同的id。否则,所有环最终显示的数据将是最后一个环的数据。

  代码中有一个图像稳定器的功能。下面是这个函数的一个粘贴:

  功能去抖(func,wait,immediate) {

  let超时,参数,上下文,时间戳,结果

  const later=function () {

  //根据上次触发的时间间隔

  const last=new Date() -时间戳

  //最后一次调用包装的函数时,间隔last小于设置的间隔wait。

  if(最后等待最后0) {

  timeout=setTimeout(稍后,wait - last)

  }否则{

  超时=空

  //如果设置为immediate===true,这里就不需要调用了,因为开始边界已经被调用了。

  如果(!立即){

  result=func.apply(上下文,参数)

  如果(!超时)context=args=null

  }

  }

  }

  本文指的是vue-circleprogressbar,它是npm上一个圆形进度条的插件。之所以不在项目中直接安装使用这个插件,是因为这个插件不符合我们开发的需要。比如这个插件不能设置圆的宽度,文本的颜色,或者文本的大小。再比如这个插件依赖lodash(这个lodash的体积还是很大的)只是为了防抖。

  至于这个组件在react中的使用,根据react的生命周期,或者react hooks的语法,或者dva模式的语法,稍微改动一下就可以用了。很简单,就不再展开了。

  作者:小坏蛋

  资料来源:http://tnnyang.cnblogs.com

  以上是Vue实现循环进度条的例子细节。更多关于Vue实现循环进度条的信息,请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: