| <template> |
| <view class=""> |
| <view |
| class="u-steps" |
| :style="{ |
| flexDirection: direction |
| }" |
| > |
| <view class="u-steps__item" |
| :class="['u-steps__item--' + direction]" |
| v-for="(item, index) in list" :key="index" |
| > |
| <view |
| class="u-steps__item__num" |
| v-if="mode == 'number'" |
| :style="{ |
| backgroundColor: current < index ? 'transparent' : activeColor, |
| borderColor: current < index ? unActiveColor : activeColor |
| }" |
| > |
| <text v-if="current < index" :style="{ |
| color: current < index ? unActiveColor : activeColor, |
| }"> |
| {{ index + 1 }} |
| </text> |
| <u-icon v-else size="22" color="#ffffff" :name="icon"></u-icon> |
| </view> |
| <view class="u-steps__item__dot" v-if="mode == 'dot'" :style="{ |
| backgroundColor: index <= current ? activeColor : unActiveColor |
| }"></view> |
| <text class="u-line-1" :style="{ |
| color: index <= current ? activeColor : unActiveColor, |
| }" :class="['u-steps__item__text--' + direction]"> |
| {{ item.name }} |
| </text> |
| <view class="u-steps__item__line" :class="['u-steps__item__line--' + mode]" v-if="index < list.length - 1"> |
| <u-line :direction="direction" length="100%" :hair-line="false" :color="unActiveColor"></u-line> |
| </view> |
| </view> |
| </view> |
| </view> |
| </template> |
| |
| <script> |
| /** |
| * steps 步骤条 |
| * @description 该组件一般用于完成一个任务要分几个步骤,标识目前处于第几步的场景。 |
| * @tutorial https://www.uviewui.com/components/steps.html |
| * @property {String} mode 设置模式(默认dot) |
| * @property {Array} list 数轴条数据,数组。具体见上方示例 |
| * @property {String} type type主题(默认primary) |
| * @property {String} direction row-横向,column-竖向(默认row) |
| * @property {Number String} current 设置当前处于第几步 |
| * @property {String} active-color 已完成步骤的激活颜色,如设置,type值会失效 |
| * @property {String} un-active-color 未激活的颜色,用于表示未完成步骤的颜色(默认#606266) |
| * @example <u-steps :list="numList" active-color="#fa3534"></u-steps> |
| */ |
| export default { |
| name: 'u-steps', |
| props: { |
| // 步骤条的类型,dot|number |
| mode: { |
| type: String, |
| default: 'dot' |
| }, |
| // 步骤条的数据 |
| list: { |
| type: Array, |
| default() { |
| return []; |
| } |
| }, |
| // 主题类型, primary|success|info|warning|error |
| type: { |
| type: String, |
| default: 'primary' |
| }, |
| // 当前哪一步是激活的 |
| current: { |
| type: [Number, String], |
| default: 0 |
| }, |
| // 激活步骤的颜色 |
| activeColor: { |
| type: String, |
| default: '#2979ff' |
| }, |
| // 未激活的颜色 |
| unActiveColor: { |
| type: String, |
| default: '#909399' |
| }, |
| // 自定义图标 |
| icon: { |
| type: String, |
| default: 'checkmark' |
| }, |
| // step的排列方向,row-横向,column-竖向 |
| direction: { |
| type: String, |
| default: 'row' |
| } |
| }, |
| data() { |
| return {}; |
| }, |
| }; |
| </script> |
| |
| <style lang="scss" scoped> |
| @import '../../libs/css/style.components.scss'; |
| |
| $u-steps-item-number-width: 44rpx; |
| $u-steps-item-dot-width: 20rpx; |
| |
| .u-steps { |
| @include vue-flex; |
| |
| .u-steps__item { |
| flex: 1; |
| text-align: center; |
| position: relative; |
| min-width: 100rpx; |
| font-size: 26rpx; |
| color: #8799a3; |
| @include vue-flex; |
| justify-content: center; |
| flex-direction: column; |
| align-items: center; |
| |
| &--row { |
| @include vue-flex; |
| flex-direction: column; |
| |
| .u-steps__item__line { |
| position: absolute; |
| z-index: 0; |
| left: 75%; |
| width: 50%; |
| |
| &--dot { |
| top: calc(#{$u-steps-item-dot-width} / 2); |
| } |
| |
| &--number { |
| top: calc(#{$u-steps-item-number-width} / 2); |
| } |
| } |
| } |
| |
| &--column { |
| @include vue-flex; |
| flex-direction: row; |
| justify-content: flex-start; |
| min-height: 120rpx; |
| |
| .u-steps__item__line { |
| position: absolute; |
| z-index: 0; |
| height: 50%; |
| top: 75%; |
| |
| &--dot { |
| left: calc(#{$u-steps-item-dot-width} / 2); |
| } |
| |
| &--number { |
| left: calc(#{$u-steps-item-number-width} / 2); |
| } |
| } |
| } |
| |
| &__num { |
| @include vue-flex; |
| align-items: center; |
| justify-content: center; |
| width: $u-steps-item-number-width; |
| height: $u-steps-item-number-width; |
| border: 1px solid #8799a3; |
| border-radius: 50%; |
| overflow: hidden; |
| } |
| |
| &__dot { |
| width: $u-steps-item-dot-width; |
| height: $u-steps-item-dot-width; |
| @include vue-flex; |
| border-radius: 50%; |
| } |
| |
| &__text--row { |
| margin-top: 14rpx; |
| } |
| |
| &__text--column { |
| margin-left: 14rpx; |
| } |
| } |
| } |
| </style> |