`

用Javascript获取页面元素的位置

阅读更多

用Javascript获取页面元素的位置

作者: 阮一峰

日期: 2009年9月14日

作网页的过程中,你有时候需要知道某个元素在网页上的确切位置。

下面的教程总结了Javascript在网页定位方面的相关知识。

一、网页的大小和浏览器窗口的大小

首先,要明确两个基本概念。

一张网页的全部面积,就是它的大小。通常情况下,网页的大小由内容和CSS样式表决定。

浏览器窗口的大小,则是指在浏览器窗口中看到的那部分网页面积,又叫做viewport(视口)。

很显然,如果网页的内容能够在浏览器窗口中全部显示(也就是不出现滚动条),那么网页的大小和浏览器窗口的大小是相等的。如果不能全部显示,则滚动浏览器窗口,可以显示出网页的各个部分。

二、获取网页的大小

网页上的每个元素,都有clientHeight和clientWidth属性。这两个属性指元素的内容部分再加上padding的所占据的视觉面积,不包括border和滚动条占用的空间。

(图一 clientHeight和clientWidth属性)

因此,document元素的clientHeight和clientWidth属性,就代表了网页的大小。

  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
      }
    }
  }

上面的getViewport函数就可以返回浏览器窗口的高和宽。使用的时候,有三个地方需要注意:

1)这个函数必须在页面加载完成后才能运行,否则document对象还没生成,浏览器会报错。

2)大多数情况下,都是document.documentElement.clientWidth返回正确值。但是,在IE6的quirks模式中,document.body.clientWidth返回正确的值,因此函数中加入了对文档模式的判断。

3)clientWidth和clientHeight都是只读属性,不能对它们赋值。

三、获取网页大小的另一种方法

网页上的每个元素还有scrollHeight和scrollWidth属性,指包含滚动条在内的该元素的视觉面积。

那么,document对象的scrollHeight和scrollWidth属性就是网页的大小,意思就是滚动条滚过的所有长度和宽度。

仿照getViewport()函数,可以写出getPagearea()函数。

  function getPagearea(){
    if (document.compatMode == "BackCompat"){
      return {
        width: document.body.scrollWidth,
        height: document.body.scrollHeight
      }
    } else {
      return {
        width: document.documentElement.scrollWidth,
        height: document.documentElement.scrollHeight
      }
    }
  }

但是,这个函数有一个问题。如果网页内容能够在浏览器窗口中全部显示,不出现滚动条,那么网页的clientWidth和scrollWidth应该相等。但是实际上,不同浏览器有不同的处理,这两个值未必相等。所以,我们需要取它们之中较大的那个值,因此要对getPagearea()函数进行改写。

  function getPagearea(){
    if (document.compatMode == "BackCompat"){
      return {
        width: Math.max(document.body.scrollWidth,
                document.body.clientWidth),
        height: Math.max(document.body.scrollHeight,
                document.body.clientHeight)
      }
    } else {
      return {
        width: Math.max(document.documentElement.scrollWidth,
                document.documentElement.clientWidth),
        height: Math.max(document.documentElement.scrollHeight,
                document.documentElement.clientHeight)
      }
    }
  }

四、获取网页元素的绝对位置

网页元素的绝对位置,指该元素的左上角相对于整张网页左上角的坐标。这个绝对位置要通过计算才能得到。

首先,每个元素都有offsetTop和offsetLeft属性,表示该元素的左上角与父容器(offsetParent对象)左上角的距离。所以,只需要将这两个值进行累加,就可以得到该元素的绝对坐标。

(图二 offsetTop和offsetLeft属性)

下面两个函数可以用来获取绝对位置的横坐标和纵坐标。

  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;
  }

由于在表格和iframe中,offsetParent对象未必等于父容器,所以上面的函数对于表格和iframe中的元素不适用。

五、获取网页元素的相对位置

网页元素的相对位置,指该元素左上角相对于浏览器窗口左上角的坐标。

有了绝对位置以后,获得相对位置就很容易了,只要将绝对坐标减去页面的滚动条滚动的距离就可以了。滚动条滚动的垂直距离,是document对象的scrollTop属性;滚动条滚动的水平距离是document对象的scrollLeft属性。

(图三 scrollTop和scrollLeft属性)

对上一节中的两个函数进行相应的改写:

  function getElementViewLeft(element){
    var actualLeft = element.offsetLeft;
    var current = element.offsetParent;

    while (current !== null){
      actualLeft += current.offsetLeft;
      current = current.offsetParent;
    }

    if (document.compatMode == "BackCompat"){
      var elementScrollLeft=document.body.scrollLeft;
    } else {
      var elementScrollLeft=document.documentElement.scrollLeft; 
    }

    return actualLeft-elementScrollLeft;
  }

  function getElementViewTop(element){
    var actualTop = element.offsetTop;
    var current = element.offsetParent;

    while (current !== null){
      actualTop += current. offsetTop;
      current = current.offsetParent;
    }

     if (document.compatMode == "BackCompat"){
      var elementScrollTop=document.body.scrollTop;
    } else {
      var elementScrollTop=document.documentElement.scrollTop; 
    }

    return actualTop-elementScrollTop;
  }

scrollTop和scrollLeft属性是可以赋值的,并且会立即自动滚动网页到相应位置,因此可以利用它们改变网页元素的相对位置。另外,element.scrollIntoView()方法也有类似作用,可以使网页元素出现在浏览器窗口的左上角。

六、获取元素位置的快速方法

除了上面的函数以外,还有一种快速方法,可以立刻获得网页元素的位置。

那就是使用getBoundingClientRect()方法。它返回一个对象,其中包含了left、right、top、bottom四个属性,分别对应了该元素的左上角和右下角相对于浏览器窗口(viewport)左上角的距离。

所以,网页元素的相对位置就是

  var X= this.getBoundingClientRect().left;

  var Y =this.getBoundingClientRect().top;

再加上滚动距离,就可以得到绝对位置

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

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

目前,IE、Firefox 3.0+、Opera 9.5+都支持该方法,而Firefox 2.x、Safari、Chrome、Konqueror不支持。

(完)

from http://www.ruanyifeng.com/blog/2009/09/find_element_s_position_using_javascript.html

分享到:
评论

相关推荐

    获取元素绝对位置 position

    "获取元素绝对位置 position"这个话题主要关注JavaScript中如何准确地定位DOM元素在页面中的坐标。这里,我们将深入探讨相关知识,并参考提供的博客链接以及相关的HTML文件。 首先,元素的绝对位置是指元素左上角相...

    javascript获取隐藏元素(display:none)的高度和宽度的方法

    例如,以下是一个使用jQuery库的JavaScript函数,用以获取隐藏元素的尺寸: ```javascript function getDefaultStyle(obj, attribute) { return obj.currentStyle ? obj.currentStyle[attribute] : document....

    Javascript 获取光标位置

    JavaScript获取光标位置是网页开发中的一个重要功能,它在用户输入、文本编辑或者富文本处理等场景中扮演着关键角色。这个功能可以帮助开发者精确地控制用户在文本输入框中的光标定位,例如在某些特定字符后插入文本...

    Javascript元素位置、大小、鼠标定位操作

    在 Javascript 中,可以使用多种方法来操作元素的位置和大小。例如: 1. 使用 offsetTop、offsetLeft 等属性来设置元素的位置。 2. 使用 width、height 等属性来设置元素的大小。 3. 使用 scrollTop、scrollLeft 等...

    用JavaScript获取DOM元素位置和尺寸大小的方法

    本文将深入探讨如何利用JavaScript获取DOM元素的位置和尺寸,并解释相关属性。 首先,我们要了解几个关键的属性: 1. `offsetWidth` 和 `offsetHeight`:这两个属性返回元素的完整外尺寸,包括内容、内边距和边框...

    JavaScript获取指定元素位置的方法

    本篇文章将深入探讨几种方法,通过JavaScript获取元素在页面中的位置,并着重讲解`left`、`scrollLeft`、`top`、`scrollTop`和`offsetHeight`等属性的用法。 首先,我们要理解元素位置的概念。一个元素在页面中的...

    基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)

    本文主要介绍了如何使用JavaScript来获取手机用户的当前位置信息,包括省、市、县、街道甚至到门牌号的具体地址。实现这一功能的关键在于利用浏览器提供的地理位置服务API——Geolocation API,以及第三方地图服务...

    JavaScript获取HTML DOM节点元素的方法的总结

    以下是对“JavaScript获取HTML DOM节点元素的方法的总结”的详细阐述,旨在帮助开发者更好地理解和应用DOM操作。 ### 一、通过`document`对象获取DOM节点 #### 1. `document.getElementById(elementId)` 这个方法...

    JavaScript获取网页表单action属性的方法

    JavaScript获取网页表单的action属性是一种常用的操作,通常用于获取表单提交时要发送到的URL地址。在Web开发中,表单是用来收集用户输入数据并将其发送到服务器的HTML元素。action属性指定了表单提交后,服务器处理...

    用Javascript 获取页面元素的位置的代码

    本教程将深入探讨如何使用JavaScript获取网页元素的绝对大小和相对大小,并提供相关代码示例。 首先,理解网页的绝对大小和相对大小的概念至关重要。网页的绝对大小是指网页的完整内容区域,包括所有元素、图片、...

    javascript 获取iframe里页面中元素值的方法

    IE方法:document.frames[‘myFrame’].document.getElementById(‘test’).value; 火狐方法:document.getElementById(‘myFrame’).contentWindow.document.getElementById(‘test’).value; ...

    javascript获取鼠标当前位置坐标并显示

    为了显示鼠标的位置坐标,我们需要获取页面中的输入框元素,并将其`value`属性设置为当前的坐标值。 ```javascript function mouseMove(ev) { Ev = ev || window.event; var mousePos = mouseCoords(ev); ...

    用Javascript获取页面元素的具体位置

    以下是基于提供的内容,对于使用JavaScript获取页面元素具体位置的知识点的详细介绍。 ### 网页的大小和浏览器窗口的大小 网页的大小是由内容和CSS样式决定的全部面积。它通常包含了内容区域、内边距(padding)、...

    JavaScript获取页面上某个元素的代码

    为了对页面上的元素进行操作,首先需要通过JavaScript获取页面元素的引用,将其作为对象进行后续操作。在JavaScript中,可以通过多种方式获取页面元素,最常用的方法包括getElementById、getElementsByName和...

    C++ builder 网页元素获取实例

    在C++ Builder中进行网页元素获取,主要是指与Web交互,获取HTML页面中的特定信息,例如文本、链接、图片等。这一过程通常涉及到网络编程、HTML解析和可能的JavaScript交互。下面将详细介绍C++ Builder中实现这个...

    JavaScript获取对象在页面中位置坐标的方法

    在JavaScript中,获取页面元素的位置坐标是Web开发中常见的需求,这主要涉及到DOM(文档对象模型)的操作。本文将详细讲解如何使用JavaScript的内置属性和方法来获取对象在页面中的位置坐标。 首先,我们需要理解两...

    js获取页面控件坐标.pdf

    获取页面控件坐标是 JavaScript 编程中非常重要的一部分,我们可以使用多种方法来获取元素的坐标,包括使用 offsetLeft 和 offsetTop 属性、getBoundingClientRect() 方法和 JavaScript 库等。 此外,在 HTML 文...

    JavaScript获取鼠标位置和鼠标与div的相对位置

    在JavaScript中,获取鼠标位置和计算鼠标与特定div元素的相对位置是常见的需求,这在交互式网页开发中尤其重要。下面将详细讲解如何实现这些功能。 首先,我们需要理解两个基本概念:`event.clientX` 和 `event....

    Javascript获取相同CSS样式的元素

    综上所述,JavaScript获取相同CSS样式的元素涉及到DOM操作、CSS选择器的运用以及对匹配元素的遍历处理。在实际开发中,掌握这些技能将有助于实现各种动态效果和用户交互。通过深入学习和实践,我们可以更好地利用...

Global site tag (gtag.js) - Google Analytics