移动端滚动的橡皮筋问题
来源:互联网 发布:中国货物贸易数据 编辑:程序博客网 时间:2024/06/06 13:22
在开发的时候遇到了移动端滚动问题,在网上找了很多办法都不行,于是自己试了下面这个方法可行。发出来希望能帮助更多的同学,大家有更好的方法也欢迎在下面分享出来~
这里面涉及到函数节流的知识,详见JavaScript 节流函数 Throttle 详解
- 问题描述:页面中有一个排行榜需要滚动,整个页面不允许滚动。但是排行榜(class=list)滚动到最上面和最下面,继续滚动,会导致整个页面下拉上拉(页面设置overflow:hidden和fixed也无法解决)
分析:和事件冒泡无关,是移动端滚动的橡皮筋效果 - 解决方法:
在body上监听touchmove事件
- 若target不在排行榜里(target若既不是list也不是list的子元素),则阻止默认事件
- 若target在排行榜里
(以下判断需要进行函数节流,否则会很卡) a. 在list滚动到最上方时,阻止继续向下滚动事件; b. 在list滚动到最下方时,阻止继续向上滚动事件
- 最终代码:
var startY, endY; // 记录滑动的开始Y坐标和当前Y坐标var timer = null;var previous = null;var atleast = 10;$('body').on('touchstart',function(e){ startY = e.originalEvent.changedTouches[0].pageY;});// 禁用手机默认的触屏滚动行为$('body').on('touchmove', function (e) { // 若target不在排行榜里 if(!$(e.target).is($('.list')) && !$(e.target).parents('.list').length > 0){ e.preventDefault(); } // 若target在排行榜里 else{ // 函数节流 var now = +new Date(); if(!previous){ previous = now; } if (now - previous > atleast){ checkScroll(e); // 重置上一次开始时间为本次结束时间 previous = now; } else{ clearTimeout(timer); timer = setTimeout(function(){ checkScroll(e); },200); } }});function checkScroll(e){ console.log("check"); endY = e.originalEvent.changedTouches[0].pageY; // 若已经移到页面最上方,则不允许再向下滑动 if($('.list').scrollTop() == 0 && endY > startY){ e.preventDefault(); } // 若已经移到页面最下方,则不允许再向上滑动 if($('.list').scrollTop() + $('.list').height() == $('.list')[0].scrollHeight && endY < startY){ e.preventDefault(); }}
阅读全文
0 0
- 移动端滚动的橡皮筋问题
- 移动端滚动的橡皮筋问题
- 移动端滚动条的问题之一
- 移动端 滚动穿透问题
- 解决移动端可恨的滚动穿透问题
- 使用“橡皮筋类”画可再次移动修改的图形
- 移动端滚动穿透问题完美解决方案
- 移动端的数据滚动插件
- 移动端如何禁止body的滚动
- 移动端滚动穿透的问题解决
- 移动端网页嵌套一个div,需要滚动条,但是在移动端浏览器上面没办法滚的问题
- 关于移动端使用局部滚动解决ios不支持position:fixed后产生的问题
- 橡皮筋的用法
- 橡皮筋类的使用
- 橡皮筋技术的实现
- 橡皮筋
- 橡皮筋
- 蚂蚁爬橡皮筋问题 之一
- 简单的一个程序,猜字游戏
- Coconut
- rac集群 oracle和grid用户 ssh等效性配置
- Android SpannableString使用示例
- vuejs几种不同组件(页面)间传值的方式
- 移动端滚动的橡皮筋问题
- Unity2D游戏开发案例-Roguelike拾荒者
- 20170909 JSP SERVLET相关知识
- 多态的对象模型
- Android studio 或Eclipse无法连接模拟器或者真机
- git 使用 meld 解决冲突文件
- named.conf 详解
- 学生信息管理系统总结(二)
- 测试用例是什么?