【问题标题】:Why does padding add to the visible width of an element even when box-sizing is set to border-box?为什么即使 box-sizing 设置为 border-box,内边距也会增加元素的可见宽度?
【发布时间】:2015-03-06 04:00:32
【问题描述】:

所以我使用 Semantic-ui 进行编码,并且我在 flexbox 容器中有两个彼此相邻的切换框(复选框)。当窗口大小减小时,它们会环绕以使一个在另一个之上。

为了让它们散开一点,我添加了大约 5 像素的右侧和底部填充。但是我注意到一个奇怪的行为。填充会导致盒子水平分开,但是当垂直堆叠时,它们之间没有空间,即使每个盒子都有底部填充。

进一步调查显示,复选框的box-sizing 属性设置为border-box。看完后发现border-box盒子模型计算的宽高包括padding和border。

复选框的高度为 1.5rem。

我的问题如下。据我了解,使用边框框时,填充不应该改变元素的大小。然而,只有在链接的 jsfiddle 中设置了明确的尺寸时,这似乎才是正确的。高度已设置,因此底部填充不会作为额外添加。但宽度不是,右填充对 div 的可见宽度有影响。

为什么会这样?当然,填充应该对元素的大小没有影响(除非设置为比元素本身大的荒谬的东西),无论我是否定义了明确的宽度或将其留给计算?

JSFiddle:http://jsfiddle.net/Astridax/8cd48emn/

请尝试使用开发工具切换填充以了解我的意思。

【问题讨论】:

    标签: html padding css


    【解决方案1】:

    据我了解,使用边框框时,填充不应改变元素的大小。

    这就是你感到困惑的地方。以下是规范对此主题的说明:http://www.w3.org/TR/css3-ui/#box-sizing0

    边框

    指定的宽度和高度(以及相应的最小值/最大值 properties) 在这个元素上确定元素的边框。 也就是说,元素上指定的任何填充或边框都会被布局 并在这个指定的宽度和高度内绘制。内容宽度 和高度是通过减去边框和填充宽度来计算的 指定“宽度”和“高度”的相应边 特性。由于内容的宽度和高度不能为负 ([CSS21],第 10.2 节),此计算的下限为 0。

    box-sizing设置为border-box的实际效果是指定宽度会说包括边框和内边距。规范没有说明 未指定的 宽度,因此它们被视为正常宽度 - 与包含内容、填充和边框所需的宽度一样宽。

    编辑:

    你暗示应该发生的事情实际上是不可能做到的,原因如下。假设您在div 中有内容,这样auto 的宽度仅内容就是500px。然后在其周围放置一个 20 像素的填充。

    #myDiv {
        padding: 20px;
        width: auto;
    }
    

    没问题 - 你有一个 540 像素宽的 div,默认情况下盒子大小为 content-box

    好的,让我们将box-sizing 更改为border-box

    #myDiv {
        box-sizing: border-box;
        padding: 20px;
        width: auto;
    }
    

    您的建议应该是现在应该忽略填充。所以我们有一个具有 500px 内容的 div,我们现在将在 500px 内包含填充,而不是扩展 div 的宽度。但是等等 - 现在内容框已经缩小到 460 像素以允许填充,并且框的整体大小为 500 像素。但是等等,我们不应该在计算宽度时考虑填充,所以我们最好将 div 渲染为 460px 对吧?

    你看到问题了吗?你可以这样无限下去。

    【讨论】:

    • 这是规范不是很清楚的地方,至少对我来说不是。 “指定的宽度和高度”到底指的是什么?任何不是初始值auto? “指定值”在 CSS 中有着非常明确的含义,并不是“任何不是初始值的东西”。看起来盒子尺寸规格需要澄清一下。
    • 在此元素上指定的宽度和高度(以及相应的最小/最大属性) 似乎显然是指 CSS 的高度和宽度属性。在 OP 的示例中,他没有指定宽度,因此 border-box 规则不适用(毕竟,这可能如何工作 - 如果您考虑一下 OP 的要求在逻辑上是不可能的)。
    • 这就是我所说的“除了初始值之外的任何东西”——因为仍然可以设置宽度:自动,但它仍然与根本不设置它实际上是一样的。这对我来说是有道理的,但我仍然认为规范可以更清楚地说明这一点。
    • 我在这里同意@BoltClock。我知道规范中提到了指定的宽度,但是对于未设置宽度和高度时会发生什么情况并不是很清楚。正如您所指出的,它显然会像使用普通盒子模型一样做出响应,但这是故意的吗?这在逻辑上不一定是不可能的。可以使用元素内容计算宽度属性,然后按照规范中的定义减去填充和边框大小,就像显式定义了高度和宽度一样。这至少是我期望从边界框发生的事情。
    • @BoltClock "auto" 没有指定高度或宽度,"auto" 指示浏览器计算高度或宽度。
    猜你喜欢
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 2020-07-28
    • 2020-07-02
    • 2014-02-28
    • 2019-05-03
    相关资源
    最近更新 更多