JS判断页面是否出现滚动条

今天无聊,帮一个网友解决一个很无聊的问题,用JS判断页面是否出现滚动条,在网上看了一些代码,经过验证并不起作用,下面是在网上搜索到的代码:
当可视区域小于页面的实际高度时,判定为出现滚动条,即:
if (document.documentElement.clientHeight < document.documentElement.offsetHeight) scroll = true;
要使用 document.documentElement ,必须在页面头部加入声明:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
其实,这段代码是不起作用的,因为他没考虑到一个问题,就是浏览器的边框,当我们在获取页面的offsetHeight高度时是包括了浏览器的边框的,浏览器的边框是2个像素,所以这时无论在任何情况下clientHeight 始终是小于offsetHeight的,这就使得即使没有滚动条它也为true,因此我们要修正这个错误,代码应该这样改,在offsetHeight上减去4个像素,即:
if (document.documentElement.clientHeight < document.documentElement.offsetHeight-4){
//执行相关脚本。
}
还有,这里要搞清楚,上面这代码是判断横向滚动条的,我们一般要判断的是纵向滚动,代码如下:
if (document.documentElement.clientWidth < document.documentElement.offsetWidth-4){
//执行相关脚本。

呵呵,问题搞定,其实我觉得这是个非常无聊的问题,我想没几个人想着去判断滚动条的有无,没有什么实际意义,在这里帮助一下那些需要这功能的朋友走出误区,免得浪费大量时间去网上搜而无果。


// ================================

#2楼 2010-12-06 15:42 Jikey
经测试,
document.documentElement.offsetHeight
这个玩艺在ie8,ff下有差别。
ff识别,ie8下不识别。

<div style="height:850px;">649</div>
<script type="text/javascript">
if (document.documentElement.clientHeight < document.documentElement.offsetHeight) scrolls = true;
if (document.documentElement.clientHeight < document.documentElement.offsetHeight - 4) {
alert('a');
}
alert( document.documentElement.offsetHeight)
//alert(document.documentElement.clientHeight);
</script>

还是得用:
if (document.documentElement.clientHeight < document.body.offsetHeight ) {
dosomething
}
看似一个简单的问题,确有不同的浏览器差别。防不胜防。


// ===========引申=============

这边想到一个比较取巧的方法,

假如没有出滚动条的时候,手工给增加一个滚动值会怎么样?

程序上就是给body或documentElement的scrollLeft、scrollTop赋值,

马上动手实现了一下,结果跟我意想的差不多,呵呵

浏览器在没有出滚动条的时候,赋值后该值不会发生变化,始终是0。 

另外扩展了一下,该检测方法,不仅可以检测页面滚动条,

传入要检测的节点,一样可以得到想要的结果。 

以下是我的实现,没有做太多异常处理:

(给scrollLeft,scrollTop赋负数值时会报错,此外scrollLeft,scrollTop的值不能大于实际最大的滚动值)

 

var isScroll = function (el) {
            // test targets
            var elems = el ? [el] : [document.documentElement, document.body];
            var scrollX = false, scrollY = false;
            for (var i = 0; i < elems.length; i++) {
                var o = elems[i];
                // test horizontal
                var sl = o.scrollLeft;
                o.scrollLeft += (sl > 0) ? -1 : 1;
                o.scrollLeft !== sl && (scrollX = scrollX || true);
                o.scrollLeft = sl;
                // test vertical
                var st = o.scrollTop;
                o.scrollTop += (st > 0) ? -1 : 1;
                o.scrollTop !== st && (scrollY = scrollY || true);
                o.scrollTop = st;
            }
            // ret
            return {
                scrollX: scrollX,
                scrollY: scrollY
            };
        };


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值