JavaScript中的三大系列offset、client、scroll

目录

零、码仙励志

一、offset系列

1.offsetWidth和offsetHeight

2.offsetTop和offsetLeft

3.offsetParent

二、scroll系列

1.clientWidth和clientHeight

2、clientTop和clientLeft (不常用)

3、clientX和clientY

三、scroll系列

1、scrollWidth和scrollHeight

2、scrollTop和scrollLeft


零、码仙励志

成功不是让周围的人都羡慕你,称赞你,而是让周围的人都需要你,离不开你

一、offset系列

1.offsetWidth和offsetHeight

offsetWidth = width+padding+border;

offsetWidth(元素实际宽)与自身的border、padding、widtht有关,与父元素无关(就是边框到边框的距离)

offsetHeight = height+padding+border;

offsetHeight (元素实际高)与自身的border、padding、height有关,与父元素无关(就是边框到边框的距离)

offsetHeight  代码请参考  offsetWidth

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        div {
            width: 100px;
            height: 50px;
            border: 10px solid pink;
            padding: 20px;
            margin: 30px;
        }
    </style>
</head>
<body>
<div id="dv"></div>
<script>
    //结果是160,因为有俩个border和padding
    //100+2*10+2*20=160
    console.log(document.getElementById("dv").offsetWidth);
</script>
</body>

2.offsetTop和offsetLeft

1.父元素没有脱离文档流

offsetTop  对齐浏览器,自身最边缘(边框)到客户区最上端的距离

offsetTop = 元素到浏览器的高度

offsetLeft  对齐浏览器,自身最边缘(边框)到客户区最左端的距离

offsetLeft = 元素到浏览器最左端的距离

offsetLeft  代码请参考  offsetTop

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        #dv1 {
            width: 300px;
            height: 200px;
            border: 10px solid pink;
            padding: 20px;
            margin: 30px;
        }

        #dv2 {
            width: 100px;
            height: 50px;
            border: 10px solid pink;
            padding: 20px;
            margin: 30px;
            background-color: aqua;
        }
    </style>
</head>
<body>
<div id="dv1">
    <div id="dv2"></div>
</div>
<script>
    //结果是90
    console.log(document.getElementById("dv2").offsetTop);
</script>
</body>

2.父元素脱离文档流(position:absolute;)

offsetTop  对齐父元素,自身最边缘(边框)到父级最上端的距离

offsetTop = 元素到父级的高度

offsetLeft  对齐父元素,自身最边缘(边框)到父级最左端的距离

offsetLeft = 元素到父级最左端的距离

offsetLeft  代码请参考  offsetTop

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        #dv1 {
            width: 300px;
            height: 200px;
            border: 10px solid pink;
            padding: 20px;
            margin: 30px;
            position: absolute;
        }

        #dv2 {
            width: 100px;
            height: 50px;
            border: 10px solid pink;
            padding: 20px;
            margin: 30px;
            background-color: aqua;
        }
    </style>
</head>
<body>
<div id="dv1">
    <div id="dv2"></div>
</div>
<script>
    //结果是50
    console.log(document.getElementById("dv2").offsetTop);
</script>

3.offsetParent

返回该对象的父级

如果当前元素的父级元素没有进行CSS定位(position为absolute或relative,fixed),offsetParent为body。

如果当前元素的父级元素中有CSS定位,offsetParent取最近的那个父级元素

 1.当前元素的父级元素没有进行CSS定位

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
    </style>
</head>
<body>
<div id="dv1">
    <div id="dv2"></div>
</div>
<script>
    console.log(document.getElementById("dv2").offsetParent);
</script>
</body>

 2.当前元素的父级元素中有CSS定位

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #dv1{
            position: absolute;
        }
    </style>
</head>
<body>
<div id="dv1">
    <div id="dv2"></div>
</div>
<script>
    console.log(document.getElementById("dv2").offsetParent);
</script>
</body>

二、scroll系列

1.clientWidth和clientHeight

获取网页可视区域宽高

调用者不同,意义不同:

- 盒子调用:用来检测盒子的宽高+padding;

clientWidth = width+padding;不包含border和margin,而且不会被内容左右

- body/htm调用:可视区域大小;

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0px;
            padding: 0px;
        }
        #dv1 {
            width: 100px;
            height: 50px;
            margin: 20px;
            padding: 10px;
            border: 2px solid pink;
            background-color: aqua;
        }
    </style>
</head>
<body>
<div id="dv1"></div>
<script>
    //100+10*2=120
    console.log(document.getElementById("dv1").clientWidth);
    //50+10*2=70
    console.log(document.getElementById("dv1").clientHeight);
    console.log(document.body.clientWidth);
    //50+10*2+2*2=74
    console.log(document.body.clientHeight);
</script>
</body>

2、clientTop和clientLeft (不常用)

clientTop:检测盒子的上border 
clientLeft:检测盒子的左border

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0px;
            padding: 0px;
        }
        #dv1 {
            width: 100px;
            height: 50px;
            margin: 20px;
            padding: 10px;
            border: 2px solid pink;
            background-color: aqua;
        }
    </style>
</head>
<body>
<div id="dv1"></div>
<script>
    //2
    console.log(document.getElementById("dv1").clientTop);
    //2
    console.log(document.getElementById("dv1").clientLeft);
</script>
</body>

3、clientX和clientY

调用者为  window.event  或者  事件参数对象e,检测鼠标距离可视区域的宽高

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0px;
            padding: 0px;
        }
        #dv1 {
            width: 50px;
            height: 50px;
            background-color: aqua;
            position: absolute;
        }
    </style>
</head>
<body>
<div id="dv1"></div>
<script>
    //鼠标在页面中移动,div跟着鼠标移动
    document.onmousemove = function (e) {
        //鼠标的移动的横纵坐标
        //可视区域的横坐标
        document.getElementById("dv1").style.left = e.clientX + "px";
        //可视区域的纵坐标
        document.getElementById("dv1").style.top = e.clientY + "px";
    };
</script>
</body>

三、scroll系列

1、scrollWidth和scrollHeight

检测盒子的宽高

scrollHeight = height + padding; //不包括border和margin;

如果  盒子里面元素的宽度或者高度  大于  盒子的宽度或者高度,scrollWidth和scrollHeight就是盒子里面元素的宽度或者高度

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0px;
            padding: 0px;
        }

        #dv1 {
            width: 100px;
            height: 50px;
            margin: 20px;
            padding: 10px;
            border: 2px solid pink;
            background-color: aqua;
            position: absolute;
        }
    </style>
</head>
<body>
<div id="dv1"></div>
<script>
    //100+10*2=120
    console.log(document.getElementById("dv1").scrollWidth);
    //50+10*2=70
    console.log(document.getElementById("dv1").scrollHeight);
</script>

盒子里面元素的高度大于盒子的高度

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0px;
            padding: 0px;
        }
        #dv1 {
            width: 100px;
            height: 50px;
            margin: 20px;
            padding: 10px;
            border: 2px solid pink;
            background-color: aqua;
            position: absolute;
        }
    </style>
</head>
<body>
<div id="dv1">码仙码仙码仙码仙码仙码仙码仙码仙码仙码仙码仙码仙码仙码仙码仙</div>
<script>
    console.log(document.getElementById("dv1").scrollWidth);
    console.log(document.getElementById("dv1").scrollHeight);
</script>
</body>

2、scrollTop和scrollLeft

被卷去的头部和左侧(浏览器无法显示的头部和左部)

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0px;
            padding: 0px;
        }

        body {
            height: 2000px;
        }

        #dv1 {
            width: 50px;
            height: 50px;
            background-color: aqua;
            position: absolute;
        }
    </style>
</head>
<body>
<div id="dv1"></div>
<script>
    //鼠标在页面中移动,div跟着鼠标移动
    document.onmousemove = function (e) {
        //有的浏览器把高度设计在了文档的第一个元素中了
        //有的浏览器把高度设计在了body中了
        //document.documentElement.scrollTop;//文档的第一个元素
        //document.body.scrollTop;

        //卷去的横纵坐标
        var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
        //卷去的纵坐标
        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
        //可视区域的横坐标+卷去的横坐标
        document.getElementById("dv1").style.left = e.clientX + scrollLeft + "px";
        //可视区域的纵坐标+卷去的纵坐标
        document.getElementById("dv1").style.top = e.clientY + scrollTop + "px";
    };
</script>
</body>

猜你喜欢

转载自blog.csdn.net/tswc_byy/article/details/82948994