Blame view

src/components/circle/circle.vue 2.5 KB
7fa943eb   梁灏   init
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
  <template>
      <div :style="circleSize" :class="wrapClasses">
          <svg viewBox="0 0 100 100">
              <path :d="pathString" :stroke="trailColor" :stroke-width="trailWidth" :fill-opacity="0"/>
              <path :d="pathString" :stroke-linecap="strokeLinecap" :stroke="strokeColor" :stroke-width="strokeWidth" fill-opacity="0" :style="pathStyle"/>
          </svg>
          <div :class="innerClasses">
              <slot></slot>
          </div>
      </div>
  </template>
  <script>
      import { oneOf } from '../../utils/assist';
  
      const prefixCls = 'ivu-chart-circle';
  
      export default {
          props: {
              percent: {
                  type: Number,
                  default: 0
              },
              size: {
                  type: Number,
                  default: 120
              },
              strokeWidth: {
                  type: Number,
                  default: 6
              },
              strokeColor: {
                  type: String,
                  default: '#2db7f5'
              },
              strokeLinecap: {
                  validator (value) {
                      return oneOf(value, ['square', 'round']);
                  },
                  default: 'round'
              },
              trailWidth: {
                  type: Number,
                  default: 5
              },
              trailColor: {
                  type: String,
                  default: '#eaeef2'
              }
          },
          computed: {
              circleSize () {
                  return {
                      width: `${this.size}px`,
                      height: `${this.size}px`
                  };
              },
              radius () {
                  return 50 - this.strokeWidth / 2;
              },
              pathString () {
                  return `M 50,50 m 0,-${this.radius}
                  a ${this.radius},${this.radius} 0 1 1 0,${2 * this.radius}
                  a ${this.radius},${this.radius} 0 1 1 0,-${2 * this.radius}`;
              },
              len () {
                  return Math.PI * 2 * this.radius;
              },
              pathStyle () {
                  return {
                      'stroke-dasharray': `${this.len}px ${this.len}px`,
                      'stroke-dashoffset': `${((100 - this.percent) / 100 * this.len)}px`,
                      'transition': 'stroke-dashoffset 0.6s ease 0s, stroke 0.6s ease'
                  }
              },
              wrapClasses () {
                  return `${prefixCls}`;
              },
              innerClasses () {
                  return `${prefixCls}-inner`;
              }
          }
      }
  </script>