【问题标题】:'position: static;' vs 'position: relative;' when child element is absolutely positioned'位置:静态;' vs'位置:相对;'当子元素绝对定位时
【发布时间】:2013-08-05 23:45:48
【问题描述】:

我很难理解为什么当容器元素的子元素被绝对定位(即position: absolute;)时,我需要为其添加position: relative;。让我举例说明。

示例 HTML 代码:

<ul>
   <li>...</li>
   <li id="parent">
      <a href="#">Menu</a>
      <div id="child">...</div>
   </li>
   <li>...</li>
   <li>...</li>
</ul>

假设代码代表一个水平菜单。看起来有点像这样:

问题是当#parentposition属性的值是默认值(即position: static;)时,它的宽度随着#child的宽度而增加,即使是孩子元素是绝对定位的,这不应该发生,因为#child 现在由于position: absolute; 而不在流程中。

当我在#parent 上使用position: relative; 时,一切都已到位,即无论#child 的大小如何,它的宽度都保持不变。

我在这里缺少什么?为什么我需要将position: relative; 用于(我认为)应该是默认行为的事情?

更新:我创建了一个小提琴来更好地解释我的观点。 Please take a look.

重现问题的步骤:

  • 在小提琴的预览中,点击“Channels”菜单,它应该会滑出其隐藏的菜单项。

  • 现在,在您的浏览器(安装了 Firebug 的 Chrome、Safari 或 Firefox)中按 F12 键,使用检查工具检查“频道”菜单。

    这应该立即将您指向现在打开的开发工具或 Firebug 窗格的“元素”选项卡中的相关 HTML 代码。

    &lt;ul id="top-navbar"&gt; 中查找&lt;li class="float-left top-menu"&gt; 的第一个实例,并将鼠标悬停在该行上。它应该向您显示如下内容:

为什么蓝色指示框(即菜单)应该是红色边框的大小时却那么大?明白我现在在说什么了吗?

现在,在li 上应用position: relative;(即li.float-left.top-menu { position: relative; },您自己看看有什么不同。)

【问题讨论】:

  • 请同时提供所使用的 CSS 和浏览器,从 html 示例您的变形块 div 到内联 a - 这可能会产生不可预知的结果,我会尝试将 display:block 添加到 a。因为我似乎无法重复您的问题。
  • @drk 当我意识到解释不够充分时,我正在努力。请检查我更新的问题。 :)

标签: css position css-position


【解决方案1】:

position:relative 创建一个新的包含框,任何绝对定位的子元素都将从中设置它们的上/左相对位置。

position: static 不会创建包含框,并且任何绝对定位的子元素将开始沿着 DOM 树向上查找包含框,直到它碰到主体并使用它找到的祖先作为顶部/左侧。

编辑:抱歉,我误读了您的问题。我似乎无法重现您对问题的描述(请参阅fiddle)。您能否将代码发布为您问题的最小测试用例。

【讨论】:

  • 但这并不能回答 OP 的问题:如果从文档流中删除子级,为什么父级会扩展?
  • JaredMcAteer 和@Matanya 请查看我更新的问题。我添加了一个小提琴和重现问题的步骤。谢谢!
【解决方案2】:

好的。我现在觉得很傻。我在子元素上使用了min-width,并且由于宽度几乎已定义,因此菜单(即父级)的宽度也扩展了。删除min-width 清除所有疑虑。

还有一个必读:Absolute Positioning Inside Relative Positioning(还有this commentthis answer)。

【讨论】:

  • 还要注意 jsfiddle 上的示例没有子菜单容器的位置,添加以下 css 将第一个 li 的大小减小到预期大小:#channels-menu-item-container{ position:absolute; }
  • @drk 我认为你错了。我在.collapse 类上使用了position:absolute;,它的目标与#channels-menu-item-container 相同,还是我遗漏了什么?
  • aah,当菜单展开时它会被删除 - 这是我进行测试的状态,打开子菜单后展开主菜单可能是我没有考虑的目标。
  • @drk 看起来 JS Fiddle(或它加载的引导库)有问题,在实时站点上没问题;该课程不应该被删除。无论如何,谢谢你让我知道。 :) 编辑: 这个问题是由 JS fiddle 加载的旧引导库引起的。使用最新版本的引导程序应该一切正常。更新了小提琴:jsfiddle.net/bdtt3/1
猜你喜欢
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多