当swiper数量不足时居中显示

当swiper-slide的数量不足设置的每页显示数量时自动居中

每每被天敌(产品经理)提出需求说:这个轮播数量不足你要居中呀,那个轮播数量不足你要剧中呀。每次写相同代码,几经折磨后终于决定封装实现该功能的方法。


(使用TS构建方法,需要引用jquery来支持操作dom)
!注意该方法暂无法适配slide宽度自定义的swiper,后续可能会增加




css代码
.flex {
    display: flex;
}

.flex_column {
    flex-direction: column;
}

.flex_wrap {
    flex-wrap: wrap;
}

.flex_row_center {
    justify-content: center;
}

.flex_row_start {
    justify-content: flex-start;
}

.flex_row_end {
    justify-content: flex-end;
}

.flex_row_justify {

    justify-content: space-between;
}

.flex_column_center {
    align-items: center;
}

.flex_column_start {
    align-items: flex-start;
}

.flex_column_end {
    align-items: flex-end;
}

.flex1 {
    flex: 1;
}

.flex_rank_1 {
    order: 1;
}

.flex_rank_2 {
    order: 2;
}

 

TS封装方法代码(可以根据需要改为JS)

 

 1 let swiper: any;
 2 /**
 3  * description: swiper数量不足时居中
 4  * !无法适用于自定义swiper-slide宽度的swiper
 5  * param {object} obj swiper对象集合
 6  * param {Array} name 需要居中swiepr / 需要排除的swiper
 7  * param {boolean} sort true为选中,false为排除
 8  * return {*}
 9  * author: 异类
10  */
11 export function swiperCenter(obj: any, name: Array<string>, sort: boolean) {
12 
13     let swiperKey: Array<string> = Object.keys(obj); //轮播对象key集合
14     swiper = obj; //赋值swiper集合
15 
16     if (sort) { // 判断是选中还是排除
17         swiperCenterCode(name);
18     } else {
19         let names = swiperKey.filter(item => { //反选swiper
20             if (name.indexOf(item) == -1) {
21                 return item;
22             }
23         })
24         swiperCenterCode(names);
25     }
26 }
27 
28 /**
29  * description:  swiper数量不足时居中
30  * param {Array} name 需要居中swiepr / 需要排除的swiper
31  * return {*}
32  * author: 异类
33 */
34 function swiperCenterCode(name: Array<string>) {
35     for (let item of name) {
36         let breakpoints: any = swiper[item].originalParams.breakpoints;// 获取swiper响应属性
37         let slidesPerView: string = swiper[item].originalParams.slidesPerView; //获取初始设置数量
38         let itemK: Array<string>;
39         if (slidesPerView != undefined) {//判断是否有设置最初显示数量
40             if (breakpoints) {// 如果swiper有响应就进行对比后判断居中,如果没有直接进行判断居中
41                 itemK = Object.keys(breakpoints); //获取响应区间数值组成数组
42                 if (window.innerWidth > Number(itemK[itemK.length - 1])) { //判断当前宽度是否小于响应最大宽度
43                     if ($(swiper[item].container.selector).find('.swiper-slide').length <= Number(slidesPerView)) { //判断当前swiper-slide数量是否小于等于该区间下设置显示数量
44                         $(swiper[item].container.selector).find('.swiper-wrapper').addClass('flex flex_row_center');
45                     } else {
46                         $(swiper[item].container.selector).find('.swiper-wrapper').removeClass('flex flex_row_center');
47                     }
48                 }
49             } else {
50                 console.log($(swiper[item].container.selector).find('.swiper-slide').length)
51                 if ($(swiper[item].container.selector).find('.swiper-slide').length <= Number(slidesPerView)) {
52                     $(swiper[item].container.selector).find('.swiper-wrapper').addClass('flex flex_row_center');
53                 } else {
54                     $(swiper[item].container.selector).find('.swiper-wrapper').removeClass('flex flex_row_center');
55                 }
56             }
57 
58             if (breakpoints) {
59                 for (let i = 0; i < itemK.length; i++) { //循环响应区间数值数组
60                     if (itemK[0] != itemK[i]) {
61                         if (window.innerWidth > Number(itemK[i + 1]) && window.innerWidth < Number(itemK[i])) { //判断当前屏幕宽度是否处在区间内
62                             if ($(swiper[item].container.selector).find('.swiper-slide').length <= breakpoints[itemK[i]].slidesPerView) {//判断当前swiper-slide数量是否小于等于该区间下设置显示数量
63                                 $(swiper[item].container.selector).find('.swiper-wrapper').addClass('flex flex_row_center');
64                             } else {
65                                 $(swiper[item].container.selector).find('.swiper-wrapper').removeClass('flex flex_row_center');
66                             }
67                         }
68                     } else {
69                         if (window.innerWidth < Number(itemK[0])) { //判断当前屏幕宽度是否处在区间内
70                             if ($(swiper[item].container.selector).find('.swiper-slide').length <= breakpoints[itemK[i]].slidesPerView) {//判断当前swiper-slide数量是否小于等于该区间下设置显示数量
71                                 $(swiper[item].container.selector).find('.swiper-wrapper').addClass('flex flex_row_center');
72                             } else {
73                                 $(swiper[item].container.selector).find('.swiper-wrapper').removeClass('flex flex_row_center');
74                             }
75                         }
76                     }
77                 }
78 
79             }
80         }
81 
82     }
83 }

 

TS引用代码

 

let swiper: any = {};
swiper.mySwiper1 = new Swiper('.swiper1', { //轮播方法赋值给轮播对象
    autoplay: 5000,//可选选项,自动滑动
    slidesPerView: 4,
    breakpoints: {
        //当宽度小于等于320
        480: {
            slidesPerView: 2,
            spaceBetween: 10
        },
        //当宽度小于等于480
        768: {
            slidesPerView: 3,
            spaceBetween: 20
        },
        //当宽度小于等于640
        1200: {
            slidesPerView: 4,
            spaceBetween: 30
        }
    }
});
let swiperName = ['mySwiper2', 'mySwiper3']; //需要居中的轮播名或者排除居中的轮播名
/**
 * description:
 * param {object} obj swiper对象集合
 * param {Array} name 需要居中swiepr / 需要排除的swiper
 * param {boolean} sort true为选中,false为排除
 */
swiperCenter(swiper, swiperName, true);//调用方法

 

实现方法,首先把每个swiper都赋值给一个变量。

然后根据传调用方法传入的键值来寻找到对应的swiper对象。通过对象中含有的参数来判断是否给swiper增加类名来控制是否居中。

自此只需要调用方法即可完成居中。(再也不怕产品经理后期提出增加该需求了)

posted @ 2022-08-04 15:43  异·类  阅读(1062)  评论(0)    收藏  举报