谈一下 css 隐藏陷阱,margin 塌陷问题

什么是 margin 塌陷

这个问题主要分为父元素和子元素之间,以及子元素之间,下面分别来说一下。

父元素和子元素之间

通俗点说就是,在一个父元素里,你给第一个子元素设置 margin-top 或者给最后一个子元素设置 margin-bottom,会被父元素抢走,这些会作用在父元素上面,而不会直接作用在子元素上面,例如下面这个栗子:

可以看到,我们给第一个子元素设置了 margin-top 为 100px,但是发现却作用在父元素上了。

同理如果给最后一个元素设置 margin-bottom,也是作用在父元素上面了,这肯定不是我们想要的效果,在开发中,如果你也遇到过类似的问题,一起来看下如何解决吧。

如何解决?

给父元素设置以下其中之一的属性:

只需要设置这些其中之一的属性即可,不需要同时开启这些属性。

border

给父元素设置 1px 的 border

CSS 复制代码
.parent 
     border: 1px solid red; 
    }
padding

给父元素设置 1px 的 padding

CSS 复制代码
.parent 
   padding: 1px;
    }
overflow:hidden

给父元素设置 overflow 为 hidden

CSS 复制代码
.parent {
      overflow: hidden;
      background-color: grey;
    }

display: flow-root(最推荐)

一个新的 display 属性的值,它可以创建无副作用的 BFC。在父级块中使用 display: flow-root 可以创建新的 BFC。

<div> 元素设置 display: flow-root 属性后,<div> 中的所有内容都会参与 BFC,浮动的内容不会从底部溢出。

你可以从 flow-root 这个值的名字上看出来,它创建一个新的用于流式布局的上下文,行为如同 root(在浏览器中是 <html>)元素。

CSS 复制代码
.parent {
      background-color: grey;
      display: flow-root;
    }
display: inline-block

给父元素设置为行内块元素

CSS 复制代码
.parent {
      background-color: grey;
      display: inline-block;
    }
使 position:absolute position:fixed

给父元素设置为绝对定位或者固定定位

CSS 复制代码
.parent {
      background-color: grey;
      position: absolute;
    }

兄弟元素之间

指的是当两个相邻的兄弟元素margin发生重叠时,最终显示的边距值不是两者的和,而是较大的那个边距值,例如下面的:

第一个子元素设置了margin-bottom: 100px;,第二个子元素设置了margin-top: 100px; bottom和top重叠了,只会取最大的那个,也就是150px

CSS 复制代码
.child1 {
      width: 100px;
      height: 100px;
      background-color: red;
      margin-bottom: 150px;
    }
    
    .child2 {
      width: 100px;
      height: 100px;
      background-color: green;
      margin-top: 100px;
    }

如图所示:

总结

css 的 margin 塌陷现象通常出现在两个相邻块级元素之间或者父子元素之间,导致它们的边距合并成一个较大的边距。可以通过添加边框、内边距、或设置 overflow 属性,display属性,定位等方法来解决这一问题。

相关推荐
于是我说3 分钟前
前端JavaScript 项目中 获取当前页面滚动位置
开发语言·前端·javascript
GISer_Jing4 分钟前
AI在前端开发&营销领域应用
前端·aigc·音视频
Hao_Harrision13 分钟前
50天50个小项目 (React19 + Tailwindcss V4) ✨ | DragNDrop(拖拽占用组件)
前端·react.js·typescript·tailwindcss·vite7
来杯三花豆奶39 分钟前
Vue 2.0 Mixins 详解:从原理到实践的深度解析
前端·javascript·vue.js
code_YuJun41 分钟前
脚手架开发工具——dotenv
前端
San30.1 小时前
深度驱动:React Hooks 核心之 `useState` 与 `useEffect` 实战详解
前端·javascript·react.js
Mr_Swilder1 小时前
vscode没有js提示:配置jsconfig配置
前端
skywalk81631 小时前
使用Trae 自动编程:为小学生学汉语项目增加不同出版社教材的区分
服务器·前端·人工智能·trae
huohuopro1 小时前
LangChain | LangGraph V1教程 #3 从路由器到ReAct架构
前端·react.js·langchain
柒.梧.1 小时前
HTML入门指南:30分钟掌握网页基础
前端·javascript·html