当前位置: 首页 > 面试题库 >

具有两个等高子项的Flexbox布局,其中一个子项包含带有滚动内容的嵌套flexbox

壤驷德宇
2023-03-14
问题内容

<img>的面板右侧包含一个控件标题和一长串项目。所以我有一个嵌套的flexbox情况:

.container (flex)
 -> .child img
 -> .child controls panel (flex)
  -> .controls
  -> .content-wrapper scrolling list

从最基本的角度来说,两个并排面板很容易,可以通过align-items: stretch..轻松进行操作

一旦右侧面板的垂直滚动列表变得更加复杂,我便看不到如何使其父级(第二个.child)的高度与第一个高度匹配.child

+-------------+---------------+
|             |  Controls     |
| Left child  |               |
|             +---------------+
|             |              A|
|             | Vertically   |+
|             | scrolling    ||
|             | items        ||
|             |              |+
|             |              V|
+-------------+---------------+

我已经阅读了[具有可滚动内容的Flexbox项目,但是它解决了水平滚动问题,而不是像这样的垂直布局。此外,带滚动区域嵌套Flexbox的涉及垂直堆叠嵌套flexboxes,我觉得这个组合rowcolumn方向混淆了我的情况。

作为代码段:

.container {

  display: flex;

  align-items: stretch;

}



.child {

  border: 1px solid grey;

  background-color: lightgrey;

  flex: 1 1 auto;

}



.controls-panel {

  display: flex;

  flex-direction: column;

}



.controls {

  flex: 0 0 auto;

}



.content-wrapper {

  flex: 1 1 auto;

  width: 400px;

  overflow-y: auto;

}

.content-item {

  display: inline-block;

  width: 100px;

  height: 100px;

  background-color: red;

}


<div class="container">

  <div class="child">

    <p>In real life I am an inline img.</p>

    <p>I am some content whoop de doo.</p>

    <p>I am some content whoop de doo.</p>

    <p>I am some content whoop de doo.</p>

    <p>I want my sibling to equal my height.</p>

  </div>

  <div class="child controls-panel">

    <div class="controls">

      <p>Small controls area. Panel below should scroll vertically.</p>

    </div>

    <div class="content-wrapper">

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

    </div>

  </div>

</div>

我不想在这里固定任何元素的高度。碰巧的是,我知道img的高度,因此我可以使用CSS强制将元素的高度设置在右侧,但是我想知道是否存在解决此问题的“真”Flexbox方法。


问题答案:

通常,为了使overflow:scroll(或autohidden)起作用,需要以一种或另一种方式来设置高度限制,否则元素的大小通常会增长到适合其内容的程度。

主要有3种方法,其中一个是设置实际高度,如在第一个示例中一样,我将其添加到container

堆栈片段1

.container {

  display: flex;

  height: 100vh;

}



.child {

  border: 1px solid grey;

  background-color: lightgrey;

  flex: 1 1 auto;

}



.controls-panel {

  display: flex;

  flex-direction: column;

}



.controls {

  flex: 0 0 auto;

}



.content-wrapper {

  flex: 1 1 auto;

  width: 400px;

  overflow-y: auto;

}

.content-item {

  display: inline-block;

  width: 100px;

  height: 100px;

  background-color: red;

}


<div class="container">

  <div class="child">

    <p>In real life I am an inline img.</p>

    <p>I am some content whoop de doo.</p>

    <p>I am some content whoop de doo.</p>

    <p>I am some content whoop de doo.</p>

    <p>I want my sibling to equal my height.</p>

  </div>

  <div class="child controls-panel">

    <div class="controls">

      <p>Small controls area. Panel below should scroll vertically.</p>

    </div>

    <div class="content-wrapper">

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

      <div class="content-item"></div>

    </div>

  </div>

</div>

或使用绝对定位来创建该 高度约束 ,而绝对元素会这样做。

只需使用一个额外的包装器即可完成content-scroll,并使其他结构保持完全动态。

堆栈摘要2

.container {

  display: flex;

}



.child {

  border: 1px solid grey;

  background-color: lightgrey;

  flex: 1 1 auto;

}



.controls-panel {

  display: flex;

  flex-direction: column;

}



.controls {

  flex: 0 0 auto;

}



.content-wrapper {

  position: relative;

  flex: 1 1 auto;

  width: 400px;

}

.content-scroll {

  position: absolute;

  top: 0; left: 0;

  right: 0; bottom: 0;

  overflow-y: auto;

}

.content-item {

  display: inline-block;

  width: 100px;

  height: 100px;

  background-color: red;

}


<div class="container">

  <div class="child">

    <p>In real life I am an inline img.</p>

    <p>I am some content whoop de doo.</p>

    <p>I am some content whoop de doo.</p>

    <p>I am some content whoop de doo.</p>

    <p>I want my sibling to equal my height.</p>

  </div>

  <div class="child controls-panel">

    <div class="controls">

      <p>Small controls area. Panel below should scroll vertically.</p>

    </div>

    <div class="content-wrapper">

      <div class="content-scroll">

        <div class="content-item"></div>

        <div class="content-item"></div>

        <div class="content-item"></div>

        <div class="content-item"></div>

        <div class="content-item"></div>

        <div class="content-item"></div>

        <div class="content-item"></div>

        <div class="content-item"></div>

        <div class="content-item"></div>

        <div class="content-item"></div>

        <div class="content-item"></div>

        <div class="content-item"></div>

        <div class="content-item"></div>

        <div class="content-item"></div>

      </div>

    </div>

  </div>

</div>

单独使用Flexbox,以为它可能无法完全跨浏览器运行,特别是对于仍支持它的旧版本,但它的bug很大。

原始代码中的简单修复方法是将flex: 1 1 auto;in 更改.content-wrapperflex: 1 1 0px;0px我的IE版本需要使用,Chrome / Firefox / Edge可以使用0

堆栈摘要3

.container {

  display: flex;

}



.child {

  border: 1px solid grey;

  background-color: lightgrey;

  flex: 1 1 auto;

}



.controls-panel {

  display: flex;

  flex-direction: column;

}



.controls {

  flex: 0 0 auto;

}



.content-wrapper {

  flex: 1 1 0px;

  width: 400px;

  overflow-y: auto;

}

.content-item {

  display: inline-block;

  width: 100px;

  height: 100px;

  background-color: red;

}


<div class="container">

  <div class="child">

    <p>In real life I am an inline img.</p>

    <p>I am some content whoop de doo.</p>

    <p>I am some content whoop de doo.</p>

    <p>I am some content whoop de doo.</p>

    <p>I want my sibling to equal my height.</p>

  </div>

  <div class="child controls-panel">

    <div class="controls">

      <p>Small controls area. Panel below should scroll vertically.</p>

    </div>

    <div class="content-wrapper">

        <div class="content-item"></div>

        <div class="content-item"></div>

        <div class="content-item"></div>

        <div class="content-item"></div>

        <div class="content-item"></div>

        <div class="content-item"></div>

        <div class="content-item"></div>

        <div class="content-item"></div>

        <div class="content-item"></div>

        <div class="content-item"></div>

        <div class="content-item"></div>

        <div class="content-item"></div>

        <div class="content-item"></div>

        <div class="content-item"></div>

    </div>

  </div>

</div>

片段2和3也会回答您的问题

…通过垂直滚动列表,我看不到如何使其父级(第二个.child)的高度与第一个高度匹配.child

注意,如果右列中的顶部元素可以大于左列,则底部元素将需要最小高度,以防止其塌陷为0,例如

.content-wrapper {
  ...
  min-height: 200px;           /*  e.g. like this  */
}


 类似资料:
  • 以下是我用来实现上述布局的代码: 我省略了用于样式设置的代码。你可以在钢笔里看到所有的东西。 上述方法有效,但当区域的内容溢出时,会使整个页面滚动。我只希望内容区域本身滚动,因此我将添加到div。 现在的问题是,柱本身并没有超出其父高度,因此边界也在那里被切断。 这是显示滚动问题的笔。 如何将区域设置为独立滚动,同时使其子项延伸到框的高度之外?

  • 问题 阻止类似按钮的内容会导致我的flex项目展开并溢出flexbox容器。 预期行为 在本例中,按钮应与按钮文本并排,并用省略号隐藏。flex项的宽度应基于兄弟项而非内容,并在容器更改宽度和添加或删除flex项时保持在容器内的响应性。另一个警告是,对于我的特定场景,我不能在flex项或buttons父div上使用overflow:hidden。 这是小提琴手。 例Html 示例CSS 编辑:现在

  • 我有一个UIScrollView,嵌套在一个内容视图中,它有两个嵌套的子视图,一个具有已知高度的常规UIView,以及一个具有动态高度的容器视图,具体取决于内容。就像这样: 视图如下所示: 我的约束设置如下: 滚动视图被限制在其超级视图(即视图)的尾缘、前缘、顶端和下边缘 内容视图被约束到其超级视图(即滚动视图)的尾部、前导、顶部和底部边缘。它还具有与主视图(即视图)相等的宽度约束,因此滚动视图的

  • 我有一个问题,我假设将是一个相对简单的CSS布局。 我想要。。。 底部的页脚(固定高度) 左侧的导航条(固定宽度) 右侧的外部内容窗格(动态大小) 在内容窗格中。。。 顶部的缎带(固定高度) 内部内容div(动态大小) 我正在尝试使用flexbox来实现这一点,因为它似乎是目前最好的选择(网格太不稳定,并且没有得到很好的支持)。 问题是,我的内部内容div(实际上)在外部内容div中有好几层。这意

  • 问题内容: 我很好奇flexbox是否可以使用这种布局。我似乎无法得出第3和第4格归入第二。这对于浮点数来说非常容易,只是好奇是否缺少一些可能对flexbox有帮助的属性。 布局 标记 问题答案: Flexbox不喜欢在多列或多行中扩展的flex项目,因为实际上flexbox没有网格概念。 但是,使用一些技巧,您可以实现此布局(以及更复杂的布局): 使用行布局 │1│2│3│4│ └─┴─┴─┴─

  • 我肯定这很简单,但我很难理解。 我有两个div。标题div最大宽度为500px。主分区最大宽度为400px。主div应在浏览器窗口中水平居中。标题div的左边缘需要与主div的左边缘对齐。请参见下文。红线是浏览器窗口的中心: 为此,我添加了一个最大宽度为500px(粉红色)的包装div,并在左侧使用了额外的填充。这在一定程度上有效。但在较小的屏幕尺寸下,左侧的额外填充会使布局偏离中心。 那么我如何