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.
 
 
 

220 lines
5.2 KiB

<template>
<div class="banner-container">
<swiper :style="{width: '100vw', height: '410rpx'}"
:indicator-dots="swiperConfig.indicatorDots"
:indicator-color="swiperConfig.indicatorColor"
:indicator-active-color="swiperConfig.indicatorActiveColor"
:autoplay="swiperConfig.autoplay"
:interval="swiperConfig.interval"
:duration="swiperConfig.duration"
:circular="swiperConfig.circular"
:previous-margin="swiperConfig.previousMargin"
:next-margin="swiperConfig.nextMargin"
@change="swiperChange"
@animationfinish="animationfinish">
<swiper-item v-for="(item, i) in bannerList" :key="i">
<!-- 1.当前展示为第1项时bannerList最后一项和第二项的justifyContent值分别为flex-end和flex-start其余项值为center -->
<!-- 2.当前展示为最后一项时bannerList倒数第2项和第1项的justifyContent值分别为flex-end和flex-start其余项值为center -->
<!-- 3.当前展示为其他项非第1和最后1项bannerList当前项的前1项和后1项的justifyContent值分别为flex-end和flex-start其余项值为center -->
<!-- 4.padding值也需要根据不同项设定不同值但理同justifyContent -->
<div class="image-container"
:class="[curIndex===0?((i===listLen-1)?'item-left':(i===1?'item-right':'item-center')):(curIndex===listLen-1?(i===0?'item-right':(i===listLen-2?'item-left':'item-center')):(i===curIndex-1?'item-left':(i===curIndex+1?'item-right':'item-center')))]">
<img :src="item.image_url"
class="slide-image"
:style="{
transitionDuration: '.3s',
transitionTimingFunction: 'ease'
}"/>
<!-- transform: curIndex===i?'scale(' + scaleX + ',' + scaleY + ')':'scale(1,1)', -->
<div class="zhe"></div>
<!-- @click="getBannerDetail(i)" -->
</div>
</swiper-item>
</swiper>
<!-- <div class="desc-wrap" :class="[isDescAnimating?'hideAndShowDesc':'']">
<div class="title">{{bannerList[descIndex].title}}</div>
<div class="desc">{{bannerList[descIndex].description}}</div>
</div> -->
</div>
</template>
<script>
export default {
name: "special-Banner",
props: {
bannerList: {
type: Array,
default () {
return []
}
},
swiperConfig: {
type: Object,
default () {
return {
indicatorDots: true,
indicatorColor: 'rgba(255, 255, 255, .4)',
indicatorActiveColor: 'rgba(255, 255, 255, 1)',
autoplay: false,
interval: 3000,
duration: 300,
circular: true,
previousMargin: '58rpx',
nextMargin: '58rpx'
}
}
},
scaleX: {
type: String,
default: (634 / 550).toFixed(4)
},
scaleY: {
type: String,
default: (378 / 328).toFixed(4)
}
},
computed:{
listLen () {
return this.bannerList.length
}
},
data () {
return {
curIndex: 0,
descIndex: 0,
isDescAnimating: false,
}
},
methods: {
swiperChange (e) {
this.$emit('curIndexs',this.bannerList[e.mp.detail.current].id)
const that = this
this.curIndex = e.mp.detail.current
this.isDescAnimating = true
let timer = setTimeout(function () {
that.descIndex = e.mp.detail.current
clearTimeout(timer)
}, 150)
},
animationfinish (e) {
this.isDescAnimating = false
},
getBannerDetail (index) {
uni.showLoading({
title: '将前往详情页面',
duration: 2000,
mask: true
})
}
}
}
</script>
<style lang="scss" scoped>
.banner-container {
width: 100vw;
height: auto;
.image-container {
box-sizing: border-box;
width: 100%;
height: 100%;
display: flex;
.slide-image {
width: 80%;
height: auto;
z-index: 200;
}
}
.item-left {
justify-content: flex-end;
padding: 0 0 0 0;
}
.item-right {
justify-content: flex-start;
padding: 0 0 0 0;
}
.item-center {
justify-content: center;
padding: 0 0 0 0;
}
.desc-wrap {
box-sizing: border-box;
width: 100%;
height: 98rpx;
padding: 24rpx 66rpx 0;
.title {
width: 100%;
height: 42rpx;
line-height: 42rpx;
color: #222222;
font-size: 30rpx;
font-family: 'PingFangTC-Regular';
font-weight: 600;
text-align: left;
}
.desc {
margin-top: 4rpx;
width: 100%;
height: 34rpx;
line-height: 34rpx;
color: #999999;
font-size: 24rpx;
font-family: 'PingFangTC-Regular';
text-align: left;
}
}
@keyframes descAnimation {
0% {
opacity: 1;
}
25% {
opacity: .5;
}
50% {
opacity: 0;
}
75% {
opacity: .5;
}
100% {
opacity: 1;
}
}
@-webkit-keyframes descAnimation {
0% {
opacity: 1;
}
25% {
opacity: .5;
}
50% {
opacity: 0;
}
75% {
opacity: .5;
}
100% {
opacity: 1;
}
}
.hideAndShowDesc {
animation: descAnimation .3s ease 1;
-webkit-animation: descAnimation .3s ease 1;
}
}
.image-container{
img{
// filter: blur(5px);
}
}
.item-center{
.zhe{
background-color:transparent;
}
}
.zhe{
z-index: 201;
position: absolute;
width: 80%;
height: 100%;
background-color: rgba(0,0,0,0.7);
}
</style>