一、基本概念

document.documentElement是整个DOM树的根节点,对应的元素就是html。下面将其称作根元素或根节点。

document.body,对应的元素是body

二、浏览器中的文档坐标系、视口坐标系

  • 元素的位置是以像素度量的,向右代表X坐标的增加,向下代表Y坐标的增加。
  • 但是,有两个不同的点作为坐标系的原点:元素的X和Y坐标可以相对于文档的左上角或者相对于在其中显示文档的视口的左上角。
  • 针对框架页中显示的文档,视口是定义了框架页的元素。
  • 视口坐标有时也叫窗口坐标。
  • 如果文档比视口要小,或者说它还未出现滚动,则文档是的左上角就是视口的左上角,文档和视口坐标系是同一个。
  • 要在两种坐标系之间互相转换,必须加上或减去滚动的偏移量。
  • 文档坐标比视口坐标要更加基础,并且在用户滚动时它们不会发生变化。
  • 在客户端编程中使用视口坐标是非常常见的。
  • 当为鼠标事件注册事件处理程序函数时,报告的鼠标指针的坐标是在视口坐标系中的。
  • 为了在坐标系之间互相转换,我们需要判定浏览器窗口的滚动条的位置。

三、关于元素的位置、尺寸及更多的信息

☆ 用于判断滚动条位置的属性

1.Window对象的pageXOffset和pageYOffset

2.IE(和所有现代浏览器)也可以通过scrollLeft和scrollTop(可写,可通过设置这两个属性改变滚动条的位置)

在IE中,标准模式下,通过查询文档的根节点(document.documentElement)来获取这些属性值。

怪异模式下,必须在文档的元素(document.body)上查询它们。

以上两种属性同义,都是表示横向或纵向滚动条在窗体中已滚动的像素数。

☆ 用于获取HTML元素尺寸的属性

1.HTML元素的只读属性offsetWidth和offsetHeight,包含元素的边框和内边距,不含外边距。因为滚动条出现后会压缩内容区域,所以这两个属性也包括滚动条的宽度,但是不包含溢出的内容。

2.HTML元素的只读属性scrollWidth和scrollHeight,包含内容区域及任何溢出内容区域的内容、内边距,不含滚动条宽度、边框、外边距。(当内容正好和内容区域匹配而没有溢出时,这些属性与clientWidth和clientHeight是相等的。但当溢出时,它们就包含溢出的内容,返回值比clientWidth和clientHeight要大。)

3.HTML元素的只读属性clientWidth和clientHeight,包含元素未溢出的内容区域、内边距,不含溢出的内容、滚动条宽度、边框、外边距。(注意:内联元素的这两个值总是返回0)

在文档的根节点(document.documentElement)上查询这两个属性时,它们的返回值和window的innerWidth和innerHeight属性值相等(实际上不一定相等,只有在浏览器没有出现滚动条时,二者相等。有滚动条时,根节点的clientWidth和clientHeight属性的值都不含滚动条的宽度)。

对于IE的怪异模式,必须在文档的元素(document.body)上查询它们(与处于标准模式时的根节点的clientWidth和clientHeight属性的值相等)。

☆ 用于获取HTML元素文档坐标的属性

HTML元素的offsetLeft和offsetTop属性来返回元素的X和Y坐标。对于很多元素,这些值是文档坐标,并直接指定元素的位置。但对于已定位元素的后代元素和一些其他元素(如表格单元),这些属性返回的坐标是相对于祖先元素的而非文档。

offsetParent属性指定这两个属性所相对的父元素。如果offsetParent为null,这两个属性就都是文档坐标。

offsetParent属性表示已进行了相对或绝对定位的父元素。

这两个属性返回的坐标包含元素的边框和内边距,但不包含元素的外边距。

这两个属性表示的是从offsetParent元素的左边框内边缘和上边框内边缘作为起点,到元素自身的左边框外边缘和上边框外边缘为终点,之间的距离。

☆ 没什么用的HTML元素属性

clientLeft和clientTop:它们返回元素的左边和上边的内边距的外边缘和它的边框的外边缘之间的水平距离和垂直距离。通常这些值就等于左边和上边的边框宽度。但是如果元素有滚动条,并且浏览器将这些滚动条的位置放置在左侧或顶部(不太常见),这两个值也就包含了滚动条的宽度。对于内联元素,clientLeft和clientTop总是为0。

☆ 相关方法

1.window对象的scrollTo()方法接受一个点的X和Y坐标(文档坐标),作为滚动条的偏移量设置它们。如果有可能的话,让这个文档坐标的点位于视口的左上角。

2.使文档中的某个元素在视口内可见,可以在需要显示的HTML元素上调用scrollIntoView()方法。

3.返回元素的视口坐标的方法:调用HTML元素的getBoundingClientRect()方法。

这个方法在当前所有的浏览器中都实现了。

这个方法可用于判断一个元素的尺寸和位置。

这个方法不需要参数,返回一个有left、right、top、bottom属性的对象。left和top属性表示元素的左上角的X和Y坐标,right和bottom属性表示元素的右下角的X和Y坐标。

这个方法返回元素在视口坐标中的位置。

这个方法返回的坐标包含元素的边框和内边距,但不包含元素的外边距。

4.如果想查询内联元素每个独立的矩形,调用getClientRects()方法来获得一个只读的类数组对象,它的每个元素类似于getBoundingClientRect()返回的矩形对象。

☆ 其他

1.三对元素属性的内边距说明(clientWidth和clientHeight、offsetWidth和offsetHeight、scrollWidth和scrollHeight)

理论上,这三对元素都包含了元素的内边距

实际上,在测试的浏览器中,clientWidth和clientHeight、offsetWidth和offsetHeight都包含四周的内边距

实际上,在测试的浏览器中,对于元素的scrollWidth和scrollHeight属性

在IE8及以上版本、Firefox中,

如果没有横向或纵向滚动条(内容不多不足以产生滚动条)时,这两个属性分别包含左右和上下内边距的宽度;如果存在横向或纵向滚动条(内容足够多产生了滚动条)时,这两个属性只包含元素的左和上内边距,不含右和下的内边距

在IE6、Chrome中,不论有无横向或纵向滚动条,这两个属性都包含元素左右和上下的内边距

2.在给元素加载内容时,如果内容里包含了一些用来描述元素尺寸的属性,且这些属性输出的是这个元素自身的值,那么这些值输出的结果很可能是不对的。因为元素在加载内容时,这些属性的值还未稳定。提前读取这些属性,很有可能会返回不准确的值。所以建议等元素自身尺寸稳定后,再读取这些描述元素尺寸的属性。

举例,假设一个块级元素,设置了宽高样式以及overflow是auto的样式,同时假设这个元素还没有任何内容。

然后现在第一次为其加载一些足够多的内容,让它显示横向和纵向滚动条。

在加载的内容里假设包含了元素自身的这三对属性:clientWidth和clientHeight、offsetWidth和offsetHeight、scrollWidth和scrollHeight

在加载这些内容之后,你会发现clientWidth和clientHeight、scrollWidth和scrollHeight输出的数值包含了元素自身横向和纵向滚动条的宽度,理论上这两对属性不应含滚动条的宽度。

但是现在,如果在元素的外面读取此元素的这两对属性,你会发现这两对属性并没有包含横向和纵向滚动条的宽度。

而offsetWidth和offsetHeight这对属性,在这种元素样式设定下,两次读取到的值都是一致的。

3.浏览器滚动条的宽度,会随着不同类型浏览器,不同的系统主题而不同

四、window对象的尺寸、位置属性(以下都是只读属性)

innerHeight、innerWidth

浏览器视口的宽高,包含滚动条

IE6到IE8:不支持

IE9及以上版本、Chrome、Firefox:支持

outerHeight、outerWidth

这两个属性指明当前浏览器窗口的总高度和宽度,单位为像素,包括工具栏、滚动条、窗口边框等。

注:当点击了浏览器的最大化按钮,使浏览器最大化以后,这两个属性的值可能会比手动让浏览器窗口撑满屏幕的值要大。

IE6到IE8:不支持

IE9及以上版本、Chrome、Firefox:支持

pageXOffset、pageYOffset

当前文档滚过的向右(pageXOffset)和向下(pageYOffset)的像素值。

IE6到IE8:不支持

IE9及以上版本、Chrome、Firefox:支持

scrollLeft、scrollTop

与pageXOffset、pageYOffset含义等同

IE6到8:不支持pageXOffset、pageYOffset;浏览器出现滚动条时,document.documentElement的scrollLeft、scrollTop有值;document.body的scrollLeft、scrollTop值为0;

IE9及以上版本、Firefox:document.documentElement的scrollLeft、scrollTop分别与window的pageXOffset、pageYOffset相等;document.body的scrollLeft和scrollTop值为0

Chrome:document.body的scrollLeft、scrollTop分别与window的pageXOffset、pageYOffset相等;document.documentElement的scrollLeft和scrollTop值为0

screenLeft、screenTop

IE6及以上版本:当前浏览器的视口(仅视口)左上角在屏幕中的坐标。

Chrome:当前浏览器窗口的左上角在屏幕中的坐标。

Firefox:不支持

screenX、screenY

IE6到IE8:不支持

IE9及以上版本、Chrome、Firefox:当前浏览器窗口的左上角在屏幕中的坐标。

注:测试用:Firefox浏览器版本是43;Chrome浏览器版本是38.05;Opera现在的内核是webkit,与Chrome等同。

IE6、IE8、IE9、IE10、IE11

DOM元素的位置、尺寸及更多的信息的更多相关文章

  1. vue 组件传递值以及获取DOM元素的位置信息

    1.父组件 select_li.vue 1.1 父组件模板 <template> <div id='selectLi' ref="selectLi"> &l ...

  2. 图示:DOM元素各种位置属性

  3. C1:DOM 元素的尺寸和位置

    DOM元素的尺寸和位置 DOM 元素的尺寸 DOM.offsetWidth/offsetHeight: 包括内容区宽/高,padding,border,不包括margin.如果元素的box-sizei ...

  4. JavaScript获取DOM元素位置和尺寸大小

      在一些复杂的页面中经常会用JavaScript处理一些DOM元素的动态效果,这种时候我们经常会用到一些元素位置和尺寸的计算,浏览器兼容性问题也是不可忽略的一部分,要想写出预想效果的JavaScri ...

  5. 获取DOM元素位置和尺寸大小

    JavaScript获取DOM元素位置和尺寸大小 在一些复杂的页面中经常会用JavaScript处理一些DOM元素的动态效果,这种时候我们经常会用到一些元素位置和尺寸的计算,浏览器兼容性问题也是不可忽 ...

  6. 第一百一十七节,JavaScript,DOM元素尺寸和位置

    学习要点: 1.获取元素CSS大小 2.获取元素实际大小 3.获取元素周边大小 本章,我们主要讨论一下页面中的某一个元素它的各种大小和各种位置的计算方式,以便更好的理解. 一.获取元素CSS大小 1. ...

  7. DOM元素尺寸和位置

    一.获取元素 CSS大小 1.通过style 内联获取元素的大小 var box = document.getElementById('box'); //获取元素 box.style.width; / ...

  8. JavaScript(第二十一天)【DOM元素尺寸和位置】

    学习要点: 1.获取元素CSS大小 2.获取元素实际大小 3.获取元素周边大小 本章,我们主要讨论一下页面中的某一个元素它的各种大小和各种位置的计算方式,以便更好的理解.   一.获取元素CSS大小 ...

  9. 原生JS获取各种高度宽度、浏览器窗口滚动条的位置、元素的几何尺寸名

    1)关于 pageX, clienX,offsetX,layerX pageX:鼠标在页面上的位置,从页面左上角开始,即是以页面为参考点,不随滑动条移动而变化 clientX:鼠标在页面上可视区域的位 ...

随机推荐

  1. qmake make install

    一般的qmake生成的Makefile是没有 make install的 方法: 在.pro中做文章 比如你要安装libEbookDataBase.so*到目录 /usr/local/lib .pro ...

  2. Taylor's theorem

    w https://en.wikipedia.org/wiki/Taylor_series

  3. docker在团队中的实践 How To Install Docker In CentOS

    " 预发布机器(centos-6.5),给每个同学都开通了ssh这个机器是大家一起共用的,稍后导些数据下来.后续 项目上线,产品测试,都是在这上面进行.  目前在一个物理机 " 3 ...

  4. servlet中获取各种相对地址(服务器、服务器所在本地磁盘、src等)。

    [本文简介] 本文将提供javaWeb中经常使用到的相对路径的获取方法,分别有: url基本地址 带目录的url地址 服务器的根路径 服务器所在的 本地磁盘路径 服务器所在的本地磁盘路径,带文件夹 S ...

  5. 从0开始用python实现神经网络 IMPLEMENTING A NEURAL NETWORK FROM SCRATCH IN PYTHON – AN INTRODUCTION

    code地址:https://github.com/dennybritz/nn-from-scratch 文章地址:http://www.wildml.com/2015/09/implementing ...

  6. 聊天软件项目UDP升级版

    import java.net.*; import java.io.*; class UdpSend2 { public static void main(String[] args) throws ...

  7. 前端基础之JavaScript(Day53)

    阅读目录 一.JavaScript基础 二.JavaScript对象 三.BOM对象 一.JavaScript基础 http://www.cnblogs.com/yuanchenqi/articles ...

  8. Python(面向对象编程4——继承顺序、封装)

    继承顺序 ''' 一点需要注意 ''' class Father: def f1(self): print("test func followed ==>") self.te ...

  9. DELPHI在标题栏上增加按钮

    Delphi代码 unit Unit1; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Contr ...

  10. knockout 学习使用笔记-----event绑定传参ko属性

    在绑定event的时候,需要传入ViewModal 本身的属性值(其实没必要,js直接能获取到,此处为测试相关参数的传递),如果不加(),会将绑定的function传进event(至于为嘛传了个fun ...