码迷,mamicode.com
首页 > 移动开发 > 详细

移动端的无缝滚动+下拉刷新+定向滑动

时间:2016-09-14 00:12:50      阅读:285      评论:0      收藏:0      [点我收藏+]

标签:

<!DOCTYPE html>
<html lang="en">
<head>
<script>
(function(){
function setFont(){
document.documentElement.style.fontSize=document.documentElement.clientWidth/16+‘px‘;
}
setFont();
window.addEventListener(‘resize‘,setFont,false)
})();
</script>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
list-style: none;
}
html,body{
width: 100%;
}
#box{
width: 100%;
}
#sec{
width: 100%;
}
#flesh{
width: 100%;
height: 0;
overflow: hidden;
text-align: center;
}
#tab{
width: 100%;
overflow: hidden;
}
#pic{
width: 700%;
display: -webkit-box;
}
#pic li{
-webkit-box-flex:1;
height: 8.5rem;
}
#pic li img{
width: 100%;
height: 100%;
}
</style>
<script>

window.addEventListener(‘DOMContentLoaded‘,function(){
var oP=document.getElementById(‘pic‘);
var aLi=oP.children;


var iNow=1;
var dir=‘‘;
var bOK=false;
var timer;
var x=-iNow*aLi[0].offsetWidth;
oP.style.webkitTransform=‘translateX(‘+x+‘px)‘;

oP.addEventListener(‘touchstart‘,function(ev){//1.先写基本拖拽

if(bOK)return;//如果拖动过快 会导致露白 所以用开关来限制拖拽状态 用运动状态监听 只有监听到运动完成了以后 才能继续拖动 难点是何时上锁 也就是bOK=true 1.鼠标点下的时候为true(上锁) 如果只是点击而没有拖动的话 也会上锁 但运动监听不到运动的结束 从而无法解锁(bOK=false) 继而不能继续拖动 同时 点下就上锁的话 继续点击会发生return 下面的事件都无法执行2.运动的时候上锁 但只是点下而不是左右拖动 是上下拖动的话也会导致无法解锁 所以 只有在运动时候判断是否为左右拖动 当确定为左右拖动的时候 才上锁 也就是bOK=true
oP.style.webkitTransition=‘none‘;//每次move都会有过渡状态 所以点击的时候要先干掉过渡状态
clearInterval(timer)
var startX=ev.targetTouches[0].pageX;
var startY=ev.targetTouches[0].pageY;

var disX=startX-x;
function move(ev){
var moveX=ev.targetTouches[0].pageX;
var moveY=ev.targetTouches[0].pageY;


if(dir){//4.滑动锁定 用移动后的坐标值减去初始的坐标值 一开始dir为空 走else
if(dir==‘l2r‘){
bOK=true;
x=moveX-disX;
}
}else{
if(Math.abs(moveX-startX)>10){//如果横向拖动大于某个值 就判定是横向拖拽 然后返回到if去 并且dir=l2r成立 进而给位移x赋值 从而实现只能横向拖动
dir=‘l2r‘;
}else if(Math.abs(moveY-startY)>10){
dir=‘t2b‘
}
}


//oP.style.webkitTransition=‘0.5s all ease‘;
oP.style.webkitTransform=‘translateX(‘+x+‘px)‘;
}
function end(ev){
document.removeEventListener(‘touchmove‘,move,false);
document.removeEventListener(‘touchend‘,end,false);
if(dir==‘l2r‘){
if(Math.abs(ev.changedTouches[0].pageX-startX)>50){//2.鼠标松开后 进行判断 如果左位移/右位移大于50的话 自动移动
if(ev.changedTouches[0].pageX-startX>0){
iNow--;

}else if(ev.changedTouches[0].pageX-startX<0){
iNow++;

}

}
}
oP.style.webkitTransition=‘0.5s all ease‘;
x=-iNow*aLi[0].offsetWidth;
oP.style.webkitTransform=‘translateX(‘+x+‘px)‘;
dir=‘‘;
timer=setInterval(function(){
iNow++;
oP.style.webkitTransition=‘0.5s all ease‘;
if(iNow==aLi.length){
iNow=1;
oP.style.webkitTransition=‘none‘;
}

x=-iNow*aLi[0].offsetWidth;
oP.style.webkitTransform=‘translateX(‘+x+‘px)‘;
},1000)
}
document.addEventListener(‘touchmove‘,move,false);
document.addEventListener(‘touchend‘,end,false)
ev.preventDefault();
},false)
oP.addEventListener(‘transitionend‘,function(){//3.监听运动状态 并在监听完成以后进行iNow判断

bOK=false;

if(iNow==0){
iNow=aLi.length-2
}
if(iNow==aLi.length-1){
iNow=1
}
oP.style.webkitTransition=‘none‘;//瞬间拖拽回去 不能加运动状态
x=-iNow*aLi[0].offsetWidth;
oP.style.webkitTransform=‘translateX(‘+x+‘px)‘;
},false)

timer=setInterval(function(){
iNow++;
oP.style.webkitTransition=‘0.5s all ease‘;
if(iNow==aLi.length){
iNow=1;
oP.style.webkitTransition=‘none‘;
}

x=-iNow*aLi[0].offsetWidth;
oP.style.webkitTransform=‘translateX(‘+x+‘px)‘;
},1000)
//5.写loading状态的拖拽
var oSec=document.getElementById(‘sec‘);
var oFlesh=document.getElementById(‘flesh‘);
var y=0;
oSec.addEventListener(‘touchstart‘,function(ev){
oFlesh.style.webkitTransition=‘none‘;//每次move的时候都有过渡状态webkitTransition 所以当点击的时候干掉上一次的过渡状态
var startY=ev.targetTouches[0].pageY;
var disY=startY-y;

function move(ev){
var moveY=ev.targetTouches[0].pageY;
y=moveY-disY;
if(dir==‘t2b‘){//判断只有上下拖动的时候 才给赋值
if(y>=100){
y=100;
}
oFlesh.style.webkitTransition=‘0.5s all ease‘
oFlesh.style.height=y+‘px‘;
}
}
function end(){
document.removeEventListener(‘touchmove‘,move,false);
document.removeEventListener(‘touchend‘,end,false);
oFlesh.style.height=0+‘px‘;//松开鼠标后恢复原来状态
}
document.addEventListener(‘touchmove‘,move,false);
document.addEventListener(‘touchend‘,end,false);
ev.preventDefault();
},false)

},false)
</script>
<body>
<section id="box">
<section id="sec">
<div id="flesh">
<img src="img/1.gif" >
</div>
<section id="tab">
<ul id="pic">
<li><img src="img/4.jpg" ></li>
<li><img src="img/0.jpg" ></li>
<li><img src="img/1.jpg" ></li>
<li><img src="img/2.jpg" ></li>
<li><img src="img/3.jpg" ></li>
<li><img src="img/4.jpg" ></li>
<li><img src="img/0.jpg" ></li>
</ul>
</section>
</section>
</section>
</body>
</html>

移动端的无缝滚动+下拉刷新+定向滑动

标签:

原文地址:http://www.cnblogs.com/wzssir/p/5870174.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!