|
|
- <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>
|