js中document.documentElement和document.body用法区别

网页中获取滚动条卷去部分的高度,可以通过 document.body.scrollTop 来获取,比如使div跟着滚动条滚动:

 代码如下 复制代码

<div id="div" style="width:100px;height:100px;background:#ccc;position:absolute;"></div>
window.onscroll = function ()
{
    var div = document.getElementById("div");
    div.style.top = document.body.scrollTop + "px";
}

运行后没有达到预期效果,输出 document.body.scrollTop 的值一看,一直都是 0。一翻折腾,原来是 DTD 的问题,要是页面直接用 <html> 开头的话就没有问题了。但是要符合 web 标准,DTD 当然是不能少的。

如果有 DTD 时用,那就用 document.documentElement.scrollTop 代替 document.body.scrollTop 就可以了。

 代码如下 复制代码

window.onscroll = function ()
{
    var oFix = document.getElementById("divfix");
    oFix.style.top = document.documentElement.scrollTop + "px";
}

DTD相关说明:

页面具有 DTD,或者说指定了 DOCTYPE 时,使用 document.documentElement。

页面不具有 DTD,或者说没有指定了 DOCTYPE,时,使用 document.body。

在 IE 和 Firefox 中均是如此。

为了兼容,不管有没有 DTD,可以使用如下代码:

 

 代码如下 复制代码

var scrollTop = window.pageYOffset  //用于FF
                || document.documentElement.scrollTop 
                || document.body.scrollTop 
                || 0;

documentElement 和 body 相关说明:

body是DOM对象里的body子节点,即 <body> 标签;

documentElement 是整个节点树的根节点root,即<html> 标签;

DOM把层次中的每一个对象都称之为节点,就是一个层次结构,你可以理解为一个树形结构,就像我们的目录一样,一个根目录,根目录下有子目录,子目录下还有子目录。

以HTML超文本标记语言为例:整个文档的一个根就是,在DOM

得到各个属性如下:

网页可见区域宽: document.body.clientWidth;
网页可见区域高: document.body.clientHeight;
网页可见区域宽: document.body.offsetWidth   (包括边线的宽);
网页可见区域高: document.body.offsetHeight  (包括边线的宽);
网页正文全文宽: document.body.scrollWidth;
网页正文全文高: document.body.scrollHeight;
网页被卷去的高: document.body.scrollTop;
网页被卷去的左: document.body.scrollLeft;
网页正文部分上: window.screenTop;
网页正文部分左: window.screenLeft;
屏幕分辨率的高: window.screen.height;
屏幕分辨率的宽: window.screen.width;
屏幕可用工作区高度: window.screen.availHeight;
屏幕可用工作区宽度:window.screen.availWidth;

scrollHeight: 获取对象的滚动高度。  
scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离
scrollTop:设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离
scrollWidth:获取对象的滚动宽度
offsetHeight:获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的高度
offsetLeft:获取对象相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置
offsetTop:获取对象相对于版面或由 offsetTop 属性指定的父坐标的计算顶端位置  
event.clientX 相对文档的水平座标
event.clientY 相对文档的垂直座标

event.offsetX 相对容器的水平坐标
event.offsetY 相对容器的垂直坐标  
document.documentElement.scrollTop 垂直方向滚动的值
event.clientX+document.documentElement.scrollTop 相对文档的水平座标+垂直方向滚动的量
Post by molong on 2009-05-19 11:57 PM  #1

要获取当前页面的滚动条纵坐标位置,用:

 代码如下 复制代码
document.documentElement.scrollTop;
而不是:
document.body.scrollTop;

documentElement 对应的是 html 标签,而 body 对应的是 body 标签。

在标准w3c下,document.body.scrollTop恒为0,需要用document.documentElement.scrollTop来代替;
如果你想定位鼠标相对于页面的绝对位置时,你会发现google里面1000篇文章里面有999.99篇会让你使用event.clientX+document.body.scrollLeft,event.clientY+document.body.scrollTop,如果你发现你的鼠标定位偏离了你的想象,请不要奇怪,这是再正常不过的事情。
ie5.5之后已经不支持document.body.scrollX对象了。
所以在编程的时候,请加上这样的判断

 代码如下 复制代码
if (document.body && document.body.scrollTop && document.body.scrollLeft)
{
    top=document.body.scrollTop;
    left=document.body.scrollleft;    
}
if (document.documentElement && document.documentElement.scrollTop && document.documentElement.scrollLeft)
{
    top=document.documentElement.scrollTop;
    left=document.documentElement.scrollLeft;
}
时间: 2024-09-13 11:07:19

js中document.documentElement和document.body用法区别的相关文章

用document.documentElement取代document.body的原因分析_javascript技巧

IE6在页面内容超出窗口大小时将宽度属性scrollWidth.clientWidth.offsetWidth都解释为内容实际宽度. 上次的测试说明了document.body属性并不会给我们返回预期的结果,比如我们用document.body.clientHeight原本想取得"页面可见区域高度",可实际上返回的是"页面实际内容高度". 那我们怎么办呢?难道加上了文档DTD类型之后就再也不能取到"可见区域高度"和"内容实际宽度&quo

document.documentElement与document.body分析

document.documentelement代替document.body来获取我们想要的结果 将代码中的document.body替换为document.documentelement,再来看看各浏览器下的实际结果: ii测试结果表明,ie系列浏览器对document.documentelement属性的解释是正确的,其它标准浏览器将offsetheight解释成 了scrollheight.火狐和netscape更是把这两个属性调换了过来.不过总的来说各属性都可以有个相应的解释,不会像

再谈 document.documentElement 与 document.body 的 scrollWidth、offsetWidth、clientWidth

(scrollHeight.offsetHeight.clientHeight 同样可按本文去理解.) 这是一个很复杂的问题,让我们想像一下: document.documentElement.scrollWidth document.documentElement.offsetWidth document.documentElement.clientWidth document.body.scrollWidth document.body.offsetWidth document.body.c

js中scrollTop()方法和scroll()方法用法示例_javascript技巧

本文实例讲述了js中scrollTop()方法和scroll()方法用法.分享给大家供大家参考,具体如下: 设置滚动条据顶部的高度: $("div").scrollTop(100); //把 scroll top offset 设置为 100px 获得滚动条的高度: $("div").scrollTop()://获得 scroll top offset 触发滚动事件 $(selector).scroll() 将函数绑定到滚动事件中: $(selector).scro

JS中Array数组的三大属性用法

原文:JS中Array数组的三大属性用法 Array数组主要有3大属性,它们分别是length属性.prototype属性和constructor属性. JS操作Array数组的方法及属性 本文总结了Array数组的3个属性,length属性.prototype属性.constructor属性使用,并附注Array数组对象的8个分类及多个方法使用,具体如下: 对象的3个属性 1.length属性 length属性 Length属性表示数组的长度,即其中元素的个数.因为数组的索引总是由0开始,所以

javascript-请问在js中prompt与window.prompt有什么区别,谢谢!

问题描述 请问在js中prompt与window.prompt有什么区别,谢谢! 请问在js中prompt与window.prompt有什么区别,谢谢! 解决方案 http://blog.csdn.net/cui_angel/article/details/7784211 解决方案二: JS promptprompt方法 window . prompt 解决方案三: 都是同一个函数,没有区别,只是省略了window.前缀而已 解决方案四: 没区别,可以看看window的相关介绍 就是当前页面罢了

详解js中的apply与call的用法_javascript技巧

前言 call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向.call 和 apply二者的作用完全一样,只是接受参数的方式不太一样. 方法定义applyFunction.apply(obj,args)方法能接收两个参数: obj:这个对象将代替Function类里this对象 args:这个是数组或类数组,apply方法把这个集合中的元素作为参数传递给被调用的函数. call call方法与apply方法的第

js中substr,substring,indexOf,lastIndexOf的用法小结_javascript技巧

js中substr,substring,indexOf,lastIndexOf等的用法 1.substrsubstr(start,length)表示从start位置开始,截取length长度的字符串. var src="images/off_1.png";alert(src.substr(7,3)); 弹出值为:off  2.substringsubstring(start,end)表示从start到end之间的字符串,包括start位置的字符但是不包括end位置的字符. var sr

document.documentElement和document.body区别介绍_javascript技巧

区别: body是DOM对象里的body子节点,即 <body> 标签: documentElement 是整个节点树的根节点root,即<html> 标签: 没使用DTD情况即怪异模式BackCompat下: 复制代码 代码如下: document.documentElement.clientHeight=0document.body.clientHeight=618 使用DTD情况即标准模式CSS1Compat下: 复制代码 代码如下: document.documentEle