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

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

jQuery扩展代码如下:

 $j.fn.uniqueScroll = function () {
$j(this).on('mousewheel', _pc)
.on('DOMMouseScroll', _pc); function _pc(e) { var scrollTop = $j(this)[0].scrollTop,
scrollHeight = $j(this)[0].scrollHeight,
height = $j(this)[0].clientHeight; var delta = (e.originalEvent.wheelDelta) ? e.originalEvent.wheelDelta : -(e.originalEvent.detail || 0); if ((delta > 0 && scrollTop <= delta) || (delta < 0 && scrollHeight - height - scrollTop <= -1 * delta)) {
this.scrollTop = delta > 0 ? 0 : scrollHeight;
e.stopPropagation();
e.preventDefault();
}
} $j(this).on('touchstart', function (e) {
var targetTouches = e.targetTouches ? e.targetTouches : e.originalEvent.targetTouches;
$j(this)[0].tmPoint = {x: targetTouches[0].pageX, y: targetTouches[0].pageY};
});
$j(this).on('touchmove', _mobile);
$j(this).on('touchend', function (e) {
$j(this)[0].tmPoint = null;
});
$j(this).on('touchcancel', function (e) {
$j(this)[0].tmPoint = null;
}); function _mobile(e) { if ($j(this)[0].tmPoint == null) {
return;
} var targetTouches = e.targetTouches ? e.targetTouches : e.originalEvent.targetTouches;
var scrollTop = $j(this)[0].scrollTop,
scrollHeight = $j(this)[0].scrollHeight,
height = $j(this)[0].clientHeight; var point = {x: targetTouches[0].pageX, y: targetTouches[0].pageY};
var de = $j(this)[0].tmPoint.y - point.y;
if (de < 0 && scrollTop <= 0) {
e.stopPropagation();
e.preventDefault();
} if (de > 0 && scrollTop + height >= scrollHeight) {
e.stopPropagation();
e.preventDefault();
}
}
};

调用方法:

$(element).uniqueScroll();

测试代码如下:

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>uniqueScroll</title>
<script type="text/javascript" src="jquery-1.11.js"></script>
</head>
<div id="test" style="width:200px;height:300px;overflow: scroll;background: gray;">
<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1<br>1
<br>1
</div>
<body>
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<br>1
<script> (function ($j) {
$j.fn.uniqueScroll = function () {
$j(this).on('mousewheel', _pc)
.on('DOMMouseScroll', _pc); function _pc(e) { var scrollTop = $j(this)[0].scrollTop,
scrollHeight = $j(this)[0].scrollHeight,
height = $j(this)[0].clientHeight; var delta = (e.originalEvent.wheelDelta) ? e.originalEvent.wheelDelta : -(e.originalEvent.detail || 0); if ((delta > 0 && scrollTop <= delta) || (delta < 0 && scrollHeight - height - scrollTop <= -1 * delta)) {
this.scrollTop = delta > 0 ? 0 : scrollHeight;
e.stopPropagation();
e.preventDefault();
}
} $j(this).on('touchstart', function (e) {
var targetTouches = e.targetTouches ? e.targetTouches : e.originalEvent.targetTouches;
$j(this)[0].tmPoint = {x: targetTouches[0].pageX, y: targetTouches[0].pageY};
});
$j(this).on('touchmove', _mobile);
$j(this).on('touchend', function (e) {
$j(this)[0].tmPoint = null;
});
$j(this).on('touchcancel', function (e) {
$j(this)[0].tmPoint = null;
}); function _mobile(e) {
if ($j(this)[0].tmPoint == null) {
return;
} var targetTouches = e.targetTouches ? e.targetTouches : e.originalEvent.targetTouches;
var scrollTop = $j(this)[0].scrollTop,
scrollHeight = $j(this)[0].scrollHeight,
height = $j(this)[0].clientHeight; var point = {x: targetTouches[0].pageX, y: targetTouches[0].pageY};
var de = $j(this)[0].tmPoint.y - point.y; if (de < 0 && scrollTop <= 0) {
e.stopPropagation();
e.preventDefault();
} if (de > 0 && scrollTop + height >= scrollHeight) {
e.stopPropagation();
e.preventDefault();
}
}
}
})(jQuery); $('#test').uniqueScroll();
</script> </body>
</html>

Javascript禁止父元素滚动条滚动, pc、移动端均有效的更多相关文章

  1. Javascript禁止子元素继承父元素的事件

    3种方法1.在父元素事件的function中加if(event.target==this){ }2.子元素事件function最后加event.stopPropgation():// 阻止事件冒泡3. ...

  2. 一个 VUE 组件:实现子元素 scroll 父元素容器不跟随滚动(兼容PC、移动端)

    介绍 我们经常遇到一种情况.当滑动滚动条区域时,子元素滚动条到底部或顶部时就会触发父级滚动条,父级滚动条同理会继续向上触发,直至body容器.这是浏览器默认的滚动行为. 但是很多情况,我们想要子元素滚 ...

  3. iframe子元素相对于父页面滚动条固定(iframe无滚动条,iframe固定高度有滚动条,两种情况)

    一.当iframe自适应高度,无滚动条时候: 例如这样: //随着父页面滚动条滚动定位“#qn-quc”他的位置固定在顶部 $(parent.window).scroll(function() { v ...

  4. [问题记录]父元素position:relative的深坑

    个人博客迁移至:https://blog.plcent.com/欢迎大家访问 今天在写全屏切换的时候,发现一个问题就是切换时只能滚动第一屏,其他屏死都不动, 全屏滚动的原理: 是每次滚动父元素向上滚动 ...

  5. 解决IE6,IE7下子元素使用position:relative、父元素使用overflow:auto后,子元素不随着滚动条滚动的问题

    解决IE6,IE7下子元素使用position:relative.父元素使用overflow:auto后,子元素不随着滚动条滚动的问题   在IE6,IE7下,子元素使用position:relati ...

  6. 父元素设置overflow,绝对定位的子元素会被隐藏或一起滚动

    一般情况: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <met ...

  7. Javascript事件模型(二):Javascript事件的父元素和子元素

    DOM事件标准定义了两种事件流,分别是捕获和冒泡.默认情况下,事件使用冒泡事件流,不使用捕获事件流.你可以指定使用捕获事件流,方法是在注册事件时传入useCapture参数,将这个参数设为true. ...

  8. jquery 禁止滚动条滚动,并且滚动条不消失,页面大小不闪动

    一,禁止滚动,滚动条不消失,页面大小不闪动 //禁止滚动条滚动 function unScroll() { var top = $(document).scrollTop(); $(document) ...

  9. jquery弹窗时禁止body滚动条滚动

    当弹出一个jq提示窗口的时候,一般窗口右边还会有进度条的情况,禁止进度条方法禁止浏览器滚动条滚动: $('body').css({ "overflow-x":"hidde ...

随机推荐

  1. Android: ScrollView监听滑动到顶端和底端

    在项目中需要监听ScrollView滑动到顶端和底端的时候以实现自己的ScrollView,那么怎样去监听呢?今天查看了一下ScrollView的源码,找到了一种方法.先看一下源码中的overScro ...

  2. Oracle左连接、右连接、全外连接

    Oracle  外连接 (1)左外连接 (左边的表不加限制)(2)右外连接(右边的表不加限制)(3)全外连接(左右两表都不加限制) 外连接(Outer Join) outer join则会返回每个满足 ...

  3. SQL别名解析(转载)

    通过使用 SQL,可以为列名称和表名称指定别名(Alias). 其实,select列的时候取别名有三种方法,这三种方法并不是所有数据库都适用. 方法一.直接在字段名称后面加上别名,中间以空格隔开. 方 ...

  4. xhost

    xhost 是用来控制X server访问权限的. 通常当你从hostA登陆到hostB上运行hostB上的应用程序时,做为应用程序来说,hostA是client,但是作为图形来说,是在hostA上显 ...

  5. iOS 开发者必知的 75 个工具

    你可以从软件开发者如何使用工具中看出他水准如何.有经验的开发者精于使用工具.对你目前所使用的工具不断研究,同时了解一些替代品的使用,当你目前所用的工具无法满足你的需要时可以填补空缺. 记住了这些,我将 ...

  6. codevs1040 统计单词个数

    题目描述 Description 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<= ...

  7. Bayesian Formulation on Cooperative Tracking

    Suppose a joint state representing a set of \(N_{n}\) nodes moving in a field\[    \textbf{X}=    \b ...

  8. Python学习笔记10-Python MysqlHelper ,MySql 辅助类

    自己写了一个MySql辅助类,有需要的拿走: #--encoding:utf-8-- # import MySQLdb class MySQLHelper: myVersion=0.1 def __i ...

  9. UVA 12219 Common Subexpression Elimination

    题意: 求最小的表达式树,也就是把相同的表达式子树给替换成最前面相同的编号. 分析: 用map<string,int>smp;存放子树对应的字符串,如果以后出现相同的子树则用相同编号表示. ...

  10. OC——NSString的常用方法

    NSString *str1 = @"BeiJing"; NSString *str2 = @"beijing"; //全部转为大写 NSLog(@" ...