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( 135 deg, 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.2 s; } |
1
2
3
| body { overflow-x: hidden ; } |
источник