У меня есть <a href="https://jsfiddle.net/tuj6wmoz/1/" rel="nofollow">основа</a> для проекта. Я пытаюсь реализовать функционал, при котором страница прокручивается не полностью, а каждый блок отдельно, так что меню слева и блок с постами имеют независимую прокрутку. Подобное решение видно на главной странице YouTube. Я посмотрел в devtools, чтобы понять их подход, но из-за большого количества служебных блоков не сложилось ясного представления. Похоже, их метод заключается в том, что боковому меню и области со списком видео задается фиксированная высота, с использованием z-index для размещения хедера поверх. Также немного непонятно, как они создали промежуток между блоками для размещения хедера без перекрытий. Я видел еще одно решение на Stack Overflow, но в нем не было хедера, и прокручиваемые блоки занимали всю высоту, что не совсем то, что мне нужно. Я знаю, что для вертикальной прокрутки блоку требуется явная высота, и, установив высоту main-блока как `calc(100vh - 75px)`, я добился желаемого эффекта <a href="https://jsfiddle.net/aby15upn/" rel="nofollow">в этом примере</a>. Однако меня не устраивает, что высота main-блока жестко закодирована, и если высота хедера изменится, это решение перестанет работать. Я хотел бы избежать сложных манипуляций с JavaScript. Существует ли какой-либо более элегантный способ организовать такую прокрутку?
Да, существует способ организовать независимую прокрутку для блоков с помощью CSS Flexbox или Grid, и без необходимости жестко задавать высоту. Вот пример того, как можно это сделать, чтобы иметь фиксированный хедер и два прокручиваемых блока, которые занимают оставшееся место. Ниже приведён пример, как это реализовать с использованием CSS Flexbox: ### HTML ```html <div class="container"> <header class="header">Header</header> <div class="content"> <aside class="sidebar">Sidebar</aside> <main class="main">Main Content</main> </div> </div> ``` ### CSS ```css * { box-sizing: border-box; } body, html { margin: 0; height: 100%; } .container { display: flex; flex-direction: column; height: 100%; } .header { background: #333; color: white; padding: 15px; text-align: center; flex-shrink: 0; /* Не сокращаем хедер */ } .content { display: flex; flex: 1; /* Занимаем оставшееся пространство */ } .sidebar { background: #f4f4f4; width: 250px; /* Ширина сайдбара */ overflow-y: auto; /* Включаем вертикальную прокрутку */ } .main { flex: 1; /* Занимает оставшееся пространство */ background: #fff; overflow-y: auto; /* Включаем вертикальную прокрутку */ padding: 15px; } ``` ### Объяснение 1. **Flexbox**: Мы используем Flexbox для создания макета, где хедер занимает фиксированную высоту, а остальная часть страницы делится между сайдбаром и основным контентом. 2. **`flex-shrink: 0;`**: Это свойство для хедера означает, что его высота не будет изменяться. Он будет фиксированной высоты, а остальная часть пространства займет `content`. 3. **`flex: 1;`** для `content`: Этот стиль заставляет содержимое (сайдбар и основной контент) занимать оставшееся пространство после хедера. 4. **`overflow-y: auto;`**: Этот стиль даёт возможность прокручивать сайдбар и основной контент независимо друг от друга. Данный подход позволяет избежать жесткой привязки высоты, при этом обеспечивая независимую прокрутку блоков. Вы можете настроить размеры, отступы и другие стили в зависимости от ваших нужд.
Сделайте раскладку на гридах, нужным блокам задайте overflow:auto