仿原生相册

仿原生相册仿原生相册

在body中添加相册列表

       <div class="backColor"></div>
        <section class="section">
          <figure id="container_g" class="gallery">
               <div class="item"><img src="../img/1.jpg" alt="1"></div>
               <div class="item"><img src="../img/2.jpg" alt="2"></div>
               <div class="item"><img src="../img/3.jpg" alt="3"></div>
               <div class="item"><img src="../img/4.jpg" alt="4"></div>
               <div class="item"><img src="../img/5.jpg" alt="5"></div>
               <div class="item"><img src="../img/6.jpg" alt="6"></div>
               <div class="item"><img src="../img/7.jpg" alt="7"></div>
               <div class="item"><img src="../img/8.jpg" alt="8"></div>
               <div class="item"><img src="../img/9.jpg" alt="9"></div>
               <div class="item"><img src="../img/10.jpg" alt="10"></div>
               <div class="item"><img src="../img/11.jpg" alt="11"></div>
               <div class="item"><img src="../img/12.jpg" alt="12"></div>
               <div class="item"><img src="../img/13.jpg" alt="13"></div>
               <div class="item"><img src="../img/14.jpg" alt="14"></div>
               <div class="item"><img src="../img/15.jpg" alt="15"></div>
               <div class="item"><img src="../img/16.jpg" alt="16"></div>
          </figure>
          </section>

添加相册样式 

           .backColor{
                display: block;
                width:100%;
                height:100vh;
                background:-webkit-linear-gradient(#663399,#333366,#330066);
                filter:blur(100px);
                position:relative;
                z-index: 1;
            }
            .section{
                display: block;
                width:100%;
                height:100vh;
                margin:0px;
                overflow: hidden;
                position:absolute;
                top:0px;
                left:0px;
                z-index: 2;
                
            }
            #container_g{
                position: absolute;
                z-index: 3;
            }
             .gallery{
                 display: flex;
                 flex-wrap: wrap;
                 justify-content: flex-start;
                 margin:0px;
                 touch-action: none;
             }
             .gallery .item{
                 display:inline-block;
                width:25%;
                height:16vh;
             }
             .gallery .item img{
                width:100%;
                height:100%;
                box-sizing: border-box;
             }
             .animation{
                 left:0;
                 -webkit-transition: 1s ease;
                 -ms-transition: 1s ease;
                 -o-transition: 1s ease;
                 transition: 1s ease;
             }

添加预览样式 

            .preview {
                 display: flex;
                 flex-wrap: nowrap;
                 justify-content: flex-start;
                 margin:0px;
                 touch-action: none;
             }
             .preview .item{
                display:inline-block;
                width:100%;
                height:100%;
                margin:auto;
             }
             .preview .item img{
                width:100vw;
                height:100vh;
                box-sizing: border-box;
             } 

 

 通过监听click事件实现略缩模式和预览模式之间的切换

//通过监听控件实现小图查看、大图预览
$('#container_g .item').on('click',function(e){
    //当回到小图浏览时不需要动画
    $('#container_g').removeClass('animation');
    if($('#container_g').hasClass('preview')){
        $('#container_g').removeClass('preview');
        $('#container_g').addClass('gallery');
        $('.gallery').css('width',100+'vw');
        move(0);
    }else{
        $('#container_g').removeClass('gallery');
        $('#container_g').addClass('preview');
        this.sumImg =$('#container_g .item').length; 
        $('.preview').css('width',this.sumImg*100+'vw');
        currentTranslateX=-width*$(this).index();
        move(currentTranslateX);//跳转到用户指定的图片
    }
});

监听touchstart事件,记录手指开始的位置 

$('#container_g').on('touchstart',function(e) {
    var _touch = e.originalEvent.changedTouches[0];
    startOffsetX= _touch.pageX;
});

监听touchmove事件,获得滑动位置 ,设置isTouchStart = true。

$('#container_g').on('touchmove',function(e){
     isTouchStart = true;
     $('#container_g').removeClass('animation');//手指滑动是不需要动画的产生
     dx = e.originalEvent.changedTouches[0].pageX-startOffsetX;//获取滑动距离
     move(currentTranslateX+dx);//跟随手指的移动而滑动
});

监听touchend事件,根据手指滑动的距离判断是否切换当前图片。 

$('#container_g').on('touchend',function(e){
    $('#container_g').addClass('animation');//手指滑动结束需要动画的产生
    dx = e.originalEvent.changedTouches[0].pageX-startOffsetX;//获取滑动距离
    if(isTouchStart){
        if(Math.abs(dx)>=width/2){
            if(currentTranslateX<=0 && currentTranslateX>-width *itemsLength){
                if(dx>0){
                    if(currentTranslateX<0){//判断是否到左边的临界值
                        currentTranslateX +=width;
                    }   
                }else if(currentTranslateX>-width*(itemsLength-1)){//判断是否到右边的临界值
                    currentTranslateX-=width;
                }
            }  
        }
        move(currentTranslateX);
    }
    isTouchStart = false;
});

所有的JS代码 

var width = $('#container_g')[0].offsetWidth;
var isTouchStart = false;
var startOffsetX = 0; 
var currentTranslateX = 0;
var itemsLength = $('#container_g .item').length;

//通过监听控件实现小图查看、大图预览
$('#container_g .item').on('click',function(e){
    //当回到小图浏览时不需要动画
    $('#container_g').removeClass('animation');
    if($('#container_g').hasClass('preview')){
        $('#container_g').removeClass('preview');
        $('#container_g').addClass('gallery');
        $('.gallery').css('width',100+'vw');
        move(0);
    }else{
        $('#container_g').removeClass('gallery');
        $('#container_g').addClass('preview');
        this.sumImg =$('#container_g .item').length; 
        $('.preview').css('width',this.sumImg*100+'vw');
        currentTranslateX=-width*$(this).index();
        move(currentTranslateX);
    }
});

//滑动图片
move = function(dx){
    $('#container_g').css('transform' ,"translate3d(" + dx + "px, 0,0)");
};  
//通过监听touchstart/touchmove/touchend来记录手指的位置
$('#container_g').on('touchstart',function(e) {
    var _touch = e.originalEvent.changedTouches[0];
    startOffsetX= _touch.pageX;
});
$('#container_g').on('touchmove',function(e){
     isTouchStart = true;
     $('#container_g').removeClass('animation');//手指滑动是不需要动画的产生
     dx = e.originalEvent.changedTouches[0].pageX-startOffsetX;//获取滑动距离
     move(currentTranslateX+dx);//跟随手指的移动而滑动
});
$('#container_g').on('touchend',function(e){
    $('#container_g').addClass('animation');//手指滑动结束需要动画的产生
    dx = e.originalEvent.changedTouches[0].pageX-startOffsetX;//获取滑动距离
    if(isTouchStart){
        if(Math.abs(dx)>=width/2){
            if(currentTranslateX<=0 && currentTranslateX>-width *itemsLength){
                if(dx>0){
                    if(currentTranslateX<0){//判断是否到左边的临界值
                        currentTranslateX +=width;
                    }   
                }else if(currentTranslateX>-width*(itemsLength-1)){//判断是否到右边的临界值
                    currentTranslateX-=width;
                }
            }  
        }
        move(currentTranslateX);
    }
    isTouchStart = false;
});