通过 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 相关文章推荐
Prototype源码浅析 String部分(三)之HTML字符串处理
Jan 15 Javascript
10款非常有用的 Ajax 插件分享
Mar 14 Javascript
js实现带有介绍的Select列表菜单实例
Aug 18 Javascript
jQuery焦点图轮播特效代码分享(3款)
Sep 05 Javascript
JavaScript对HTML DOM使用EventListener进行操作
Oct 21 Javascript
jQuery获取剪贴板内容的方法
Jun 16 Javascript
jQuery EasyUI tree 使用拖拽时遇到的错误小结
Oct 10 Javascript
jQuery动态生成表格及右键菜单功能示例
Jan 13 Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
Mar 30 Javascript
vue路由跳转传参数的方法
May 06 Javascript
JavaScript实现的弹出遮罩层特效经典示例【基于jQuery】
Jul 10 jQuery
javascript二维数组和对象的深拷贝与浅拷贝实例分析
Oct 26 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操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
2011/11/10 PHP
UCenter 批量添加用户的php代码
2012/07/17 PHP
php一个解析字符串排列数组的方法
2015/05/12 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
2015/06/10 PHP
PHP对称加密函数实现数据的加密解密
2016/10/27 PHP
经常用到的JavasScript事件的翻译
2007/04/09 Javascript
DOM下的节点属性和操作小结
2009/05/14 Javascript
javascript自启动函数的问题探讨
2013/10/05 Javascript
XML、HTML、CSS与JS的区别整理
2016/02/18 Javascript
Angularjs中使用Filters详解
2016/03/11 Javascript
JavaScript鼠标特效大全
2016/09/13 Javascript
AngularJS表格样式简单设置方法示例
2017/03/03 Javascript
利用纯js + transition动画实现移动端web轮播图详解
2017/09/10 Javascript
VueJs 将接口用webpack代理到本地的方法
2017/11/27 Javascript
如何将你的AngularJS1.x应用迁移至React的方法
2018/02/01 Javascript
微信小程序实现简单购物车功能
2020/12/30 Javascript
Python中使用第三方库xlutils来追加写入Excel文件示例
2015/04/05 Python
Python使用xlrd模块操作Excel数据导入的方法
2015/05/26 Python
Python基于动态规划算法解决01背包问题实例
2017/12/06 Python
使用python语言,比较两个字符串是否相同的实例
2018/06/29 Python
python实现朴素贝叶斯算法
2018/11/19 Python
python基于C/S模式实现聊天室功能
2019/01/09 Python
pyqt5使用按钮进行界面的跳转方法
2019/06/19 Python
pytorch中的transforms模块实例详解
2019/12/31 Python
浅谈pytorch torch.backends.cudnn设置作用
2020/02/20 Python
numpy的Fancy Indexing和array比较详解
2020/06/11 Python
阿拉伯时尚购物网站:Nisnass
2021/02/07 全球购物
大学生军训广播稿
2014/01/24 职场文书
好人好事事迹材料
2014/02/12 职场文书
土建工程师岗位职责
2014/06/10 职场文书
五五普法心得体会
2014/09/04 职场文书
防灾减灾宣传标语
2014/10/07 职场文书
五一劳动节活动总结
2015/02/09 职场文书
《妈妈别哭,有我在》读后感3篇
2020/01/13 职场文书
Python中json.load()和json.loads()有哪些区别
2021/06/07 Python
分享python函数常见关键字
2022/04/26 Python