【问题标题】:prevent padding background-color from overflowing into child element防止填充背景颜色溢出到子元素中
【发布时间】:2026-01-14 17:50:02
【问题描述】:

我已经用谷歌搜索了很多,但我在 SO 上或这里都找不到答案。我需要弄清楚如何防止填充背景颜色溢出到其子元素中。 子元素不能移出它的位置

我已经尝试过溢出:隐藏、z-index 以及几乎所有内容。

只看到 jsfiddle 绝对是最简单的: https://jsfiddle.net/so23hbf0/3/

HTML:

<div class="navbar">
<a href="#home">Home</a>
<a href="#news">News</a>
<div class="dropdown">
    <a href="#" class="dropbtn">Books & Media</a>
    <div class="dropdown-content">
        <div class="header">
            <h2>Mega Menu</h2>
        </div>   
    </div>
</div> 

CSS:

.navbar {
    overflow: hidden;
    background-color: yellow;
 }

.navbar a {
    padding: 2rem 1.6rem;
  overflow: hidden;
}

.dropdown {
    overflow: hidden;
    display: inline;
}

.navbar a:hover {
    background-color: black;
}

.dropdown-content {
    background-color: gray;
}

请注意,当您悬停链接时,黑色背景会溢出到灰色的“超级菜单”区域。但它不会溢出顶部。我想防止它向下溢出。

【问题讨论】:

  • 这感觉像是一个非常糟糕的结构,您的嵌套似乎不正确,内联元素中有块级元素。我建议使用嵌套 li 包含任何菜单基本结构的链接。
  • @AlexanderDeSousa 它是嵌套的,因此悬停将触发 display:block 而不是 display:none。为了简单起见,我把那部分省略了。
  • 为什么不能只调整内边距?
  • @Turnip 嗯,这都是关于原则的。我以后可能想改变高度,不想做两次。
  • 明白了,虽然你会用那个结构来打自己的脚,但你会花费很多时间来调试源于那个结构的东西,我真的强烈建议你尝试下面的结构作为开始点:codepen.io/antoniputra/pen/BzyWmb

标签: html css padding


【解决方案1】:

定位div.dropdown,以便您可以使用z-index 控制与周围元素相关的堆栈顺序,防止菜单重叠。

只有位置值不是初始值 - static - 的元素才能使用 z-index 重新排列其堆叠上下文,例如,请参阅 MDN

div.dropdown {
    /* ... */
    position: relative; 
    z-index: 1;
}

例如:https://jsfiddle.net/0mczuLsx/

【讨论】:

  • 这很有帮助,但您知道如何获取它以使“图书与媒体”链接也不会溢出吗?谢谢!
  • @Mark:你在哪里看到它“溢出”?在最新的 Firefox 开发者版上看不到它。另请参阅@Alexander De Sousa 评论,您确实需要重新构建 HTML 并在 CSS 中进行一些更改。例如,div.dropdown 不应该是内联元素。
  • 嗯,我在 Chrome 上,但我也使 .dropdown-content div 相对定位。现在就像我需要的那样工作。现实生活中的项目要复杂得多,我需要 HTML 保持这种状态。请参阅 W3schools 上的“超级菜单”。
  • @Mark:请不要将 W3Schools 用作学习资源,它历来充满了不良做法和错误信息。阅读MDN或官方specifications
  • 好吧,听起来更好。
【解决方案2】:

.navbar {
	overflow: hidden;
  background-color: yellow;
}

.navbar a {
	padding: 2rem 1.6rem;
  overflow: hidden;
}

.dropdown {
	overflow: hidden;
	display: inline;
}

.navbar a:hover {
	background-color: black;
}

.dropdown-content {
	background-color: gray;
}

div.dropdown{
    /* ... */
    position: relative; 
    z-index: 1;
}
<!--Change Html to:-->

<div class="navbar">
	<a href="#home">Home</a>
	<a href="#news">News</a>
  <a href="#" class="dropbtn">Books & Media</a>
	<div class="dropdown">
		<div class="dropdown-content">
			<div class="header">
				<h2>Mega Menu</h2>
			</div>	 
		</div>
	</div> 
</div>

【讨论】:

  • 您将图书与媒体放置在错误的位置。这就是书籍和媒体不起作用的原因