通过 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 相关文章推荐
NiftyCube——轻松实现圆角边框
Feb 20 Javascript
javascript中字符串替换函数replace()方法与c# 、vb 替换有一点不同
Jun 25 Javascript
JQuery 图片的展开和伸缩实例讲解
Apr 18 Javascript
js的touch事件的实际引用
Oct 13 Javascript
JavaScript中扩展Array contains方法实例
Aug 23 Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
Oct 17 Javascript
jQuery插件formValidator实现表单验证
May 23 Javascript
微信小程序使用checkbox显示多项选择框功能【附源码下载】
Dec 11 Javascript
浅谈在node.js进入文件目录的问题
May 13 Javascript
微信小程序实现星级评价
Nov 20 Javascript
vue实现购物车列表
Jun 30 Javascript
解决ant Design Search无法输入内容的问题
Oct 29 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
php存储过程调用实例代码
2013/02/03 PHP
smarty简单入门实例
2014/11/28 PHP
JQUERY的属性选择符和自定义选择符使用方法(二)
2011/04/07 Javascript
JS实现静止元素自动移动示例
2014/04/14 Javascript
ff chrome和ie下全局动态定位的异同及全局高度的取法
2014/06/30 Javascript
JS获取数组最大值、最小值及长度的方法
2015/11/24 Javascript
Eclipse引入jquery报错如何解决
2015/12/01 Javascript
Bootstrap选项卡与Masonry插件的完美结合
2016/07/06 Javascript
微信小程序 实例开发总结
2017/04/26 Javascript
node.js + socket.io 实现点对点随机匹配聊天
2017/06/30 Javascript
nodejs之get/post请求的几种方式小结
2017/07/26 NodeJs
微信小程序getPhoneNumber获取用户手机号
2017/09/29 Javascript
Vue 莹石摄像头直播视频实例代码
2018/08/31 Javascript
对angularJs中ng-style动态改变样式的实例讲解
2018/09/30 Javascript
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
微信小程序实现多行文字超出部分省略号显示功能
2019/10/23 Javascript
js的Object.assign用法示例分析
2020/03/05 Javascript
Vue实现手机计算器
2020/08/17 Javascript
[01:38]完美世界DOTA2联赛(PWL)宣传片:第一站
2020/10/26 DOTA
python赋值操作方法分享
2013/03/23 Python
Python打印“菱形”星号代码方法
2018/02/05 Python
通过Pandas读取大文件的实例
2018/06/07 Python
python中计算一个列表中连续相同的元素个数方法
2018/06/29 Python
利用python计算windows全盘文件md5值的脚本
2019/07/27 Python
如何使用Python进行PDF图片识别OCR
2021/01/22 Python
Python实现网络聊天室的示例代码(支持多人聊天与私聊)
2021/01/27 Python
Opencv 图片的OCR识别的实战示例
2021/03/02 Python
CSS3实现王者匹配时的粒子动画效果
2019/04/12 HTML / CSS
党干部专题民主生活会对照检查材料思想汇报
2014/10/06 职场文书
2014年公务员个人工作总结
2014/11/22 职场文书
跟班学习心得体会(共6篇)
2016/01/23 职场文书
详解Html5项目适配系统深色模式方案总结
2021/04/14 HTML / CSS
Python控制台输出俄罗斯方块的方法实例
2021/04/17 Python
如何获取numpy array前N个最大值
2021/05/14 Python
OpenCV-Python实现轮廓的特征值
2021/06/09 Python
Docker安装MySql8并远程访问的实现
2022/07/07 Servers