html - 将 flexbox 与绝对位置子项一起使用?

标签 html css flexbox css-position

我正在学习 CSS 中的技巧,但在将 flexbox 与绝对子元素和重叠的 div 结合使用时遇到了问题。根据在线问题,我发现它可能存在问题,我只是看不到解决我遇到的问题的方法。

我之前问过一个问题,解决方案工作正常:How to make one div always be at the bottom of the view and make top div resize based on bottom div?

基本上,顶部 div (Div A) 会填充底部 div 未动态填充的视口(viewport)剩余空间。

enter image description here

但是,我遇到了一个问题,因为我的 divA 包含需要重叠并使用 position: absolute 的子元素。

在处理 flex 之前,这就是我定义顶部 div 的方式:(请原谅命名和其他东西。为了这个例子,我将它们设为虚拟名称。)

    #divA {
        width: 100vw;
        height: 70vh;
        position: relative;
    }

    #innerContainer {
        position: absolute;
        width: inherit;
        height: inherit;
    }

    #centeredIcon {
        width: 2em;
        height: 3em;
        left: 50%;
        top: 50%;
        transform: translate(-50%, -50%);
        position: absolute;
        z-index: 1;
    }

元素是这样的:

    <div id="divA">
        <div id="innerContainer"/>
        <img id="centeredIcon" src="..."/>
    </div>
    <div id="divB"> ... </div>

在尝试将 Div A 的外部容器转换为使用 flex: 1 0 auto; 并将 divA 和 divB 放入包装器 div 中时,我的 divA 的 innerContainer 几乎消失了(大小为 0) .

.wrapper {
  height: 100vh;
  display: flex;
  flex-direction: column;
}

关于如何使这项工作有什么建议吗?

最佳答案

绝对定位元素 innerContainer 没有正确填充其容器 divA 的空间 - 而不是使用 width: inheritheight: inherit 您可以使用 100%,也可以将 topleft 设置为零。

可选地,我在 divB 上添加了 flex-shrink: 0,这样它就不会在窗口高度较小时收缩 - 请参见下面的演示:

body {
  margin: 0;
}
.wrapper {
  height: 100vh;
  display: flex;
  flex-direction: column;
}

#divA {
  position: relative;
  flex-grow: 1; /* occupy remaining space */
  background: lightblue;
}

#divB {
  flex-shrink: 0; /* do not shrink */
  background: lightgreen;
  /* center horizontally and place buttons vertically */
  display: flex;
  flex-direction: column;
  align-items: center;
}

#innerContainer {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}

#centeredIcon {
  width: 2em;
  height: 3em;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  position: absolute;
  z-index: 1;
}
<div class="wrapper">
  <div id="divA">
    <div id="innerContainer"></div>
    <img id="centeredIcon" src="https://via.placeholder.com/200" />
  </div>
  <div id="divB">
    <button>button 1</button>
    <button>button 2</button>
  </div>
</div>

关于html - 将 flexbox 与绝对位置子项一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56589145/

相关文章:

html - 元素扩展时图标会抖动

html - 无需javascript根据其中的文本更改div的高度

html - 无法滚动到容器溢出的 flex 元素顶部

javascript - 尝试打印页面时文本被 chop

javascript - 在简单的 HTML/JavaScript 元素中抽动 TABLE

javascript - 将 HTML 编码的字符串 append 为 HTML,而不是文本

javascript - 如何在动态 HTML 表格中将 <td> 居中对齐

html - 在标准标签上工作时,无法将 polymer 数据绑定(bind)到自定义 html 标签上工作

html - 试图让 FlexBox 正确呈现的问题

html - 显示 block 没有将我的标签元素对齐在我的输入元素之上?