在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
前述本文很短~ 正文最近做了一个小活动,里面要用到一个效果:滑动翻页。大概是这样的: <!-- HTML代码 --> <div class="page-container"> <div class="page" style="background: #dc3b26">1</div> <div class="page" style="background: #f3b03d">2</div> <div class="page" style="background: #44a2f8">3</div> </div> 在css中,首先因为是滑动翻页,所以我们要保证“始终只有一屏”,这个可以放在全局样式表里控制,然后是其中的“每一页”都要占满父元素 —— 这里其实用了“div是块元素,无外力情况下竖直排列”的特性。 /** css样式 */ html, body{ margin: 0; padding: 0; width: 100%; height: 100vh; overflow: hidden; font-size: 60px; } .page-container{ width: 100%; height: 100%; } .page-container .page{ width: 100%; height: 100%; } 其JS实现也很简单:因为在移动端,所以使用了
// 这里是控制全局js的文件 // 全局阻止浏览器默认行为 document.addEventListener("touchstart",function(e){ if(e.cancelable){ e.preventDefault(); } },{passive: false}) // {passive: false}就是告诉前面可能有需要重置行为的代码 document.addEventListener("touchmove",function(e){ if(e.cancelable){ e.preventDefault(); } },{passive: false}) // JavaScript代码 let curPageIndex=0; let pageContainer=document.querySelector(".page-container"); let pageNumber=pageContainer.children.length; //页面的数量 // 文档的视窗高度(这里就是一屏的高度) let cHeight=document.documentElement.clientHeight; // 设置页面容器的margin-top为合适的值,让其显示在视野中 function toPage(){ pageContainer.style.transition="all .5s ease"; pageContainer.style.marginTop=-curPageIndex*cHeight+"px"; // 变化完成后去掉过渡效果 ! pageContainer.addEventListener("transitionend",function(){ pageContainer.style.transition="none"; },{once:true}) } toPage() pageContainer.ontouchstart=function(e){ let y=e.changedTouches[0].clientY; //手指按下的纵坐标 pageContainer.ontouchmove=function(e){ let dis=e.changedTouches[0].clientY-y; //计算距离 // 计算page-container的margin-top let mtop=-curPageIndex*cHeight+dis if(mtop>0){ mtop=0; }else if(mtop<-(pageNumber-1)*cHeight){ mtop=-(pageNumber-1)*cHeight; } // 实时改变位置 pageContainer.style.marginTop=mtop+"px"; } pageContainer.ontouchend=function(e){ let dis=e.changedTouches[0].clientY-y; // 如果滑动距离实在太短,就回到滑动前的位置状态 if(Math.abs(dis)<=60){ toPage() }else if(dis>0 && curPageIndex>0){ curPageIndex--; toPage() }else if(dis<0 && curPageIndex<pageNumber-1){ curPageIndex++; toPage() } // 手指离开后,取消监听事件 pageContainer.ontouchmove=null; pageContainer.ontouchend=null; } } 至此,功能上似乎很完美。但这时候,我们在第一个page里添加一个button: <div class="page" style="background: #dc3b26"> <button onclick="alert('哈哈哈')" class="but">click me!</button> 1 </div> 然后到页面上查看效果: 无效! 这是因为在上方全局js文件里我们加了“阻止浏览器默认事件”的代码。 但是如上面所示,全部禁止掉总会造成一些困扰,怎么办? <button data-default="true" onclick="alert('哈哈哈')" class="but">click me!</button> 将上面“控制全局js的文件”内容改为如下: // 全局阻止浏览器默认行为 document.addEventListener("touchstart",function(e){ if(e.target.dataset.default){ return; } if(e.cancelable){ e.preventDefault(); } },{passive: false}) document.addEventListener("touchmove",function(e){ if(e.target.dataset.default){ return; } if(e.cancelable){ e.preventDefault(); } },{passive: false}) 就OK了: 其实还有另一种“解法”:既然上面说了,移动端click实际上是通过mouse事件模拟的,那么我们可以从mousestart事件入手;又因为button元素是“第一个页面”内的(子)元素,所以可以用阻止事件冒泡: <!-- button就是普通的button --> <button class="but">click me!</button> document.querySelector(".but").addEventListener("touchstart",function(e){ e.stopPropagation(); alert('噶哈哈'); },false)
到此这篇关于滑动翻页效果实现和移动端click事件问题的文章就介绍到这了,更多相关滑动翻页效果内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
请发表评论