ios系统的微信浏览器中 h5页面 整体可以拖动的Bug修复

       因为做一个 底部是固定的导航,头部是固定标题(全为absolute定位,ios系统下的fixed布局有bug), 中间是内容页。

       首先这三部分保持在同一个层级,内容部分因为有下拉刷新的功能,所以页面是有垂直滚动条的。

        在ios系统中发现,当touch位置在比较偏上或者偏下的情况下,手指拖动整个页面,会导致整个页面整体被拖动,然后内容页的滚动部分会发生卡顿,不能滑动的问题。试过网上的很多方法,比如:给有overflow:srcoll的元素增加 

-webkit-overflow-scrolling: touch;

样式,增加弹性;给body增加一个监听touchmove事件,当监听到事件时,event.preventDefault();阻止事件发生,但是此时发现页面中需要滚动的部分也没有效果了,给单独需要监听touchmove事件的dom元素设置监听也无效。亲测下面这个方法有效,所有的头部、内容部分和底部导航全部用的absolute定位写好。

        var startY = 0;
		var scrollBox = document.querySelector('.mui-content');

		document.body.addEventListener('touchstart', function(e){
			startY = e.touches[0].pageY;
		}, { passive: false });

		document.body.addEventListener('touchmove', function(e) {
			var moveY = e.touches[0].pageY;
			var top = scrollBox.scrollTop;
			var ch = scrollBox.clientHeight;
			var sh = scrollBox.scrollHeight;
			if (!isChildTarget(e.target, scrollBox)) {
				e.preventDefault();
			} else if ((top === 0 && moveY > startY) || (top + ch === sh && moveY < startY)) {
				e.preventDefault();
			}
		}, { passive: false });
		function isChildTarget(child, parent, justChild) {
			// justChild为true则只判断是否为子元素,若为false则判断是否为本身或者子元素 默认为false
			var parentNode;
			if (justChild) {
				parentNode = child.parentNode;
			} else {
				parentNode = child;
			}

			if (child && parent) {
				while (parentNode) {
					if (parent === parentNode) {
						return true;
					}
					parentNode = parentNode.parentNode;
				}
			}
			return false;
		}

其中 .mui-content为内容部分,需要scroll滚动条。在ios以及安卓系统的微信浏览器中均有效。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值