通过 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 相关文章推荐
自适应高度框架 ----属个人收藏内容
Jan 22 Javascript
js文字滚动停顿效果代码
Jun 28 Javascript
js加载读取内容及显示与隐藏div示例
Feb 13 Javascript
JavaScript中的比较操作符>、=、
Dec 31 Javascript
jQuery中prev()方法用法实例
Jan 08 Javascript
js实现简单的计算器功能
Jan 16 Javascript
微信小程序组件之srcoll-view的详解
Oct 19 Javascript
JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解
Oct 25 Javascript
Vue中v-for的数据分组实例
Mar 07 Javascript
稍微学一下Vue的数据响应式(Vue2及Vue3区别)
Nov 21 Javascript
JS桶排序的简单理解与实现方法示例
Nov 25 Javascript
JavaScript对象访问器Getter及Setter原理解析
Dec 08 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
2021年最新CPU天梯图
2021/03/04 数码科技
20个2014年最优秀的PHP框架回顾
2014/10/22 PHP
Smarty模板简单配置与使用方法示例
2016/05/23 PHP
建立良好体验度的Web注册系统ajax
2007/07/09 Javascript
js可突破windows弹退效果代码
2008/08/09 Javascript
ext 同步和异步示例代码
2009/09/18 Javascript
javascript中定义私有方法说明(private method)
2014/01/27 Javascript
JS动态修改iframe高度和宽度的方法
2015/04/01 Javascript
js日期相关函数dateAdd,dateDiff,dateFormat等介绍
2016/09/24 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
详解node.js平台下Express的session与cookie模块包的配置
2017/04/26 Javascript
浅谈webpack 自动刷新与解析
2018/04/09 Javascript
基于Vue的延迟加载插件vue-view-lazy
2018/05/21 Javascript
jQuery插件simplePagination的使用方法示例
2020/04/28 jQuery
解决vue路由name同名,路由重复的问题
2020/08/05 Javascript
[47:21]Liquid vs TNC Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
[44:43]完美世界DOTA2联赛决赛日 FTD vs GXR 第一场 11.08
2020/11/11 DOTA
python使用正则表达式提取网页URL的方法
2015/05/26 Python
自动化Nginx服务器的反向代理的配置方法
2015/06/28 Python
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
解决python 未发现数据源名称并且未指定默认驱动程序的问题
2018/12/07 Python
Python整数对象实现原理详解
2019/07/01 Python
Python实现动态循环输出文字功能
2020/05/07 Python
python 星号(*)的多种用途
2020/09/21 Python
Python将list元素转存为CSV文件的实现
2020/11/16 Python
加拿大时尚少女服装品牌:Garage
2016/10/10 全球购物
Cotton On美国网站:澳洲时装连锁品牌
2016/10/25 全球购物
英国领先的电动可调床制造商:Laybrook
2019/12/26 全球购物
中学教师管理制度
2014/01/14 职场文书
批评与自我批评材料
2014/02/15 职场文书
大学生实习介绍信
2015/05/05 职场文书
你为什么是穷人?可能是这5个缺点造成
2019/07/11 职场文书
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python
python实现简易自习室座位预约系统
2021/06/30 Python
Mysql分析设计表主键为何不用uuid
2022/03/31 MySQL
Golang 1.18 多模块Multi-Module工作区模式的新特性
2022/04/11 Golang