有一些场景,比如弹窗,比如商品的抛物线效果,为了更好的前端用户体验,要求临时禁止滚动条的滚动。
参考了前辈的一些经验,比如这位:https://yujiangshui.com/review-how-to-make-popup-mask-effect/。现做如下总结。
方案1,最为简单粗暴的方式当然是直接将dom的body挂一个样式即overflow:hide。
document.body.style.cssText = 'overflow-y:hidden';
基本思路:需要禁止时执行上面代码,禁用解除则用
document.body.style.cssText = 'overflow-y:auto';
但上述方案存在一个问题,就是页面内容抖动,这产生了不好的前端操作体验。
方案2,采用jquery的解决方案,jquery作为老牌的js库,自带禁用功能。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>jquery实现方案</title> </head> <body> <div style="height: 200px; 100%;"> </div> <div style="text-align: center;"> <button id="btn">点我测试</button> </div> <div style=" 100%;height: 1200px;">这是用开显示滚动条的</div> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript"> function unScroll() { var top = $(document).scrollTop(); $(document).on('scroll.unable', function(e) { $(document).scrollTop(top); }) } //移除禁止滚动条滚动 function removeUnScroll() { $(document).unbind("scroll.unable"); } $("#btn").click(function() { unScroll(); setTimeout(function() { removeUnScroll(); }, 5000) }) </script> </body> </html>
注意引入jquery,测试觉得还有有些小问题。
方案3,采用css的overflow设置结合padding-right的方案。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>另一种方式禁用</title> </head> <body> <div style="height: 200px; 100%;"> </div> <div style="text-align: center;"> <button id="btn">点我测试</button> </div> <div style=" 100%;height: 1200px;">这是用开显示滚动条的</div> <script type="text/javascript"> document.getElementById('btn').addEventListener('click', function() { document.body.style.cssText = "overflow-y:hidden;padding-right:17px;"; setTimeout(function() { document.body.style.cssText = "overflow-y:auto;padding-right:0px;"; }, 2000) }); </script> </body> </html>
但是部分浏览器的padding-right不为17px;所以产生了方案4。
方案4,就是动态设定padding-right值
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>另一种方式禁用</title> <style type="text/css"> .box-lock-test { overflow-y: hidden !important; } </style> </head> <body> <div style="height: 200px; 100%;"> </div> <div style="text-align: center;"> <button id="btn">点我测试</button> </div> <div style=" 100%;height: 1200px;">这是用开显示滚动条的</div> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript"> document.getElementById('btn').addEventListener('click', function() { // var w1 = $(window).width(); // $('html').addClass('box-lock-test'); // var w2 = $(window).width(); // $('html').removeClass('box-lock-test'); var w1 = $(window).width(); $('body').addClass('box-lock-test'); var w2 = $(window).width(); $('body').removeClass('box-lock-test'); // document.documentElement.style.cssText = `overflow-y:hidden;padding-right:${w2-w1}px;`; // setTimeout(function() { // document.documentElement.style.cssText = "overflow-y:auto;padding-right:0px;"; // }, 2000) document.body.style.cssText = `overflow-y:hidden;padding-right:${w2-w1}px;`; setTimeout(function() { document.body.style.cssText = "overflow-y:auto;padding-right:0px;"; }, 2000) }); </script> </body> </html>
如上。
但在具体的开发应用中,发现一些问题,针对overflow的,原因是dom的html和body元素高度塌陷。要使用overflow需要特别留意一下这点。