通过 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 相关文章推荐
JavaScript 事件冒泡简介及应用
Jan 11 Javascript
jquery获得页面元素的坐标值实现思路及代码
Apr 15 Javascript
node.js中的fs.fsync方法使用说明
Dec 15 Javascript
DOM基础教程之使用DOM控制表格
Jan 20 Javascript
jQuery实现自定义checkbox和radio样式
Jul 13 Javascript
Bootstrap每天必学之进度条
Nov 30 Javascript
基于javascript实现简单计算器功能
Jan 03 Javascript
jQuery实现简单的DIV拖动效果
Feb 19 Javascript
浅析java线程中断的办法
Jul 29 Javascript
vue项目设置scrollTop不起作用(总结)
Dec 21 Javascript
vue中npm包全局安装和局部安装过程
Sep 03 Javascript
js删除指定位置超链接中含有百度与360的标题
Jan 06 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
Apache设置虚拟WEB
2006/10/09 PHP
php一句话cmdshell新型 (非一句话木马)
2009/04/18 PHP
javascript 学习笔记(八)javascript对象
2011/04/12 Javascript
js onkeypress与onkeydown 事件区别详细说明
2012/12/13 Javascript
利用js判断浏览器类型(是否为IE,Firefox,Opera浏览器)
2013/11/22 Javascript
javascript中数组的多种定义方法和常用函数简介
2014/05/09 Javascript
jQuery分组选择器用法实例
2014/12/23 Javascript
基于jquery实现即时检查格式是否正确的表单
2016/05/06 Javascript
JavaScript中常用的验证reg
2016/10/13 Javascript
BootStrap Tooltip插件源码解析
2016/12/27 Javascript
javascript数据类型详解
2017/02/07 Javascript
十个免费的web前端开发工具详细整理
2017/09/18 Javascript
JavaScript数据结构之双向链表定义与使用方法示例
2017/10/27 Javascript
微信小程序排坑指南详解
2018/05/23 Javascript
angularJS开发注意事项
2018/05/26 Javascript
JQuery样式与属性设置方法分析
2019/12/07 jQuery
vue 使用async写数字动态加载效果案例
2020/07/18 Javascript
原生JavaScript实现拖动校验功能
2020/09/29 Javascript
[01:39:04]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第二场 2月1日
2021/03/11 DOTA
python脚本实现xls(xlsx)转成csv
2016/04/10 Python
安装Python和pygame及相应的环境变量配置(图文教程)
2017/06/04 Python
python实现日常记账本小程序
2018/03/10 Python
对Python发送带header的http请求方法详解
2019/01/02 Python
python读取文件名并改名字的实例
2019/01/07 Python
详解Python Qt的窗体开发的基本操作
2019/07/14 Python
基于python二叉树的构造和打印例子
2019/08/09 Python
pyqt5、qtdesigner安装和环境设置教程
2019/09/25 Python
Python如何使用turtle库绘制图形
2020/02/26 Python
HTML5实现WebSocket协议原理浅析
2014/07/07 HTML / CSS
日本PLST在线商店:日本时尚杂志刊载的人气服装
2016/12/10 全球购物
Luxplus荷兰:以会员价购买美容产品等,独家优惠
2019/08/30 全球购物
俄罗斯购买内衣网站:Trusiki
2020/08/22 全球购物
教师自我评价范例
2013/09/24 职场文书
学校远程教育工作总结
2015/08/11 职场文书
为什么说餐饮很难做,是因为你不了解这些新规则
2019/08/20 职场文书
Sentry的安装、配置、使用教程(Sentry日志手机系统)
2022/07/23 Python