首页 > 其他分享 >涨冷门知识之CSS魔法:边距合并

涨冷门知识之CSS魔法:边距合并

时间:2024-08-07 17:55:46浏览次数:11  
标签:魔法 上边 元素 合并 边距 下边 margin CSS

后端同学问了一个问题:“为什么背景色没有充满?”

F12,inspect,哎嗨,p 标签存在默认边距

源码如下:

点击查看代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="styles.css">
    <title>折叠面板示例</title>

    <style>

body {
    font-family: Arial, sans-serif;
}

.collapse {
    width: 98%;
    margin: 5px auto;
}

.collapse-item {
    border: 1px solid #ddd;
    border-radius: 8px;
    margin-bottom: 10px;
}

.collapse-header {
    display: flex;
    align-items: center;
    background-color: #f7f7f7;
    padding-left: 8px;
    height: 50px;
    cursor: pointer;
}

.collapse-content {
    background-color: #000000;
    color: 	#FFFFFF;
    border-top: 1px solid #ddd;
}

.arrow {
    margin-right: 5px;
}

p {
    display: block;
    margin-block-start: 1em;
    margin-block-end: 1em;
    margin-inline-start: 0px;
    margin-inline-end: 0px;
    unicode-bidi: isolate;
    margin: 24px;
}

    </style>

</head>
<body>
    <div class="collapse">
        <div class="collapse-item">
            <div class="collapse-content">
                <p>这是面板 1 的内容。</p>
            </div>
        </div>
    </div>

    <script src="script.js"></script>
</body>
</html>


问题来了:为什么上边距填充了背景色,下边距没有呢?

引入今天主题:** 边距合并 **

根据 GPT 给出的边距合并规则:

在 CSS 中,边距合并(margin collapsing)是一种现象,当两个块级元素的上下边距相邻时,它们的外边距合并为一个边距,而不是简单相加。这种合并规则通常在以下情况下发生:

边距合并的规则:
相邻块级元素的上下边距:

如果一个块级元素的下边距与下一个块级元素的上边距相邻,它们会合并成一个边距。合并后的边距效应表现为它们中较大的边距值。

   <div class="box1"></div>
   <div class="box2"></div>
   .box1 {
       margin-bottom: 20px; /* 下边距 */
   }
   .box2 {
       margin-top: 30px; /* 上边距 */
   }

上面例子中,合并后的边距为 30px,而不是 20px + 30px = 50px。

父元素与子元素的边距:

当子元素垂直居于父元素内时,如果子元素的上边距和父元素的上边距相接,则父元素的边距会跟子元素的边距合并,表现为子元素的边距。

   <div class="parent">
       <div class="child"></div>
   </div>
   .parent {
       margin-top: 20px; /* 父元素上边距 */
   }
   .child {
       margin-top: 30px; /* 子元素上边距 */
   }

在这种情况下,父元素的上边距可能会被合并为 30px。

空的块级元素:

如果一个块级元素没有内容(即是空的),并且设置了边距,那么这些边距也可能会发生合并。

   <div class="empty"></div>
   .empty {
       margin-top: 20px; /* 空元素的上边距 */
   }

如果这是在一个父元素中,可能会导致父元素的边距合并。

合并边距的例外情况:
有边框或内边距的元素: 如果上或下边距元素有边框(border)或内边距(padding),那么边距就不会合并。

浮动元素: 如果元素是浮动的话,它的边距也不会合并。

完全包含: 在 overflow: hidden;, overflow: scroll; 等情况下,合并也会被阻止。

在这个例子中,父子元素边距合并规则又区分为上边距合并、下边距合并。一般没有设置 parent 元素高度,边距合并会影响 parent 的高度计算

  1. 上边距合并(Margin Collapse)
    定义:当一个子元素的上边距(margin-top)与其父元素的上边距重叠时,会发生边距合并。

情况:

子元素的上边距与父元素的上边距合并:如果子元素的 margin-top 值大于父元素的 margin-top 值,则合并后的上边距为两者中的较大者。
不涉及边框和内边距:这个合并只在子元素的上边距与父元素的上边距之间发生,没有涉及到父元素的边框(border)和内边距(padding)。

示例:

<div class="parent">
    <div class="child"></div>
</div>
.parent {
    margin-top: 20px; /* 父元素的上边距 */
}

.child {
    margin-top: 30px; /* 子元素的上边距 */
}

在这个例子中,父元素的上边距是20px,子元素的上边距是30px。当父元素和子元素共用一个上下文(没有边框和内边距的情况下),合并结果为30px。

  1. 下边距合并(Margin Collapse)
    定义:同样地,当子元素的下边距(margin-bottom)与父元素的下边距重叠时,也会发生边距合并。

情况:

子元素的下边距与父元素的下边距合并:如果子元素的 margin-bottom 值更大,则合并后的下边距同样是两者中的较大者。
同样不涉及边框和内边距:下边距的合并也不考虑父元素的边框和内边距。

示例:

<div class="parent">
    <div class="child"></div>
</div>
.parent {
    margin-bottom: 15px; /* 父元素的下边距 */
}

.child {
    margin-bottom: 25px; /* 子元素的下边距 */
}

在这个例子中,父元素的下边距为15px,子元素的下边距为25px。由于合并规则,最终的合并结果为25px。

讲了那么多,为什么上边距合并填充了颜色,下边距却没有颜色?为什么 parent 高度比 p 标签高度小?

在 CSS 中,父元素的高度计算规则主要由以下几个方面构成:

  1. 内容高度

父元素的高度通常基于其子元素的高度。如果父元素没有设定明确的高度(通过 height 属性),那么它的高度会根据其中可见内容的实际高度进行自动调整。这意味着,父元素的高度是通过累积的子元素的内容高度和内边距、边框等来计算的。

  1. 合并下边距

下边距合并(margin collapsing)是指当两个块级元素的下边距相接触时,会合并成一个下边距,而不简单地相加。合并下边距的行为在以下情况中发生:

当两个垂直方向的块级元素相邻时,它们的下边距可以合并。

父元素的下边距与它最后一个子元素的下边距可以发生合并。

  1. 合并影响父元素高度

由于合并下边距的机制,父元素的高度不包括合并后的下边距。例如,假设一个父元素中的最后一个子元素有一个下边距,且这个下边距与父元素的下边距相接触,父元素的高度在计算时不会包括这个下边距。因此,父元素的实际可见尺寸往往会小于子元素的内容总高度。

  1. 特殊情况

在某些情况下,比如当子元素设置为浮动(float)或定位(position: absolute)时,父元素的高度可能不会被这些子元素计算在内。这是因为浮动元素从文档流中“脱离”了。

  1. 避免下边距合并

可以通过以下方式来避免下边距合并以确保父元素的高度包含所有下边距:

在父元素中添加内边距(padding)。

在父元素中添加边框(border)。

使用 overflow 属性,例如设置为 hidden 或 auto。

示例

<div class="parent">
    <div class="child">Hello</div>
    <div class="child">World</div>
</div>
.parent {
    background: lightblue;
}
.child {
    margin-bottom: 20px; /*这20px下边距在合并时可能不会计算在父元素高度中*/
}

在这个例子中,虽然子元素有下边距,但如果父元素没有额外的 padding 或 border,其高度可能不会包含这20px的下边距。

以上。

PS:感谢 GPT,这个破边距差点没把我 CPU 干烧了
PPS:博客园啊,好古早了,好久没登录,没想到密码还能记得,看以前的留言,有种园子长草,很荒芜的感觉

标签:魔法,上边,元素,合并,边距,下边,margin,CSS
From: https://www.cnblogs.com/xyJen/p/18347563

相关文章

  • CSS3第一天(基础选择器+复合选择器)
    1.选择器基础选择器:标签选择器(某一类标签)、类选择器(一个或几个标签,最常用)、id选择器和通配符选择器标签名{属性1:属性值1;属性2:属性值2;...}类选择器(可以多个标签使用).类名{属性1:属性值1;...}<ul><liclass="red">大雨</li></ul>类名长的,可以用短横线分割,最......
  • 不用一分钟,理解css中repeat函数的auto-fill和auto-fit
    相信大家在使用grid布局时,总难免会使用到grid-template-columns:repeat(auto-fit,minmax(200px,1fr));这里的auto-fit很好理解,就是按照容器大小和元素数量,将网格自动分成多少列。比如有4个元素时:页面宽度200px,则每行有一个元素页面宽度800px,则每行有四个元素,页面宽度......
  • 界面控件DevExpress WinForms,支持HTML & CSS提升用户体验(二)
    DevExpressWinForms现在可以利用HTML/CSS强大的功能,帮助受DevExpress驱动的WinForms应用程序引入现代的UI元素和用户体验!P.S:DevExpressWinForms拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能完美构建流畅、美观且易于使用的应......
  • CSS3新特性
    目录:一、选择器的扩展1.属性选择器2.伪类选择器3.伪元素选择器二、盒子模型的增强1.box-sizing属性2.边框圆角(border-radius)3.盒阴影(box-shadow)三、过渡和动画效果1.过渡效果2.动画效果四、响应式布局1.媒体查询(mediaquery)2.弹性布局(Flexbox)一、选择器......
  • HTML&CSS
    一、Html、css、jshtml:超文本标记语言——负责网页的结构css:层叠样式表——页面显示的样式、排版js:JavaScript——界面交互(动态交互、逻辑)二、Htmldiv和span1.divdivision:div里面所有的元素都在div区域里面,div里面可以嵌套别的标签   div独占一行2.span:功能类似......
  • css 实现弹窗缩放出现,从小放大
    在CSS中,实现弹窗从小放大的动画效果,可以使用transform属性和transition属性或者@keyframes动画。以下是几种实现方式:使用transition当弹窗元素的类被添加或移除时,可以使用transition来实现平滑的缩放效果。.modal{opacity:0;transform:scale(0.5);/*初始缩放比例较......
  • CSS中span元素垂直居中【解决span元素内基线对齐问题】
    CSS中span元素垂直居中【解决span元素内基线对齐问题】在样式的书写中,我们常常使用以下方式实现垂直居中,若span元素内例外,解决办法看文章最后<divclass="parent"><spanclass="child">text</span></div>1.flex布局方式垂直居中.parent{display:flex;align-ite......
  • 爬虫:xpath高级使用,bs4使用,bs4-css选择器
    xpath高级使用fromlxmlimportetree#由于本次要格式化的内容是一个文件,所以用parse,如果是一个html格式的字符串就用HTMLhtml=etree.parse('02_xpath.html')#可以连接多个但是每两个之间要用一个管道符来连接#print(html.xpath('//ol/li[@data="one"]/text()|......
  • CSS书写模式 Writing Mode text-combine-upright
     writing-mode属性定义了文本在水平或垂直方向上如何排布。语法格式如下:writing-mode:horizontal-tb|vertical-rl|vertical-lr|sideways-rl|sideways-lrhorizontal-tb:水平方向自上而下的书写方式。即left-right-top-bottomvertical-rl:垂直方向自右而左的书写方式。......
  • 【Vitepress系列】-- 自定义组件及布局,配置tailwindcss、配置Markdown
    Vitepress自定义页面,以及配置tailwindcssvitepress中,除了使用一些配置项目,还可以通过写vue代码,来做一个定制化的UI。下面这个UI主页便是vue组件+tailwindcss做的一.自定义vitepress中,如果内置的home、doc、page不满足需求,还可以自己写vue代码进行自定义1.1自定义布......