当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增加类名来控制是否居中。
自此只需要调用方法即可完成居中。(再也不怕产品经理后期提出增加该需求了)