DOM学习实用路线(11)——DOM元素的尺寸获取-获取页面及可视区的绝对位置

元素的尺寸获取




  • getBoundingClientRect()
    • left 元素左侧距离可视区左侧距离
    • top 元素顶部距离可视区顶部距离
    • right 元素右侧距离可视区左侧距离
    • bottom 元素底部距离可视区顶部距离
    • width 可视宽度
    • height 可视高度

元素相对可视区的位置(不太兼容)



<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        div {
            height: 500px;
            border: 1px solid #000;
        }
        #box {
            background: red;
        }
    </style>
</head>
<body>
<div></div>
<div></div>  
<div></div>
<div id="box"></div>   
<div></div>
<div></div>
<div></div>
<script>
{
    let box = document.querySelector("#box");
    box.onclick = function(){
        console.log(this.getBoundingClientRect());
    };
}
</script>
</body>
</html>

在这里插入图片描述
bottom: 元素底部,相对可视区顶部的距离
height: 元素的可视高度
left: 元素的左侧相对于可视区左侧的距离
right: 元素的右侧相对于可视区左侧的距离
top: 元素顶部相对可视区顶部的距离
width: 元素的可视宽度
在这里插入图片描述

获取元素相对于页面的位置



getBoundingClientRect()不太兼容,可以借助offset获取元素相对于页面的位置。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        #box {
            margin: 50px auto;
            position: relative;
            width: 500px;
            height: 500px;
            border: 1px solid #000;
        }
        #div {
            position: absolute;
            left: 100px;
            top: 100px;
            width: 100px;
            height: 100px;
            padding: 30px;
            border: 5px solid #000;
            background: red;
        }
    </style>
</head>
<body>
 <div id="box">
     <div id="div"></div>
 </div>   
<script>

{
    let div = document.querySelector("#div");
    let l = div.offsetLeft;             // div 相对于box的距离
    l += div.offsetParent.offsetLeft;   // box 相对于其父级(可视区)的距离
    console.log(l,div.getBoundingClientRect().left);
}

</script>    
</body>
</html>

多了0.5,因为offset是老版本方法,很多浏览器没法精确到小数位,但是getBoundingClientRect做了小数位的精确。
注意:要是多层次定位父级,得一层层获取,因此最好这里再封装一下!
在这里插入图片描述

封装:获取页面绝对尺寸



<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        body {
            margin: 0;
        }
        #box {
            position: relative;
            left: 100px;
            top: 100px;
            width: 500px;
            height: 500px;
            border: 1px solid #000;
        }
        #div {
            position: absolute;
            left: 100px;
            top: 100px;
            width: 100px;
            height: 100px;
            padding: 30px;
            border: 5px solid #000;
            background: red;
        }
    </style>
</head>
<body>
 <div id="box">
     <div id="div"></div>
 </div>   
<script>
{
    let div = document.querySelector("#div");
    console.log(getPageOffset(div));
}
function getPageOffset(el){
    let left = el.offsetLeft;
    let top =  el.offsetTop;
    while(el.offsetParent){
        el = el.offsetParent;
        left += el.offsetLeft + el.clientLeft;
        top += el.offsetTop + el.clientTop;
    }
    return {left,top};
}

</script>    
</body>
</html>

在这里插入图片描述


为了更加精确加上边框距离

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>
            body {
                margin: 0;
            }
            #box {
                position: relative;
                left: 100px;
                top:100px;
                width: 500px;
                height: 500px;
                border: 1px solid #000;
            }
            #div {
                position: absolute;
                left: 100px;
                top: 100px;
                width: 100px;
                height: 100px;
                padding: 30px;
                border: 5px solid #000;
                background: red;
            }
        </style>
    </head>
    <body>
     <div id="box">
         <div id="div"></div>
     </div>    
<script>
{
    let div = document.querySelector("#div");
    console.log(getPageOffset(div));
}
function getPageOffset(el){
    let left = el.offsetLeft;
    let top =  el.offsetTop;
    while(el.offsetParent){
        el = el.offsetParent;
        left += el.offsetLeft + el.clientLeft;
        top += el.offsetTop + el.clientTop;
    }
    return {left,top};
}

</script>    
</body>
</html>

在这里插入图片描述




(后续待补充)

发布了34 篇原创文章 · 获赞 12 · 访问量 2521

猜你喜欢

转载自blog.csdn.net/u013946061/article/details/105435212