Commit b40e2e96be7c00a15e1b3111debecafb9fbca4ba
1 parent
9f249603
Circle add prop dashboard
Showing
2 changed files
with
82 additions
and
61 deletions
Show diff stats
examples/routers/circle.vue
1 | -<style lang="less"> | |
2 | - .demo-circle-custom{ | |
3 | - & h1{ | |
4 | - color: #3f414d; | |
5 | - font-size: 28px; | |
6 | - font-weight: normal; | |
7 | - } | |
8 | - & p{ | |
9 | - color: #657180; | |
10 | - font-size: 14px; | |
11 | - margin: 10px 0 15px; | |
12 | - } | |
13 | - & span{ | |
14 | - display: block; | |
15 | - padding-top: 15px; | |
16 | - color: #657180; | |
17 | - font-size: 14px; | |
18 | - &:before{ | |
19 | - content: ''; | |
20 | - display: block; | |
21 | - width: 50px; | |
22 | - height: 1px; | |
23 | - margin: 0 auto; | |
24 | - background: #e0e3e6; | |
25 | - position: relative; | |
26 | - top: -15px; | |
27 | - }; | |
28 | - } | |
29 | - & span i{ | |
30 | - font-style: normal; | |
31 | - color: #3f414d; | |
32 | - } | |
33 | - } | |
34 | -</style> | |
35 | 1 | <template> |
36 | - <i-circle | |
37 | - :size="250" | |
38 | - :trail-width="4" | |
39 | - :stroke-width="5" | |
40 | - :percent="75" | |
41 | - stroke-linecap="square" | |
42 | - stroke-color="#43a3fb"> | |
43 | - <div class="demo-circle-custom"> | |
44 | - <h1>{{ 42001776 }}</h1> | |
45 | - <p>消费人群规模</p> | |
46 | - <span> | |
47 | - 总占人数 | |
48 | - <i>75%</i> | |
49 | - </span> | |
50 | - </div> | |
51 | - </i-circle> | |
2 | + <div> | |
3 | + <i-circle :percent="percent" dashboard :stroke-color="color"> | |
4 | + <Icon v-if="percent == 100" type="ios-checkmark" size="60" style="color:#5cb85c"></Icon> | |
5 | + <span v-else style="font-size:24px">{{ percent }}%</span> | |
6 | + </i-circle> | |
7 | + <ButtonGroup size="large"> | |
8 | + <Button icon="ios-add" @click="add"></Button> | |
9 | + <Button icon="ios-remove" @click="minus"></Button> | |
10 | + </ButtonGroup> | |
11 | + </div> | |
52 | 12 | </template> |
53 | 13 | <script> |
54 | 14 | export default { |
55 | - | |
15 | + data () { | |
16 | + return { | |
17 | + percent: 0 | |
18 | + } | |
19 | + }, | |
20 | + computed: { | |
21 | + color () { | |
22 | + let color = '#2db7f5'; | |
23 | + if (this.percent == 100) { | |
24 | + color = '#5cb85c'; | |
25 | + } | |
26 | + return color; | |
27 | + } | |
28 | + }, | |
29 | + methods: { | |
30 | + add () { | |
31 | + if (this.percent >= 100) { | |
32 | + return false; | |
33 | + } | |
34 | + this.percent += 10; | |
35 | + }, | |
36 | + minus () { | |
37 | + if (this.percent <= 0) { | |
38 | + return false; | |
39 | + } | |
40 | + this.percent -= 10; | |
41 | + } | |
42 | + } | |
56 | 43 | } |
57 | 44 | </script> | ... | ... |
src/components/circle/circle.vue
1 | 1 | <template> |
2 | 2 | <div :style="circleSize" :class="wrapClasses"> |
3 | 3 | <svg viewBox="0 0 100 100"> |
4 | - <path :d="pathString" :stroke="trailColor" :stroke-width="trailWidth" :fill-opacity="0"/> | |
5 | - <path :d="pathString" :stroke-linecap="strokeLinecap" :stroke="strokeColor" :stroke-width="strokeWidth" fill-opacity="0" :style="pathStyle"/> | |
4 | + <path :d="pathString" :stroke="trailColor" :stroke-width="trailWidth" :fill-opacity="0" :style="trailStyle" /> | |
5 | + <path :d="pathString" :stroke-linecap="strokeLinecap" :stroke="strokeColor" :stroke-width="computedStrokeWidth" fill-opacity="0" :style="pathStyle" /> | |
6 | 6 | </svg> |
7 | 7 | <div :class="innerClasses"> |
8 | 8 | <slot></slot> |
... | ... | @@ -46,6 +46,10 @@ |
46 | 46 | trailColor: { |
47 | 47 | type: String, |
48 | 48 | default: '#eaeef2' |
49 | + }, | |
50 | + dashboard: { | |
51 | + type: Boolean, | |
52 | + default: false | |
49 | 53 | } |
50 | 54 | }, |
51 | 55 | computed: { |
... | ... | @@ -55,23 +59,53 @@ |
55 | 59 | height: `${this.size}px` |
56 | 60 | }; |
57 | 61 | }, |
62 | + computedStrokeWidth () { | |
63 | + return this.percent === 0 && this.dashboard ? 0 : this.strokeWidth; | |
64 | + }, | |
58 | 65 | radius () { |
59 | 66 | return 50 - this.strokeWidth / 2; |
60 | 67 | }, |
61 | 68 | pathString () { |
62 | - return `M 50,50 m 0,-${this.radius} | |
63 | - a ${this.radius},${this.radius} 0 1 1 0,${2 * this.radius} | |
64 | - a ${this.radius},${this.radius} 0 1 1 0,-${2 * this.radius}`; | |
69 | + if (this.dashboard) { | |
70 | + return `M 50,50 m 0,${this.radius} | |
71 | + a ${this.radius},${this.radius} 0 1 1 0,-${2 * this.radius} | |
72 | + a ${this.radius},${this.radius} 0 1 1 0,${2 * this.radius}`; | |
73 | + } else { | |
74 | + return `M 50,50 m 0,-${this.radius} | |
75 | + a ${this.radius},${this.radius} 0 1 1 0,${2 * this.radius} | |
76 | + a ${this.radius},${this.radius} 0 1 1 0,-${2 * this.radius}`; | |
77 | + } | |
65 | 78 | }, |
66 | 79 | len () { |
67 | 80 | return Math.PI * 2 * this.radius; |
68 | 81 | }, |
82 | + trailStyle () { | |
83 | + let style = {}; | |
84 | + if (this.dashboard) { | |
85 | + style = { | |
86 | + 'stroke-dasharray': `${this.len - 75}px ${this.len}px`, | |
87 | + 'stroke-dashoffset': `-${75 / 2}px`, | |
88 | + 'transition': 'stroke-dashoffset .3s ease 0s, stroke-dasharray .3s ease 0s, stroke .3s' | |
89 | + } | |
90 | + } | |
91 | + return style; | |
92 | + }, | |
69 | 93 | pathStyle () { |
70 | - return { | |
71 | - 'stroke-dasharray': `${this.len}px ${this.len}px`, | |
72 | - 'stroke-dashoffset': `${((100 - this.percent) / 100 * this.len)}px`, | |
73 | - 'transition': 'stroke-dashoffset 0.6s ease 0s, stroke 0.6s ease' | |
74 | - }; | |
94 | + let style = {}; | |
95 | + if (this.dashboard) { | |
96 | + style = { | |
97 | + 'stroke-dasharray': `${(this.percent / 100) * (this.len - 75)}px ${this.len}px`, | |
98 | + 'stroke-dashoffset': `-${75 / 2}px`, | |
99 | + 'transition': 'stroke-dashoffset .3s ease 0s, stroke-dasharray .3s ease 0s, stroke .3s, stroke-width .06s ease .3s' | |
100 | + }; | |
101 | + } else { | |
102 | + style = { | |
103 | + 'stroke-dasharray': `${this.len}px ${this.len}px`, | |
104 | + 'stroke-dashoffset': `${((100 - this.percent) / 100 * this.len)}px`, | |
105 | + 'transition': 'stroke-dashoffset 0.3s ease 0s, stroke 0.3s ease' | |
106 | + }; | |
107 | + } | |
108 | + return style; | |
75 | 109 | }, |
76 | 110 | wrapClasses () { |
77 | 111 | return `${prefixCls}`; | ... | ... |