html5 移动端滑动效果,移动端 H5 滑动穿透 (完美解决)

本文探讨了移动端页面滚动时的性能问题,指出不应在scroll事件处理函数中进行DOM操作。介绍了防抖和节流两种常用解决策略,以减少高频事件触发的开销。并提供了一个具体的touch事件处理示例,展示了如何防止滚动穿透问题,同时解决了一个关于touchmove事件取消的错误处理。
摘要由CSDN通过智能技术生成

之前写的是用jq写的 过时了

被我删除了 现在的这个方法比较完善

说的再多 不如复制运行看一下效果吧

935d30dd2189

image.png

scroll 事件本身会触发页面的重新渲染,

同时 scroll 事件的 handler 又会被高频度的触发,

因此事件的 handler 内部不应该有复杂操作,

例如 DOM 操作就不应该放在事件处理中。

针对此类高频度触发事件问题

(例如页面 scroll ,屏幕 resize,监听用户输入等)

,下面介绍两种常用的解决方法,防抖和节流。

固定的滚动穿透问题探索start

固定的滚动穿透问题探索

固定的滚动穿透问题探索

固定的滚动穿透问题探索

固定的滚动穿透问题探索

固定的滚动穿透问题探索

固定的滚动穿透问题探索

固定的滚动穿透问题探索

固定的滚动穿透问题探索

固定的滚动穿透问题探索

固定的滚动穿透问题探索

固定的滚动穿透问题探索

固定的滚动穿透问题探索

固定的滚动穿透问题探索

固定的滚动穿透问题探索

固定的滚动穿透问题探索

固定的滚动穿透问题探索

固定的滚动穿透问题探索

固定的滚动穿透问题探索

固定的滚动穿透问题探索

固定的滚动穿透问题探索

固定的滚动穿透问题探索

固定的滚动穿透问题探索

固定的滚动穿透问题探索

固定的滚动穿透问题探索

固定的滚动穿透问题探索

固定的滚动穿透问题探索end

.btn{

height: 2000px;

position: relative;

border: 1px solid crimson;

border-bottom: 1px solid #000000;

font-size: 2rem

}

.sc{

width: 100%;

height: 100%;

background: rgba(0,0,0,0.1);

position: fixed;

left:0;

top:0;

}

.st{

touch-action: none;

}

.sd{

width: 450px;

height: 450px;

overflow-y:scroll ;

border: 1px solid #000;

position: fixed;

left: 50%;

top: 50%;

color: #000;

z-index: 5;

font-size: 2rem;

transform:translate(-50%,-50%) ;

}

var firstY=0

var divEle = document.getElementById("canmove");

var divsc = document.getElementById("sc");

// 手指触碰到屏幕时触发

// divEle.addEventListener('touchstart',

// firstY=e.targetTouches[0].clientY

//

// })

//

divEle.addEventListener('touchstart', function (e) {

// 打印的事件对象

firstY=e.targetTouches[0].clientY

},false)

divsc.addEventListener('touchstart', function (e) {

// 打印的事件对象

console.log("222")

return e.preventDefault()

},false)

// consloe.log("firstY",firstY)

console.log("firstY",firstY)

divEle.addEventListener('touchmove', function (e) {

// let target =document.getElementById('canmove')

let target =divEle

var tdiv =target.classList.contains('st'); //return true or false

console.log("firstY2e",firstY)

let offsetHeight =target.offsetHeight,

scrollHeight =target.scrollHeight;

let changedTouches =e.changedTouches;

let scrollTop =target.scrollTop;

console.log("firstY2",firstY)

if(changedTouches.length>0){

let touch =changedTouches[0]||{};

let moveY =touch.clientY;

if(moveY >firstY&&scrollTop===0&&e.cancelable){// 滑动到弹窗顶部临界条件

e.preventDefault()

return false

}else if(moveY =scrollHeight&&e.cancelable){

e.preventDefault()

return false

}

}

},false)

// divEle.addEventListener('touchstart', function (e) {

// // 打印的事件对象

// return e.preventDefault()

// })

中途出现了一次报错 解决了很久

.Ignored attempt to cancel a touchmove event with cancelable=false,scrolling is in progress and cann

解决步骤如下:

1.先在控制台找到报错代码的位置,以及文件目录位置

2.编辑器打开报错文件,找到报错位置,应该是在关于touchmove方法里,在执行e.preventDefault();e.stopPropagation();的if语句中加上一个条件判断 e.cancelable,就ok了

例如在我的报错index文件里是这样的

if (status !== '11' && this.direction === 'vertical' && !(parseInt(status, 2) & parseInt(direction, 2))&& e.cancelable) {

e.preventDefault();

e.stopPropagation();

}

报错解决问题的链接

点击了解更多

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值