在网页中经常会遇到这样的场景, 网页比较长有滚动条, 然后网页内的某个内容块里面的内容也比较长, 也具有滚动条。当鼠标移到内容块中使用滚动条来滚动查看内容到达底部或头部的时候,父元素的滚动条也就开始滚动了, 非常影响体验, 特别是选择东西的时候。我们需要在滚动的时候不允许父元素也跟着滚动。有一种非常简单, 但是适应能力不强的方法就是, 给鼠标一上去的时候, 给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. 求绝对值,hdu-2003

    求绝对值 Problem Description 求实数的绝对值.   Input 输入数据有多组,每组占一行,每行包含一个实数.   Output 对于每组输入数据,输出它的绝对值,要求每组数据输出 ...

  2. 定义#define

                                                    定义符号常量   当我们不止一次用到某个符号常量时,常选择对符号变量进行定义,这样就能当成一般常量来用. ...

  3. 定制样式插入到ueditor

    AngularJs定制样式插入到ueditor中的问题总结 总结一下自己给编辑器定制样式的过程中所遇到的问题,主要是编辑器的二次开发接口,以及用angular定制样式,问题不少,终于在**的帮助下,完 ...

  4. 新建Android项目的时候,选择SDK的区别

    选择新建一个Android项目时候,出现MiniMum Required SDK.Target SDK.Compile With.Theme,如下所示,分别是什么意思呢? MinMum Require ...

  5. QNDTU外壳及开发板

        昨天从淘宝上淘来了个DTU外壳,翻出来之前的STM32开发板和GPRS模块开发板,今天准备复习一下开发板,把裸板跑起来.     晒一下装备:     两块开发板:           51n ...

  6. 跟我开发NSP(网上查询平台):如何选择开发项目

    我想通过一个真实的项目开发的全过程,记录一下开发过程的点点滴滴,记录一下过程中的前思后想.这个全过程包括,如何选择项目.如何分析项目.如何组织项目开发.如何设计开发流程.如何设计软件的总体架构.如何建 ...

  7. HDU2084 数塔 (DP入门题)

    数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...

  8. 十个JAVA程序员容易犯的错误

    十个JAVA程序员容易犯的错误 1. Array 转 ArrayList 一般开发者喜欢用: List<String> list = Arrays.asList(arr); Arrays. ...

  9. fafu 1568 Matrix(二分匹配+二分)

    Description:   You are given a matrix which <= n <= m <= ). You are supposed to choose n el ...

  10. leetcode_question_130 Surrounded Regions

    Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured ...