#
whycq
2023-10-13 c64064285bc6df2d5b82f3995bb9e56398cacd73
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<template>
    <view class="u-swiper-indicator">
        <view
            class="u-swiper-indicator__wrapper"
            v-if="indicatorMode === 'line'"
            :class="[`u-swiper-indicator__wrapper--${indicatorMode}`]"
            :style="{
                width: $u.addUnit(lineWidth * length),
                backgroundColor: indicatorInactiveColor
            }"
        >
            <view
                class="u-swiper-indicator__wrapper--line__bar"
                :style="[lineStyle]"
            ></view>
        </view>
        <view
            class="u-swiper-indicator__wrapper"
            v-if="indicatorMode === 'dot'"
        >
            <view
                class="u-swiper-indicator__wrapper__dot"
                v-for="(item, index) in length"
                :key="index"
                :class="[index === current && 'u-swiper-indicator__wrapper__dot--active']"
                :style="[dotStyle(index)]"
            >
 
            </view>
        </view>
    </view>
</template>
 
<script>
    import props from './props.js';
    /**
     * SwiperIndicator 轮播图指示器
     * @description 该组件一般用于导航轮播,广告展示等场景,可开箱即用,
     * @tutorial https://www.uviewui.com/components/swiper.html
     * @property {String | Number}    length                    轮播的长度(默认 0 )
     * @property {String | Number}    current                    当前处于活动状态的轮播的索引(默认 0 )
     * @property {String}            indicatorActiveColor    指示器非激活颜色
     * @property {String}            indicatorInactiveColor    指示器的激活颜色
     * @property {String}            indicatorMode            指示器模式(默认 'line' )
     * @example    <u-swiper :list="list4" indicator keyName="url" :autoplay="false"></u-swiper>
     */
    export default {
        name: 'u-swiper-indicator',
        mixins: [uni.$u.mpMixin, uni.$u.mixin, props],
        data() {
            return {
                lineWidth: 22
            }
        },
        computed: {
            // 指示器为线型的样式
            lineStyle() {
                let style = {}
                style.width = uni.$u.addUnit(this.lineWidth)
                style.transform = `translateX(${ uni.$u.addUnit(this.current * this.lineWidth) })`
                style.backgroundColor = this.indicatorActiveColor
                return style
            },
            // 指示器为点型的样式
            dotStyle() {
                return index => {
                    let style = {}
                    style.backgroundColor = index === this.current ? this.indicatorActiveColor : this.indicatorInactiveColor
                    return style
                }
            }
        },
    }
</script>
 
<style lang="scss" scoped>
    @import "../../libs/css/components.scss";
 
    .u-swiper-indicator {
 
        &__wrapper {
            @include flex;
 
            &--line {
                border-radius: 100px;
                height: 4px;
 
                &__bar {
                    width: 22px;
                    height: 4px;
                    border-radius: 100px;
                    background-color: #FFFFFF;
                    transition: transform 0.3s;
                }
            }
 
            &__dot {
                width: 5px;
                height: 5px;
                border-radius: 100px;
                margin: 0 4px;
 
                &--active {
                    width: 12px;
                }
            }
 
        }
    }
</style>