DOM元素在浏览器中的位置参数,如offset,ownerDocument

aaaaaaaa00 2014-10-08

作者:zccst

2014-10-21

区分clientX和screenX的简单办法是?

client指浏览器左上角;screen指显示器左上角。所以正常情况下screen>=client。

2014-10-08

学习一下,好像有很多相关的参数

1,documentElement和body

(1)documentElement属性可返回文档的根节点。

语法:documentObject.documentElement

例子:

xmlDoc=loadXMLDoc("/example/xdom/books.xml");

varx=xmlDoc.documentElement;

document.write("Nodename:"+x.nodeName+"<br/>");

document.write("Nodevalue:"+x.nodeValue+"<br/>");

document.write("Nodetype:"+x.nodeType);

输出:

Nodename:bookstore

Nodevalue:null

Nodetype:1

(2)document.body也是属性,指body

如果用<html>开头,可以用document.body

如果用DOCTYPE开通,则需用document.documentElement

兼容方法:varscrollTop=window.pageYOffset//用于FF

||document.documentElement.scrollTop

||document.body.scrollTop

||0;

(3)document.documentElement与document.body区别

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

2,各种偏移量

需要注意的是:区分是document.body的,还是某一个节点元素的。

(1)pageYOffset/pageXOffset

window.pageYOffset:Netscape属性,指的是滚动条顶部到网页顶部的距离

(2)offsetTop/offsetLeft,offsetWidth/offsetHeight

offsetTop改元素最上端离它父元素最上端的距离。

offsetHeight=height+padding+border+滚动条。

也即offsetHeight=clientHeight+border+滚动条。

offsetwidth:是元素相对父元素的偏移宽度。等于border+padding+width

(3)clientTop/clientLeft,clientWidth/clientHeight

body.clientTop=body.offsetTop-border-top

body.clientLeft=body.offsetLeft-border-left

clientLeft可以简单理解为元素边框厚度。与border的区别是:border仅仅是边框,而clientLeft是计算出来的。

clientHeight=height+padding(IE6.0/FF)

clientwidth=padding+width是元素的可见宽度。

大家对clientHeight都没有什么异议,都认为是内容可视区域的高度,也就是说页面浏览器中可以看到内容的这个区域的高度,一般是最后一个工具条以下到状态栏以上的这个区域,与页面内容无关。

对比1:

clientWidth是对象可见的宽度,不包滚动条等边线,会随窗口的显示大小改变。

offsetWidth是对象的可见宽度,包滚动条等边线,会随窗口的显示大小改变。

scrollWidth是对象的实际内容的宽且包括滚动部分,不包边线宽度,会随对象中内容的多少改变(内容多了可能会改变对象的实际宽度)。

对比2:

clientLeft返回对象的offsetLeft属性值和到当前窗口左边的真实值之间的距离,如果不指定一个边框或者不定位该元素,他的值就是0.

offsetLeft返回对象相对于父级对象的布局或坐标的left值,就是以父级对象左上角为坐标原点,向右和向下为X、Y轴正方向的x坐标

scrollLeft如果元素是可以滚动的,可以通过这俩个属性得到元素在水平和垂直方向上滚动了多远,单位是象素。对于不可以滚动的元素,这些值总是0.

(4)scrollTop/scrollLeft,scrollWidth/scrollHeight

scrollTop卷起来的顶部距离。

(5)screenTop/screenLeft(window对象的属性)

网页正文部分上:window.screenTop;

网页正文部分左:window.screenLeft;

屏幕分辨率的高:window.screen.height;

屏幕分辨率的宽:window.screen.width;

(n)对象event的坐标

event.clientX相对文档的水平座标

event.clientY相对文档的垂直座标

event.offsetX相对容器的水平坐标

event.offsetY相对容器的垂直坐标

3,getBoundingClientRect获取元素位置

(1)TextRectangle

对于文本对象,W3C提供了一个TextRectangle对象,这个对象是对文本区域的一个解释。这里的文本区域只针对inline元素,比如:a,span,em这类标签元素。

(2)getBoundingClientRect用于获得页面中某个元素的左,上,右和下分别相对浏览器视窗的位置。

getBoundingClientRect是DOM元素到浏览器可视范围的距离(不包含文档卷起的部分)。该函数返回一个Object对象(TextRectangle),该对象有6个属性:top,lef,right,bottom,width,height;这里的top、left和css中的理解很相似,width、height是元素自身的宽高,但是right,bottom和css中的理解有点不一样。right是指元素右边界距窗口最左边的距离,bottom是指元素下边界距窗口最上面的距离。

使用:rectObject=object.getBoundingClientRect();

兼容所有浏览器写法:

varro=object.getBoundingClientRect();

varTop=ro.top;

varBottom=ro.bottom;

varLeft=ro.left;

varRight=ro.right;

varWidth=ro.width||Right-Left;

varHeight=ro.height||Bottom-Top;

有了这个方法,获取页面元素的位置就简单多了:

varX=this.getBoundingClientRect().left+document.documentElement.scrollLeft;

varY=this.getBoundingClientRect().top+document.documentElement.scrollTop;

(3)getClientRects获取元素占据页面的所有矩形区域

获取元素占据页面的所有矩形区域。

varrectCollection=object.getClientRects();

getClientRects返回一个TextRectangle集合,就是TextRectangleList对象。TextRectangle对象包含了,topleftbottomrightwidthheight六个属性

浏览器差异

getClientRects()最先由MSIE提出,后被W3C引入并制订了标准。目前主流浏览器都支持该标准,而IE只支持TextRectangle的topleftbottomright四个属性。IE下可以通过right-left来计算width、bottom-top来计算height。

ie和非ie浏览器在使用getClientRects还是有些差别的,ie获取TextRectangleList的范围很大。而非ie获取的范围比较小,只有display:inline的对象才能获取到TextRectangleList,例如emispan等标签。

应用场景

getClientRects常用于获取鼠标的位置,如放大镜效果。微博的用户信息卡也是通过该方法获得的。

(4)getClientRects和getBoundingClientRect的区别

返回类型差异:

getClientRects返回一个TextRectangle集合,就是TextRectangleList对象。

getBoundingClientRect返回一个TextRectangle对象,即使DOM里没有文本也能返回TextRectangle对象.

浏览器差异:

除了safari,firefox2.0外所有浏览器都支持getClientRects和getBoundingClientRect,

firefox3.1给TextRectangle增加了width和height。

ie和非ie浏览器在使用getClientRects还是有些差别的,ie获取TextRectangleList的范围很大。而非ie获取的范围比较小,只有display:inline的对象才能获取到TextRectangleList,例如emispan等标签。

通过测试,至少Chrome2+\Safari4\Firefox3.5\0pera9.63+已经支持getBoundingClientRect方法。

使用场景差异:

出于浏览器兼容的考虑,现在用得最多的是getBoundingClientRect,经常用来获取一个element元素的viewport坐标。

4,HTMLCollection和NodeList

HTMLElement,HTMLDocument,ownerDocument

HTMLElement对象表示HTML中的一个元素。一个HTML文档中的每个元素都有和元素的HTML属性对应的属性。这里列出了所有HTML标记都支持的属性。其他的属性,都特定于某种具体的HTML标记。HTMLElement对象继承了Node和Element对象的标准属性,也实现了下面所描述的几个非标准属性:className,currentStyle,dir,id,innerHTML,lang,offsetHeight/offsetWidth,offsetLeft/offsetTop,offsetParent,scrollHeight/scrollWidth,scrollTop/scrollLeft,style,title.

HTMLDocument对象表示HTML文档树的根。HTMLDocument接口提供了对HTML层级的访问。

HTMLDocument接口对DOMDocument接口进行了扩展,定义HTML专用的属性和方法。

很多属性和方法都是HTMLCollection对象(实际上是可以用数组或名称索引的只读数组),其中保存了对锚、表单、链接以及其他可脚本元素的引用。

HTMLCollection对象HTMLCollection是一个接口,表示HTML元素的集合,它提供了可以遍历列表的方法和属性。HTMLDOM中的HTMLCollection是“活”的;如果基本的文档改变时,那些改变通过所有HTMLCollection对象会立即显示出来。

下面的每个项目(以及它们指定的属性)都返回HTMLCollection:

Document(images,applets,links,forms,anchors)

form(elements)

map(areas)

select(options)

table(rows,tBodies)

tableSection(rows)

row(cells)

HTMLDocument接口的许多属性都是HTMLCollection对象,它提供了访问诸如表单、图像和链接等文档元素的便捷方式。form.elements和select.options都是HTMLCollection对象。HTMLCollection还提供了遍历Table的各行以及TableRow的各个单元格的一种方便方法。

在上面已经提到了,HTMLCollection对象是带有方法的HTML元素的集合,用它可以通过元素在文档中的位置或它们的id属性、name属性获取元素。在JavaScript中,HTMLCollection对象的行为和只读数组一样,可以使用JavaScript的方括号,通过编号或名称索引一个HTMLCollection对象,而不必调用item()方法和namedItem()方法。

HTMLCollection对象是只读的,不能给它添加新元素,即使采用JavaScript数组语法也是如此。

HTMLCollection对象和NodeList对象很相似,但前者可能既能用名称索引也能用数字索引。

属性:cssRules只读属性,返回指示列表长度的整数(即集合中的元素数)。

方法:item()返回集合中指定位置的元素(节点),namedItem()返回集合中name属性或id属性具有指定值的元素(节点)。

Node对象是整个DOM的主要数据类型。节点对象代表文档树中的一个节点。

节点可以是元素节点、属性节点、文本节点,或者也可以是“节点类型”那一节中所介绍的任何一种节点。

请注意,虽然所有的对象均能继承用于处理父节点和子节点的属性和方法,但是并不是所有的对象都拥有父节点或子节点。例如,文本节点不能拥有子节点,所以向类似的节点添加子节点就会导致DOM错误。

属性:nodeName/nodeType/nodeValue,previousSibling/nextSibling,childNodes,firstChild/lastChild,parentNode/ownerDocument,baseURI,localName,namespaceURI,prefix,textContent(返回节点及其后代的文本内容),text,xml.

方法:cloneNode(),insertBefore(),appendChild/removeChild/replaceChild,isEqualNode/isSameNode,normailze(合并相邻的text节点并删除空的text节点);

ownerDocument:返回节点的根元素(document对象)

NodeList对象代表一个有顺序的节点列表。

我们可通过节点列表中的节点索引号来访问列表中的节点(索引号由0开始)。

节点列表可保持其自身的更新。如果节点列表或XML文档中的某个元素被删除或添加,列表也会被自动更新。

注释:在一个节点列表中,节点被返回的顺序与它们在XML被规定的顺序相同。

属性:length

方法:item();可返回节点列表中处于指定的索引号的节点。

如果您觉得本文的内容对您的学习有所帮助,您可以微信:

相关推荐