Przewijanie flexboxa z przepełnioną treścią

Tutaj wpisz opis obrazka

Oto kod, którego używam do osiągnięcia powyższego układu:

.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>

Pominąłem kod używany do stylizacji. Wszystko można zobaczyć w wstrzykiwaczu .


Powyższe działa, ale gdy zawartość content jest przepełniona, powoduje to przewinięcie całej strony. Chcę tylko przewijać sam obszar zawartości, więc dodałem overflow: auto do content div.

Problem z tym polega teraz na tym, że same kolumny nie wykraczają poza ich rodziców wysokość, więc granice są odcięte tam też.

Oto długopis pokazujący problem z przewijaniem .

Jak ustawić obszar content, aby przewijał się niezależnie, a jego dzieci rozciągały się poza wysokość content?

Author: Vadim Ovchinnikov, 2014-02-02

5 answers

Rozmawiałem o tym zTab Atkins (autor spec flexbox) i oto co wymyśliliśmy:

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;
}

Oto pióra:

  1. krótkie kolumny są rozciągane .
  2. dłuższe kolumny przepełnione i przewijane .

To działa, ponieważ align-items: stretch nie zmniejsza swoich przedmiotów, jeśli mają wewnętrzną wysokość, która jest osiągana tutaj przez min-content.

 170
Author: Joseph Silber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-06 00:09:30

Rozwiązałem ten problem bardzo elegancko po wielu próbach i błędach.

Zobacz mój wpis na blogu: http://geon.github.io/programming/2016/02/24/flexbox-full-page-web-app-layout

Zasadniczo, aby komórka flexbox była przewijalna, musisz zrobić wszystkich jej rodziców overflow: hidden;, lub po prostu zignoruje ustawienia przepełnienia i zamiast tego powiększy rodzica.

 44
Author: geon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-24 18:20:21

Trochę za późno, ale to może pomóc.: http://webdesign.tutsplus.com/tutorials/how-to-make-responsive-scrollable-panels-with-flexbox--cms-23269

W zasadzie trzeba umieścić html,body Aby height: 100%; i zawinąć całą zawartość w <div class="wrap"> <!-- content --> </div>

CSS:

html, body {
  height: 100%;
}

.wrap {
  height: 100vh;
  display: flex;
}
Zadziałało dla mnie. Hope it helps
 8
Author: Doua Beri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-10 11:13:31

Praca z position:absolute; wraz z flex:

Powodzenia...
 6
Author: Akash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-19 13:02:00

Dodaj to:

align-items: flex-start;

Do zasady dla .content {}. To naprawia to w pióro dla mnie, przynajmniej (zarówno w Firefox i Chrome).

Domyślnie, .zawartość ma "align-items: stretch" , co sprawia, że rozmiar wszystkich dzieci z automatycznym wzrostem dopasowuje się do własnego wzrostu, na http://dev.w3.org/csswg/css-flexbox/#algo-stretch . natomiast wartość "flex-start" pozwala dzieciom obliczyć własne wysokości i wyrównać się na jego krawędzi początkowej (i przepełnienie i wyzwalanie scrollbar).

 4
Author: dholbert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-03 16:11:04