主要的浏览器都已经支持这些属性。
1.
偏移量
首先要介绍的属性涉及偏移量(offset dimension),包括元素在屏幕上占用的所有可见的空间。元素
的可见大小由其高度、宽度决定,包括所有内边距、滚动条和边框大小(注意,不包括外边距)。通过
下列4 个属性可以取得元素的偏移量。
offsetHeight:元素在垂直方向上占用的空间大小,以像素计。包括元素的高度、(可见的)
水平滚动条的高度、上边框高度和下边框高度。
offsetWidth:元素在水平方向上占用的空间大小,以像素计。包括元素的宽度、(可见的)垂
直滚动条的宽度、左边框宽度和右边框宽度。
offsetLeft:元素的左外边框至包含元素的左内边框之间的像素距离。
offsetTop:元素的上外边框至包含元素的上内边框之间的像素距离。
其中,offsetLeft 和offsetTop 属性与包含元素有关,包含元素的引用保存在offsetParent
属性中。offsetParent 属性不一定与parentNode 的值相等。例如,<td>元素的offsetParent 是
作为其祖先元素的<table>元素,因为<table>是在DOM 层次中距<td>最近的一个具有大小的元素。
图12-1 形象地展示了上面几个属性表示的不同大小。
要想知道某个元素在页面上的偏移量,将这个元素的offsetLeft 和offsetTop 与其offsetParent
的相同属性相加,如此循环直至根元素,就可以得到一个基本准确的值。以下两个函数就可以用于分别
取得元素的左和上偏移量。
function getElementLeft(element){ var actualLeft = element.offsetLeft; var current = element.offsetParent; while (current !== null){ actualLeft += current.offsetLeft; current = current.offsetParent; } return actualLeft; } function getElementTop(element){ var actualTop = element.offsetTop; var current = element.offsetParent; while (current !== null){ actualTop += current. offsetTop; current = current.offsetParent; } return actualTop; }
元素的客户区大小(client dimension),指的是元素内容及其内边距所占据的空间大小。有关客户区
大小的属性有两个:clientWidth 和clientHeight。其中,clientWidth 属性是元素内容区宽度加
上左右内边距宽度;clientHeight 属性是元素内容区高度加上上下内边距高度。图12-2 形象地说明
了这些属性表示的大小。
从字面上看,客户区大小就是元素内部的空间大小,因此滚动条占用的空间不计算在内。最常用到
这些属性的情况,就是像第8 章讨论的确定浏览器视口大小的时候。如下面的例子所示,要确定浏览器
视口大小,可以使用document.documentElement 或document.body(在IE7 之前的版本中)的
clientWidth 和clientHeight。
function getViewport(){ if (document.compatMode == "BackCompat"){ return { width: document.body.clientWidth, height: document.body.clientHeight }; } else { return { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight }; } }这个函数首先检查document.compatMode 属性,以确定浏览器是否运行在混杂模式。Safari 3.1
IE(在标准模式)中的这两组属性不相等,其中scrollWidth 和scrollHeight 等于文档内
容区域的大小,而clientWidth 和clientHeight 等于视口大小。
在确定文档的总高度时(包括基于视口的最小高度时),必须取得scrollWidth/clientWidth 和
scrollHeight/clientHeight 中的最大值,才能保证在跨浏览器的环境下得到精确的结果。下面就
是这样一个例子。
var docHeight = Math.max(document.documentElement.scrollHeight, document.documentElement.clientHeight); var docWidth = Math.max(document.documentElement.scrollWidth, document.documentElement.clientWidth);注意,对于运行在混杂模式下的IE,则需要用document.body 代替document.document-
function scrollToTop(element){ if (element.scrollTop != 0){ element.scrollTop = 0; } }这个函数既取得了scrollTop 的值,也设置了它的值。
元素在页面中相对于视口的位置。但是,浏览器的实现稍有不同。IE8 及更早版本认为文档的左上角坐
标是(2, 2),而其他浏览器包括IE9 则将传统的(0,0)作为起点坐标。因此,就需要在一开始检查一下位于
(0,0)处的元素的位置,在IE8 及更早版本中,会返回(2,2),而在其他浏览器中会返回(0,0)。来看下面的
函数:
function getBoundingClientRect(element){ if (typeof arguments.callee.offset != "number"){ var scrollTop = document.documentElement.scrollTop; var temp = document.createElement("div"); temp.style.cssText = "position:absolute;left:0;top:0;"; document.body.appendChild(temp); arguments.callee.offset = -temp.getBoundingClientRect().top - scrollTop; document.body.removeChild(temp); temp = null; } var rect = element.getBoundingClientRect(); var offset = arguments.callee.offset; return { left: rect.left + offset, right: rect.right + offset, top: rect.top + offset, bottom: rect.bottom + offset }; }这个函数使用了它自身的属性来确定是否要对坐标进行调整。第一步是检测属性是否有定义,如果
function getBoundingClientRect(element){ var scrollTop = document.documentElement.scrollTop; var scrollLeft = document.documentElement.scrollLeft; if (element.getBoundingClientRect){ if (typeof arguments.callee.offset != "number"){ var temp = document.createElement("div"); temp.style.cssText = "position:absolute;left:0;top:0;"; document.body.appendChild(temp); arguments.callee.offset = -temp.getBoundingClientRect().top - scrollTop; document.body.removeChild(temp); temp = null; } var rect = element.getBoundingClientRect(); var offset = arguments.callee.offset; return { left: rect.left + offset, right: rect.right + offset, top: rect.top + offset, bottom: rect.bottom + offset }; } else { var actualLeft = getElementLeft(element); var actualTop = getElementTop(element); return { left: actualLeft - scrollLeft, right: actualLeft + element.offsetWidth - scrollLeft, top: actualTop - scrollTop, bottom: actualTop + element.offsetHeight - scrollTop } } }