通过 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 来精简代码。

http://www.dwd9016.cn/
http://www.wqr1047.cn/
http://www.nyc9430.cn/
http://www.bks4017.cn/
http://www.iru8567.cn/
http://www.dyq9159.cn/
http://www.ece1729.cn/
http://www.zpp0623.cn/
http://www.ymg3874.cn/
http://www.jaf1308.cn/
http://www.djz1658.cn/
http://www.jlh2124.cn/
http://www.acj2609.cn/
http://www.per1537.cn/
http://www.jxa6372.cn/
http://www.dja2819.cn/
http://www.sml6389.cn/
http://www.hgh3722.cn/
http://www.ntd5264.cn/
http://www.esn7121.cn/
http://www.oee2689.cn/
http://www.pdh7765.cn/
http://www.qsv0141.cn/
http://www.mar4014.cn/
http://www.rcd9187.cn/
http://www.unw3900.cn/
http://www.tmo9604.cn/
http://www.eko5785.cn/
http://www.eqn5017.cn/
http://www.oek0353.cn/
http://www.hmw0652.cn/
http://www.tub1546.cn/
http://www.taj7240.cn/
http://www.dto7731.cn/
http://www.tox1106.cn/
http://www.pzx0011.cn/
http://www.kdd4058.cn/
http://www.bti6873.cn/
http://www.nvg6571.cn/
http://www.krr6354.cn/
http://www.uym8620.cn/
http://www.blm3653.cn/
http://www.uqt9445.cn/
http://www.txr3194.cn/
http://www.hqu4552.cn/
http://www.veo6686.cn/
http://www.usx0758.cn/
http://www.bpl6646.cn/
http://www.iyi5365.cn/
http://www.xgm6868.cn/
http://www.hfk7896.cn/
http://www.ngp3761.cn/
http://www.bwb3762.cn/
http://www.jbx0190.cn/
http://www.fvj9657.cn/
http://www.ife7579.cn/
http://www.zws1014.cn/
http://www.bou1446.cn/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值