实现移动端touch事件的横向滑动列表效果

要实现手机端横向滑动效果并不难,了解实现的原理及业务逻辑就很容易实现。原理:touchstart(手指按下瞬间获取相对于页面的位置)——》touchmove(手指移动多少,元素相应移动多少)。

接下来讲讲实现逻辑:

其实就是手指拖动列表向哪个方向移动多少像素,并设置左右拖动的边界值。

附上代码及注释:

	<div id="common_wrap" class="common-wrap">
		<h4 class="common-kit__h4">在区域内向左右滑动</h4>
			<ul class="common-kit__list" id="mask" style="left:0px">
				<li><a href="javascript:;">感冒药箱</a></li>
				<li><a href="javascript:;">健胃消食药箱</a></li>
				<li><a href="javascript:;">高血压药箱</a></li>
				<li><a href="javascript:;">慢病控制药箱</a></li> 
				<li><a href="javascript:;">孕妇育儿药箱</a></li>
				<li><a href="javascript:;">糖尿病药箱</a></li> 
			</ul>
	</div>

设置样式:

	*{
		padding: 0;
		margin: 0;
	}
	html,body{
		width: 100%;
		overflow: hidden;
	}
	.common-wrap{
		width: 100%;
		height: 105px;
		border-bottom: 8px solid #eee;
	}
	.common-kit__h4{
		font-size: 14px;
		margin-top: 17px;
		margin-left: 8px;
		letter-spacing: 0.2px;
	}
	.common-kit{
		width: 100%;
		position: relative;
	}
	.common-kit__list{
		width: 558px;
		position: absolute; 
		margin-top: 10px;
		height: 80px;
	}
	.common-kit__list li{
		position: relative;
		list-style: none;
		width: 80px;
		height: 80px;
		background-color: #eee;
		float: left;
		margin-left: 13px;
	}
	.common-kit__list li a{
		text-decoration: none;
		font-size: 12px;
		position: absolute;
		top:50%;
		transform:translateY(-50%); 
		text-align: center;
		padding: 0px 12px; 
	}
	.common-kit__list li:first-child{
		margin-left: 8px;
	}

js代码:

function slidecommonkit(){

	var mask = document.getElementById('mask');
	var common_kit__list=document.querySelector('.common-kit__list');
        var startPosition, endPosition, deltaX, deltaY, moveLength;
        var commonkitLeft;

    /*手指按下瞬间触发touchstart事件*/
    mask.addEventListener('touchstart', function (e) {
        commonkitLeft=parseInt(common_kit__list.style.left);
        var touch = e.targetTouches[0];  //targetTouches位于当前DOM元素上的手指动作的列表
        startPosition = {   //取屏幕上第一个手指相对于页面的坐标
            x: touch.pageX,
            y: touch.pageY
        }
    });

    /*手指移动触发touchmove事件*/
    mask.addEventListener('touchmove', function (e) {
        var touch = e.targetTouches[0];
        endPosition = {
            x: touch.pageX,
            y: touch.pageY
        }

        deltaX = endPosition.x - startPosition.x;   //移动到最后的坐标x - 开始时的坐标x
        moveLength = Math.abs(deltaX);   //获得移动的x方向的距离

        /*向左移动的函数*/
        var swipeLeft=function(){
            if( deltaX<(-30) ){   //这里以30作为判断是否触发、如果deltaX小于-30,说明向左移动
                
                if(Math.abs(commonkitLeft)+moveLength > ( common_kit__list.offsetWidth-window.innerWidth ) ){   //判断临界值  
                    common_kit__list.style.left=window.innerWidth-common_kit__list.offsetWidth+'px';
                }else{
                    common_kit__list.style.left=commonkitLeft-moveLength+'px';  //上一次的left值-移动的距离(由于距离是正数,而向左移动left值是负数,所以用-)
                }
            }
        }
        swipeLeft();   //执行该函数

        /*向右移动的函数*/
        var swipeRight=function(){
            if( deltaX>30 ){
                /*主要是逻辑*/
                if(commonkitLeft+moveLength > 0  ){
                    common_kit__list.style.left=0+'px';
                }else{
                    common_kit__list.style.left=commonkitLeft+moveLength+'px';
                }
            }
        }
        swipeRight();
        
    });

};

slidecommonkit();

效果图如下:

 

这样就实现横向滑动列表效果了。

注意:使用touch事件必须要下载touch.min.js   <script src="touch.min.js"></script> 才能使用,原生js是没有这个事件的。

 

posted @ 2017-05-14 14:57  heyujun-  阅读(2044)  评论(0编辑  收藏  举报