Blame view

uni_modules/uview-plus/components/u-swiper-indicator/u-swiper-indicator.vue 2.73 KB
a2702f6d   刘淇   巡查计划
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
111
112
113
114
  <template>
  	<view class="u-swiper-indicator">
  		<view
  			class="u-swiper-indicator__wrapper"
  			v-if="indicatorMode === 'line'"
  			:class="[`u-swiper-indicator__wrapper--${indicatorMode}`]"
  			:style="{
  				width: 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';
  	import { mpMixin } from '../../libs/mixin/mpMixin';
  	import { mixin } from '../../libs/mixin/mixin';
  	import { addUnit } from '../../libs/function/index';
  	/**
  	 * SwiperIndicator 轮播图指示器
  	 * @description 该组件一般用于导航轮播,广告展示等场景,可开箱即用,
  	 * @tutorial https://uview-plus.jiangruyi.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: [mpMixin, mixin, props],
  		data() {
  			return {
  				lineWidth: 22
  			}
  		},
  		computed: {
  			// 指示器为线型的样式
  			lineStyle() {
  				let style = {}
  				style.width = addUnit(this.lineWidth)
  				style.transform = `translateX(${ 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
  				}
  			}
  		},
  		methods: {
  			addUnit
  		}
  	}
  </script>
  
  <style lang="scss" scoped>
  
  	.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>