<template> <view class="tm-propress" :style="{ width: width_c , }"> <view class="tm-propress-wk " :style="{ height: height_upx, overflow:loading?'hidden':'inherit' }" > <view :class="[shape=='round'?'round-24':'',bgColor,black_tmeme?'bk':'']" class="tm-propress-wk-statick "></view> <view :animation="animationData" :class="[black_tmeme?'bk':'',shape=='round'?'round-24':'',colors.theme?colors.color:'',loading?'ani':'']" class="tm-propress-wk-active flex-end" :style="{ height: height_upx, width:baifenbi, background:colors.theme?'default':colors.color }" > <block v-if="value>0&&showValue"> <slot name="default" :value="value"> <view class="tm-propress-wk-active-label flex-center px-10 round-24" :class="[black_tmeme?'bk':'',colors.theme?colors.color:'']" :style="{background:colors.theme?'default':colors.color}"> <text>{{value}}%</text> </view> </slot> </block> </view> </view> </view> </template> <script> /** * 进度条 * @property {Function} change value变化时触发. * @property {Function} input value变化时触发. * @property {Number} value = [] 通过value来赋值进度,如果想双向绑定需要value.sync,建议使用v-model. * @property {Number} width = [] 宽度,默认自动宽度,单位rpx,也可输入百分比或者其它类型比如5px * @property {Number} height = [] 高度,默认6,单位upx,也可输入百分比或者其它类型比如5px * @property {String} shape = [round|square] 默认round,方形:square,半圆形:round. * @property {String} color = [] 默认primary,可以是16进制,rgb,rgba,主题色名称. * @property {String} bg-color = [] 默认 grey-lighten-4 ,背景颜色 * @property {Boolean} loading = [true|false] 默认false,自动加载中... * @example <tm-propress v-model="checked" ></tm-propress> */ export default { name: 'tm-propress', model:{ prop:"value", event:"input" }, props: { // 单位upx width: { type: Number|String, default: 0 }, // 单位upx height: { type: Number|String, default: 8 }, value:{ type:Number, default:0 }, showValue:{ type:Boolean|String, default:true, }, // 方形:square,半圆形:round. shape:{ type:String, default:"round" }, color:{ type:String, default:"primary" }, loading:{ type:Boolean, default:false }, bgColor:{ type:String, default:'grey-lighten-4' }, // 跟随主题色的改变而改变。 fllowTheme:{ type:Boolean|String, default:true }, black: { type: Boolean, default: null }, }, computed: { black_tmeme: function() { if (this.black !== null) return this.black; return this.$tm.vx.state().tmVuetify.black; }, colors:function(){ return this.$TestColor(this.color_tmeme); }, color_tmeme:function(){ if(this.$tm.vx.state().tmVuetify.color!==null&&this.$tm.vx.state().tmVuetify.color && this.fllowTheme){ return this.$tm.vx.state().tmVuetify.color; } return this.color; }, width_upx: { get:function(){ return this.width_c; }, set:function(val){ if(val==''||val==0||typeof val === 'undefined'){ this.width_c = '100%'; return; } let reg = /(vw|vh|rem|em|\%|upx|rpx|auto|px)/g; if (reg.test(val)) { this.width_c = val; return } this.width_c = val+'rpx'; } }, height_upx: function() { let reg = /(vw|vh|rem|em|\%|upx|rpx|auto|px)/g; if (reg.test(this.height)) { return this.height; } return this.height+'rpx'; }, baifenbi:function(){ if(this.loading) return "100rpx"; let bl = this.value ; if(typeof bl !=='number') bl =0; if(bl>=100) bl =100; if(bl<=0) bl =0; this.$emit("input",bl); this.$emit("update:value",bl); this.$emit("change",bl); return bl + "%" } }, data() { return { width_c:0, animationData:"", animation:null, tmiddd:55656 }; }, created() { this.width_upx = this.width; }, destroyed() { clearInterval(this.tmiddd) }, mounted() { this.getRect() }, updated() { this.getRect() }, methods: { getRect(){ let t =this this.$Querey(".tm-propress",this,0).then((p)=>{ if(!p) return; if(!p[0].width) return; t.width_upx = p[0].width+'px'; if(t.loading){ t.startAni(); } }).catch(e=>{}) }, async startAni(){ // clearInterval(this.tmiddd) let t = this; var animation = uni.createAnimation({ duration: 1000, timingFunction: 'linear', }) this.animation = animation animation.opacity(0).translateX(t.width_c).step() this.animationData = animation.export() this.tmiddd = setInterval(async function() { t.animationData = "" animation.opacity(1).translateX(0).step({duration:0}) t.animationData = animation.export() await uni.$tm.sleep(50) animation.opacity(0).translateX(t.width_c).step() t.animationData = animation.export() }.bind(this), 1000) } }, }; </script> <style lang="scss" scoped> .tm-propress { .tm-propress-wk { position: relative; .tm-propress-wk-statick, .tm-propress-wk-active { height: 100%; } .tm-propress-wk-active { position: absolute; top: 0; left: 0; transition:0.35s; .tm-propress-wk-active-label{ height: 30rpx; font-size:22rpx; max-width: 100rpx; } // &.ani{ // transition:1s; // animation-name: linef; // animation-duration: 1s; // animation-timing-function: linear; // animation-iteration-count: infinite; // } } } } @keyframes linef{ 0%{ // left:0; transform: translateX(0); opacity: 0.4; } 100%{ // left:100%; transform: translateX(311px); opacity: 1; } } </style>