clientWidth和offsetWidth的区别

diyxiaoshitou

clientWidth

是一个只读属性,返回元素的内部宽度,该属性包括内边距,但不包括垂直滚动条(如果有)、边框和外边距。
用法:

var offsetWidth = element.clientWidth;

计算方法:

clientWidth = width + padding

offsetWidth

是一个只读属性,返回一个元素的布局宽度。一个典型的offsetWidth是测量包含元素的边框、水平线上的内边距、竖直方向滚动条(如果有的话)、以及CSS设置的宽度(width)值。

用法:

var offsetWidth = element.offsetWidth;

计算方法:

clientWidth = width + padding + scrollWidth + border
<!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>
        #parent {
            width: 200px;
            height: 200px;
            background-color: red;
        }
    </style>
</head>

<body>
    <div id="parent"></div>
    <script>
        var clientWidth = window.document.getElementById("parent").clientWidth;
        var offsetWidth = window.document.getElementById("parent").offsetWidth;
        console.log(clientWidth);  //200
        console.log(offsetWidth);  //200
    </script>
</body>

</html>

当我们给上面parent元素加上边框内边距时:

 #parent {
            width: 200px;
            height: 200px;
            background-color: red;
            border: 10px solid black;
            padding: 10px;
        }

显示结果如图:
image.pngimage.png
输出结果为:
// clientWidth: 220
// offsetWidth: 240

计算规则

(clientWidth)220 = 200(width) + 10(padding) + 10(padding)
(offsetWidth)240 = 200(width) + 10(padding) + 10(padding) + 10(border) + 10(border)

现在我们给parent加一个子元素,并让滚动条出现,完整代码如下:

<!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>
        #parent {
            width: 200px;
            height: 200px;
            background-color: red;
            border: 10px solid black;
            padding: 10px;
            overflow: auto;
        }
        
        #son {
            width: 300px;
            height: 300px;
        }
    </style>
</head>

<body>
    <div id="parent">
        <div id="son"></div>
    </div>
    <script>
        var clientWidth = window.document.getElementById("parent").clientWidth;
        var offsetWidth = window.document.getElementById("parent").offsetWidth;
        console.log(clientWidth);
        console.log(offsetWidth);
    </script>
</body>

</html>

显示结果如图:
image.pngimage.png

输出信息如下:
// 205
// 240
对于上述代码作个简要说明,clientWidth值为205是这样计算来的:原本我们设置parent的宽度为200,因为我们设置了父元素overflow:scroll属性出现滚动条后,滚动条宽度被包括在这个设置的宽度之内。chrome浏览器滚动条默认宽度为15,所以parent宽度就只剩185。
计算规则:
(clientWidth)205 = 185(实际width) + 10(padding) + 10(padding)
(offsetWidth)240 = 185(实际width) + 10(padding) + 10(padding) + 10(border) + 10(border) + 15(scrollWidth)

阅读 2.4k
28 声望
0 粉丝
0 条评论
你知道吗?

28 声望
0 粉丝
文章目录
宣传栏