148 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Vue
		
	
	
	
		
		
			
		
	
	
			148 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Vue
		
	
	
	
|  | <template> | |||
|  | 	<view class="u-progress" :style="{ | |||
|  | 		borderRadius: round ? '100rpx' : 0, | |||
|  | 		height: height + 'rpx', | |||
|  | 		backgroundColor: inactiveColor | |||
|  | 	}"> | |||
|  | 		<view :class="[ | |||
|  | 			type ? `u-type-${type}-bg` : '', | |||
|  | 			striped ? 'u-striped' : '', | |||
|  | 			striped && stripedActive ? 'u-striped-active' : '' | |||
|  | 		]" class="u-active" :style="[progressStyle]"> | |||
|  | 			<slot v-if="$slots.default || $slots.$default" /> | |||
|  | 			<block v-else-if="showPercent"> | |||
|  | 				{{percent + '%'}} | |||
|  | 			</block> | |||
|  | 		</view> | |||
|  | 	</view> | |||
|  | </template> | |||
|  | 
 | |||
|  | <script> | |||
|  | 	/** | |||
|  | 	 * lineProgress 线型进度条 | |||
|  | 	 * @description 展示操作或任务的当前进度,比如上传文件,是一个线形的进度条。 | |||
|  | 	 * @tutorial https://www.uviewui.com/components/lineProgress.html
 | |||
|  | 	 * @property {String Number} percent 进度条百分比值,为数值类型,0-100 | |||
|  | 	 * @property {Boolean} round 进度条两端是否为半圆(默认true) | |||
|  | 	 * @property {String} type 如设置,active-color值将会失效 | |||
|  | 	 * @property {String} active-color 进度条激活部分的颜色(默认#19be6b) | |||
|  | 	 * @property {String} inactive-color 进度条的底色(默认#ececec) | |||
|  | 	 * @property {Boolean} show-percent 是否在进度条内部显示当前的百分比值数值(默认true) | |||
|  | 	 * @property {String Number} height 进度条的高度,单位rpx(默认28) | |||
|  | 	 * @property {Boolean} striped 是否显示进度条激活部分的条纹(默认false) | |||
|  | 	 * @property {Boolean} striped-active 条纹是否具有动态效果(默认false) | |||
|  | 	 * @example <u-line-progress :percent="70" :show-percent="true"></u-line-progress> | |||
|  | 	 */ | |||
|  | 	export default { | |||
|  | 		name: "u-line-progress", | |||
|  | 		props: { | |||
|  | 			// 两端是否显示半圆形
 | |||
|  | 			round: { | |||
|  | 				type: Boolean, | |||
|  | 				default: true | |||
|  | 			}, | |||
|  | 			// 主题颜色
 | |||
|  | 			type: { | |||
|  | 				type: String, | |||
|  | 				default: '' | |||
|  | 			}, | |||
|  | 			// 激活部分的颜色
 | |||
|  | 			activeColor: { | |||
|  | 				type: String, | |||
|  | 				default: '#19be6b' | |||
|  | 			}, | |||
|  | 			inactiveColor: { | |||
|  | 				type: String, | |||
|  | 				default: '#ececec' | |||
|  | 			}, | |||
|  | 			// 进度百分比,数值
 | |||
|  | 			percent: { | |||
|  | 				type: Number, | |||
|  | 				default: 0 | |||
|  | 			}, | |||
|  | 			// 是否在进度条内部显示百分比的值
 | |||
|  | 			showPercent: { | |||
|  | 				type: Boolean, | |||
|  | 				default: true | |||
|  | 			}, | |||
|  | 			// 进度条的高度,单位rpx
 | |||
|  | 			height: { | |||
|  | 				type: [Number, String], | |||
|  | 				default: 28 | |||
|  | 			}, | |||
|  | 			// 是否显示条纹
 | |||
|  | 			striped: { | |||
|  | 				type: Boolean, | |||
|  | 				default: false | |||
|  | 			}, | |||
|  | 			// 条纹是否显示活动状态
 | |||
|  | 			stripedActive: { | |||
|  | 				type: Boolean, | |||
|  | 				default: false | |||
|  | 			} | |||
|  | 		}, | |||
|  | 		data() { | |||
|  | 			return { | |||
|  | 
 | |||
|  | 			} | |||
|  | 		}, | |||
|  | 		computed: { | |||
|  | 			progressStyle() { | |||
|  | 				let style = {}; | |||
|  | 				style.width = this.percent + '%'; | |||
|  | 				if(this.activeColor) style.backgroundColor = this.activeColor; | |||
|  | 				return style; | |||
|  | 			} | |||
|  | 		}, | |||
|  | 		methods: { | |||
|  | 
 | |||
|  | 		} | |||
|  | 	} | |||
|  | </script> | |||
|  | 
 | |||
|  | <style lang="scss" scoped> | |||
|  | 	@import "../../libs/css/style.components.scss"; | |||
|  | 	 | |||
|  | 	.u-progress { | |||
|  | 		overflow: hidden; | |||
|  | 		height: 15px; | |||
|  | 		/* #ifndef APP-NVUE */ | |||
|  | 		display: inline-flex; | |||
|  | 		/* #endif */ | |||
|  | 		align-items: center; | |||
|  | 		width: 100%; | |||
|  | 		border-radius: 100rpx; | |||
|  | 	} | |||
|  | 
 | |||
|  | 	.u-active { | |||
|  | 		width: 0; | |||
|  | 		height: 100%; | |||
|  | 		align-items: center; | |||
|  | 		@include vue-flex; | |||
|  | 		justify-items: flex-end; | |||
|  | 		justify-content: space-around; | |||
|  | 		font-size: 20rpx; | |||
|  | 		color: #ffffff; | |||
|  | 		transition: all 0.4s ease; | |||
|  | 	} | |||
|  | 
 | |||
|  | 	.u-striped { | |||
|  | 		background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); | |||
|  | 		background-size: 39px 39px; | |||
|  | 	} | |||
|  | 
 | |||
|  | 	.u-striped-active { | |||
|  | 		animation: progress-stripes 2s linear infinite; | |||
|  | 	} | |||
|  | 
 | |||
|  | 	@keyframes progress-stripes { | |||
|  | 		0% { | |||
|  | 			background-position: 0 0; | |||
|  | 		} | |||
|  | 
 | |||
|  | 		100% { | |||
|  | 			background-position: 39px 0; | |||
|  | 		} | |||
|  | 	} | |||
|  | </style> |