• JavaScript的DOM操作获取元素周边大小


    一、clientLeft 和 clientTop

      这组属性可以获取元素设置了左边框和上边框的大小,目前只提供了 Left 和 Top 这组,并没有提供 Right 和 Bottom。

    <script type="text/javascript">
        window.onload = function(){
            var box = document.getElementById("box");
            alert(box.clientLeft); 
            alert(box.clientTop);
        } 
    </script>
    <style type="text/css">
        .aaa{
            background:#ccc;
            200px;
            height:200px;
            border:10px solid red;
        }
    </style>
    </head>
    <body>
        <div id="box" class="aaa">测试Div</div>
    </body>

    二、offsetLeft 和 offsetTop

      1、这组属性可以获取当前元素相对于父元素的位置。 

          获取元素当前相对于父元素的位置,最好将它设置为定位 position:absolute;不要用外边距,否则不同的浏览器会有不同的解释。

            加上边框和内边距不会影响它的位置,但加上外边据会累加。

    <script type="text/javascript">
        window.onload = function(){
               var box = document.getElementById("box");
               alert(box.offsetLeft); //50
               alert(box.offsetTop);//50
        }   
    </script>
    <style type="text/css">
        /*
         body{
             margin:50px;
        }
        */
        .aaa{
            background:#ccc;
            200px;
            height:200px;
            position:absolute;
            top:50px;
            left:50px;
        }
    </style>
    </head>
    <body>
        <div id="box" class="aaa">测试Div</div>
    </body>

      2、得到父元素

        offsetParent 中,如果本身父元素是<body>,非 IE6,7,8 返回 body 对象,IE 6,7,8返回 html 对象。

        如果两个元素嵌套,如果上父元素没有使用定位 position:absolute,那么 offsetParent 将返回 body 对象或 html 对象。

        所以,在获取 offsetLeft 和 offsetTop 时候,CSS 定位很重要。

    <script type="text/javascript">
        window.onload = function(){
            var box = document.getElementById("box");
               alert(box.offsetParent);  //得到父元素,IE6,7,8得到的是HTML跟标签,其他得到的是body标签
        }
        
    </script>
    <style type="text/css">
    </style>
    </head>
    <body>
        <div id="box" class="aaa">测试Div</div>
    </body>
    <script type="text/javascript">
        window.onload = function(){
            var box = document.getElementById("box");
               alert(box.offsetParent);//父元素是id为pox的那个div,如果没加定位就变成body了
               alert(box.offsetTop);//20
               alert(box.offsetParent.offsetTop);//50
        }
    </script>
    <style type="text/css">
        #box{
            background:#ccc;
            200px;
            height:200px;
            margin:20px;
            
        }
        #pox{
            position:absolute;
            top:50px;
            left:50px;
            background:blue;
            400px;
            height:400px;
        }
    </style>
    </head>
    <body>
        <div id="pox">
            <div id="box" class="aaa">测试Div</div>
        </div>
    </body>

      如果多层的话,就必须使用循环或递归。

    <script type="text/javascript">
        window.onload = function(){
            var box = document.getElementById("box");
               alert(box.offsetParent);//父元素是id为pox的那个div,如果没加定位就变成body了
               alert(offsetLeft(box)+offsetLeft(box.offsetParent));//20
               alert(box.offsetParent.offsetTop);//50    
        }
        function offsetLeft(element) {
            var left = element.offsetLeft;                 //得到第一层距离
            var parent = element.offsetParent;             //得到第一个父元素
            while (parent !== null) {                     //如果还有上一层父元素left += parent.offsetLeft; //把本层的距离累加
                parent = parent.offsetParent;             //得到本层的父元素
            }                                             //然后继续循环
            return left;
        }
    </script>
    <style type="text/css">
        #box{
            background:#ccc;
            200px;
            height:200px;
            margin:20px;
            
        }
        #pox{
            position:absolute;
            top:50px;
            left:50px;
            background:blue;
            400px;
            height:400px;
        }
    </style>
    </head>
    <body>
        <div id="pox">
            <div id="box" class="aaa">测试Div</div>
        </div>
    </body>

    三、scrollTop 和 scrollLeft

      这组属性可以获取滚动条被隐藏的区域大小,也可设置定位到该区域。意思就是获取滚动条的位置(有滚动条的前提下)

    box.scrollTop; //获取滚动内容上方的位置
    box.scrollLeft; //获取滚动内容左方的位置

      如果要让滚动条滚动到最初始的位置,那么可以写一个函数:

    function scrollStart(element) {
      if (element.scrollTop != 0)
        element.scrollTop = 0;
    }

     四、getBoundingClientRect()

      这个方法返回一个矩形对象,包含四个属性:left、top、right和 bottom。分别表示元素各边与页面上边和左边的距离。

    <script type="text/javascript">
        window.onload = function(){
            var box = document.getElementById("box");
                alert(box.getBoundingClientRect().top); //元素上边距离页面上边的距离
                alert(box.getBoundingClientRect().right); //元素右边距离页面左边的距离
                alert(box.getBoundingClientRect().bottom); //元素下边距离页面上边的距离
                alert(box.getBoundingClientRect().left); //元素左边距离页面左边的距离
        }
    </script>
    <style type="text/css">
        #box{
            background:#ccc;
            200px;
            height:200px;
            position:absolute;
            top:50px;
            left:50px;    
        }
    </style>
    </head>
    <body>
        <div id="box" class="aaa">测试Div</div>
    </body>

      IE、Firefox3+、Opera9.5、Chrome、Safari 支持,在 IE 6,7,8中,默认坐标从(2,2)开始计算,导致最终距离比其他浏览器多出两个像素,需要做个兼容。

    <script type="text/javascript">
        window.onload = function(){
            var box = document.getElementById("box");
            alert(document.documentElement.clientTop); //IE6,7,8 为 2其他为0
            alert(document.documentElement.clientLeft); //IE6,7,8 为2其他为0
                
            alert(getRect(box).top); //元素上边距离页面上边的距离
            alert(getRect(box).right); //元素右边距离页面左边的距离
            alert(getRect(box).bottom); //元素下边距离页面上边的距离
            alert(getRect(box).left); //元素左边距离页面左边的距离
        }
        function getRect(element) {
            var rect = element.getBoundingClientRect();
            var top = document.documentElement.clientTop;
            var left = document.documentElement.clientLeft;
            return {
                top : rect.top - top,
                bottom : rect.bottom - top,
                left : rect.left - left,
                right : rect.right - left
            }
        }
    </script>
    <style type="text/css">
        #box{
            background:#ccc;
            200px;
            height:200px;
            position:absolute;
            top:50px;
            left:50px;    
        }
    </style>
    </head>
    <body>
        <div id="box" class="aaa">测试Div</div>
    </body>
  • 相关阅读:
    Java学习之IO之File类一
    Java学习之二分查找算法
    Java学习之国际化程序
    Java学习之自定义异常
    Java学习之开篇—个人随想
    pl/sql 的 put和put_line区别
    Java中static、final用法
    一个包含所有c++的头文件的头文件
    Codeforces Round #379 (Div. 2)
    hdu-5977 Garden of Eden(树分治)
  • 原文地址:https://www.cnblogs.com/LO-ME/p/4591453.html
Copyright © 2020-2023  润新知