通过 JS 判断页面是否有滚动条的实现方法


Posted in Javascript onApril 05, 2018

前言

最近在写插件的过程中,需要使用 JS 判断是否有滚动条,搜了一下,大致方法都差不多,但都有些??拢??氩还患蚪唷W钪胀ü?慰疾煌?椒ǎ?戳艘桓霰冉霞虻サ姆椒āT谂卸瞎龆?醯耐?币残枰?扑愎龆?醯目矶龋?ü?酒?恼乱徊⒂氪蠹曳窒怼?/p>

为什么要判断滚动条

通过 JS 判断页面是否有滚动条的实现方法

判断滚动条的需求在弹窗插件中用的较多,因为弹窗大多会添加 overflow: hidden 的属性,如果页面比较长的话,添加这个属性之后页面会有晃动。

为了增强用户体验,通过判断是否有滚动条而添加 margin-left 属性以抵消 overflow: hidden 之后的滚动条位置。

判断是否有滚动条的方法

其实只需要一行 JS 就可以,测试兼容 IE7

function hasScrollbar() {
  return document.body.scrollHeight > (window.innerHeight || document.documentElement.clientHeight);
}

一般情况下,使用 document.body.scrollHeight > window.innerHeight 就可以判断。

但是在 IE7,IE8 中 window.innerHeight 为 underfined,所以为了兼容 IE7、IE8,需要使用document.documentElement.clientHeight 属性计算窗口高度。

计算滚动条宽度的方法

还是以弹窗为例,因为 IE 10 以上以及移动端浏览器的滚动条都是不占据页面宽度的透明样式(其中 IE 10 以上浏览器可以通过 CSS 属性还原原始的滚动条样式),所以为了进一步增强用户体验,我们还需要计算滚动条的宽度,根据情况添加合理的 margin-left 数值。

通过 JS 判断页面是否有滚动条的实现方法

计算滚动条宽度的方法比较简单,新建一个带有滚动条的 div 元素,通过该元素的 offsetWidth clientWidth 的差值即可获得,我在此借鉴 Magnific-popup 中的方法

function getScrollbarWidth() {

  var scrollDiv = document.createElement("div");
  scrollDiv.style.cssText = 'width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;';
  document.body.appendChild(scrollDiv);
  var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
  document.body.removeChild(scrollDiv);

  return scrollbarWidth;

}

总结

使用 JS 实现一个功能可能并不困难,但作为编程人员应该时刻思考如何更简单更优雅的实现这个功能,并且时刻以提升用户体验为原则。对于条件判断,也许十行的逻辑判断可能只需要一行,最近感受极为深刻,而且要善于使用三元表达式替代 if..else 来精简代码。

原理就是判断 是文档高度大于可视区域高度。

Javascript 相关文章推荐
JS backgroundImage控制
May 19 Javascript
Javascript面象对象成员、共享成员变量实验
Nov 19 Javascript
JS清空多文本框、文本域示例代码
Feb 24 Javascript
javascript中AJAX用法实例分析
Jan 30 Javascript
实例详解angularjs和ajax的结合使用
Oct 22 Javascript
关于vue.js发布后路径引用的问题解决
Aug 15 Javascript
二维码图片生成器QRCode.js简单介绍
Aug 18 Javascript
element-ui 中使用upload多文件上传只请求一次接口
Jul 19 Javascript
Layui table field初始化加载时进行隐藏的方法
Sep 19 Javascript
TensorFlow.js 微信小程序插件开始支持模型缓存的方法
Feb 21 Javascript
javascript 数组精简技巧小结
Feb 26 Javascript
mapboxgl区划标签避让不遮盖实现的代码详解
Jul 01 Javascript
mint-ui在vue中的使用示例
Apr 05 #Javascript
webpack热模块替换(HMR)/热更新的方法
Apr 05 #Javascript
详解Vue基于 Nuxt.js 实现服务端渲染(SSR)
Apr 05 #Javascript
express默认日志组件morgan的方法
Apr 05 #Javascript
React Native悬浮按钮组件的示例代码
Apr 05 #Javascript
关于Google发布的JavaScript代码规范你要知道哪些
Apr 04 #Javascript
Angular HMR(热模块替换)功能实现方法
Apr 04 #Javascript
You might like
一个阿拉伯数字转中文数字的函数
2006/10/09 PHP
利用PHP制作简单的内容采集器的原理分析
2008/10/01 PHP
php URL编码解码函数代码
2009/03/10 PHP
smarty简单分页的实现方法
2014/10/27 PHP
javascript some()函数用法详解
2014/11/13 PHP
PHP中捕获超时事件的方法实例
2015/02/12 PHP
php中时间函数date及常用的时间计算
2017/05/12 PHP
PHP中number_format()函数的用法讲解
2019/04/08 PHP
JavaScript中两个感叹号的作用说明
2011/12/28 Javascript
JQuery的ready函数与JS的onload的区别详解
2013/11/21 Javascript
微信小程序  audio音频播放详解及实例
2016/11/02 Javascript
js学使用setTimeout实现轮循动画
2017/07/17 Javascript
理解nodejs的stream和pipe机制的原理和实现
2017/08/12 NodeJs
jQuery Layer弹出层传值到父页面的实现代码
2017/08/17 jQuery
NW.js 简介与使用方法
2018/02/01 Javascript
vue弹窗插件实战代码
2018/09/08 Javascript
JavaScript 高性能数组去重的方法
2018/09/20 Javascript
vuex实现购物车功能
2020/06/28 Javascript
js+canvas实现五子棋小游戏
2020/08/02 Javascript
pycharm 使用心得(三)Hello world!
2014/06/05 Python
浅析Python基础-流程控制
2016/03/18 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
2017/11/02 Python
python爬虫自动创建文件夹的功能
2018/08/01 Python
Python Learning 列表的更多操作及示例代码
2018/08/22 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
Python实现自定义读写分离代码实例
2019/11/16 Python
Python实现动态循环输出文字功能
2020/05/07 Python
使用Python文件读写,自定义分隔符(custom delimiter)
2020/07/05 Python
英国领先的运动营养品牌:Protein Dynamix
2018/01/02 全球购物
Marlies Dekkers内衣美国官方网上商店:高端内衣品牌
2018/11/12 全球购物
机械设计制造专业个人求职信
2013/09/25 职场文书
财务会计专业应届毕业生求职信
2013/10/18 职场文书
火锅店的活动方案
2014/08/15 职场文书
群众路线个人剖析材料及整改措施
2014/11/04 职场文书
CSS 文字装饰 text-decoration & text-emphasis 详解
2021/04/06 HTML / CSS
Docker部署Mysql8的实现步骤
2022/07/07 Servers