`
77tt77
  • 浏览: 27388 次
  • 性别: Icon_minigender_1
  • 来自: Luna
社区版块
存档分类
最新评论

[建议]用document.documentElement代替document.body(转)

阅读更多
之前写过一篇文章对比了不同浏览器环境对document.body属性的解释,地址是:http://www.silentash.com/blog/2008/62.html
回顾一下,在限定了文档类型的情况下,多数浏览器对document.body属性的解释都是相同的:在加上DTD文档格式后,IE7,FF,OPERA这三个浏览器表现出了惊人的一致性,只有IE6在页面内容超出窗口大小时出现了大变化(具体请看IE6部分),也就是说在正常的窗口最大化情况下,四个浏览器对这些属性的解释都是一样的,既:

•body.scrollHeight=内容实际高度;
•body.scrollWidth=可视区域宽度;
•body.clientHeight=内容实际高度;
•body.clientWidth=可视区域宽度;
•body.offsetHeight=内容实际高度;
•body.offsetWidth=可视区域宽度;

IE6在页面内容超出窗口大小时将宽度属性scrollWidth、clientWidth、offsetWidth都解释为内容实际宽度。

上次的测试说明了document.body属性并不会给我们返回预期的结果,比如我们用document.body.clientHeight原本想取得“页面可见区域高度”,可实际上返回的是“页面实际内容高度”。

那我们怎么办呢?难道加上了文档DTD类型之后就再也不能取到“可见区域高度”和“内容实际宽度”等等属性了吗?

Code
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>documentElement</title>
<style type="text/css">
body{margin:0;padding:0;font:12px/150% arial;}
</style>
<script type="text/javascript">
function a(){
var scrollTop;
var scrollLeft;
if (typeof window.pageYOffset != 'undefined') {
scrollTop = window.pageYOffset;
scrollLeft = window.pageXOffset;
}
else if (typeof document.compatMode != 'undefined' &&
document.compatMode != 'BackCompat') {
scrollTop = document.documentElement.scrollTop;
scrollLeft = document.documentElement.scrollLeft;
}
else if (typeof document.body != 'undefined') {
scrollTop = document.body.scrollTop;
scrollLeft = document.body.scrollLeft;

var scrollHeight = document.documentElement.scrollHeight;
var scrollWidth = document.documentElement.scrollWidth;
var clientWidth = document.documentElement.clientWidth;
var clientHeight = document.documentElement.clientHeight;
var offsetWidth = document.documentElement.offsetWidth;
var offsetHeight = document.documentElement.offsetHeight;
var screenTop = window.screenTop;
var screenBottom = window.screenBottom;
var screenLeft = window.screenLeft;
var sheight = window.screen.height;
var swidth = window.screen.width;
var availHeight = window.screen.availHeight;
var availWidth = window.screen.availWidth;
document.getElementById('scrollTop').value = scrollTop;
document.getElementById('scrollLeft').value = scrollLeft;
document.getElementById('scrollHeight').value = scrollHeight;
document.getElementById('scrollWidth').value = scrollWidth;
document.getElementById('clientWidth').value = clientWidth;
document.getElementById('clientHeight').value = clientHeight;
document.getElementById('offsetWidth').value = offsetWidth;
document.getElementById('offsetHeight').value = offsetHeight;
document.getElementById('screenTop').value = screenTop;
document.getElementById('screenBottom').value = screenBottom;
document.getElementById('screenLeft').value = screenLeft;
document.getElementById('sheight').value = sheight;
document.getElementById('swidth').value = swidth;
document.getElementById('availHeight').value = availHeight;
document.getElementById('availWidth').value = availWidth;
}
</script>
</head>

<body>
<div style="width:400px;height:400px;margin:0 auto;font-size:12px;">
<center>
<table width="400" border="0" cellspacing="0" cellpadding="0" style="font-size:12px;margin-top:20px;">
  <tr>
    <td width="187" align="right">scrollTop(滚动条卷过的高):</td>
    <td width="10"> </td>
    <td width="209"><input type="text" name="scrollTop" id="scrollTop" /></td>
  </tr>
  <tr>
    <td align="right">scrollLeft(滚动条卷过的宽):</td>
    <td> </td>
    <td><input type="text" name="scrollLeft" id="scrollLeft" /></td>
  </tr>
  <tr>
    <td align="right">scrollHeight(内容实际高度):</td>
    <td> </td>
    <td><input type="text" name="scrollHeight" id="scrollHeight" /></td>
  </tr>
  <tr>
    <td align="right">scrollWidth(内容实际宽度):</td>
    <td> </td>
    <td><input type="text" name="scrollWidth" id="scrollWidth" /></td>
  </tr>
  <tr>
    <td align="right">clientWidth(可见区域宽):</td>
    <td> </td>
    <td><input type="text" name="clientWidth" id="clientWidth" /></td>
  </tr>
  <tr>
    <td align="right">clientHeight(可见区域高):</td>
    <td> </td>
    <td><input type="text" name="clientHeight" id="clientHeight" /></td>
  </tr>
  <tr>
    <td align="right">offsetWidth(加滚动条宽?):</td>
    <td> </td>
    <td><input type="text" name="offsetWidth" id="offsetWidth" /></td>
  </tr>
  <tr>
    <td align="right">offsetHeight(加滚动条高?):</td>
    <td> </td>
    <td><input type="text" name="offsetHeight" id="offsetHeight" /></td>
  </tr>
  <tr>
    <td align="right">screenTop:</td>
    <td> </td>
    <td><input type="text" name="screenTop" id="screenTop" /></td>
  </tr>
  <tr>
    <td align="right">screenBottom:</td>
    <td> </td>
    <td><input type="text" name="screenBottom" id="screenBottom" /></td>
  </tr>
  <tr>
    <td align="right">screenLeft:</td>
    <td> </td>
    <td><input type="text" name="screenLeft" id="screenLeft" /></td>
  </tr>
  <tr>
    <td align="right">sheight(分辨率高):</td>
    <td> </td>
    <td><input type="text" name="sheight" id="sheight" /></td>
  </tr>
  <tr>
    <td align="right">swidth(分分辨率宽):</td>
    <td> </td>
    <td><input type="text" name="swidth" id="swidth" /></td>
  </tr>
  <tr>
    <td align="right">availHeight:</td>
    <td> </td>
    <td><input type="text" name="availHeight" id="availHeight" /></td>
  </tr>
  <tr>
    <td align="right">availWidth:</td>
    <td> </td>
    <td><input type="text" name="availWidth" id="availWidth" /></td>
  </tr>
</table>
<a href="javascript:a()" style="height:20px;display:block;">内容高度是400PX,点击查看所有属性值</a>
</center>
</div>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>documentElement</title>
<style type="text/css">
body{margin:0;padding:0;font:12px/150% arial;}
</style>
<script type="text/javascript">
function a(){
var scrollTop;
var scrollLeft;
if (typeof window.pageYOffset != 'undefined') {
scrollTop = window.pageYOffset;
scrollLeft = window.pageXOffset;
}
else if (typeof document.compatMode != 'undefined' &&
document.compatMode != 'BackCompat') {
scrollTop = document.documentElement.scrollTop;
scrollLeft = document.documentElement.scrollLeft;
}
else if (typeof document.body != 'undefined') {
scrollTop = document.body.scrollTop;
scrollLeft = document.body.scrollLeft;
}
var scrollHeight = document.documentElement.scrollHeight;
var scrollWidth = document.documentElement.scrollWidth;
var clientWidth = document.documentElement.clientWidth;
var clientHeight = document.documentElement.clientHeight;
var offsetWidth = document.documentElement.offsetWidth;
var offsetHeight = document.documentElement.offsetHeight;
var screenTop = window.screenTop;
var screenBottom = window.screenBottom;
var screenLeft = window.screenLeft;
var sheight = window.screen.height;
var swidth = window.screen.width;
var availHeight = window.screen.availHeight;
var availWidth = window.screen.availWidth;
document.getElementById('scrollTop').value = scrollTop;
document.getElementById('scrollLeft').value = scrollLeft;
document.getElementById('scrollHeight').value = scrollHeight;
document.getElementById('scrollWidth').value = scrollWidth;
document.getElementById('clientWidth').value = clientWidth;
document.getElementById('clientHeight').value = clientHeight;
document.getElementById('offsetWidth').value = offsetWidth;
document.getElementById('offsetHeight').value = offsetHeight;
document.getElementById('screenTop').value = screenTop;
document.getElementById('screenBottom').value = screenBottom;
document.getElementById('screenLeft').value = screenLeft;
document.getElementById('sheight').value = sheight;
document.getElementById('swidth').value = swidth;
document.getElementById('availHeight').value = availHeight;
document.getElementById('availWidth').value = availWidth;
}
</script>
</head>

<body>
<div style="width:400px;height:400px;margin:0 auto;font-size:12px;">
<center>
<table width="400" border="0" cellspacing="0" cellpadding="0" style="font-size:12px;margin-top:20px;">
  <tr>
    <td width="187" align="right">scrollTop(滚动条卷过的高):</td>
    <td width="10"> </td>
    <td width="209"><input type="text" name="scrollTop" id="scrollTop" /></td>
  </tr>
  <tr>
    <td align="right">scrollLeft(滚动条卷过的宽):</td>
    <td> </td>
    <td><input type="text" name="scrollLeft" id="scrollLeft" /></td>
  </tr>
  <tr>
    <td align="right">scrollHeight(内容实际高度):</td>
    <td> </td>
    <td><input type="text" name="scrollHeight" id="scrollHeight" /></td>
  </tr>
  <tr>
    <td align="right">scrollWidth(内容实际宽度):</td>
    <td> </td>
    <td><input type="text" name="scrollWidth" id="scrollWidth" /></td>
  </tr>
  <tr>
    <td align="right">clientWidth(可见区域宽):</td>
    <td> </td>
    <td><input type="text" name="clientWidth" id="clientWidth" /></td>
  </tr>
  <tr>
    <td align="right">clientHeight(可见区域高):</td>
    <td> </td>
    <td><input type="text" name="clientHeight" id="clientHeight" /></td>
  </tr>
  <tr>
    <td align="right">offsetWidth(加滚动条宽?):</td>
    <td> </td>
    <td><input type="text" name="offsetWidth" id="offsetWidth" /></td>
  </tr>
  <tr>
    <td align="right">offsetHeight(加滚动条高?):</td>
    <td> </td>
    <td><input type="text" name="offsetHeight" id="offsetHeight" /></td>
  </tr>
  <tr>
    <td align="right">screenTop:</td>
    <td> </td>
    <td><input type="text" name="screenTop" id="screenTop" /></td>
  </tr>
  <tr>
    <td align="right">screenBottom:</td>
    <td> </td>
    <td><input type="text" name="screenBottom" id="screenBottom" /></td>
  </tr>
  <tr>
    <td align="right">screenLeft:</td>
    <td> </td>
    <td><input type="text" name="screenLeft" id="screenLeft" /></td>
  </tr>
  <tr>
    <td align="right">sheight(分辨率高):</td>
    <td> </td>
    <td><input type="text" name="sheight" id="sheight" /></td>
  </tr>
  <tr>
    <td align="right">swidth(分分辨率宽):</td>
    <td> </td>
    <td><input type="text" name="swidth" id="swidth" /></td>
  </tr>
  <tr>
    <td align="right">availHeight:</td>
    <td> </td>
    <td><input type="text" name="availHeight" id="availHeight" /></td>
  </tr>
  <tr>
    <td align="right">availWidth:</td>
    <td> </td>
    <td><input type="text" name="availWidth" id="availWidth" /></td>
  </tr>
</table>
<a href="javascript:a()" style="height:20px;display:block;">内容高度是400PX,点击查看所有属性值</a>
</center>
</div>
</body>
</html>
其实,我们可以用document.documentElement代替document.body来获取我们想要的结果

将代码中的document.body替换为document.documentElement,再来看看各浏览器下的实际结果:

IE6:


IE7:


FF3:


opera9:


safari:


netscape9:


测试结果表明,IE系列浏览器对document.documentElement属性的解释是正确的,其它标准浏览器将offsetHeight解释成了scrollHeight。火狐和netscape更是把这两个属性调换了过来。不过总的来说各属性都可以有个相应的解释,不会像document.body一样只有可怜的两种解释。

终于可以放心地使用JS方法获取各种页面高宽属性了吧^_^!
分享到:
评论

相关推荐

    火狐、谷歌、IE关于document.body.scrollTop和document.documentElement.scrollTop 以及值为0的问题

    在探讨“火狐、谷歌、IE关于`document.body.scrollTop`和`document.documentElement.scrollTop`以及值为0的问题”这一主题时,我们深入分析了浏览器在处理页面滚动位置时的不同行为,尤其是当滚动位置值始终为0时的...

    深入解析:`document.documentElement` 与 `document.body` 的差异及其应用

    在JavaScript的DOM操作中,document.documentElement 和 document.body 是两个非常重要的属性,它们分别代表了文档的不同部分。理解这两者之间的区别对于前端开发者来说至关重要,尤其是在进行页面布局和滚动操作时...

    document.body.scrollTop用法

    - 在处理跨浏览器兼容性问题时,建议使用 `document.documentElement.scrollTop` 而不是 `document.body.scrollTop`。 - 使用 `window.scrollTo` 或 `window.scrollBy` 方法时,注意它们在不同浏览器中的兼容性差异...

    document.documentElement &amp;&amp; document.documentElement.scrollTop

    在JavaScript中,`document.documentElement` 和 `document.documentElement.scrollTop` 是两个非常重要的属性,它们与网页文档的DOM(Document Object Model)交互,特别是涉及到页面滚动时的行为。本文将深入讲解...

    document.body属性.document.body.scrollTop

    5. **浏览器兼容性**:虽然大部分现代浏览器都支持 `document.body.scrollTop`,但在一些老版本的IE浏览器中可能需要使用 `document.documentElement.scrollTop` 来兼容。 6. **CSS替代方案**:有时候,为了避免...

    document.documentElement和document.body区别介绍

    在标准模式下,则需要先判断document.documentElement.scrollLeft和document.documentElement.scrollTop是否为0,若是则使用document.body.scrollLeft和document.body.scrollTop。 了解了这些区别后,前端开发者在...

    解决VUE中document.body.scrollTop为0的问题

    页面指定了DTD,即指定了DOCTYPE时,使用document.documentElement。 页面没有DTD,即没指定DOCTYPE时,使用document.body。 IE和Firefox都是如此。 以上这篇解决VUE中document.body.scrollTop为0的问题就是小编分享...

    用javascript地址栏显示源码

    - 使用`document.write('&lt;body&gt;&lt;/body&gt;')`来清除页面上的所有内容,并重新插入一个空的`&lt;body&gt;`标签。 - 这一步是必要的,因为如果直接修改现有文档的内容而不进行清空操作,可能会导致布局错乱或意料之外的结果。...

    document.documentElement document.documentElement.scrollTop

    if (document.documentElement && document.documentElement.scrollTop) diffY = document.documentElement.scrollTop; else if (document.body) diffY = document.body.scrollTop else {/*Netscape ...

    document.documentElement的一些使用技巧

    如果需要直接访问`&lt;body&gt;`元素,可以使用`document.documentElement.lastChild`,因为`&lt;body&gt;`通常是文档的最后一个子元素。这样,`document.documentElement.lastChild`就相当于`document.body`。 5. 查找特定...

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

    上次的测试说明了document.body属性并不会给我们返回预期的结果,比如我们用document.body.clientHeight原本想取得“页面可见区域高度”,可实际上返回的是“页面实际内容高度”。 那我们怎么办呢?难道加上了文档...

    Document.body.scrollTop的值总为零的快速解决办法

    在标准模式下,浏览器倾向于使用`document.documentElement.scrollTop`来获取页面的滚动位置,而不是`document.body.scrollTop`。 `document.documentElement` 指的是HTML文档的根元素,即`&lt;html&gt;`标签。在标准模式...

    javascript获取滚动条高度 页面宽度与高度

    - 在 Firefox 和 Opera 中,`document.documentElement.clientWidth`和`document.documentElement.clientHeight`分别表示页面宽度减去`BODY`的外边距(`margin`)后的宽度和高度。 为了确保代码的兼容性,开发者在...

    javascript 获取网页高度宽度.pdf

    这个函数通过检查 `document.documentElement.scrollTop` 和 `document.body.scrollTop` 来确定滚动条的位置。在不同的浏览器中,这两个属性可能有不同的行为,因此需要进行条件判断来确保兼容性。 ```javascript ...

    由document.body和document.documentElement想到的

    在Web开发中,理解和掌握`document.body`和`document.documentElement`的区别至关重要,尤其是在处理页面布局和兼容性问题时。这两个对象分别代表了HTML文档的不同部分:`document.body`指的是HTML文档的实际内容...

    document.body.scrollTop 值总为0的解决方法 比较常见的标准问题

    在标准模式下,IE和Firefox等现代浏览器倾向于遵循W3C标准,其中规定应该使用`document.documentElement.scrollTop`来获取整个页面的滚动位置,而不是`document.body.scrollTop`。因此,当你尝试通过`document.body....

    javascript scrollTop正解使用方法

    document.documentElement.scrollTop在Chrome里总为0document.body.scrollTop 在IE和firefox里总为01、各浏览器下 window.pageYOffset/document.documentElement.scrollTop/document.body.scrollTop的差异示例:...

    js中的如何定位固定层的位置.docx

    但在W3C标准模式下(如XHTML文档),`document.body.scrollTop`通常返回0,此时应使用`document.documentElement.scrollTop`和`document.documentElement.scrollLeft`来获取正确的滚动值。 以下是一段具有良好兼容...

Global site tag (gtag.js) - Google Analytics