A-A+

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

2016年10月14日 前端设计 暂无评论 阅读 7 views 次

在js网页开发中我们常会碰到关于document.documentElement和document.body一些使用方法,下面我来总结这两者的区别,有需要的朋友可参考。

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

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

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

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

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

DTD相关说明:

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

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

在 IE 和 Firefox 中均是如此。

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

  1. var scrollTop = window.pageYOffset  //用于FF  
  2.                 || document.documentElement.scrollTop    
  3.                 || document.body.scrollTop    
  4.                 || 0;//xiariboke.net  

documentElement 和 body 相关说明:

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

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

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对象了。

所以在编程的时候,请加上这样的判断,代码如下:

  1. if (document.body && document.body.scrollTop && document.body.scrollLeft)   
  2. {   
  3.     top=document.body.scrollTop;   
  4.     left=document.body.scrollleft;       
  5. }   
  6. if (document.documentElement && document.documentElement.scrollTop && document.documentElement.scrollLeft)   
  7. {   
  8.     top=document.documentElement.scrollTop;   
  9.     left=document.documentElement.scrollLeft;   
  10. }   
标签:

给我留言