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