博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Javascript禁止父元素滚动条滚动, pc、移动端均有效
阅读量:5338 次
发布时间:2019-06-15

本文共 4170 字,大约阅读时间需要 13 分钟。

在网页中经常会遇到这样的场景, 网页比较长有滚动条, 然后网页内的某个内容块里面的内容也比较长, 也具有滚动条。当鼠标移到内容块中使用滚动条来滚动查看内容到达底部或头部的时候,父元素的滚动条也就开始滚动了, 非常影响体验, 特别是选择东西的时候。我们需要在滚动的时候不允许父元素也跟着滚动。有一种非常简单, 但是适应能力不强的方法就是, 给鼠标一上去的时候, 给BODY加一个css 属性overflow:hidden !important; 这个方法在部分浏览器中没有效果, 而且这个方法有个副作用,会让网页回到顶部。

 

那么我们可以通过js来实现。原理就是阻止事件冒泡和事件默认动作。阻止冒泡就为了当前块的滚动事件不会传递到父元素中, 在移动端就是touchmove事件。其实现代码如下, 通过扩展jQuery:

 

jQuery扩展代码如下:

1 $j.fn.uniqueScroll = function () { 2             $j(this).on('mousewheel', _pc) 3                 .on('DOMMouseScroll', _pc); 4  5             function _pc(e) { 6  7                 var scrollTop = $j(this)[0].scrollTop, 8                     scrollHeight = $j(this)[0].scrollHeight, 9                     height = $j(this)[0].clientHeight;10 11                 var delta = (e.originalEvent.wheelDelta) ? e.originalEvent.wheelDelta : -(e.originalEvent.detail || 0);12 13                 if ((delta > 0 && scrollTop <= delta) || (delta < 0 && scrollHeight - height - scrollTop <= -1 * delta)) {14                     this.scrollTop = delta > 0 ? 0 : scrollHeight;15                     e.stopPropagation();16                     e.preventDefault();17                 }18             }19 20             $j(this).on('touchstart', function (e) {21                 var targetTouches = e.targetTouches ? e.targetTouches : e.originalEvent.targetTouches;22                 $j(this)[0].tmPoint = {x: targetTouches[0].pageX, y: targetTouches[0].pageY};23             });24             $j(this).on('touchmove', _mobile);25             $j(this).on('touchend', function (e) {26                 $j(this)[0].tmPoint = null;27             });28             $j(this).on('touchcancel', function (e) {29                 $j(this)[0].tmPoint = null;30             });31 32             function _mobile(e) {33 34                 if ($j(this)[0].tmPoint == null) {35                     return;36                 }37 38                 var targetTouches = e.targetTouches ? e.targetTouches : e.originalEvent.targetTouches;39                 var scrollTop = $j(this)[0].scrollTop,40                     scrollHeight = $j(this)[0].scrollHeight,41                     height = $j(this)[0].clientHeight;42 43                 var point = {x: targetTouches[0].pageX, y: targetTouches[0].pageY};44                 var de = $j(this)[0].tmPoint.y - point.y;45                 if (de < 0 && scrollTop <= 0) {46                     e.stopPropagation();47                     e.preventDefault();48                 }49 50                 if (de > 0 && scrollTop + height >= scrollHeight) {51                     e.stopPropagation();52                     e.preventDefault();53                 }54             }55         };

 

 

调用方法:

$(element).uniqueScroll();

 

 

测试代码如下:

1   2   3   4     
5 uniqueScroll 6 7 8
9
1 10
1
1 11
1
1 12
1
1 13
1
1 14
1
1 15
1
1 16
1
1 17
1
1 18
1
1 19
1
1 20
1
1 21
1
1 22
1
1 23
1
1 24
1
1 25
1
1 26
1
1 27
1
1 28
1
1 29
1
1 30
1
1 31
1
1 32
1
1 33
1
1 34
1
1 35
1
1 36
1
1 37
1
1 38
1
1 39
1
1 40
1
1 41
1
1 42
1
1 43
1
1 44
1 45
46 47
1 48
1 49
1 50
1 51
1 52
1 53
1 54
1 55
1 56
1 57
1 58
1 59
1 60
1 61
1 62
1 63
1 64
1 65
1 66
1 67
1 68
1 69
1 70
1 71
1 72
1 73
1 74
1 75
1 76
1 77
1 78
1 79
1 80
1 81
1 82
1 83
1 84
1 85
1 86
1 87
1 88
1 89
1 90
1 91
1 92
1 93
1 94
1 95
1 96
1 97
1 98
1 99
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148 211 212 213

 

转载于:https://www.cnblogs.com/JinkoWu/p/5220708.html

你可能感兴趣的文章
Zookeeper一致性级别
查看>>
Linux远程登录
查看>>
Linux自己安装redis扩展
查看>>
HDU 1016 Prime Ring Problem(dfs)
查看>>
C#中结构体与字节流互相转换
查看>>
session和xsrf
查看>>
跟随大神实现简单的Vue框架
查看>>
Linux目录结构
查看>>
LeetCode-Strobogrammatic Number
查看>>
luoguP3414 SAC#1 - 组合数
查看>>
五一 DAY 4
查看>>
(转)接口测试用例设计(详细干货)
查看>>
【译】SSH隧道:本地和远程端口转发
查看>>
win8.1安装Python提示缺失api-ms-win-crt-runtime-l1-1-0.dll问题
查看>>
图片点击轮播(三)-----2017-04-05
查看>>
判断两个字符串是否相等【JAVA】
查看>>
直播技术细节3
查看>>
《分布式服务架构:原理、设计于实战》总结
查看>>
java中new一个对象和对象=null有什么区别
查看>>
字母和数字键的键码值(keyCode)
查看>>