1
2
3
4
5
6
7
8
9
10
11
12
| <ul class="navigation"> <li class="nav-item"><a href="#">Home</a></li> <li class="nav-item"><a href="#">Portfolio</a></li> <li class="nav-item"><a href="#">About</a></li> <li class="nav-item"><a href="#">Blog</a></li> <li class="nav-item"><a href="#">Contact</a></li></ul><input type="checkbox" id="nav-trigger" class="nav-trigger" /><label for="nav-trigger"></label><div class="site-wrap"> <!-- основная страница сайта --></div> |
- Основные моменты разметки:
- Раздел навигации идет первым в разметке, потому что все остальные элементы находятся за меню. Вы можете использовать любые HTML теги какие вы хотите для построения меню. Здесь я использую неупорядоченный список.
- Кнопка управления меню это чекбокс и label. Обычно label идет перед чекбоксом или обернут вокруг него. В нашем случае чекбокс должен идти непосредственно перед label. Мы увидим почему это так когда после добавления CSS.
- Остальная часть нашего сайта должна быть заключена в уникальном div. Это объясняется тем, что, когда мы открываем меню, все остальное смещается немного правее, чтобы показать скрытые элементы навигации.
1
2
3
4
5
6
7
8
9
10
11
12
| .navigation { list-style: none; background: #111; width: 100%; height: 100%; position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 0;} |
1
2
3
4
5
6
7
8
9
10
| .site-wrap { min-width: 100%; min-height: 100%; background-color: #fff; position: relative; top: 0; bottom: 100%; left: 0; z-index: 1;} |
1
2
3
4
5
6
7
8
| .site-wrap { padding: 4em; background-image: linear-gradient(135deg, rgb(254,255,255) 0%, rgb(221,241,249) 35%, rgb(160,216,239) 100%); background-size: 200%;} |
1
2
3
4
5
| .nav-trigger { display: block; width: 0; height: 0;} |
displa: block важны. По умолчанию input элементы отображаться как inline-block, так что мы должны установить его как block, чтобы мы могли установить ширину и высоту до нуля. Если мы использовали бы display:none или visiblity: hidden то отключили бы взаимодействие клавиатуру с кнопкой меню, так что мы избежали этого.элемент:
1
2
3
4
5
6
| label[for="nav-trigger"] { position: fixed; top: 15px; left: 15px; z-index: 2;} |
position: fixed; теперь label будет на фиксированном месте во время прокрутки страницы. top и left свойства определяют, как далеко от края будет находится кнопка. Мы также установим z-index что бы кнопка была выше .site-wrap.
1
2
3
4
5
6
7
| label[for="nav-trigger"] { width: 30px; height: 30px; cursor: pointer; background-image: url("data:image/svg+xml;utf8,"); background-size: contain;} |
cursor: pointer; для визуального отображения интерактивности кнопки.
1
2
3
4
5
6
7
| .nav-trigger:checked + label { left: 215px;}.nav-trigger:checked ~ .site-wrap { left: 200px; box-shadow: 0 0 5px 5px rgba(0,0,0,0.5);} |
.nav-trigger:checked + label) контролирует положение триггера, когда меню открыто. Значение 215 получается из суммы значений 15 ( label[for="nav-trigger"] значение left) и 200 (.nav-trigger:checked ~ .site-wrap значение left )
1
2
3
| .nav-trigger + label, .site-wrap { transition: left 0.2s;} |
1
2
3
| body { overflow-x: hidden;} |
источник













