前端原生写自定义旋转变换轮播图

html部分:

<div class="banner_box">
    <div class="swiperWrapper" v-show="bannerList.length>0">
         <div class="swiper-item" :id="`swiperSlide${index}`" :class="{'active':index==0,'next':index==1,'prev':index==2}" @click="swiperChange(item,index)" v-for="(item,index) in bannerList" :key="index">
             <img class="bus_img" style="width:100%;height:auto;max-width: 1200px;" :src="item.img_url">
			 <div class="txt_box txtBox" :class="{'txtBox_active':item.active}" >
                 <p class="f_t_16 desc" v-html="item.desc"></p>
                 <p class="f_t_20 title">{{ item.title }}</p>
             </div>
          </div>
          <div class="dot">
              <i class="el-icon-arrow-left icon-prev" @click="swiperButtonChange('prev')"></i>
              <div v-for="(item,index) in bannerList" :key="index" :class="{'active':item.active}" @click="swiperChange(item,index)"></div>
              <i class="el-icon-arrow-right icon-next" @click="swiperButtonChange('next')"></i>
           </div>
     </div>
</div>

css部分:

/* 自定义轮播图样式 */
.banner_box {    
    width: 1100px;
    height: 856px;
    margin: 100px auto -70px auto;
    position: relative;
    box-sizing: border-box;
}
.swiper-item {
    transition: bottom 1s ease-in-out,left 1s ease-in-out,width 1s ease-in-out,height 1s ease-in-out,z-index 0s linear 1s;
    cursor: pointer;
    position: absolute;
}
.swiperWrapper {
    height: 100%;
}
.swiperWrapper .active {
    bottom: 380px;
    left: 215px;
    z-index: 10;
    width: 883px;
    height: 464px;
}
.swiperWrapper .next {
    bottom: 170px;
    left: 7%;
    z-index: 20;
    width: 386px;
    height: 257px;
}
.swiperWrapper .prev {
    bottom: 360px;
    left: 0%;
    z-index: 30;
    width: 194px;
    height: 130px;
}
.txtBox {
    bottom: 9%;
    line-height: unset;
    width: 36.9%;
    background-color: #FFFFFF;
    position: absolute;
    right: 5%;
    padding: 20px 24px;
    box-sizing: border-box;
    font-size: 24px;
    color: #004388;
    text-align: left;
}
.txtBox {
    opacity: 0;
    visibility: hidden;
    right: 30px;
    bottom: -90px;
    width: 575px;
}
.txtBox_active {
    visibility: visible;
    opacity: 1;
    transition: all .6s ease-in-out 1s;
}
.txtBox .title {
    font-size: 20px;
    font-family: theSans;
    font-weight: 500;
    color: #333333;
 }
.txtBox .desc {
    font-size: 16px;
    font-family: SourceHanSansSC-Medium, SourceHanSansSC;
    font-weight: 500;
    color: #004388;
    margin-bottom: 39px;
 }
.newPointer {
    transform: translate(160px,315px);
}
.dot {
    width: 120px;
    height: 20px;
    position: absolute;
    left: 44%;
    bottom: 220px;
    display: flex;
    justify-content: space-between;
    align-items: center;
}
.dot > div {
    width: 10px;
    height: 10px;
    border-radius: 50%;
    background-color: #004387;
    transition: background-color 0.3s ease-in-out;
    cursor: pointer;
}
.dot > div:hover {
    background-color: #02A6E3;
    transition: background-color 0.3s ease-in-out;
}
.dot .active {
    width: 10px;
    height: 10px;
    background-color: #02A6E3;
    transition: background-color 0.3s ease-in-out;
}

.dot .icon-prev,.dot .icon-next {
    font-weight: bold;
    color: #02A6E3;
    font-size: 18px;
    cursor: pointer;
}

js部分:

data定义bannerList:

// 轮播图列表
bannerList: []

获取轮播图数据:

this.bannerList = res.data.chart;
this.bannerList.forEach((item, index) => {
    item.active = index == 0;
});

轮播图方法:

/**
 * 轮播图点击
 */
swiperChange(item, index) {
   let activeIndex = this.bannerList.findIndex(item => item.active == true);
   // 如果选中的是当前active的无效果
   if (index == activeIndex) return false;
   let swiper0 = document.getElementById(`swiperSlide0`); 
   let swiper1 = document.getElementById(`swiperSlide1`); 
   let swiper2 = document.getElementById(`swiperSlide2`); 
   let swiper = document.getElementById(`swiperSlide${index}`);
   let classList = [...swiper.classList];
   this.bannerList.map(item => {
       return item.active = false;
   });

   if (index == 0 && classList.includes('next')) {
       swiper0.classList.remove('next');
       swiper0.classList.add('active');
                
       swiper1.classList.remove('prev');
       swiper1.classList.add('next');
                
       swiper2.classList.remove('active');
       swiper2.classList.add('prev');

       this.bannerList[0].active = true;
       this.$set(this.bannerList,0,{ ...this.bannerList[0], active: true });
       this.$set(this.bannerList,1,{ ...this.bannerList[1], active: false });
       this.$set(this.bannerList,2,{ ...this.bannerList[2], active: false });
   } else if (index == 0 && classList.includes('prev')) {
       swiper0.classList.remove('prev');
       swiper0.classList.add('active');
                
       swiper1.classList.remove('active');
       swiper1.classList.add('next');
                
       swiper2.classList.remove('next');
       swiper2.classList.add('prev');

       this.bannerList[0].active = true;
       this.$set(this.bannerList,0,{ ...this.bannerList[0], active: true });
       this.$set(this.bannerList,1,{ ...this.bannerList[1], active: false });
       this.$set(this.bannerList,2,{ ...this.bannerList[2], active: false });
   } else if (index == 1 && classList.includes('next')) {
       swiper0.classList.remove('active');
       swiper0.classList.add('prev');
                
       swiper1.classList.remove('next');
       swiper1.classList.add('active');
                
       swiper2.classList.remove('prev');
       swiper2.classList.add('next');
                    
       this.bannerList[1].active = true;
       this.$set(this.bannerList,0,{ ...this.bannerList[0], active: false });
       this.$set(this.bannerList,1,{ ...this.bannerList[1], active: true });
       this.$set(this.bannerList,2,{ ...this.bannerList[2], active: false });
   } else if (index == 1 && classList.includes('prev')) {
       swiper0.classList.remove('next');
       swiper0.classList.add('prev');
                
       swiper1.classList.remove('prev');
       swiper1.classList.add('active');
                
       swiper2.classList.remove('active');
       swiper2.classList.add('next');
                
       this.bannerList[1].active = true;
       this.$set(this.bannerList,0,{ ...this.bannerList[0], active: false });
       this.$set(this.bannerList,1,{ ...this.bannerList[1], active: true });
       this.$set(this.bannerList,2,{ ...this.bannerList[2], active: false });
   } else if (index == 2 && classList.includes('next')) {
       swiper0.classList.remove('prev');
       swiper0.classList.add('next');
                
       swiper1.classList.remove('active');
       swiper1.classList.add('prev');
                
       swiper2.classList.remove('next');
       swiper2.classList.add('active');
                
       this.bannerList[2].active = true;
       this.$set(this.bannerList,0,{ ...this.bannerList[0], active: false });
       this.$set(this.bannerList,1,{ ...this.bannerList[1], active: false });
       this.$set(this.bannerList,2,{ ...this.bannerList[2], active: true });
   } else if (index == 2 && classList.includes('prev')) {
       swiper0.classList.remove('active');
       swiper0.classList.add('next');
                
       swiper1.classList.remove('next');
       swiper1.classList.add('prev');
                    
       swiper2.classList.remove('prev');
       swiper2.classList.add('active');
                
       this.bannerList[2].active = true;
       this.$set(this.bannerList,0,{ ...this.bannerList[0], active: false });
       this.$set(this.bannerList,1,{ ...this.bannerList[1], active: false });
       this.$set(this.bannerList,2,{ ...this.bannerList[2], active: true });
   }
},
/**
 * 前进和后退点击
 */
swiperButtonChange(type) {
   let swiper0 = document.getElementById(`swiperSlide0`); 
   let swiper1 = document.getElementById(`swiperSlide1`); 
   let swiper2 = document.getElementById(`swiperSlide2`); 
   let classList = [...swiper0.classList];
   this.bannerList.map(item => {
       return item.active = false;
   });
   // 以第一张图片为基准判断
   if (type == 'prev') {
      if (classList.includes('active')) {
         swiper0.classList.remove('active');
         swiper0.classList.add('next');
                    
         swiper1.classList.remove('next');
         swiper1.classList.add('prev');
                    
         swiper2.classList.remove('prev');
         swiper2.classList.add('active');
                
         this.bannerList[2].active = true;
         this.$set(this.bannerList,0,{ ...this.bannerList[0], active: false });
         this.$set(this.bannerList,1,{ ...this.bannerList[1], active: false });
         this.$set(this.bannerList,2,{ ...this.bannerList[2], active: true });
      } else if (classList.includes('next')) {
         swiper0.classList.remove('next');
         swiper0.classList.add('prev');
                        
         swiper1.classList.remove('prev');
         swiper1.classList.add('active');
                    
         swiper2.classList.remove('active');
         swiper2.classList.add('next');
                
         this.bannerList[1].active = true;
         this.$set(this.bannerList,0,{ ...this.bannerList[0], active: false });
         this.$set(this.bannerList,1,{ ...this.bannerList[1], active: true });
         this.$set(this.bannerList,2,{ ...this.bannerList[2], active: false });
      } else if (classList.includes('prev')) {
         swiper0.classList.remove('prev');
         swiper0.classList.add('active');
                        
         swiper1.classList.remove('active');
         swiper1.classList.add('next');
                            
         swiper2.classList.remove('next');
         swiper2.classList.add('prev');
                
         this.bannerList[0].active = true;
         this.$set(this.bannerList,0,{ ...this.bannerList[0], active: true });
         this.$set(this.bannerList,1,{ ...this.bannerList[1], active: false });
         this.$set(this.bannerList,2,{ ...this.bannerList[2], active: false });
      }
   } else if (type == 'next') {
      if (classList.includes('active')) {
         swiper0.classList.remove('active');
         swiper0.classList.add('prev');
                    
         swiper1.classList.remove('next');
         swiper1.classList.add('active');
                    
         swiper2.classList.remove('prev');
         swiper2.classList.add('next');
                
         this.bannerList[1].active = true;
         this.$set(this.bannerList,0,{ ...this.bannerList[0], active: false });
         this.$set(this.bannerList,1,{ ...this.bannerList[1], active: true });
         this.$set(this.bannerList,2,{ ...this.bannerList[2], active: false });
      } else if (classList.includes('next')) {
         swiper0.classList.remove('next');
         swiper0.classList.add('active');
                    
         swiper1.classList.remove('prev');
         swiper1.classList.add('next');
                    
         swiper2.classList.remove('active');
         swiper2.classList.add('prev');
                
         this.bannerList[0].active = true;
         this.$set(this.bannerList,0,{ ...this.bannerList[0], active: true });
         this.$set(this.bannerList,1,{ ...this.bannerList[1], active: false });
         this.$set(this.bannerList,2,{ ...this.bannerList[2], active: false });
      } else if (classList.includes('prev')) {
         swiper0.classList.remove('prev');
         swiper0.classList.add('next');
                    
         swiper1.classList.remove('active');
         swiper1.classList.add('prev');
                    
         swiper2.classList.remove('next');
         swiper2.classList.add('active');
                
         this.bannerList[2].active = true;
         this.$set(this.bannerList,0,{ ...this.bannerList[0], active: false });
         this.$set(this.bannerList,1,{ ...this.bannerList[1], active: false });
         this.$set(this.bannerList,2,{ ...this.bannerList[2], active: true });
       }
   }
}

 轮播图数据结构:

[
    {
        "id": 44,
        "title": "李刚,班组长",
        "img_url": "http://cdn.juplus.cn/FhR4NNaOEHIsn2Uz-KePR3I1A4No",
        "desc": "“在科德宝工作意味着拥有自由并设定可持续发展足迹。”",
        "subtitle": null,
        "video_url": null,
        "subtitle1": null,
        "type": 3,
        "create_time": "2023-08-11 09:14:59",
        "sort": 1,
        "active": true
    },
    {
        "id": 43,
        "title": "利里奥(Lirio),销售主管",
        "img_url": "http://cdn.juplus.cn/FhLtUKcYxOLwQrabkylp5jV2RGap",
        "desc": "“我为在这里工作感到自豪,因为我在职业生涯中有很多发展机会。”",
        "subtitle": null,
        "video_url": null,
        "subtitle1": null,
        "type": 3,
        "create_time": "2023-08-11 09:14:20",
        "sort": 2,
        "active": false
    },
    {
        "id": 56,
        "title": "达伦(Darren),销售主管",
        "img_url": "http://cdn.juplus.cn/Fls4sM6DPjgV0gxbHc59torADFZD",
        "desc": "“科德宝一直求才若渴,我们理想的人才求知欲强,积极主动,希望获得成长和发展个人技能。”",
        "subtitle": null,
        "video_url": null,
        "subtitle1": null,
        "type": 3,
        "create_time": "2023-08-17 13:31:55",
        "sort": 3,
        "active": false
    }
]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值