#html #css #flexbox #markup
#HTML #css #flexbox #разметка
Вопрос:
В данный момент я изучаю CSS flexbox и хочу реализовать эту разметку:
- Я хочу
header
, чтобы иfooter
было «липким» (header
всегда сверху иfooter
всегда внизу). - Если
article
илиaside1
илиaside2
размер не соответствует странице, я хочу, чтобы область между верхним и нижним колонтитулами можно было прокручивать.
Итак, мой план был:
- Создайте элемент контейнера с
display: flex
его элементами иcolumn direction
для него - Он будет содержать 3 элемента:
header
,footer
и {aside1
,article
иaside2
}, которые будут упакованы в другой контейнер. - Этот другой контейнер будет иметь
display: flex
сам сrow direction
для своих элементов:aside
,article
иaside2
Моя разметка очень проста:
<div class="wrapper">
<header>This is header</header>
<div class="content">
<aside>aside1</aside>
<article>article</article>
<aside>aside2</aside>
</div>
<footer>This is footer</footer>
</div>
И вот стили:
html, body {
height: 100%;
}
/* Main wrapper, sizes = 100% to fit the viewport */
.wrapper {
width: 100%;
height: 100%;
display: flex;
border: solid 1px black;
flex-direction: column;
}
/* Just some styling, ignore this */
header,
article,
aside,
footer {
border: solid 1px #888;
padding: 1rem;
text-align: center;
}
header {
background-color: #cfffff;
}
/* flex: 1 makes it "stretch" allowing header and footer
to have their default sizes */
.content {
display: flex;
flex: 1;
overflow-y: scroll;
}
aside {
box-sizing: border-box;
vertical-align: top;
background-color: #cfffcf;
width: 250px;
}
article {
background-color: #ffcfff;
flex: 1;
}
footer {
background-color: #ffffcf;
}
Проблема в том, что всякий article
раз, когда содержимое переполняет контейнер, прокрутка происходит не так, как я ожидаю:
Я хочу понять:
- Почему это происходит?
- Каков правильный способ сделать это?
Ответ №1:
Используйте новый стиль
position: sticky;
html, body {
height: 100vh;
}
/* Main wrapper, sizes = 100% to fit the viewport */
.wrapper {
width: 100%;
display: flex;
border: solid 1px black;
flex-direction: column;
}
/* Just some styling, ignore this */
header,
article,
aside,
footer {
border: solid 1px #888;
padding: 1rem;
text-align: center;
}
header {
background-color: #cfffff;
position: sticky;
top:0;
}
/* flex: 1 makes it "stretch" allowing header and footer
to have their default sizes */
.content {
display: flex;
flex: 1;
}
aside {
box-sizing: border-box;
vertical-align: top;
background-color: #cfffcf;
width: 250px;
}
article {
background-color: #ffcfff;
flex: 1;
}
footer {
position: sticky;
bottom:0;
background-color: #ffffcf;
}
<div class="wrapper">
<header>This is header</header>
<div class="content">
<aside>aside1</aside>
<article>article</article>
<aside>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</aside>
</div>
<footer>This is footer</footer>
</div>