123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- <template>
- <view class="banner" :style="{height: height + 'rpx'}">
- <view v-for="(item, index) in list" :key="index" class="pic"
- :animation="num === index ?showpic:hidepic"
- :style="{zIndex: zIndex === index ?1:0}"
- @touchstart="touchstart" @touchend="touchend">
- <app-jump-button
- :open_type="item.open_type"
- :url="item.url ? item.url : item.page_url"
- :params="item.params">
- <image :style="{height: height + 'rpx', width: '100%'}" :mode="imgMode" :src="item[name]" />
- </app-jump-button>
- </view>
- <view class="u-swiper-indicator"
- :style="{
- bottom: '12rpx',
- justifyContent: 'center'
- }"
- >
- <block v-if="mode === 'rect'">
- <view class="u-indicator-item-rect" :class="{ 'u-indicator-item-rect-active': index === num }" v-for="(item, index) in list"
- :key="index"></view>
- </block>
- <block v-if="mode === 'round'">
- <view class="u-indicator-item-round" :class="{ 'u-indicator-item-round-active': index === num }" v-for="(item, index) in list"
- :key="index"></view>
- </block>
- </view>
- </view>
- </template>
- <script>
-
- export default {
- name:'u-swiper',
- props: {
- list: {
- type: Array,
- default () {
- return [];
- }
- },
- // 图片的裁剪模式
- imgMode: {
- type: String,
- default: 'aspectFill'
- },
- // 从list数组中读取的图片的属性名
- name: {
- type: String,
- default: 'image'
- },
- // list的高度,单位rpx
- height: {
- type: [Number, String],
- default: 250
- },
- // 自动轮播时间间隔,单位ms
- duration: {
- type: [Number, String],
- default: 500
- },
- // 隔多久自动切换
- interval: {
- type: [String, Number],
- default: 3000
- },
- // 指示器的模式,rect|dot|number|round
- mode: {
- type: String,
- default: 'round'
- },
- // 指示器的位置,topLeft|topCenter|topRight|bottomLeft|bottomCenter|bottomRight
- indicatorPos: {
- type: String,
- default: 'bottomCenter'
- },
- // 是否自动播放
- autoplay: {
- type: Boolean,
- default: true
- },
- },
- data() {
- return {
- num: 0,
- zIndex: 0,
- showpic:null,
- hidepic:null,
- setTime: 0,
- touchDot: 0
- }
- },
-
- methods: {
- touchstart(e) {
- this.touchDot = e.touches[0].pageX;
- },
- touchend(e) {
- let touchMove = e.changedTouches[0].pageX;
- if (touchMove - this.touchDot <= -40) {
- this.num = this.num - 1;
- if(this.num < 0){
- this.num=this.list.length-1;
- }
- setTimeout(() => {
- this.zIndex = this.num;
- }, 1000);
- }
- if (touchMove - this.touchDot >= 40) {
- this.num = this.num + 1;
- if(this.num>=this.list.length){
- this.num=0;
- }
- setTimeout(() => {
- this.zIndex = this.num;
- }, 1000);
- }
- }
- },
- destroyed() {
- clearInterval(this.setTime);
- },
- watch: {
- list: {
- handler(newVal) {
- if (newVal.length === 0) return;
- let animation= uni.createAnimation({}) //创建一个动画实例
- //淡入
- animation.opacity(1).step({
- duration:this.duration
- }) //描述动画
- this.showpic = animation.export();
- //淡出
- animation.opacity(0).step({duration:this.duration})
- this.hidepic = animation.export();
- if (this.autoplay) {
- this.setTime = setInterval(() => {
- this.num = this.num+1;
- if(this.num>=this.list.length){
- this.num=0;
- }
- setTimeout(() => {
- this.zIndex = this.num;
- }, this.interval + 1000)
- }, this.interval);
- }
- },
- immediate: true
- }
- }
- }
- </script>
- <style lang="scss">
- .banner {
- width: 750rpx;
- position: relative;
- }
- .pic {
- width:750rpx;
- position:absolute;
- top:0;
- left:0;
- }
- .u-swiper-indicator {
- padding: 0 24rpx;
- position: absolute;
- display: flex;
- width: 100%;
- z-index: 1;
- }
- .u-indicator-item-round-active {
- width: 34rpx !important;
- background-color: rgba(255, 255, 255, 0.8) !important;
- }
- .u-indicator-item-round {
- width: 14rpx;
- height: 14rpx;
- margin: 0 6rpx;
- border-radius: 20rpx;
- transition: all 0.5s;
- background-color: rgba(0, 0, 0, 0.3);
- }
- .u-indicator-item-rect {
- width: 26rpx;
- height: 8rpx;
- margin: 0 6rpx;
- transition: all 0.5s;
- background-color: rgba(0, 0, 0, 0.3);
- }
- .u-indicator-item-rect-active {
- background-color: rgba(255, 255, 255, 0.8);
- }
- </style>
|