<template>
|
|
<view v-if="visible" class="circle y-flex" ref="loading" :style="{
|
|
width: pixelSize + 'px',
|
|
height: pixelSize + 'px',
|
|
'border-radius': pixelSize + 'px'
|
|
}">
|
|
<view
|
|
class="line y-flex"
|
|
:style="{
|
|
'border-top-width': (pixelSize / 4) + 'px',
|
|
'border-bottom-width': (pixelSize / 4) + 'px',
|
|
'border-top-color': item.top,
|
|
'border-bottom-color': item.bottom,
|
|
width: (pixelSize / 12) + 'px',
|
|
left: ((pixelSize / 2) - (pixelSize / 24)) + 'px',
|
|
}"
|
|
:class="'line_' + index"
|
|
v-for="(item, index) in rgbs" :key="index"></view>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
// #ifdef APP-NVUE
|
|
const Binding = uni.requireNativePlugin('bindingx');
|
|
// #endif
|
|
export default {
|
|
props: {
|
|
visible: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
size: {
|
|
type: [Number, String],
|
|
default: 40
|
|
},
|
|
color: {
|
|
type: String,
|
|
default: '#333333'
|
|
}
|
|
},
|
|
computed: {
|
|
rgbs () {
|
|
const rgb = this.hexToRgb(this.color).replace('rgb(', '').replace(')', '')
|
|
return [{
|
|
top: `rgba(${rgb}, 1)`,
|
|
bottom: `rgba(${rgb}, .4)`
|
|
},{
|
|
top: `rgba(${rgb}, .4)`,
|
|
bottom: `rgba(${rgb}, .5)`
|
|
},{
|
|
top: `rgba(${rgb}, .4)`,
|
|
bottom: `rgba(${rgb}, .6)`
|
|
},{
|
|
top: `rgba(${rgb}, .4)`,
|
|
bottom: `rgba(${rgb}, .7)`
|
|
},{
|
|
top: `rgba(${rgb}, .4)`,
|
|
bottom: `rgba(${rgb}, .8)`
|
|
},{
|
|
top: `rgba(${rgb}, .4)`,
|
|
bottom: `rgba(${rgb}, .9)`
|
|
}]
|
|
},
|
|
pixelSize () {
|
|
return this.unitpixel(this.size)
|
|
}
|
|
},
|
|
data () {
|
|
return {
|
|
loading_binding: null
|
|
}
|
|
},
|
|
mounted() {
|
|
// #ifdef APP-NVUE
|
|
this.$nextTick( function () {
|
|
if ( this.visible ) this.start()
|
|
})
|
|
// #endif
|
|
},
|
|
beforeDestroy() {
|
|
// #ifdef APP-NVUE
|
|
if ( this.loading_binding ) {
|
|
Binding.unbind({
|
|
token: this.loading_binding.token,
|
|
eventType: 'timing'
|
|
})
|
|
this.loading_binding = null
|
|
}
|
|
// #endif
|
|
},
|
|
methods: {
|
|
start () {
|
|
const loading = this.getEl(this.$refs.loading);
|
|
this.loading_binding = Binding.bind({
|
|
eventType: 'timing',
|
|
props: [{
|
|
element: loading,
|
|
property: 'transform.rotateZ',
|
|
expression: 'floor(t/100)*30'
|
|
}]
|
|
});
|
|
},
|
|
unitpixel (size) {
|
|
const text = size.toString()
|
|
return text.indexOf('rpx') > -1 ? uni.upx2px(text.replace('rpx', '')) : text.indexOf('px') > -1 ? parseFloat(text.replace('px', '')) : uni.upx2px(text)
|
|
},
|
|
hexToRgb (hex) {
|
|
hex = hex.length == 7 ? hex : '#' + hex.slice(1, 4) + hex.slice(1, 4)
|
|
let str="rgb("
|
|
const r = parseInt(hex.slice(1,3),16).toString(); //ff slice不包括end
|
|
const g = parseInt(hex.slice(3,5),16).toString(); //00
|
|
const b = parseInt(hex.slice(5,7),16).toString(); //ff
|
|
str += r+","+g+","+b+")";
|
|
return str
|
|
},
|
|
getEl (el) {
|
|
if (typeof el === 'string' || typeof el === 'number') return el;
|
|
if (WXEnvironment) {
|
|
return el.ref;
|
|
} else {
|
|
return el instanceof HTMLElement ? el : el.$el;
|
|
}
|
|
}
|
|
},
|
|
watch: {
|
|
visible (newVal) {
|
|
// #ifdef APP-NVUE
|
|
this.$nextTick(() => {
|
|
if ( newVal ) {
|
|
this.start()
|
|
} else {
|
|
if ( this.loading_binding ) {
|
|
Binding.unbind({
|
|
token: this.loading_binding.token,
|
|
eventType: 'timing'
|
|
})
|
|
this.loading_binding = null
|
|
}
|
|
}
|
|
})
|
|
// #endif
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped>
|
|
/* #ifndef APP-NVUE */
|
|
@keyframes loading{
|
|
0% {
|
|
transform: rotateZ(30deg);
|
|
}
|
|
9.33333%{
|
|
transform: rotateZ(60deg);
|
|
}
|
|
18.66666%{
|
|
transform: rotateZ(90deg);
|
|
}
|
|
27.99999%{
|
|
transform: rotateZ(120deg);
|
|
}
|
|
37.33332%{
|
|
transform: rotateZ(150deg);
|
|
}
|
|
46.66665%{
|
|
transform: rotateZ(180deg);
|
|
}
|
|
55.99998%{
|
|
transform: rotateZ(210deg);
|
|
}
|
|
65.33331%{
|
|
transform: rotateZ(240deg);
|
|
}
|
|
74.66664%{
|
|
transform: rotateZ(270deg);
|
|
}
|
|
83.99997%{
|
|
transform: rotateZ(300deg);
|
|
}
|
|
93.33333%{
|
|
transform: rotateZ(330deg);
|
|
}
|
|
100%{
|
|
transform: rotateZ(360deg);
|
|
}
|
|
}
|
|
/* #endif */
|
|
.circle {
|
|
position: relative;
|
|
/* #ifndef APP-NVUE */
|
|
animation: loading 1200ms step-start infinite;
|
|
/* #endif */
|
|
}
|
|
.circle .line {
|
|
position: absolute;
|
|
border-top-style: solid;
|
|
border-bottom-style: solid;
|
|
top: 0;
|
|
bottom: 0;
|
|
}
|
|
.circle .line_0 {
|
|
}
|
|
.circle .line_1 {
|
|
transform: rotateZ(30deg);
|
|
}
|
|
.circle .line_2 {
|
|
transform: rotateZ(60deg);
|
|
}
|
|
.circle .line_3 {
|
|
transform: rotateZ(90deg);
|
|
}
|
|
.circle .line_4 {
|
|
transform: rotateZ(120deg);
|
|
}
|
|
.circle .line_5 {
|
|
transform: rotateZ(150deg);
|
|
}
|
|
</style>
|