Flexbox-макет сайта с двумя сайдбарами по краям окна
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <link rel="stylesheet" href="style.css"> <link rel="stylesheet" href="style1130.css"> <link rel="stylesheet" href="style1450.css"> <link rel="canonical" href="https://site.com"> <title>Title</title> <meta name="description" content="Description of the page content."> </head> <body> <header style="background:dodgerblue;height:60px;"> <button id="button-left" title="Sections" onclick="mainOpen()"> <svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M4 8h4V4H4v4zm6 12h4v-4h-4v4zm-6 0h4v-4H4v4zm0-6h4v-4H4v4zm6 0h4v-4h-4v4zm6-10v4h4V4h-4zm-6 4h4V4h-4v4zm6 6h4v-4h-4v4zm0 6h4v-4h-4v4z" /><path d="M0 0h24v24H0z" fill="none"/></svg> </button> <a id="logo" href="/" title="To main page" style="text-decoration:none;margin: 0 10px;"> <img src="logo.png" alt="Logo of the website" width="55" height="45" style="margin:5px;vertical-align:-18px;width:55px;height:45px;"> <span style="font-size: 28px;color:white;">Website name</span> </a> </header> <div id="overlay0" onclick="mainClose()"></div> <div id="overlay" onclick="lesClose()"></div> <button id="button-right" title="Section menu" onclick="lesOpen()"> <svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"> <path d="M0 0h24v24H0z" fill="none"/> <path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"/> </svg> </button> <aside id="sidebar0" style="background:steelblue;"> <nav></nav> </aside> <main style="background:#f0f0f0;height:800px;"></main> <aside id="sidebar" style="background:lightgoldenrodyellow;"> <nav> <p style="text-align:center;">Название раздела</p> <ol> <li><a href="#">История Linux</a></li> <li><a href="#">Свободное ПО и копилефт</a></li> <li><a href="#">Ядро Linux</a></li> <li><a href="#">Каталоги Linux</a></li> <li><a href="#">Типы файлов Linux</a></li> <li><a href="#">Интерфейс командной строки</a></li> </ol> </nav> </aside> <footer style="background:lightskyblue;height:40px;text-align:center;padding-top:20px;">Flask.Website © 2025</footer> <script src="script.js"></script> </body> </html>
Стили тех элементов, которые остаются постоянными при изменении размера экрана, в данном случае специально вынесены в теги, чтобы сделать разметку макета более ясной.
body { margin: 0; } @media(min-width: 810px) { main { max-width: 810px; margin: 0 auto; } } #button-left { float: left; margin-top: 10px; margin-left: 10px; } #button-right { float: right; position: sticky; top: 2px; margin-top: 10px; margin-right: 5px; } aside { width: 320px; } aside#sidebar0 { display: none; position: fixed; top: 0; bottom: 0; overflow: auto; z-index: 10; } aside#sidebar { display: none; position: fixed; top: 0; right: 0; bottom: 0; overflow: auto; z-index: 10; } #overlay0, #overlay { display: none; position: fixed; top: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.5); z-index: 9; }
var bar0 = document.getElementById("sidebar0"); var lay0 = document.getElementById("overlay0"); function mainOpen() { bar0.style.display = "block"; lay0.style.display = "block"; } function mainClose() { bar0.style.display = "none"; lay0.style.display = "none"; } var bar = document.getElementById("sidebar"); var lay = document.getElementById("overlay"); function lesOpen() { bar.style.display = "block"; lay.style.display = "block"; } function lesClose() { bar.style.display = "none"; lay.style.display = "none"; }
После этого макет сайта будет выглядеть вполне рабочим, но на больших и малых экранах выглядеть одинаково (иметь разметку под малые). Также заметим, что на этом этапе нет надобности в использовании css-технологии Flexbox. Видимые блоки (header
, main
и footer
) следуют друг за другом.
Для адаптации под большие экраны данная html-разметка осложнена тем, что мы не используем единый родительский контейнер для отображаемых слева sidebar0, справа sidebar и по центру main. Поэтому таким контейнером будет выступать body
. Следовательно, надо сделать так, чтобы header
и footer
занимали всю ширину.
@media (min-width: 1130px) { #button-right { display: none; } body { display: flex; flex-flow: row wrap; } main { width: 840px; } header, footer { flex: 100%; } aside#sidebar { display: block!important; } aside#sidebar nav { top: 0; position: sticky; } }
@media (min-width: 1450px) { #button-left { display: none; } aside#sidebar0 { display: block!important; } }
Чтобы не переопределять установленные для сайдбаров свойства, проще ограничить их применение в первоначальном определении, поместив правила в "обратные" media-запросы.
@media (max-width: 1449px) { aside#sidebar0 { display: none; position: fixed; top: 0; bottom: 0; overflow: auto; z-index: 10; } } @media (max-width: 1129px) { aside#sidebar { display: none; position: fixed; top: 0; right: 0; bottom: 0; overflow: auto; z-index: 10; } }
В файле style1130.css задано, что элемент nav
"залипает" при прокрутке у верхней границы экрана. Если такое поведение нежелательно (меню слишком длинное), достаточно убрать соответствующие свойства. После этого меню будет прокручиваться вместе с основным содержимым.