由document.body和document.documentElement学习

本文介绍了document.compatMode属性的作用及应用场景,解析了其两种返回值BackCompat和CSS1Compat的区别,并探讨了不同浏览器模式下盒模型渲染的差异。此外,还讨论了如何利用此属性判断文档渲染模式。

对于document.compatMode,很多朋友可能都根我一样很少接触,知道他的存在却不清楚他的用途。其实这个对于我们开发兼容性的web页面还是很有帮助,我们都知道,盒模型的渲染在 Standards Mode和Quirks Mode是有很大差别的,在不声明Doctype的情况下,浏览器默认是Quirks Mode。所以为兼容性考虑,我们可能需要获取当前的文档渲染方式。
document.compatMode正好派上用场,它有两种可能的返回值:BackCompat和CSS1Compat,对其解释如下:
BackCompat Standards-compliant mode is not switched on. (Quirks Mode)
CSS1Compat Standards-compliant mode is switched on. (Standards Mode)
当文档有了标准声明时, document.compatMode 的值就等于 "CSS1compat", 因此, 我们可以根据 document.compatMode 的值来判断文档是否加了标准声明
var height = document.compatMode=="CSS1Compat" ? document.documentElement.clientHeight : document.body.clientHeight;
当文档有了标准声明时火狐的style.top等等的设置必须加上“px”等单位,否则它不会认。既然已经说道了这,再展开一下。对于火狐:
一、offsetTop 返回的是数字,而 style.top 返回的是字符串,除了数字外还带有单位:px。
二、offsetTop 只读,而 style.top 可读写。
三、如果没有给 HTML 元素指定过 top 样式(即使在css中设定也不行),则 style.top 返回的是空字符串。
offsetLeft 与 style.left、offsetWidth 与 style.width、offsetHeight 与 style.height 也是同样道理。
再说说他们的区别吧:
下面这段大家可能都见到过,在网上被转载过很多次,在这我也借用一下:
.Kfk428 { display:none; }
网页可见区域宽: 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 相对文档的水平座标+垂直方向滚动的量
以上主要指IE之中,FireFox差异如下:
IE6.0、FF1.06+:
clientWidth = width + padding
clientHeight = height + padding
offsetWidth = width + padding + border
offsetHeight = height + padding + border
IE5.0/5.5:
clientWidth = width - border
clientHeight = height - border
offsetWidth = width
offsetHeight = height
(需要提一下:CSS中的margin属性,与clientWidth、offsetWidth、clientHeight、offsetHeight均无关)

这段代码主要实现了判断是否为IE浏览器,并在IE浏览器环境下获取页面滚动位置鼠标位置的功能,以下是对代码各部分含义的详细解析: ### 1. `if (document.all)` `document.all` 是一个在旧版IE浏览器中存在的属性,现代浏览器(如Chrome、Firefox等)已经不支持该属性。因此,通过判断 `document.all` 是否存在,可以粗略地判断当前浏览器是否为IE浏览器。如果 `document.all` 存在,则表示当前使用的是IE浏览器,代码块内的逻辑将会执行。 ### 2. 页面滚动位置的获取 ```javascript x = (document.documentElement && document.documentElement.scrollLeft) ? document.documentElement.scrollLeft : document.body.scrollLeft; y = (document.documentElement && document.documentElement.scrollTop) ? document.documentElement.scrollTop : document.body.scrollTop; ``` - **`x` 的计算**:`x` 代表页面水平方向的滚动位置。使用三元运算符来判断 `document.documentElement` 是否存在且 `document.documentElement.scrollLeft` 是否有值。如果条件成立,则将 `document.documentElement.scrollLeft` 的值赋给 `x`;否则,将 `document.body.scrollLeft` 的值赋给 `x`。 - **`y` 的计算**:`y` 代表页面垂直方向的滚动位置。同样使用三元运算符来判断 `document.documentElement` 是否存在且 `document.documentElement.scrollTop` 是否有值。如果条件成立,则将 `document.documentElement.scrollTop` 的值赋给 `y`;否则,将 `document.body.scrollTop` 的值赋给 `y`。 ### 3. 鼠标位置的计算 ```javascript x += window.event.clientX; y += window.event.clientY; ``` - **`window.event`**:`window.event` 是IE浏览器特有的事件对象,用于获取当前事件的相关信息。 - **`clientX` `clientY`**:`clientX` 表示鼠标相对于浏览器窗口可视区域左上角的水平坐标,`clientY` 表示鼠标相对于浏览器窗口可视区域左上角的垂直坐标。 - **最终的 `x` `y`**:将页面滚动位置(`x` `y`)分别加上鼠标相对于浏览器窗口可视区域的坐标(`window.event.clientX` `window.event.clientY`),得到鼠标相对于整个页面的实际坐标。 ### 代码示例 ```javascript if (document.all) { // 获取页面滚动位置 let x = (document.documentElement && document.documentElement.scrollLeft) ? document.documentElement.scrollLeft : document.body.scrollLeft; let y = (document.documentElement && document.documentElement.scrollTop) ? document.documentElement.scrollTop : document.body.scrollTop; // 获取鼠标相对于浏览器窗口可视区域的坐标 x += window.event.clientX; y += window.event.clientY; console.log(`鼠标相对于整个页面的水平坐标: ${x}`); console.log(`鼠标相对于整个页面的垂直坐标: ${y}`); } ``` ### 总结 这段代码通过判断 `document.all` 属性来确定是否为IE浏览器,并在IE浏览器环境下获取页面的滚动位置鼠标相对于整个页面的实际坐标。需要注意的是,`document.all` `window.event` 都是旧版IE浏览器特有的属性对象,在现代浏览器中已经不被支持,因此在实际开发中应尽量避免使用这些旧的特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值