3 changed files with 193 additions and 131 deletions
@ -0,0 +1,176 @@
|
||||
<template> |
||||
<view class="banner-swiper-box"> |
||||
<canvas canvas-id="colorThief" class="hide-canvas"></canvas> |
||||
<swiper class="banner-carousel shopro-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) { |
||||
console.log(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(); |
||||
let bgcolor = this.bgcolorAry[this.swiperCurrent]; |
||||
this.$emit('getbgcolor', bgcolor); |
||||
}, |
||||
|
||||
// 路由跳转 |
||||
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> |
Loading…
Reference in new issue