ProgressBar.js

ProgressBar.js

ProgressBar.js配置参数详解

1,介绍

它是响应式的创建SVG元素的一个插件。不要慌,不懂SVG也没有关系,插件的使用,主要是对配置参数的理解。

这是ProgressBar.js的网站,有动效的展示(我截的静态的图。。。),在如下图所示,右击小铅笔,在新的页面中打开网页,就可以看到小demo的全部代码了。

1.img

  • 这是官方配置参数的文档,我会在下面的代码中,详解。
  • 进度条的效果,常见的就是长条形和圆形。当然也可以自定义形状,这里就不做讨论了。

2,案例

下面的2个demo,一个是实现的长条形的,一个是圆形,因为配置参数有所不同,所以分开介绍。

2.1 长条形

2.img

<!--首先,需要引入插件-->
<script src="https://cdn.bootcss.com/progressbar.js/1.0.1/progressbar.js"></script>
<script>
  // 获取容器节点
  let container = document.querySelector('#container')

  /*
  * 先介绍稍微难理解的参数
  * 首先,进度条的实现,要有一个准备填充的矩形作为背景被填充,还要有一个进行填充的矩形。
  *   所以,两个矩形肯定是重叠在一起的。而这些生成的矩形,就是以SVG元素的形式显示。
  * @strokeWidth 跟踪路径,指慢慢边长,进行填充的那个矩形。
  * @trailWidth 未填充路径,指作为背景被填充的矩形。
  * @svgStyle SVG元素(2个矩形)面积占容器的百分比。
  * */

  /*
  * 结论先行:一般显示的效果,strokeWidth和trailWidth这2个的值,只需要设置strokeWidth: 1 即可。
  * 原因:
  * strokeWidth的值number类型,表示跟路径的高度占容器的百分比,
  *   所以,数值为1就已经占满容器的高度,>1会有副作用,下面会介绍。
  * trailWidth的值number类型,表示未填充路径的高度占容器的百分比,
  *   如果不设置,默认等于strokeWidth的值,并且会被strokeWidth影响到:
  *   所以它最终的值:trailWidth=(trailWidth/strokeWidth)*height(height为容器高度)
  * 也就是说,strokeWidth和trailWidth的值同时设置,且不相等时,trailWidth的值可能不会如预期效果显示。
  * */
  let bar = new ProgressBar.Line(container, {
    strokeWidth: 1, // 跟踪路径的高度
    easing: 'easeInOut',  // 运动形式,默认是linear(匀速运动),easeInOut代表慢-快-慢,该配置项具体可以参照CSS3中transition的过渡形式
    duration: 5000,  // 走完整体时间(ms)
    color: 'salmon',  // 跟踪路径颜色(单词,16进制,rgb都可以)
    trailColor: 'blue',   // 未填充路径颜色(同上)
    trailWidth: 1,  // 未填充路径的高度
    svgStyle: {width: '100%', height: '100%'},   // 2个路径整体的宽高
    text: {   // 显示百分比文字的样式,最终生成放文字内容的容器是一个div
      // className可以指定文字容器的class名称,但是注意,所有在配置项style中写的样式都会转为内联样式,
      // 并且像color这种不设置,会继承其他配置项的样式,也会设置为内联样式。
      className: 'text-color',
      // 百分比文字的样式
      style: {
        color: 'green',   // 不设置的话,继承跟踪路径颜色
        position: 'absolute',
        textAlign: 'right',
        top: '0',
        padding: 0,
        margin: 0,
        // 如果要设置transform,直接设置,亲测好像不行,只能按照官网给出的写法。
        transform: {
          prefix: true,  // 自动加浏览器前缀
          value: 'translate(-100%, 70%)'
        }
      },
      // 一旦上面的style选项中写了样式,则自动会给容器添加position: relative;
      //(我觉得主要考虑的是文字的位置,一般在设置时,使用定位更方便一点,所以才会自动添加),
      // 可以通过设置下面这个属性为false,禁止自动给容器添加。
      autoStyleContainer: false,
    },
    // 下面三个配置项是配合使用的。
    // from指定进度条(根据上面所列配置项指定)开始的样式,to指定结束的样式。样式的变化自动会有过渡效果。
    // 这个demo中,只展示了颜色的变化,可以同时指定多个样式,比如还可以指定width的渐变等等。
    // step,第一个参数代表的就是管理from和to中样式的状态对象,根据state.color应该就很好理解了。
    //   第二个参数,就是实例对象(JavaScript代码最顶部生成的那个)
    from: {color: '#FFEA82'},
    to: {color: '#ED6A5A'},
    step: (state, bar) => {
      // 下面的bar.xxx都是在官网中介绍有案例使用的属性。
      // 设置跟踪路径颜色变化,颜色会根据from 和to 的渐变
      bar.path.setAttribute('stroke', state.color);
      // 设置百分比文字可以随着,跟随路径的不断填充而实时变化。
      // bar.setText(Math.round(bar.value() * 100) + ' %');
      // 我为了实现当进度条走到一定距离时,在显示文字,所以加了一个判断
      let value = Math.round(bar.value() * 100);
      if (value <= 5) {
        bar.setText('');
      } else {
        bar.setText(value+'%');
      }
      // 下面这个设置,主要是想实现文字的位置随着进度条的增长,跟着变化。
      bar.text.style.left = Math.round(bar.value() * 100) + '%';

    }
  });

  // animate方法,用来启动进度条动画。
  // 第一个参数 0.0 ~ 1.0 指定动画结束的百分比,一般都为1,进度条就会跑完整个矩形。
  // 第二个参数,配置项(这里没有写,感觉有点多余),如果配置的话,会重写上面的配置项,
  //   比如{duration: 4000} 会重写上面的duration。
  // 第三个参数,回调函数,在动画执行完成之后执行,也就是进度条走完。这里放一些处理逻辑。
  bar.animate(1, function () {
    console.log('动画结束,萌萌哒')
  });
</script>

以上就是长条形的实现。代码亲测可行。

2.2 圆形

3.img

  • html代码,就一个div作为容器
<div id="container"></div>
  • css代码,设置margin是为了进度条的开始部分不在页面边缘,为了显示效果更好。设置position为相对定位,是因为显示进度条的百分比提示文字,默认会绝对定位
#container {
  margin: 20px;
  width: 100px;
  height: 100px;
  position: relative;
}
  • JavaScript代码,各个配置参数,会在注释中,详细说明。这是官方配置参数的文档
<script src="https://cdn.bootcss.com/progressbar.js/1.0.1/progressbar.js"></script>
<script>
  let container = document.querySelector('#container')

  var bar = new ProgressBar.Circle(container, {
    color: 'salmon',
    strokeWidth: 50,  // 正好是从圆心开始画起,>50会越过圆心,<50画出的是圆环
    trailWidth: 50,  // 也设置为50,就是一个未填充的圆形,而不是圆环。要么设置为0
    easing: 'easeInOut',
    duration: 5000,
    text: {
      style: {
        color: 'yellow',
        display: 'inline-block',
        position: 'absolute',
        top: '50%',
        left: '50%',
        transform: 'translate(-50%,-50%)'
      },
      autoStyleContainer: false
    },
    // fill: 'salmon',   // 圆形内容区域填充色,当需要画圆环时,效果应该最好。
    from: { color: '#aaa'},
    to: { color: '#333'},
    step: function(state, circle) {
      circle.path.setAttribute('stroke', state.color);

      var value = Math.round(circle.value() * 100);
      circle.setText(value+'%');
    }
  });
  bar.text.style.fontFamily = '"Raleway", Helvetica, sans-serif';
  bar.text.style.fontSize = '2rem';

  bar.animate(1.0, function () {
    console.log('动画执行结束')
  });

</script>
  • 这个是width的渐变效果

4.img

strokeWidth: 5,
trailWidth: 0,
fill: 'salmon',   // 圆形内容区域填充色
from: { color: '#aaa', width: 1},
to: { color: '#333', width: 5},
circle.path.setAttribute('stroke-width', state.width);  

转载

作者:非梧不栖

链接:https://juejin.cn/post/6844903628881428494

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容