Прокрутка flexbox с переполненным контентом

enter image description here

Здесь код, который я использую для достижения вышеуказанной компоновки:

.header {
  height: 50px;
}

.body {
  position: absolute;
  top: 50px;
  right: 0;
  bottom: 0;
  left: 0;
  display: flex;
}

.sidebar {
  width: 140px;
}

.main {
  flex: 1;
  display: flex;
  flex-direction: column;
}

.content {
  flex: 1;
  display: flex;
}

.column {
  padding: 20px;
  border-right: 1px solid #999;
}
<div class="header">Main header</div>
<div class="body">
  <div class="sidebar">Sidebar</div>

  <div class="main">
    <div class="page-header">Page Header. Content columns are below.</div>
    <div class="content">
      <div class="column">Column 1</div>
      <div class="column">Column 1</div>
      <div class="column">Column 1</div>
    </div>
  </div>
</div>

Ответ 1

Я говорил с Tab Atkins (автор спецификации flexbox) об этом, и это то, что мы придумали:

HTML:

<div class="content">
    <div class="box">
        <div class="column">Column 1</div>
        <div class="column">Column 1</div>
        <div class="column">Column 1</div>
    </div>
</div>

CSS

.content {
    flex: 1;
    display: flex;
    overflow: auto;
}

.box {
    min-height: min-content; /* needs vendor prefixes */
    display: flex;
}

Вот ручки:

Причина этого в том, что align-items: stretch не сжимает свои элементы, если они имеют внутреннюю высоту, которая выполняется здесь min-content.

Ответ 2

Я просто решил эту проблему очень элегантно после большого количества проб и ошибок.

Отправляй сообщение в своем блоге: http://geon.github.io/programming/2016/02/24/flexbox-full-page-web-app-layout

В принципе, чтобы прокручивать ячейку flexbox, вы должны сделать все ее родители overflow: hidden;, иначе она просто проигнорирует ваши настройки переполнения и сделает вместо этого родителя.

Ответ 3

Работа с position:absolute; вместе с flex:

Поместите гибкий элемент в position: relative. Затем внутри него добавьте еще один элемент <div> с:

position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;

Это расширяет элемент до границ его родителя с относительным положением, но не позволяет расширять его. Внутри, overflow: auto; будет работать как положено.

Удачи...

Ответ 4

Немного поздно, но это может помочь: http://webdesign.tutsplus.com/tutorials/how-to-make-responsive-scrollable-panels-with-flexbox--cms-23269

В основном вам нужно поместить html, body в height: 100%; и обернуть весь ваш контент в <div class="wrap"> <!-- content --> </div>

CSS

html, body {
  height: 100%;
}

.wrap {
  height: 100vh;
  display: flex;
}

Работал для меня. Надеюсь, что это поможет.

Ответ 5

Добавь это:

align-items: flex-start;

к правилу для .content {}. Это исправляет это в вашей ручке для меня, по крайней мере (как в Firefox, так и в Chrome).

По умолчанию .content имеет align-items: stretch, что позволяет ему .content размер всех .content align-items: stretch авто-высоты в соответствии с его собственной высотой в соответствии с http://dev.w3.org/csswg/css-flexbox/#algo-stretch, Напротив, значение flex-start позволяет дочерним элементам вычислять их собственные высоты и выравнивать их по начальному краю (и переполнять, и запускать полосу прокрутки).