前言
最近在写插件的过程中, 需要使用 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 来精简代码.
原理就是判断 是文档高度大于可视区域高度.
来源: http://www.jb51.net/article/137787.htm