通过 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 相关文章推荐
一个选择最快的服务器转向代码
Apr 27 Javascript
JavaScript 学习笔记(十六) js事件
Feb 01 Javascript
JavaScript中的this实例分析
Apr 28 Javascript
setTimeout的延时为0时多个浏览器的区别
May 23 Javascript
jQuery插件jFade实现鼠标经过的图片高亮其它变暗
Mar 14 Javascript
javascript实现连续赋值
Aug 10 Javascript
JS实现简单的二维矩阵乘积运算
Jan 26 Javascript
JavaScript闭包和范围实例详解
Dec 19 Javascript
vue-cli3.0 特性解读
Apr 22 Javascript
跟混乱的页面弹窗说再见
Apr 11 Javascript
Vue组件通信的几种实现方法
Apr 25 Javascript
vue中的.$mount('#app')手动挂载操作
Sep 02 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
mysql 搜索之简单应用
2007/04/27 PHP
php中$_GET与$_POST过滤sql注入的方法
2014/11/03 PHP
谈谈你对Zend SAPIs(Zend SAPI Internals)的理解
2015/11/10 PHP
PHP 中使用explode()函数切割字符串为数组的示例
2017/05/06 PHP
PHP中危险的file_put_contents函数详解
2017/11/04 PHP
php5与php7的区别点总结
2019/10/11 PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
2019/10/30 PHP
javascript 写类方式之八
2009/07/05 Javascript
Javascript的匿名函数小结
2009/12/31 Javascript
js实现图片旋转的三种方法
2014/04/10 Javascript
javascript中clone对象详解
2014/12/03 Javascript
director.js实现前端路由使用实例
2015/02/03 Javascript
json传值以及ajax接收详解
2016/05/24 Javascript
JS HTML5实现拖拽移动列表效果
2020/08/27 Javascript
javascript数字验证的实例代码(推荐)
2016/08/20 Javascript
详解webpack es6 to es5支持配置
2017/05/04 Javascript
javascript浏览器用户代理检测脚本实现方法
2017/10/27 Javascript
vue中的$emit 与$on父子组件与兄弟组件的之间通信方式
2018/05/13 Javascript
JS中数据结构之栈
2019/01/01 Javascript
JavaScript中的Proxy对象
2020/11/27 Javascript
wxPython 入门教程
2008/10/07 Python
python采用requests库模拟登录和抓取数据的简单示例
2014/07/05 Python
python中urllib.unquote乱码的原因与解决方法
2017/04/24 Python
python机器学习库常用汇总
2017/11/15 Python
完美解决Python 2.7不能正常使用pip install的问题
2018/06/12 Python
详解Python匿名函数(lambda函数)
2019/04/19 Python
python实现PID算法及测试的例子
2019/08/08 Python
numpy:np.newaxis 实现将行向量转换成列向量
2019/11/30 Python
Python logging模块原理解析及应用
2020/08/13 Python
毕业生求职简历的自我评价
2013/10/23 职场文书
化工专业推荐信范文
2013/11/28 职场文书
小学教师事迹材料
2014/01/13 职场文书
群众路线自我剖析材料
2014/10/08 职场文书
2015年全国“爱牙日”宣传活动总结
2015/03/23 职场文书
浅析Python实现DFA算法
2021/06/26 Python
python 中yaml文件用法大全
2021/07/04 Python