通过 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获取网页属性包括宽、高等等
Apr 03 Javascript
JS实现超精简响应鼠标显示二级菜单代码
Sep 12 Javascript
JQuery标签页效果的两个实例讲解(4)
Sep 17 Javascript
jqGrid 学习笔记整理——进阶篇(一 )
Apr 17 Javascript
jQuery焦点图轮播效果实现方法
Dec 19 Javascript
bootstrap laydate日期组件使用详解
Jan 04 Javascript
详解用vue编写弹出框组件
Jul 04 Javascript
微信小程序的线程架构【推荐】
May 14 Javascript
ES6基础之数组和对象的拓展实例详解
Aug 22 Javascript
微信小程序自定义弹出模态框禁止底部滚动功能
Mar 09 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
Oct 02 Javascript
vue使用vant中的checkbox实现全选功能
Nov 17 Vue.js
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 mail 通过Windows的SMTP发送邮件失败的解决方案
2009/05/27 PHP
php cookies中删除的一般赋值方法
2011/05/07 PHP
PHP获取当前日期和时间及格式化方法参数
2015/05/11 PHP
Cygwin中安装PHP方法步骤
2015/07/04 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
2019/09/30 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
2019/10/12 PHP
img标签中onerror用法
2009/08/13 Javascript
用JQuery实现表格隔行变色和突出显示当前行的代码
2012/02/10 Javascript
javascript学习笔记(四) Number 数字类型
2012/06/19 Javascript
getJSON调用后台json数据时函数被调用两次的原因猜想
2013/09/29 Javascript
每天一篇javascript学习小结(基础知识)
2015/11/10 Javascript
jQuery实现表格文本框淡入更改值后淡出效果
2016/09/27 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
2016/11/25 Javascript
JavaScript标准对象_动力节点Java学院整理
2017/06/27 Javascript
vue 1.0 结合animate.css定义动画效果
2018/07/11 Javascript
vue2.0+vue-router构建一个简单的列表页的示例代码
2019/02/13 Javascript
详解Vue组件之间通信的七种方式
2019/04/14 Javascript
Nuxt的路由配置和参数传递方式
2020/11/06 Javascript
[06:45]DOTA2-DPC中国联赛 正赛 Magma vs LBZS 选手采访
2021/03/11 DOTA
python DataFrame获取行数、列数、索引及第几行第几列的值方法
2018/04/08 Python
在python中pandas的series合并方法
2018/11/12 Python
Python函数装饰器实现方法详解
2018/12/22 Python
python原类、类的创建过程与方法详解
2019/07/19 Python
Python数据可视化实现正态分布(高斯分布)
2019/08/21 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
2020/01/25 Python
使用Python判断一个文件是否被占用的方法教程
2020/12/16 Python
Python制作运行进度条的实现效果(代码运行不无聊)
2021/02/24 Python
全球虚拟主机商:HostGator
2017/02/06 全球购物
联想加拿大官方网站:Lenovo Canada
2018/04/05 全球购物
黄河象教学反思
2014/02/10 职场文书
承诺书怎么写
2014/03/26 职场文书
购房意向书范本
2014/04/01 职场文书
项目经理任命书
2014/06/04 职场文书
田径运动会通讯稿
2015/07/18 职场文书
Spring Boot两种全局配置和两种注解的操作方法
2021/06/29 Java/Android