Работает оно по принципу, что если в основной раздел вложен только один подраздел, то выпадает обычное подменю, а если в этот подраздел вложены еще под-подразделы, то открывается мега-меню (в примере это 4 колонки).
Данное меню удобно настроить под свои нужны, а из-за отсутствия классов у всех списков - внедрить в любую CMS
Также стоит отметить удобный адаптивный вариант, складывающий на узком экране все меню и открывающий подменю отдельной кнопкой (часто можно видеть что подменю открывается нажатием на раздел, что лишает его возможности быть ссылкой).
Для иконок мобильного меню используется шрифт Font Awesome
Пример:
HTML:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
<div class="menu-container"> <div class="menu"> <ul> <li><a href="#link">Главная</a></li> <li><a href="#link">Мега-меню</a> <ul> <li><a href="#link">Раздел 1</a> <ul> <li><a href="#link">Раздел 1.1</a></li> <li><a href="#link">Раздел 1.2</a></li> <li><a href="#link">Раздел 1.3</a></li> <li><a href="#link">Раздел 1.4</a></li> </ul> </li> <li><a href="#link">Раздел 2</a> <ul> <li><a href="#link">Раздел 2.1</a></li> <li><a href="#link">Раздел 2.2</a></li> <li><a href="#link">Раздел 2.3</a></li> <li><a href="#link">Раздел 2.4</a></li> <li><a href="#link">Раздел 2.5</a></li> </ul> </li> <li><a href="#link">Раздел 3</a> <ul> <li><a href="#link">Раздел 3.1</a></li> <li><a href="#link">Раздел 3.2</a></li> <li><a href="#link">Раздел 3.3</a></li> </ul> </li> <li><a href="#link">Раздел 4</a> <ul> <li><a href="#link">Раздел 4.1</a></li> <li><a href="#link">Раздел 4.2</a></li> <li><a href="#link">Раздел 4.3</a></li> <li><a href="#link">Раздел 4.4</a></li> </ul> </li> </ul> </li> <li><a href="#link">Подменю</a> <ul> <li><a href="#link">Раздел 1</a></li> <li><a href="#link">Раздел 2</a></li> <li><a href="#link">Раздел 3</a></li> </ul> </li> <li><a href="#link">Контакты</a></li> </ul> </div> </div> |
CSS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 |
.menu-container { width: 100%; margin: 20px auto; background: #337AB7; } .menu-mobile:after { content: "\f0c9"; font-family: "FontAwesome"; font-size: 38px; line-height: 38px; padding: 0; color: #FFF; float: right; position: relative; transform: translateY(-25%); } .menu-dropdown-icon:before { content: "\f078"; font-family: "FontAwesome"; display: none; cursor: pointer; float: right; padding: 10px 20px; margin: 10px; background: #337AB7; color: #FFF; font-size: 20px; } .menu > ul { margin: 0 auto; width: 100%; list-style: none; padding: 0; position: relative; box-sizing: border-box; } .menu > ul:before, .menu > ul:after { content: ""; display: table; } .menu > ul:after { clear: both; } .menu > ul > li { float: left; background: #337AB7; padding: 0; margin: 0; transition: .2s ease-in-out; } .menu > ul > li a, .menu-mobile { text-decoration: none; padding: 20px 30px; display: block; color: #FFF; font-size: 20px; line-height: 20px; font-family: 'Roboto', sans-serif; transition: .2s ease-in-out; } .menu-mobile { display: none; } .menu > ul > li:hover { background: #BFE2FF; } .menu > ul > li:hover a { color: #000; } .menu > ul > li > ul { display: none; width: 100%; background: #BFE2FF; padding: 20px; position: absolute; z-index: 99; left: 0; margin: 0; list-style: none; box-sizing: border-box; } .menu > ul > li > ul:before, .menu > ul > li > ul:after { content: ""; display: table; } .menu > ul > li > ul:after { clear: both; } .menu > ul > li > ul > li { margin: 0; padding-bottom: 0; list-style: none; width: 25%; background: none; float: left; } .menu > ul > li > ul > li a { padding: 10px; display: block; border-bottom: 1px solid #337AB7; } .menu > ul > li > ul > li a:hover { color: #337AB7; border-bottom: 1px solid #000; } .menu > ul > li > ul > li > ul { display: block; padding: 0; margin: 10px 0 0; list-style: none; box-sizing: border-box; } .menu > ul > li > ul > li > ul:before, .menu > ul > li > ul > li > ul:after { content: ""; display: table; } .menu > ul > li > ul > li > ul:after { clear: both; } .menu > ul > li > ul > li > ul > li { float: left; width: 100%; margin: 0; } .menu > ul > li > ul > li > ul > li a { border: 0; padding: 10px 12px; font-size: 18px; } .menu > ul > li > ul > li > ul > li a:hover { border: 0; } .menu > ul > li > ul.normal-sub { width: 300px; left: auto; padding: 20px; } .menu > ul > li > ul.normal-sub > li { width: 100%; } .menu > ul > li > ul.normal-sub > li a { border: 0; padding: 10px; } @media only screen and (max-width: 768px) { .menu-container { width: 100%; } .menu-mobile { display: block; } .menu-dropdown-icon:before { display: block; } .menu > ul { display: none; } .menu > ul > li { width: 100%; float: none; display: block; background: #BFE2FF; border-top: 2px solid #FFF; border-bottom: 2px solid #FFF; } .menu > ul > li a { padding: 20px; width: 100%; display: block; color: #000; } .menu > ul > li > ul { position: relative; } .menu > ul > li > ul.normal-sub { width: 100%; } .menu > ul > li > ul > li { float: none; width: 100%; } .menu > ul > li > ul:not(.normal-sub) > li { margin-top: 20px; } .menu > ul > li > ul > li:first-child { margin: 0; } .menu > ul > li > ul > li > ul { position: relative; } .menu > ul > li > ul > li > ul > li { float: none; } .menu .show-on-mobile { display: block; } } |
jQuery:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$(document).ready(function() { "use strict"; $('.menu > ul > li:has( > ul)').addClass('menu-dropdown-icon'); $('.menu > ul > li > ul:not(:has(ul))').addClass('normal-sub'); $(".menu > ul").before("<span class=\"menu-mobile\">Меню:</span>"); $(".menu > ul > li").hover(function(e) { if ($(window).width() > 768) { $(this).children("ul").stop(true, false).fadeToggle(150); e.preventDefault(); } }); $(".menu > ul > li").click(function(e) { if (($(window).width() <= 768) && (($(".menu > ul > li").width() - e.offsetX) < 70)) { $(this).children("ul").fadeToggle(150); } }); $(".menu-mobile").click(function(e) { $(".menu > ul").toggleClass('show-on-mobile'); e.preventDefault(); }); }); |
Источник: github
Всё отлично.
Только вот как бы сделать в мобильной версии (цитирую из другой вашей статьи) "открытие (закрытие) подуровня происходило по клику на плюс (минус)"
У меню есть один недостаток. В адаптивной версии при клике на пункт меню у которого есть дочерние пункты (не на указатель открытия дочерних пунктов) дочерние пункты открываются и после происходит переход на страницу раздела, эти разворачивания бы убрать и будет незаменимая вещь.
Стрелка добавляется через псевдоэлемент :before, на который нельзя повесить клик. поэтому он идет по всей строке списка li вместе с ссылкой. В итоге и происходит открытие подменю.
Но можно ограничить это открытие и показывать подменю, только если клик прошел в правой его части, например в 70 пикселях.
Я поправил код, проверьте.
Как сделать скролл мобильного меню? У меня не влезает в видимость мобильного окна. Спасибо
Это меню не фиксированное, оно двигает страницу вниз и соотв. все там умещается.
А если оно у вас зафиксировано как то, то пробуйте как нибудь через:
А можно как то иконки нарисовать средствами css?
Вообще не сработало! Только верхняя строка с меню и ни каких подменю. При уменьшении экрана полное исчезновение всего!
А jQuery то подключена?
Если да, то скрипт должен быть ниже нее.
Конечно же скрипт подключен. Сразу его и поставил в самый низ, а потом и на верх ставил. Увы. И понять не могу почему. В разных браузерах смотрел.
Ссылку надо, угадать невозможно.
Не подскажите как расположить пункты меню справой стороны. Меняю
но пункты меню становятся справа зеркально.
Заранее спасибо!
Добавить:
Заменить:
На:
Только не забывайте что выпадайка открывается вправо и может не уместиться на последних пунктах меню.
Круть! Данке Шён! Мулцумеск! Рахмет! Than You!
Запарился искать отличное меню, а оно вон где спряталось, на Вашем сайте!
--
Спасибо!
--
А вопросик можно?
Как сделать так, чтобы в адаптивном варианте при клике на один подраздел - другой открытый раздел закрывался бы, как в аккордеоне?
Вместо:
Ставим:
Доброго времени суток.
Почему у меня в 3 строке js, одинокая стрелочка перед ul в скобках, ошибку даёт?
А какую ошибку?
И тут посмотрел, и в вакууме локально и на codepen кинул код - ошибок нет...
Может версия jQuery?
Без демо ничего не понятно. Скопировал код вставил в html, адаптивности нет...
Для демо сузьте окно браузера