通过 JS 判断页面是否有滚动条的实现方法

 更新时间:2018年04月05日 15:27:27   作者:叙帝利  
最近在写插件的过程中,需要使用 JS 判断是否有滚动条,搜了一下,大致方法都差不多,但都有些啰嗦,代码不够简洁。最终通过参考不同方法,写了一个比较简单的方法

前言

最近在写插件的过程中,需要使用 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 数值。

计算滚动条宽度的方法比较简单,新建一个带有滚动条的 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 来精简代码。

原理就是判断 是文档高度大于可视区域高度。

相关文章

  • Linux下编译安装php libevent扩展实例

    Linux下编译安装php libevent扩展实例

    这篇文章主要介绍了Linux下编译安装php libevent扩展实例,本文着重讲解了编译过程中一个错误解决方法,需要的朋友可以参考下
    2015-02-02
  • Chrome插件(扩展)开发全攻略(完整demo)

    Chrome插件(扩展)开发全攻略(完整demo)

    Chrome插件是一个用Web技术开发、用来增强浏览器功能的软件,它其实就是一个由HTML、CSS、JS、图片等资源组成的一个.crx后缀的压缩包,本文给大家分享一个Chrome插件(扩展)开发全攻略完整demo,感兴趣的朋友跟随小编一起学习下吧
    2021-05-05
  • javascript中的replace函数(带注释demo)

    javascript中的replace函数(带注释demo)

    在js中有两个replace函数 一个是location.replace(url) 跳转到一个新的url.一个string.replace("xx","yy") 替换字符串 返回一个新的字符串,该方法并不改变字符串本身。下面通过本文给大家介绍javascript中的replace函数
    2018-01-01
  • javascript 利用arguments实现可变长参数

    javascript 利用arguments实现可变长参数

    在C#中,有可变长参数params[],但是在js中,如何实现这种可变参数呢?本片文章主要介绍利用arguments,实现可变长参数。有需要的请参考下
    2016-11-11
  • 浅析Bootstrap组件之面板组件

    浅析Bootstrap组件之面板组件

    这篇文章主要介绍了浅析Bootstrap组件之面板组件 的相关资料,需要的朋友可以参考下
    2016-05-05
  • selenium 反爬虫之跳过淘宝滑块验证功能的实现代码

    selenium 反爬虫之跳过淘宝滑块验证功能的实现代码

    这篇文章主要介绍了selenium 反爬虫之跳过淘宝滑块验证功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • JavaScript正则表达式函数总结(常用)

    JavaScript正则表达式函数总结(常用)

    正则表达式作为一种匹配处理字符串的利器在很多语言中都得到了广泛实现和应用.这篇文章主要介绍了JavaScript正则表达式函数总结,需要的朋友可以参考下
    2018-02-02
  • 前端js中的事件循环eventloop机制详解

    前端js中的事件循环eventloop机制详解

    这篇文章主要给大家介绍了关于前端js中事件循环eventloop机制的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用js具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • 微信小程序自定义对话框弹出和隐藏动画

    微信小程序自定义对话框弹出和隐藏动画

    这篇文章主要为大家详细介绍了微信小程序自定义对话框弹出和隐藏动画,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • 可以自动轮换的页签 tabs with auto play fucntion

    可以自动轮换的页签 tabs with auto play fucntion

    HTML、CSS方面改写了一下结构,用了一个DL javascript方面可以选择不断自动循环,或者只循环一次的,点击以后继续循环,或者停止循环
    2008-02-02

最新评论