【问题标题】:How to disable margin-collapsing?如何禁用边距折叠?
【发布时间】:2013-11-12 04:10:41
【问题描述】:

有没有办法完全禁用边距折叠?我找到的唯一解决方案(称为“展开”)需要使用 1px 边框或 1px 填充。我觉得这是不可接受的:无关的像素无缘无故地使计算复杂化。有没有更合理的方法来禁用这种边距折叠?

【问题讨论】:

标签: css margin collapse


【解决方案1】:

试试

{
 display:flex;
 flex-direction:column;
}

{
   display:grid;
}

【讨论】:

    【解决方案2】:

    为防止同级之间的边距折叠,请将display: inline-block; 添加到其中一个同级(一个就足够了,尽管您可以将它添加到两个)。

    【讨论】:

      【解决方案3】:

      您也可以为此使用良好的旧 micro clearfix。

      #container::before, #container::after{
          content: ' ';
          display: table;
      }
      

      查看更新的小提琴:http://jsfiddle.net/XB9wX/97/

      【讨论】:

      • 已将我的答案变成了社区 wiki。请随时用您的答案扩展它。谢谢。
      • 我不明白,当我查看该示例时,边距正在折叠(div 之间只有 10px 的垂直空间而不是 20px)
      • 这仅有助于消除已应用此 clearfix 的兄弟姐妹之间的崩溃。我已经分叉了这个例子来证明这一点:jsfiddle.net/dpyuyg07 --- 甚至这还不是全部。它只会消除因您应用了该修复程序的元素的子元素而导致的边距塌陷。如果您在容器本身上添加边距,边距仍然会折叠,这可以在这个 fork 中看到:jsfiddle.net/oew7qsjx
      • 我可以更准确地说: clearfix 方法只能防止父母和孩子之间的边距塌陷。它不影响相邻兄弟之间的折叠。
      • 我想我现在明白 Bootstrap 倾向于用 :before:after 元素填充 DOM。我现在已将此规则添加到我的样式表中:div:before, div:after{content: ' '; display: table;}。极好的。突然间,事情开始按预期运行。
      【解决方案4】:

      在较新的浏览器(不包括 IE11)中,防止父子页边距折叠的简单解决方案是使用display: flow-root。但是,您仍然需要其他技术来防止相邻元素折叠。

      演示(之前)

      .parent {
        background-color: grey;
      }
      
      .child {
        height: 16px;
        margin-top: 16px;
        margin-bottom: 16px;
        background-color: blue;
      }
      <div class="parent">
      <div class="child"></div>
      <div class="child"></div>
      <div class="child"></div>
      </div>

      演示(之后)

      .parent {
        display: flow-root;
        background-color: grey;
      }
      
      .child {
        height: 16px;
        margin-top: 16px;
        margin-bottom: 16px;
        background-color: blue;
      }
      <div class="parent">
      <div class="child"></div>
      <div class="child"></div>
      <div class="child"></div>
      </div>

      【讨论】:

        【解决方案5】:

        边距折叠有两种主要类型:

        • 折叠相邻元素之间的边距
        • 折叠父元素和子元素之间的边距

        仅在后一种情况下使用填充或边框将防止折叠。此外,任何与应用于父级的默认值 (visible) 不同的 overflow 值都将防止崩溃。因此,overflow: autooverflow: hidden 将具有相同的效果。使用hidden 时的唯一区别可能是如果父级具有固定高度,则隐藏内容的意外后果。

        一旦应用于父级,可以帮助修复此行为的其他属性是:

        • float: left / right
        • position: absolute
        • display: inline-block / flex

        您可以在这里测试所有这些:http://jsfiddle.net/XB9wX/1/

        我应该补充一点,像往常一样,Internet Explorer 是个例外。更具体地说,在 IE 7 中,当为父元素指定某种布局时,边距不会折叠,例如 width

        来源:Sitepoint 的文章Collapsing Margins

        【讨论】:

        • 请注意,如果它不是零值,填充也会影响这一点
        • 注意overflow: auto会导致滚动条出现在父元素中,而不是像overflow: visible那样让溢出内容溢出。
        • 感谢展示:inline-block,它救了我 :)
        • flex 的任何不同于其默认值的值也将禁用边距折叠
        • 一旦浏览器支持有所提升,display: flow-root 可能是首选方法。
        【解决方案6】:

        每个基于 webkit 的浏览器都应该支持属性-webkit-margin-collapse。还有一些子属性只为顶部或底部边距设置它。您可以为其指定值折叠(默认)、丢弃(如果有相邻边距,则将边距设置为 0)和分离(防止边距折叠)。

        我已经测试过这适用于 2014 版的 Chrome 和 Safari。不幸的是,我认为 IE 不支持此功能,因为它不是基于 webkit。

        阅读Apple's Safari CSS Reference了解完整说明。

        如果您检查Mozilla's CSS webkit extensions page,他们会将这些属性列为专有属性并建议不要使用它们。这是因为它们可能不会很快进入标准 CSS,并且只有基于 webkit 的浏览器才会支持它们。

        【讨论】:

        • 这很好,因为它可以帮助我们解决 Safari 和 Chrome 处理边距的不一致问题。
        • 看起来属性 -webkit-margin-collapse 在 Chrome v85 中已被删除。我在一些工具中使用了它,但现在测试失败了。
        【解决方案7】:

        据我所知,禁用没有视觉影响的边距折叠的一个巧妙技巧是将父级的填充设置为0.05px

        .parentClass {
            padding: 0.05px;
        }
        

        内边距不再为 0,因此不会再发生折叠,但同时内边距足够小,在视觉上它会向下舍入为 0。

        如果需要其他填充,则仅将填充应用于不需要边距折叠的“方向”,例如padding-top: 0.05px;

        工作示例:

        .noCollapse {
          padding: 0.05px;
        }
        
        .parent {
          background-color: red;
          width: 150px;
        }
        
        .children {
          margin-top: 50px;
        
          background-color: lime;      
          width: 100px;
          height: 100px;
        }
        <h3>Border collapsing</h3>
        <div class="parent">
          <div class="children">
          </div>
        </div>
        
        <h3>No border collapsing</h3>
        <div class="parent noCollapse">
          <div class="children">
          </div>
        </div>

        编辑:将值从 0.1 更改为 0.05。正如 Chris Morgan 在下面的评论中提到的以及来自this small test 的那样,Firefox 似乎确实考虑了0.1px 填充。不过,0.05px 似乎可以解决问题。

        【讨论】:

        • 这是我最喜欢的解决方案。您甚至可以将其作为默认样式。为什么不? *{padding-top:0.1px}。我们确定它适用于所有浏览器吗?
        • 到目前为止对我来说工作得很好,但我并没有声称在大多数浏览器中都对其进行了彻底的测试。
        • 非常好的解决方案,它似乎在大多数浏览器上都能正常工作。感谢分享!
        • 这是一个狡猾的解决方案,因为它确实在各种情况下添加了额外的像素,这是由于高 DPI 显示和亚像素计算。 (Firefox 已经做了很长时间的亚像素布局,我相信其他浏览器最近也纷纷效仿。)
        • 0.05px 似乎仍然是一个特定的选择,而不是随机的浏览器欺骗号码,我更喜欢0.01px
        【解决方案8】:

        实际上,有一个可以完美运行:

        显示:弹性; 弹性方向:列;

        只要你能忍受只支持 IE10 及更高版本

        .container {
          display: flex;
          flex-direction: column;
            background: #ddd;
            width: 15em;
        }
        
        .square {
            margin: 15px;
            height: 3em;
            background: yellow;
        }
        <div class="container">
            <div class="square"></div>
            <div class="square"></div>
            <div class="square"></div>
        </div>
        <div class="container">
            <div class="square"></div>
            <div class="square"></div>
            <div class="square"></div>
        </div>

        【讨论】:

        • 要使其成为通用解决方案,必须在.container 中添加一个额外的&lt;div&gt;,否则.container 将控制其孩子的盒子模型。例如,内联元素会变成全宽块元素;如果它们有边距,它们也会被边距折叠。
        【解决方案9】:

        为了您的信息,您可以使用 网格但有副作用:)

        .parent {
          display: grid
        }
        

        【讨论】:

          【解决方案10】:

          由于父级将position 设置为相对,我遇到了类似的边距崩溃问题。以下是可用于禁用边距折叠的命令列表。

          这里是测试的游乐场

          只需尝试将任何parent-fix* 类分配给div.container 元素,或将任何children-fix* 类分配给div.margin。选择最适合您的需求。

          什么时候

          • margin collapsing禁用,红色背景的div.absolute将位于页面的最顶部。
          • ma​​rgin is collapsing div.absolute 将定位在与 div.margin 相同的 Y 坐标上

          html, body { margin: 0; padding: 0; }
          
          .container {
            width: 100%;
            position: relative;
          }
          
          .absolute {
            position: absolute;
            top: 0;
            left: 50px;
            right: 50px;
            height: 100px;
            border: 5px solid #F00;
            background-color: rgba(255, 0, 0, 0.5);
          }
          
          .margin {
            width: 100%;
            height: 20px;
            background-color: #444;
            margin-top: 50px;
            color: #FFF;
          }
          
          /* Here are some examples on how to disable margin 
             collapsing from within parent (.container) */
          .parent-fix1 { padding-top: 1px; }
          .parent-fix2 { border: 1px solid rgba(0,0,0, 0);}
          .parent-fix3 { overflow: auto;}
          .parent-fix4 { float: left;}
          .parent-fix5 { display: inline-block; }
          .parent-fix6 { position: absolute; }
          .parent-fix7 { display: flex; }
          .parent-fix8 { -webkit-margin-collapse: separate; }
          .parent-fix9:before {  content: ' '; display: table; }
          
          /* Here are some examples on how to disable margin 
             collapsing from within children (.margin) */
          .children-fix1 { float: left; }
          .children-fix2 { display: inline-block; }
          <div class="container parent-fix1">
            <div class="margin children-fix">margin</div>
            <div class="absolute"></div>
          </div>

          这里是 jsFiddle 示例,您可以编辑

          【讨论】:

            【解决方案11】:

            我知道这是一篇很老的帖子,但我只想说在父元素上使用 flexbox 会禁用其子元素的边距折叠。

            【讨论】:

            • 不仅是它的子元素——它还可以防止父元素与第一个和最后一个子元素之间的边距折叠。
            【解决方案12】:

            overflow:hidden 防止折叠边距,但它并非没有副作用 - 即它...隐藏溢出。

            除了这个和你提到的之外,你只需要与它一起学习,并在它们真正有用的那一天学习(每 3 到 5 年出现一次)。

            【讨论】:

            • 已将我的答案变成了社区 wiki。我想我确实涵盖了您在第二段的最后两行中提到的副作用:使用 hidden 时唯一的区别可能是如果父级具有固定高度,则隐藏内容的意外后果。但是,如果您觉得需要进一步澄清,请随时贡献。谢谢。
            • overflow: auto 非常适合用于防止隐藏溢出并仍然防止折叠边距。
            • @Gavin, overflow:auto; 使我的内容区域在某些页面上获得了滚动条。
            猜你喜欢
            • 2016-05-17
            • 2017-02-16
            • 2010-09-11
            • 2011-02-09
            • 2017-07-27
            相关资源
            最近更新 更多