Js:offsetWidth的Bug

本文解释了HTML元素offsetWidth属性的含义,并通过一个实例说明了它实际上代表的是元素盒模型的总宽度,包括width、padding和border。展示了如何正确理解和使用这一属性避免编程中的常见错误。

offsetWidth 得到的并不是当前元素width的宽度,而是当前元素盒模型的宽度。
例如:

#div1{width:200px; height:200px; border:1px solid black; background:red; padding:5px;}
<div>test<div>

这个时候的offsetWidth应该是200px+1px(左边框)+1px(右边框)+5px(左内边距)+5px(右内边距)


如果分不清这个会导致程序出问题。如下:

<script>
    setInterval(funtion(){
        var oDiv = document.getElementById("div1);
        oDiv.style.width = oDiv.offsetWidth - 1 + "px";
},30)
</script>
<style>
#div1{width:200px; height:200px; border:1px solid black; background:red;}
</style>
<body>
    <div id="id1"></div>
</body>

div1会越来越宽,而不是越来越窄。
因为定时器第一次执行时
offsetWidth是202px,-1之后是201px赋值给width(这里是元素的实际宽度)
定时器第二次执行时
offsetWidth是203px(201之前赋值给width的值+2边框),-1之后是202px赋值给width
……
所以div1会越变越宽而不是越变窄

转载于:https://www.cnblogs.com/czm0718/p/5203935.html

### ClientWidth 与 OffsetWidth 的区别及用法 #### 定义与特性 - **ClientWidth** 是指元素的可视宽度,包括内容区域和内边距(padding),但不包括边框(border)、外边距(margin)以及滚动条。如果元素的内容超出了其可视区域并且有滚动条,则 `clientWidth` 不会包含滚动条的宽度[^2]。 - **OffsetWidth** 是指元素的整体宽度,包括内容区域、内边距(padding)、边框(border),但不包括外边距(margin)。它是一个只读属性,返回值为整数,单位是像素(px)。`offsetWidth` 可能比 `clientWidth` 大,因为前者还包含了边框的宽度[^3]。 #### 区别总结 | 属性 | 包含内容 | 是否包含边框 | 是否包含滚动条 | |---------------|------------------------------|--------------|----------------| | **ClientWidth** | 内容区域 + 内边距 | 否 | 否 | | **OffsetWidth** | 内容区域 + 内边距 + 边框 | 是 | 否 | #### 示例代码 以下是一个示例代码,用于展示 `clientWidth` 和 `offsetWidth` 的差异: ```javascript // 获取元素 const element = document.getElementById("example"); // 输出 clientWidth console.log("clientWidth: " + element.clientWidth); // 仅包含内容和内边距 // 输出 offsetWidth console.log("offsetWidth: " + element.offsetWidth); // 包含内容、内边距和边框 ``` 在上述代码中,假设 `#example` 元素设置了 `width: 200px; padding: 10px; border: 5px solid black;`,那么: - `clientWidth` 的值将是 `200 + 2 * 10 = 220`[^2]。 - `offsetWidth` 的值将是 `220 + 2 * 5 = 230`[^3]。 #### 实际应用场景 - **ClientWidth** 常用于需要获取元素内部可用宽度的场景,例如计算内容是否超出可视区域或调整内容布局。 - **OffsetWidth** 更适合于需要了解元素整体尺寸的情况,例如在进行页面布局或动画时考虑边框的影响。 ### 注意事项 - 如果元素存在滚动条,`clientWidth` 不会包含滚动条的宽度,而 `offsetWidth` 则可能间接反映出滚动条的存在,因为它通常大于 `clientWidth`。 - 在跨浏览器开发时,需注意不同浏览器对这些属性的具体实现可能存在细微差异[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值