所以,我有#Wrapper
一个固定宽度的 DIV。在那个 DIV 里面,我有另一个 DIV #Panel
,它也有一个固定的宽度:
<div id="Wrapper">
<p>...</p>
<div id="Panel">Panel</div>
<p>...</p>
</div>
有时,Panel 的宽度大于 Wrapper 的宽度,在这种情况下,我想通过 JavaScript 加宽 Wrapper,使其完美地包裹 Panel。
现场演示:http: //jsfiddle.net/H6rML/
我打算.scrollWidth
在 Wrapper 上使用来确定 Panel 的宽度。但是,问题在于 Wrapper 具有水平填充,并且由于.scrollWidth
某种原因仅包括 wrapper 的左侧填充。所以:
Wrapper.scrollWidth === Wrapper.LeftPadding + Panel.Width
所以,给定:
#Wrapper {
width: 200px;
padding: 10px;
}
#Panel {
width: 300px;
}
Wrapper.scrollWidth
return 310px
,这不是很有用。如果.scrollWidth
不包含任何填充并且只返回面板的宽度,我可以使用它(我会手动将填充添加到该值)。如果两个填充都包括在内,我也可以使用它。但是为什么只包括左边的填充?(顺便说一句,这种行为似乎是跨浏览器的。)
一些附加说明:
我无法直接在 Wrapper 上设置宽度。在我的实际代码中,我在比 Wrapper 高几级的祖先元素上设置了宽度,并使用自定义 API 来设置宽度。这就是为什么我需要检索全部
320px
价值。我想要一个不依赖于 Wrapper 内容的解决方案。在我的演示中,它是一个面板,但在其他情况下,可能会有不同的元素溢出,甚至是多个元素。这就是我
.scrollWidth
选择 Wrapper 的原因。
有没有一种方法可以获取值320px
而无需手动为值添加正确的填充.scrollWidth
?
顺便说一句,根据标准,应该包括正确的填充:
scrollWidth 属性必须返回运行这些步骤的结果:
如果元素没有任何关联的 CSS 布局框,则返回零并终止这些步骤。
如果元素是根元素并且 Document 不是 quirks 模式,则返回 max(document content width, value of innerWidth)。
如果元素是 HTML body 元素并且 Document 处于 quirks 模式,则返回 max(document content width, value of innerWidth)。
返回“padding-left”属性的计算值,加上“padding-right”的计算值,再加上元素的内容宽度。
资料来源:http ://www.w3.org/TR/cssom-view/
为什么浏览器的行为不相应?
为了进一步提高我的帖子的清晰度,让我总结两个主要问题:
(1) 如果标准规定应该在.scrollWidth
值中包含正确的填充,那么为什么浏览器不采取相应的行为呢?
(2) 是否可以检索正确的值(320px
在我的情况下),而无需手动添加正确的填充?
这个问题已经在另一个帖子里回答了
这个问题的答案在这里:当子元素水平溢出时,为什么忽略了父元素的右填充?
</p>