zoukankan      html  css  js  c++  java
  • 用Javascript获取页面元素的位置

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

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

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

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

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

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

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

    二、获取网页的大小

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

    (图一 clientHeight和clientWidth属性)

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

      function getViewport(){
        if (document.compatMode == "BackCompat"){
          return {
             document.body.clientWidth,
            height: document.body.clientHeight
          }
        } else {
          return {
             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 {
             document.body.scrollWidth,
            height: document.body.scrollHeight
          }
        } else {
          return {
             document.documentElement.scrollWidth,
            height: document.documentElement.scrollHeight
          }
        }
      }

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

      function getPagearea(){
        if (document.compatMode == "BackCompat"){
          return {
             Math.max(document.body.scrollWidth,
                    document.body.clientWidth),
            height: Math.max(document.body.scrollHeight,
                    document.body.clientHeight)
          }
        } else {
          return {
             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不支持。

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

    基础概念

    为了方便理解,我们需要了解几个基础概念,每个HTML元素都有下列属性

    offsetWidth

    clientWidth

    scrollWidth

    offsetHeight

    clientHeight

    scrollHeight

    offsetLeft

    clientLeft

    scrollLeft

    offsetTop

    clientTop

    scrollTop

    为了理解这些属性,我们需要知道HTML元素的实际内容有可能比分配用来容纳内容的盒子更大,因此可能会出现滚动条,内容区域是视口,当实际内容比视口大的时候,需要把元素的滚动条位置考虑进去。

    1. clientHeight和clientWidth用于描述元素内尺寸,是指 元素内容+内边距 大小,不包括边框(IE下实际包括)、外边距、滚动条部分

    2. offsetHeight和offsetWidth用于描述元素外尺寸,是指 元素内容+内边距+边框,不包括外边距和滚动条部分

    3. clientTop和clientLeft返回内边距的边缘和边框的外边缘之间的水平和垂直距离,也就是左,上边框宽度

    4. offsetTop和offsetLeft表示该元素的左上角(边框外边缘)与已定位的父容器(offsetParent对象)左上角的距离

    5. offsetParent对象是指元素最近的定位(relative,absolute)祖先元素,递归上溯,如果没有祖先元素是定位的话,会返回null

    写个小例子方便理解

    <div id="divParent" style="padding: 8px;  position: relative;">
            <div id="divDisplay" style="background-color: #0f0; margin: 30px; padding: 10px;
                height: 200px;  200px; border: solid 3px #f00;">
            </div>
        </div>
    复制代码
    <script type="text/javascript">
            var div = document.getElementById('divDisplay');
    
            var clientHeight = div.clientHeight;
            var clientWidth = div.clientWidth;
            div.innerHTML += 'clientHeight: ' + clientHeight + '<br/>';
            div.innerHTML += 'clientWidth: ' + clientWidth + '<br/>';
    
            var clientLeft = div.clientLeft;
            var clientTop = div.clientTop;
            div.innerHTML += 'clientLeft: ' + clientLeft + '<br/>';
            div.innerHTML += 'clientTop: ' + clientTop + '<br/>';
    
            var offsetHeight = div.offsetHeight;
            var offsetWidth = div.offsetWidth;
            div.innerHTML += 'offsetHeight: ' + offsetHeight + '<br/>';
            div.innerHTML += 'offsetWidth: ' + offsetWidth + '<br/>';
    
            var offsetLeft = div.offsetLeft;
            var offsetTop = div.offsetTop;
            div.innerHTML += 'offsetLeft: ' + offsetLeft + '<br/>';
            div.innerHTML += 'offsetTop: ' + offsetTop + '<br/>';
    
            var offsetParent = div.offsetParent;
            div.innerHTML += 'offsetParent: ' + offsetParent.id + '<br/>';
        </script>
    复制代码

    效果如图

    UntitledUntitle1d

    从图中我们可以看到,clientHeight就是div的高度+上下各10px的padding,clientWidth同理

    而clientLeft和ClientTop即为div左、上边框宽度

    offsetHeight是clientHeight+上下个3px的边框宽度之和,offsetWidth同理

    offsetTop是div 30px的 maggin+offsetparent 8px的 padding,offsetLeft同理

    6. scrollWidth和scrollHeight是元素的内容区域加上内边距加上溢出尺寸,当内容正好和内容区域匹配没有溢出时,这些属性与clientWidth和clientHeight相等

    7. scrollLeft和scrollTop是指元素滚动条位置,它们是可写

    下面写个简单例子理解

    复制代码
    <div id="divParent" style=" padding:8px; border:solid 7px #000; height:200px; 500px; overflow:auto;">
            <div id="divDisplay" style="background-color: #0f0; margin: 30px; padding: 10px;
                height: 400px;  200px; border: solid 3px #f00;">
            </div>
        </div>
    复制代码
    复制代码
    <script type="text/javascript">
            var divP = document.getElementById('divParent');
            var divD = document.getElementById('divDisplay');
    
            var scrollHeight = divP.scrollHeight;
            var scrollWidth = divP.scrollWidth;
            divD.innerHTML += 'scrollHeight: ' + scrollHeight + '<br/>';
            divD.innerHTML += 'scrollWidth: ' + scrollWidth + '<br/>';
        </script>
    复制代码

    在FireFox和IE10(IE10以下版本盒模型和W3C标准不一致,不加讨论,兼容性问题下面会介绍到)下得到结果scrollHeight: 494,而在Chrome和Safari下得到结果scrollHeight: 502,差了8px,根据8可以简单推测是divParent的padding,来算一下是不是

    我们可以看看它们的结果是怎么来的,首先scrollHeight肯定包含了divDisplay所需的高度 400px的高度+上下各10px的padding+上下各3px的border+上下各30px的margin,这样

    400+10*2+3*2+30*2=486

    这样486+8=494, 486+8*2=502果真是这样,在FireFox和IE10下没有计算下padding

    有了这些基础知识后,我们就可以计算元素的位置和尺寸了。

    相对于文档与视口的坐标

    当我们计算一个DOM元素位置也就是坐标的时候,会涉及到两种坐标系,文档坐标视口坐标

    我们经常用到的document就是整个页面部分,而不仅仅是窗口可见部分,还包括因为窗口大小限制而出现滚动条的部分,它的左上角就是我们所谓相对于文档坐标的原点。

    视口是显示文档内容的浏览器的一部分,它不包括浏览器外壳(菜单,工具栏,状态栏等),也就是当前窗口显示页面部分,不包括滚动条。

    如果文档比视口小,说明没有出现滚动,文档左上角和视口左上角相同,一般来讲在两种坐标系之间进行切换,需要加上或减去滚动的偏移量(scroll offset)。

    为了在坐标系之间进行转换,我们需要判定浏览器窗口的滚动条位置。window对象的pageXoffset和pageYoffset提供这些值,IE 8及更早版本除外。也可以通过scrollLeft和scrollTop属性获得滚动条位置,正常情况下通过查询文档根节点(document.documentElement)来获得这些属性值,但在怪异模式下必须通过文档的body上查询。

    复制代码
    function getScrollOffsets(w) {
                var w = w || window;
                if (w.pageXoffset != null) {
                    return { x: w.pageXoffset, y: pageYoffset };
                }
                var d = w.document;
                if (document.compatMode == "CSS1Compat")
                    return { x: d.documentElement.scrollLeft, y: d.documentElement.scrollTop };
                return { x: d.body.scrollLeft, y: d.body.scrollTop };
            }
    复制代码

    有时候能够判断视口的尺寸也是非常有用的

    复制代码
    function getViewPortSize(w) {
                var w = w || window;
                if (w.innerWidth != null)
                    return { w: w.innerWidth, h: w.innerHeight };
                var d = w.document;
                if (document.compatMode == "CSS1Compat")
                    return { w: d.documentElement.clientWidth, h: d.documentElement.clientHeight };
                return { w: d.body.clientWidth, h: d.body.clientHeight };
            }
    复制代码

    文档坐标

    任何HTML元素都拥有offectLeft和offectTop属性返回元素的X和Y坐标,对于很多元素,这些值是文档坐标,但是对于以定位元素后代及一些其他元素(表格单元),返回相对于祖先的坐标。我们可以通过简单的递归上溯累加计算

    复制代码
    function getElementPosition(e) {
                var x = 0, y = 0;
                while (e != null) {
                    x += e.offsetLeft;
                    y += e.offsetTop;
                    e = e.offsetParent;
                }
                return { x: x, y: y };
            }
    复制代码

    尽管如此,这个函数也不总是计算正确的值,当文档中含有滚动条的时候这个方法就不能正常工作了,我们只能在没有滚动条的情况下使用这个方法,不过我们用这个原理算出一些元素相对于某个父元素的坐标。

    视口坐标

    计算视口坐标就相对简单了很多,可以通过调用元素getBoundingClientRect方法。方法返回一个有left、right、top、bottom属性的对象,分别表示元素四个位置的相对于视口的坐标。getBoundingClientRect所返回的坐标包含元素的内边距和边框,不包含外边距。兼容性很好,非常好用

    元素尺寸

    由上面计算坐标方法,我们可以方便得出元素尺寸。在符合W3C标准的浏览器中getBoundingClientRect返回的对象还包括width和height,但在原始IE中未实现,但是通过返回对象的right-left和bottom-top可以方便计算出。

     
     

    在javascript中操作dom节点让其运动的时候,常常会涉及到各种宽高以及位置坐标等概念,如果不能很好地理解这些属性所代表的意义,就不能理解js的运动原理,同时,由于这些属性概念较多,加上浏览器之间

    实现方式不同,常常会造成概念混淆,经过研究之后,这里来进行一个总结。

    第一部分:DOM对象

    1.1只读属性

    所谓的只读属性指的是DOM节点的固有属性,该属性只能通过js去获取而不能通过js去设置,而且获取的值是只有数字并不带单位的(px,em等),如下:

    1)clientWidth和clientHeight

    该属性指的是元素的可视部分宽度和高度,即padding+content,如果没有滚动条,即为元素设定的高度和宽度,如果出现滚动条,滚动条会遮盖元素的宽高,那么该属性就是其本来宽高减去滚动条的宽高

    css:

    复制代码
    <style>
            .one{
                 200px;
                height: 200px;
                background: red;
                border: 1px solid #000000;
                overflow: auto;
            }
        </style>
    复制代码

    HTML

    复制代码
    <body>
    <div class="one">
        javascript高级应用<br>
        javascript高级应用<br>
        javascript高级应用<br>
        javascript高级应用<br>
        javascript高级应用<br>
        javascript高级应用<br>
        javascript高级应用<br>
        javascript高级应用<br>
        javascript高级应用<br>
        javascript高级应用<br>
        javascript高级应用<br>
        javascript高级应用<br>
        javascript高级应用<br>
        javascript高级应用<br>
        javascript高级应用<br>
        javascript高级应用<br>
        javascript高级应用<br>
        javascript高级应用<br>
    </div>
    </body>
    复制代码

    js

    复制代码
    <script>
            window.onload=function(){
                var oDiv=document.getElementsByTagName('div')[0];
                console.log(oDiv.clientWidth+":"+oDiv.clientHeight);
            }
        </script>
    复制代码

    结果:

    元素本来设定为宽高都是200,即可视部分宽高都是200,但是由于出现了垂直方向的滚动条,占据了可视部分的宽度,所以clientWidth变成了183,而clientHeight依然是200.

    2)offsetWidth和offsetHeight

    这一对属性指的是元素的border+padding+content的宽度和高度,该属性和其内部的内容是否超出元素大小无关,只和本来设定的border以及width和height有关

    css和HTML部分同上,js部分如下:

    复制代码
     <script>
            window.onload=function(){
                var oDiv=document.getElementsByTagName('div')[0];
                console.log(oDiv.offsetWidth+":"+oDiv.offsetHeight);
            }
        </script>
    复制代码

    最终结果:

    可以看到该属性和clientWidth以及clientHeight相比,多了设定的边框border的宽度和高度。

    3)clientTop和clientLeft

    这一对属性是用来读取元素的border的宽度和高度的。

    css

    复制代码
     <style>
            body{
                border: 2px solid #000000;
            }
            .one{
                border: 1px solid red;
                 100px;
                height: 100px;
                background: red;
            }
        </style>
    复制代码

    html

    <body>
    <div class="one">
    </div>
    </body>

    js

    <script>
        var oDiv=document.getElementsByClassName('one')[0];
        console.log(oDiv.clientLeft+":"+oDiv.clientTop);
    </script>

    最终结果:

     可以看到div的border被设定了1px的宽,这里显示的就是它的宽度

    4)offsetLeft和offsetTop

    说到这对属性就需要说下offsetParent,所谓offsetParent指的是当前元素的离自己最近的具有定位的(position:absolute或者position:relative)父级元素(不仅仅指的是直接父级元素,只要是它的父元素都可以),该父级元素就是当前元素的offsetParent,如果从该元素向上寻找,找不到这样一个父级元素,那么当前元素的offsetParent就是body元素。而offsetLeft和offsetTop指的是当前元素,相对于其offsetParent左边距离和上边距离,即当前元素的border到包含它的offsetParent的border的距离如下所示:

    css

    复制代码
     <style>
            .two{
                position: relative;
                 200px;
                height: 200px;
                border: 1px solid green;
            }
            .one {
                 100px;
                height: 100px;
                background: red;
                margin: 20px;
                border: 1px solid #000000;
                position: absolute;
                top:20px;
            }
    
        </style>
    复制代码

    HTML

    复制代码
    <body>
    <div class="two">
    <div class="one">
    </div>
    </div>
    </body>
    复制代码

     js

    <script>
        var oDiv=document.querySelector('.one');
        console.log(oDiv.offsetTop+":"+oDiv.offsetLeft);
    </script>

    最终结果:

     这里让div.two相对定位,让div.one绝对定位,所以div.two是one的offsetParent,同时,又给div.one加了一个margin为20px,所以这里它的offsetTop为40,offsetLeft 本来为0,但是加上margin为20之后就变成了20.

    5)scrollHeight和scrollWidth

    顾名思义,这两个属性指的是当元素内部的内容超出其宽度和高度的时候,元素内部内容的实际宽度和高度,需要注意的是,当元素其中内容没有超过其高度或者宽度的时候,该属性是取不到的。

    css

    复制代码
     <style>
            .one{
                 100px;
                height: 100px;
                overflow: auto;
            }
        </style>
    复制代码

    HTML

    复制代码
    <body>
    <div class="one">
        我是内容<br>
        我是内容<br>
        我是内容<br>
        我是内容<br>
        我是内容<br>
        我是内容<br>
        我是内容<br>
        我是内容<br>
        我是内容<br>
        我是内容<br>
        我是内容<br>
        我是内容<br>
        我是内容<br>
    </div>
    </body>
    复制代码

    js

    复制代码
    <script>
        var oDiv=document.querySelector('.one');
        oDiv.onscroll=function(){
            console.log(this.scrollHeight+":"+this.scrollWidth);
        }
    </script>

    复制代码

    最终结果

     尽管该div的宽高都是100,但是其scrollheight为234显示的是其中内容的实际高度,scrollWidth为83(由于滚动条占据了宽度)

    1.2可读可写属性

    所谓的可读可写属性指的是不仅能通过js获取该属性的值,还能够通过js为该属性赋值。

    1)scrollTop和scrollLeft

    这对属性是可读写的,指的是当元素其中的内容超出其宽高的时候,元素被卷起的高度和宽度。

    css和html部分同上,js部分如下:

    复制代码
    <script>
        var oDiv=document.querySelector('.one');
        oDiv.onscroll=function(){
            console.log(this.scrollTop+":"+this.scrollLeft);
        }
    </script>
    复制代码

    最终结果:

    由于拖动了滚动条,scrollTop的属性值一直在增大,而水平方向没有滚动条,所以scrollLeft一直为0.

    该属性还可以通过赋值内容自动滚动到某个位置,js如下:

    复制代码
    <script>
        var oDiv=document.querySelector('.one');
        oDiv.scrollTop=20;
        oDiv.onscroll=function(){
            console.log(this.scrollTop+":"+this.scrollLeft);
        }
    </script>
    复制代码

    结果如下:

    通过直接设定div的scrollTop,让它直接显示在滚动条在20垂直方向上20的位置。

    2)obj.style.*属性

    对于一个dom元素,它的style属性返回的是一个对象,这个对象中的任意一个属性是可读写的。如obj.style.top,obj.style.wdith等,在读的时候,他们返回的值常常是带有单位的(如px),同时,对于这种方式,

    它只能够获取到该元素的行内样式,而并不能获取到该元素最终计算好的样式,这就是在读取属性值得时候和以上只读属性的区别,要获取计算好的样式,请使用obj.currentstyle(IE)和getComputedStyle(IE之外的浏览器)。另一方面,这些属性能够被赋值,js运动的原理就是通过不断修改这些属性的值而达到其位置改变的,需要注意的是,给这些属性赋值的时候需要带单位的要带上单位,否则不生效。

    第二部分 Event对象

    在js中,对于元素的运动的操作通常都会涉及到event对象,而event对象也存在很多位置属性,且由于浏览器兼容性问题会导致这些属性间相互混淆,这里一一讲解。

    1)clientX和clientY,这对属性是当事件发生时,鼠标点击位置相对于浏览器(可视区)的坐标,即浏览器左上角坐标的(0,0),该属性以浏览器左上角坐标为原点,计算鼠标点击位置距离其左上角的位置,

    不管浏览器窗口大小如何变化,都不会影响点击位置的坐标。

    js

    复制代码
    <script>
        var oDiv=document.querySelector('.one');
        oDiv.onclick=function(ev){
            var evt=ev||event;
            console.log(evt.clientX+":"+evt.clientY);  
        }
    </script>
    复制代码

    结果:

    2)screenX和screenY是事件发生时鼠标相对于屏幕的坐标,以设备屏幕的左上角为原点,事件发生时鼠标点击的地方即为该点的screenX和screenY值,如下所示:

    可以看到尽管浏览器窗口被缩到很小,但是坐标值却很大,因为是相对于屏幕坐标而不是浏览器的坐标。

    3)offsetX和offsetY

    这一对属性是指当事件发生时,鼠标点击位置相对于该事件源的位置,即点击该div,以该div左上角为原点来计算鼠标点击位置的坐标,如下所示:

    可以看到,点击该div的靠近左上角处,它的offsetX和offsetY为1,0,需要注意的是,IE,chrome,opera都支持该属性,唯独Firefox不支持该属性,Firefox中与此属性相对应的概念是,event.layerX和event.layerY,所以需要兼容浏览器时,获取鼠标点击位置相对于事件源的坐标的兼容写法为var disX=event.offsetX||event.layerX.

    4)pageX和pageY

    顾名思义,该属性是事件发生时鼠标点击位置相对于页面的位置,通常浏览器窗口没有出现滚动条时,该属性和event.clientX及event.clientY是等价的,但是当浏览器出现滚动条的时候,pageX通常会大于clientX,因为页面还存在被卷起来的部分的宽度和高度,如下所示:

     

    由于浏览器出现了垂直和水平的滚动条,所以pageX和pageY大于clientX和clientY。

    当浏览器的滚动条没有被拖动或者浏览器没有滚动条的时候,两者是相等的。

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

    http://www.cnblogs.com/dolphinX/archive/2012/11/19/2777756.html

    http://www.cnblogs.com/myzhibie/p/4256164.html?utm_source=tuicool

  • 相关阅读:
    iOS开发多线程篇 03 —线程安全
    【Objective-C】01-Objective-C概述
    insert小细节,大问题
    高速修复汉澳sinox命令解释程序bash shell漏洞
    load-on-startup 解释
    研究下JavaScript中的Rest參数和參数默认值
    UVALive 6530 Football (水
    Android多线程分析之五:使用AsyncTask异步下载图像
    POJ2407_Relatives【欧拉phi函数】【基本】
    cocos2d-x 下使用加密 sqlite3
  • 原文地址:https://www.cnblogs.com/autismtune/p/5264589.html
Copyright © 2011-2022 走看看