利用swiper实现图片灯箱浏览及放大

如果想实现页面中图片的一个灯箱展示,分组展示,并且支持图片缩放,利用swiper的特性,我们应该怎么处理呢?最下面有一个小坑,好在最后解决了,积累了经验。

1.首先,我遇到可以一个场景,当后台无法返回一组前台想要的数据时,用JS,把页面DOM处理成自己想要的数据:

    var obj = $(".demo")
    if (obj) {
        var data = [];
        obj.each(function(i,v){
            var id = $(v).attr('id');
            var arr = [];
            arr['id'] = id
            var imgs = $(v).find('.demo-img');
            if (imgs) {
                var arr1 = [];
                imgs.each(function(i1,imgObj){
                    var img =  $(imgObj).attr('src');
                    if (img) {
                        arr1[i1] = img
                    }
                    arr['imgs'] = arr1
                })
            }
            if (arr) {
                data[i] = arr;
            }
        })

        console.log(data)   //result
    }

2.利用ID查找,当前点击属于哪一组数据

 var imgarrid = $(this).parents('.bestPre').attr('id');
 thisImgSrc = $(this).attr('src');
 var obj = data.find(function(item) {
       return item.id === imgarrid
  })
console.log(obj); //获取到了当前点击的那组图片数据

3.利用swiper的appendSlide()方法,动态添加slide,slide中是我们的图片数据的循环,此时我们生成了这组图片数据的swiper了

 obj.imgs.forEach((e,index) => {
    if(e == thisImgSrc){
        imgIndex = index; 
     }
     lightSwiper.appendSlide('<div class="swiper-slide"><div class="swiper-zoom-container"><img src="'+ e +'"></div></div>');
});

4.swiper的一个特点,是每次更改slide之后,都需要销毁和更新swiper,来初始化新的内容。我用的最新版swiper,所以使用了update()方法来进行更新。

lightSwiper.update()

5.接下来就是让生成的这组轮播数据,那怎么自动定位到我们点击的那个图片slide上,用到了我们上面获取到的index,结合slideTo()方法。

lightSwiper.slideTo(imgIndex, 0, false);

6.怎么实现图片缩放呢,swiper中为我们准备了swiper-zoom-container,加上这个类就可以随意缩放图片啦。但是这里有一个坑。

------当你反复缩放图片的时候,图片会忽然卡住,不再缩放了。。。为什么呢?一开始我也是蒙的,各种求助,各种排查,在我要放弃的时候,我打印了一下zoomchange里面的scale,

------一定是因为我的人品爆发了,我发现swiper的方法图片的时候,改变的是图片的scale值,然后我们每次缩放,关闭启动swiper,这个值一直再累加,我内心的声音告诉我,就是它的锅。

所以,在使用swiper的时候,一定要记得销毁和更新的事情。

lightSwiper.zoom.out();  
lightSwiper.removeAllSlides();

 

 

上一篇:记一次手动实现前端*--swiper


下一篇:swiper使用