You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
173 lines
5.3 KiB
173 lines
5.3 KiB
<template> |
|
<view class="banner-swiper-box"> |
|
<canvas canvas-id="colorThief" class="hide-canvas"></canvas> |
|
<swiper class="banner-carousel Shop-selector-rect" circular @change="swiperChange" :autoplay="true"> |
|
<swiper-item v-for="(item, index) in list" :key="index" class="carousel-item" @tap="routerTo(item.path)"> |
|
<image class="swiper-image " :src="item.pic" @click="goRoll(item)" mode="widthFix" lazy-load> |
|
</image> |
|
</swiper-item> |
|
</swiper> |
|
<view class="banner-swiper-dots"> |
|
<text :class="swiperCurrent === index ? 'banner-dot-active' : 'banner-dot'" |
|
v-for="(dot, index) in list.length" :key="index"></text> |
|
</view> |
|
</view> |
|
</template> |
|
|
|
<script> |
|
import colorThief from 'miniapp-color-thief'; |
|
|
|
export default { |
|
data() { |
|
return { |
|
swiperCurrent: 0, //轮播下标 |
|
webviewId: 0, |
|
bgcolorAry: [], |
|
list: [] |
|
}; |
|
}, |
|
props: { |
|
banner: { |
|
type: Array, |
|
default: [] |
|
} |
|
}, |
|
created: async function () { |
|
await this.doColorThief(); |
|
|
|
}, |
|
async mounted() { |
|
|
|
}, |
|
computed: {}, |
|
watch: { |
|
banner(next) { |
|
this.list = next; |
|
this.doColorThief() |
|
} |
|
}, |
|
methods: { |
|
async doColorThief() { |
|
let that = this; |
|
// 获取轮播图 |
|
let item = this.list[this.swiperCurrent]; |
|
if(!item){ |
|
return |
|
} |
|
// 获取轮播图颜色 |
|
let bgcolor = this.bgcolorAry[this.swiperCurrent]; |
|
// 颜色不存在 |
|
if (!bgcolor) { |
|
let ctx = uni.createCanvasContext('colorThief', that.$scope); |
|
if (0 === that.webviewId || ctx.webviewId === that.webviewId) { |
|
that.webviewId = ctx.webviewId; |
|
uni.getImageInfo({ |
|
src: item.pic, |
|
success: function (image) { |
|
ctx.drawImage(image.path, 0, 0, image.width, image.height); |
|
ctx.draw(true, function (e) { |
|
uni.canvasGetImageData({ |
|
canvasId: 'colorThief', |
|
x: 0, |
|
y: 0, |
|
width: parseInt(image.width), |
|
height: parseInt(image.height), |
|
success(res) { |
|
let newBgcolor = colorThief(res.data) |
|
.color() |
|
.getHex(); |
|
that.$set(that.bgcolorAry, that |
|
.swiperCurrent, |
|
newBgcolor); |
|
that.$emit('getbgcolor', newBgcolor); |
|
}, |
|
fail: function (error) { |
|
} |
|
}, that.$scope); |
|
}); |
|
}, |
|
fail: function (error) { |
|
} |
|
}); |
|
} |
|
} else { |
|
that.$set(item, 'bgcolor', bgcolor); |
|
that.$emit('getbgcolor', bgcolor); |
|
} |
|
}, |
|
swiperChange(e) { |
|
this.swiperCurrent = e.detail.current; |
|
this.doColorThief(); |
|
}, |
|
|
|
// 路由跳转 |
|
goRoll(item) { |
|
if (item.uniapp_url) { |
|
this.$yrouter.push(item.uniapp_url) |
|
} |
|
}, |
|
} |
|
|
|
} |
|
</script> |
|
|
|
<style lang="less"> |
|
// 轮播 |
|
.banner-swiper-box { |
|
background: #fff; |
|
} |
|
|
|
.banner-swiper-box, |
|
.banner-carousel { |
|
width: 750rpx; |
|
height: 350upx; |
|
position: relative; |
|
|
|
.carousel-item { |
|
width: 100%; |
|
height: 100%; |
|
// padding: 0 28upx; |
|
overflow: hidden; |
|
} |
|
|
|
.swiper-image { |
|
width: 100%; |
|
height: 100%; |
|
// border-radius: 10upx; |
|
// background: #ccc; |
|
} |
|
} |
|
|
|
.banner-swiper-dots { |
|
display: flex; |
|
position: absolute; |
|
left: 50%; |
|
transform: translateX(-50%); |
|
bottom: 20rpx; |
|
z-index: 5; |
|
|
|
.banner-dot { |
|
width: 14rpx; |
|
height: 14rpx; |
|
background: rgba(255, 255, 255, 1); |
|
border-radius: 50%; |
|
margin-right: 10rpx; |
|
} |
|
|
|
.banner-dot-active { |
|
width: 14rpx; |
|
height: 14rpx; |
|
background: #a8700d; |
|
border-radius: 50%; |
|
margin-right: 10rpx; |
|
} |
|
} |
|
|
|
|
|
.hide-canvas { |
|
position: fixed !important; |
|
top: -99999upx; |
|
left: -99999upx; |
|
z-index: -99999; |
|
} |
|
</style>
|
|
|