123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- <template>
- <view class="tui-steps-box" :class="{ 'tui-steps-column': direction === 'column' }">
- <view class="tui-step-item" :style="{ width: direction === 'column' ? '100%' : spacing }"
- :class="[direction === 'row' ? 'tui-step-horizontal' : 'tui-step-vertical']" v-for="(item, index) in items"
- :key="index" @tap.stop="handleClick(index)">
- <view class="tui-step-item-ico" :class="[direction === 'column' ? 'tui-step-column_ico' : 'tui-step-row_ico']" :style="{ width: direction === 'column' ? '36rpx' : '100%' }">
- <view v-if="!item.name && !item.icon" class="tui-step-ico"
- :style="{
- width: type == 2 || activeSteps === index ? '36rpx' : '16rpx',
- height: type == 2 || activeSteps === index ? '36rpx' : '16rpx',
- backgroundColor: index <= activeSteps ? activeColor : type == 2 ? '#fff' : deactiveColor,
- borderColor: index <= activeSteps ? activeColor : deactiveColor
- }">
- <text v-if="activeSteps !== index"
- :style="{ color: index <= activeSteps ? '#fff' : '' }">{{ type == 1 ? '' : index + 1 }}</text>
- <tui-icon name="check" :size="16" color="#fff" v-if="activeSteps === index"></tui-icon>
- </view>
- <view class="tui-step-custom" :style="{ backgroundColor: backgroundColor }"
- v-if="item.name || item.icon">
- <tui-icon :name="item.name" :size="item.size || 20" :color="index <= activeSteps ? activeColor : deactiveColor"
- v-if="item.name"></tui-icon>
- <image :src="index <= activeSteps ? item.activeIcon : item.icon" class="tui-step-img"
- mode="widthFix" v-if="!item.name"></image>
- </view>
- <view class="tui-step-line"
- :class="['tui-step-' + direction + '_line', direction == 'column' && (item.name || item.icon) ? 'tui-custom-left' : '']"
- :style="{
- borderColor: index <= activeSteps - 1 ? activeColor : deactiveColor,
- borderRightStyle: direction == 'column' ? lineStyle : '',
- borderTopStyle: direction == 'column' ? '' : lineStyle
- }" v-if="index != items.length - 1"></view>
- </view>
- <view class="tui-step-item-main" :class="['tui-step-' + direction + '_item_main']">
- <view class="tui-step-item-title" :style="{
- color: index <= activeSteps ? activeColor : deactiveColor,
- fontSize: titleSize + 'rpx',
- lineHeight: titleSize + 'rpx',
- fontWeight: bold ? 'bold' : 'normal'
- }">
- {{ item.title }}
- </view>
- <view class="tui-step-item-content"
- :style="{ color: index <= activeSteps ? activeColor : deactiveColor, fontSize: descSize + 'rpx' }">
- {{ item.desc }}</view>
- </view>
- </view>
- </view>
- </template>
- <script>
- //如果自定义传入图标内容,则需要拆分组件
- export default {
- name: 'tuiSteps',
- emits: ['click'],
- props: {
- // 1-默认步骤 2-数字步骤
- type: {
- type: Number,
- default: 1
- },
- spacing: {
- type: String,
- default: '160rpx'
- },
- // 方向 row column
- direction: {
- type: String,
- default: 'row'
- },
- // 激活状态成功颜色
- activeColor: {
- type: String,
- default: '#5677fc'
- },
- // 未激活状态颜色
- deactiveColor: {
- type: String,
- default: '#999999'
- },
- //title字体大小
- titleSize: {
- type: Number,
- default: 28
- },
- //title是否粗体
- bold: {
- type: Boolean,
- default: false
- },
- //desc字体大小
- descSize: {
- type: Number,
- default: 24
- },
- // 当前步骤
- activeSteps: {
- type: Number,
- default: -1
- },
- //线条样式 同border线条样式
- lineStyle: {
- type: String,
- default: 'solid'
- },
- /**
- * [{
- title: "标题",
- desc: "描述",
- name:"字体图标 thorui icon内",
- size:字体图标大小,单位px
- icon:"图片图标",
- activeIcon:"已完成步骤显示图片图标"
- }]
- * */
- items: {
- type: Array,
- default () {
- return [];
- }
- },
- //自定义item内容时背景色
- backgroundColor: {
- type: String,
- default: '#fff'
- }
- },
- data() {
- return {};
- },
- methods: {
- handleClick(index) {
- this.$emit('click', {
- index: index
- });
- }
- }
- };
- </script>
- <style scoped>
- .tui-steps-box {
- width: 100%;
- display: flex;
- justify-content: center;
- }
- .tui-steps-column {
- flex-direction: column;
- }
- .tui-step-ico {
- border-radius: 50%;
- position: relative;
- z-index: 3;
- margin: 0 auto;
- border-width: 1rpx;
- border-style: solid;
- display: inline-flex;
- align-items: center;
- justify-content: center;
- flex-shrink: 0;
- }
- .tui-step-row_ico {
- align-items: center;
- }
- .tui-step-column_ico {
- align-items: flex-start;
- }
- .tui-step-line {
- position: absolute;
- left: 50%;
- top: 20rpx;
- width: 100%;
- height: 0rpx;
- border-top-width: 1px;
- z-index: 2;
- transform: translateY(-50%) translateZ(0);
- }
- .tui-step-row_item_main {
- text-align: center;
- }
- .tui-step-item {
- font-size: 24rpx;
- position: relative;
- box-sizing: border-box;
- }
- .tui-step-item-ico {
- height: 36rpx;
- display: flex;
- justify-content: center;
- }
- .tui-step-custom {
- display: flex;
- align-items: center;
- justify-content: center;
- width: 48rpx;
- height: 40rpx;
- position: relative;
- z-index: 4;
- margin: 0 auto;
- }
- .tui-step-img {
- width: 40rpx;
- height: 40rpx;
- }
- .tui-step-item-main {
- margin-top: 16rpx;
- clear: both;
- }
- .tui-step-item-title {
- word-break: break-all;
- }
- .tui-step-item-content {
- margin-top: 8rpx;
- word-break: break-all;
- }
- .tui-step-vertical {
- width: 100%;
- display: flex;
- padding-bottom: 60rpx;
- }
- .tui-step-column_item_main {
- margin-top: 0;
- padding-left: 20rpx;
- max-width: 80%;
- }
- .tui-step-column_line {
- position: absolute;
- height: 100%;
- top: 0;
- left: 18rpx;
- margin: 0;
- width: 0rpx;
- border-right-width: 1px;
- transform: none !important;
- }
- .tui-custom-left {
- left: 20rpx !important;
- }
- </style>
|