CSS margin 折叠现象的实际代码示例

下面是展示 CSS margin 折叠现象的实际代码示例,包含了几种常见的 margin 折叠场景:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Margin Collapse Example</title>
    <style>
        /* 基础样式 */
        .container {
            width: 400px;
            margin: 20px auto;
            border: 1px solid #ccc;
            padding: 10px;
        }

        .box {
            height: 100px;
            background-color: #f0f0f0;
            border: 1px solid #999;
            text-align: center;
            line-height: 100px;
        }

        /* 1. 相邻兄弟元素的margin折叠 */
        .sibling1 {
            margin-bottom: 30px;
        }
        .sibling2 {
            margin-top: 20px;
            /* 实际间距是30px(取较大值),而不是50px */
        }

        /* 2. 父子元素的margin折叠(父元素没有padding/border隔离) */
        .parent {
            background-color: #e0e0e0;
            /* 取消注释可阻止折叠:
            padding: 1px; 
            或 border: 1px solid transparent;
            */
        }
        .child {
            margin-top: 20px;
            margin-bottom: 20px;
            /* 子元素的margin会"溢出"到父元素外 */
        }

        /* 3. 空元素的margin折叠 */
        .empty-box {
            margin-top: 20px;
            margin-bottom: 20px;
            /* 上下margin会折叠成一个20px的margin */
        }

        /* 4. 负margin的折叠情况 */
        .negative-sibling1 {
            margin-bottom: 30px;
        }
        .negative-sibling2 {
            margin-top: -10px;
            /* 实际间距是20px(30px + (-10px)) */
        }
    </style>
</head>
<body>
    <h2>1. 相邻兄弟元素的margin折叠</h2>
    <div class="container">
        <div class="box sibling1">下方margin: 30px</div>
        <div class="box sibling2">上方margin: 20px</div>
        <p>实际间距是30px(取较大值)</p>
    </div>

    <h2>2. 父子元素的margin折叠</h2>
    <div class="container">
        <div class="parent">
            <div class="box child">子元素上下margin: 20px</div>
        </div>
        <p>子元素的margin会溢出到父元素外(父元素无padding/border时)</p>
    </div>

    <h2>3. 空元素的margin折叠</h2>
    <div class="container">
        <div class="box">上方元素</div>
        <div class="empty-box"></div> <!-- 空元素 -->
        <div class="box">下方元素</div>
        <p>空元素的上下margin会折叠成一个margin</p>
    </div>

    <h2>4. 包含负margin的折叠</h2>
    <div class="container">
        <div class="box negative-sibling1">下方margin: 30px</div>
        <div class="box negative-sibling2">上方margin: -10px</div>
        <p>实际间距是20px(30px + (-10px))</p>
    </div>
</body>
</html>

代码说明:

  1. 相邻兄弟元素折叠:两个相邻元素的上下margin会合并,取较大的那个值(示例中30px覆盖20px)
  2. 父子元素折叠:当父元素没有padding、border或inline内容隔离时,子元素的margin会"溢出"到父元素外部
  3. 空元素折叠:没有内容、padding和border的空元素,其上下margin会合并为一个
  4. 负margin折叠:包含负margin时,最终间距为正margin与负margin的代数和

如何阻止margin折叠:

  • 给父元素添加padding或border
  • 使用BFC(块级格式化上下文),如给元素添加overflow: autodisplay: flex
  • 浮动元素(float不为none)不会产生margin折叠
  • 绝对定位元素的margin不会与其他元素折叠

运行这段代码可以直观看到各种margin折叠现象,以及它们的实际表现效果。

相关推荐
ℋᙚᵐⁱᒻᵉ鲸落6 小时前
移动端滑动手势冲突:overflow: auto导致外层横向滑动失效
前端·javascript·css·vue.js·html
默_笙7 小时前
🎃 前端学了 Next.js,后端该学啥?NestJS 就是 Node 版的蜜雪冰城
前端·javascript
এ慕ོ冬℘゜8 小时前
navigator 导航对象 BOM制作方法
javascript
慧一居士10 小时前
Vite项目中使用Less步骤,详细使用示例
前端·css
kyriewen11 小时前
面试官让我用 AI 重构一个 8 年陈的 React 组件——他说他不看代码,只看我会不会拆
前端·javascript·面试
Jacky199912 小时前
Electron + Vue 3 桌面打字游戏实战:从 VSCode 扩展到独立应用的架构改造
javascript
柚yuzumi13 小时前
别再猜 this:先看它属于谁,再看它指向谁
前端·javascript
汉堡大王952713 小时前
面试必考:手写代码 new 做了什么?从原理到实现全解析
前端·javascript·面试
BillKu14 小时前
TypeScript中,字符串字面量联合类型(Union Type)、enum的用法说明
前端·javascript·typescript
慧一居士15 小时前
Sass和Less功能、使用场景、用法对比
前端·css·less·sass