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