Przewijanie flexboxa z przepełnioną treścią
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
?
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:
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
.
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.
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 helpsWarning: 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
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).
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