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żyty do stylizacji. Możesz to wszystko zobaczyć w piórze .
Powyższe działa, ale gdy zawartość content
obszaru przepełnia się, przewija całą stronę. Chcę tylko przewijać sam obszar zawartości, więc dodałem overflow: auto
do content
div .
Problem polega na tym, że same kolumny nie wystają poza wysokość rodziców, więc granice są tam również odcięte.
Oto pióro pokazujące problem z przewijaniem .
Jak ustawić content
obszar tak, aby przewijał się niezależnie, a jego dzieci nadal wystawały poza content
wysokość pudełka?
źródło
Właśnie rozwiązałem ten problem bardzo elegancko po wielu próbach i błędach.
Sprawdź mój post na blogu: http://geon.github.io/programming/2016/02/24/flexbox-full-page-web-app-layout
Zasadniczo, aby przewijać komórkę Flexbox, musisz uczynić wszystkich jej rodzicami
overflow: hidden;
, albo po prostu zignoruje twoje ustawienia przepełnienia i zamiast tego powiększy rodzica.źródło
Współpracując
position:absolute;
zflex
:Ustaw element elastyczny za pomocą
position: relative
. Następnie dodaj do niego kolejny<div>
element z:To rozszerza element do granic jego nadrzędnego położenia względnego, ale nie pozwala go przedłużyć. Wewnątrz
overflow: auto;
będzie wtedy działać zgodnie z oczekiwaniami.Powodzenia...
źródło
box-sizing: border-box
zamiast tego, ale może to być bardziej skomplikowane dla niektórych kontroli stron trzecich).Trochę późno, ale to może pomóc: http://webdesign.tutsplus.com/tutorials/how-to-make-responsive-scrollable-panels-w--flexbox--cms-23269
Zasadniczo trzeba postawić
html
,body
abyheight: 100%;
i owinąć całą swoją zawartość do<div class="wrap"> <!-- content --> </div>
CSS:
Pracował dla mnie. Mam nadzieję, że to pomoże
źródło
Dodaj:
do zasady dla
.content {}
. To naprawia to w twoim piórze, przynajmniej dla mnie (zarówno w przeglądarce Firefox, jak i Chrome).Domyślnie
.content
maalign-items: stretch
, co powoduje, że wszystkie dzieci potomne z automatyczną wysokością dopasowują się do własnej wysokości, według http://dev.w3.org/csswg/css-flexbox/#algo-stretch . W przeciwieństwie do tego, wartość taflex-start
pozwala dzieciom obliczyć własne wysokości i wyrównać się na początkowej krawędzi (i przepełnić oraz uruchomić pasek przewijania).źródło
Jednym z problemów, na jakie natknąłem się, jest to, że aby mieć pasek przewijania, element wymaga określenia wysokości (a nie jako%).
Sztuczka polega na zagnieżdżeniu kolejnego zestawu elementów div w każdej kolumnie i ustawieniu wyświetlania elementu nadrzędnego kolumny za pomocą flex-direction: column.
A oto html:
https://jsfiddle.net/LiamFlavelle/czpjdfr4/
źródło
Rozwiązaniem tego problemu jest dodanie
overflow: auto;
do zawartości .content, aby umożliwić przewijanie zawartości opakowania.Ponadto występują okoliczności towarzyszące pakowaniu Flexbox i
overflowed
przewijalnej zawartości, takiej jak ten codepen .Rozwiązaniem jest dodanie
overflow: hidden (or auto);
do elementu nadrzędnego opakowania (ustawionego z przepełnieniem: auto;) wokół dużej zawartości.źródło