2018-06-30 14:52:34 +08:00
|
|
|
<template>
|
|
|
|
<div class="md-activity-indicator-rolling">
|
|
|
|
<svg
|
|
|
|
:viewBox="`0 0 ${viewBoxSize} ${viewBoxSize}`"
|
|
|
|
:style="{width: `${size}px`, height: `${size}px`}"
|
|
|
|
preserveAspectRatio="xMidYMid"
|
|
|
|
class="md-activity-indicator-svg rolling"
|
|
|
|
>
|
2018-09-28 15:19:20 +08:00
|
|
|
<circle
|
|
|
|
fill="none"
|
|
|
|
:stroke="borderColor"
|
|
|
|
:stroke-width="strokeWidth"
|
|
|
|
:cx="viewBoxSize/2"
|
|
|
|
:cy="viewBoxSize/2"
|
|
|
|
:r="radius"
|
|
|
|
/>
|
2018-06-30 14:52:34 +08:00
|
|
|
<g
|
|
|
|
v-if="!$slots.default"
|
|
|
|
class="circle"
|
|
|
|
>
|
|
|
|
<circle
|
|
|
|
class="stroke"
|
|
|
|
:cx="viewBoxSize/2"
|
|
|
|
:cy="viewBoxSize/2"
|
|
|
|
:fill="fill"
|
|
|
|
:stroke="color"
|
|
|
|
:stroke-width="strokeWidth"
|
2018-09-29 15:31:05 +08:00
|
|
|
:stroke-dasharray="isAutoAnimation ? `${110 * circlePerimeter / 125}` : strokeDasharray"
|
2018-09-28 15:19:20 +08:00
|
|
|
stroke-linecap="round"
|
2018-06-30 14:52:34 +08:00
|
|
|
:r="radius"
|
|
|
|
>
|
2018-09-29 15:31:05 +08:00
|
|
|
<animate
|
|
|
|
v-if="isAutoAnimation"
|
|
|
|
attributeName="stroke-dashoffset"
|
|
|
|
:values="`${360 * circlePerimeter / 125};${140 * circlePerimeter / 125}`"
|
|
|
|
dur="2.2s"
|
|
|
|
keyTimes="0;1"
|
|
|
|
calcMode="spline"
|
|
|
|
fill="freeze"
|
|
|
|
keySplines="0.41,0.314,0.8,0.54"
|
|
|
|
repeatCount="indefinite"
|
|
|
|
begin="0"
|
|
|
|
/>
|
2018-06-30 14:52:34 +08:00
|
|
|
<animateTransform
|
2018-09-29 15:31:05 +08:00
|
|
|
v-if="isAutoAnimation"
|
2018-06-30 14:52:34 +08:00
|
|
|
:dur="`${duration}s`"
|
|
|
|
:values="`0 ${viewBoxSize/2} ${viewBoxSize/2};360 ${viewBoxSize/2} ${viewBoxSize/2}`"
|
|
|
|
attributeName="transform"
|
|
|
|
type="rotate"
|
|
|
|
calcMode="linear"
|
|
|
|
keyTimes="0;1"
|
2018-09-28 15:19:20 +08:00
|
|
|
begin="0"
|
2018-06-30 14:52:34 +08:00
|
|
|
repeatCount="indefinite"
|
|
|
|
></animateTransform>
|
|
|
|
</circle>
|
|
|
|
</g>
|
|
|
|
<slot v-else></slot>
|
|
|
|
</svg>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script>
export default {
|
|
|
|
name: 'md-activity-indicator-rolling',
|
|
|
|
|
|
|
|
props: {
|
|
|
|
size: {
|
|
|
|
type: Number,
|
|
|
|
default: 70,
|
|
|
|
},
|
2018-09-29 15:31:05 +08:00
|
|
|
width: {
|
|
|
|
type: Number,
|
|
|
|
},
|
2018-06-30 14:52:34 +08:00
|
|
|
color: {
|
|
|
|
type: String,
|
2018-08-22 14:55:06 +08:00
|
|
|
default: '#2F86F6',
|
2018-06-30 14:52:34 +08:00
|
|
|
},
|
2018-09-28 15:19:20 +08:00
|
|
|
borderColor: {
|
|
|
|
type: String,
|
|
|
|
default: 'rgba(0, 0, 0, .1)',
|
|
|
|
},
|
2018-06-30 14:52:34 +08:00
|
|
|
fill: {
|
|
|
|
type: String,
|
|
|
|
default: 'transparent',
|
|
|
|
},
|
2018-06-30 19:34:33 +08:00
|
|
|
process: {
|
|
|
|
// process control 0-1
|
|
|
|
type: Number,
|
|
|
|
},
|
2018-06-30 14:52:34 +08:00
|
|
|
},
|
|
|
|
|
|
|
|
computed: {
|
|
|
|
id() {
|
|
|
|
return `${this.$options.name}-keyframes-${this.size}`
|
|
|
|
},
|
|
|
|
strokeWidth() {
|
2018-09-29 15:31:05 +08:00
|
|
|
return this.width || this.size / 12
|
|
|
|
},
|
|
|
|
strokeDasharray() {
|
|
|
|
return `${this.process * this.circlePerimeter} ${(1 - this.process) * this.circlePerimeter}`
|
2018-06-30 14:52:34 +08:00
|
|
|
},
|
|
|
|
radius() {
|
|
|
|
return this.size / 2
|
|
|
|
},
|
|
|
|
viewBoxSize() {
|
|
|
|
return this.size + 2 * this.strokeWidth
|
|
|
|
},
|
|
|
|
circlePerimeter() {
|
|
|
|
return this.size * 3.1415
|
|
|
|
},
|
|
|
|
duration() {
|
|
|
|
return 2
|
|
|
|
},
|
2018-09-29 15:31:05 +08:00
|
|
|
isAutoAnimation() {
|
|
|
|
return this.process === undefined
|
2018-06-30 14:52:34 +08:00
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<style lang="stylus">
|
|
|
|
.md-activity-indicator-rolling
|
|
|
|
clearfix()
|
|
|
|
.rolling
|
|
|
|
float left
|
|
|
|
circle.stroke
|
|
|
|
will-change auto
|
|
|
|
</style>
|