一、基本概念

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. 网络编程4 网络编程之FTP上传简单示例&socketserver介绍&验证合法性连接

    今日大纲: 1.FTP上传简单示例(详细代码) 2.socketserver简单示例&源码介绍 3.验证合法性连接//[秘钥加密(urandom,sendall)(注意:中文的!不能用)] 内 ...

  2. Python菜鸟之路:原生Ajax/Jquery Ajax/IFrame Ajax的选用

    原生Ajax Jquery Ajax IFrame Ajax 如果发送的是普通的数据,比如用户简单的输入.选择的值,推荐使用Jquery ,其次用XMLHttpRquest对象,最次使用IFrame ...

  3. Spring Data 关于Repository的介绍(四)

    Repository类的定义: public interface Repository<T, ID extends Serializable> { } 1)Repository是一个空接口 ...

  4. SOE不能进入断点调试

    一.前言 任何程序开发,如果不能进入断点调试,是非常的痛苦的. 如果有过SOE开发经验的人都知道,SOE开发过程中调试是非常麻烦的.任何在SOE开发模板中的修改都需要重新编译工程,重新生成.soe 文 ...

  5. python基础之类和对象、对象之间的交互、类名称空间与对象/实例名称空间

    一 面向对象初识 Python要么是面向过程要么是面向对象. 概念及优缺点: 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东 ...

  6. 使用jQuery重用form表单并异步提交到其它action

    在做页面开发的时候,有时候要重用表单的数据,并异步请求提交到其它的链接中,这个时候就能够使用jquery去改动表单的action值(记得使用后改动回来).并调用submit方法,当然后台的链接acti ...

  7. Android图片加载框架Picasso最全使用教程4

    通过前几篇的学习,我们已经对Picasso的加载图片的用法有了很深的了解,接下来我们开始分析Picasso为我们提供的其他高级功能及内存分析,Let’sGo ! Picasso进行图片的旋转(Rota ...

  8. mysql进阶(二)之细谈索引、分页与慢日志

    索引 1.数据库索引 数据库索引是一种数据结构,可以以额外的写入和存储空间为代价来提高数据库表上的数据检索操作的速度,以维护索引数据结构.索引用于快速定位数据,而无需在每次访问数据库表时搜索数据库表中 ...

  9. Redis持久化方式RDB和AOF

    Redis 持久化 RDB(快照) 优点 rdb是可进行压缩的二进制文件,表示Redis在某一个时间点的数据快照.非常使用与备份,灾难恢复等场景.比如使用定时任务执行bgsave并备份rdb到serv ...

  10. 使用ansible 完成yum安装lamp环境

    使用ansible 完成yum安装lamp环境 [root@node2 ~]# cd /etc/ansible/playbook/[root@node2 playbook]# lslamp[root@ ...