Випадаюче навігаційне меню на CSS/HTML

Навігаційне меню – це найважливіша частина сайту. Зручне навігаційне меню допомагає користувачеві швидше зрозуміти, де і що знаходиться, на що потрібно натиснути або навести, щоб побачити вкладені пункти.

Випадаючий список навігайного меню актуален, коли у нас є підпункти одного або декількох пунктів меню і ми хочемо щоб користувач швидше міг їх побачити.

Тобто наводимо на перший рівень → бачимо вкладені пункти → натискаємо і переходимо на сторінку другого рівня (підпункт). Фактично одне натискання.

Якщо ми не даємо можливість відразу перейти на підпункт, то користувачеві потрібно буде спочатку відвідати батьківський розділ, а потім тільки в нього вкладений пункт меню. Це не зручно з погляду юзабіліти – ми маємо зайве натискання та перехід, тобто два натискання.

Коли це потрібно

  1. При наявності каталогу. У більшості випадків каталог має категорії та підкатегорії.
    Наприклад вкладеність:
    – Магазин (рівень 1)
    — Категорія 1 (рівень 2)
    — Категорія 2 (рівень 2)
    — Категорія 3 (рівень 2)

  2. В інших випадках, коли є розділ “Про нас”, наприклад
    – Про нас (рівень 1)
    — Наша історія (рівень 2)
    — Наша команда (рівень 2)
    — Відгуки (рівень 2)

Навігаційне меню

Умови

  1. Навігаційне меню має бути зроблене невпорядкований списком, тобто на тегах <ul><li>, всі властивості на елементи задаємо від основного класу на батьківському елементі.
  2. Активний клас має назву ‘active’
  3. У неупорядкованому списку немає тегів крім <ul>, <li>, <a>. Якщо потрібно додати обгортку <div>, <span> та інші – зробить це на js

По коду додатково можна подивитись тут – “Стандартні HTML елементи та структура сайту“, а також там можна завантажити HTML шаблон.

Чому саме так

  1. Навігаційне меню інтегруватиметься в CMS, а 100% CMS таких як Worpdress, Joomla, Opencart та багато інших мають саме таку розмітку – невпорядкований список без класів на посиланнях або інших додаткових конструкціях типу як обгортка навколо вкладеного <ul>
  2. Класи можуть відрізнятися в різних CMS. Наприклад, у WordPress активний клас це current-menu-item, у Joomla – active, це лише приклад, а не проблема. Перейменувати чи додати через комусь клас це не проблема. Проблема це коли будуть додані класи на <li>, <a> на всі рівні і ще різні, і потрібно це якось буде інтегрувати. Так, можна підключити свою розмітку меню через Walker_Nav_Menu у Wordrpess або додати через модуль у Joomla, спробувати зробити там розмітку, ось тільки навіщо – це все набагато складніше, ніж зробити це в css.
  3. Загалом це стандарт використовувати невпорядкований список без зайвих елементів для навігаційного меню.

Як робити меню

Написання коду для навігайійного меню можна поділіти на дві частини – робимо перший рівень і після додаємо другій рвіен. Це приклад, тому я використовував колір та розміри на свій розсуд. Починаємо з написання коду для першого рівня навігаційного меню.

HTML код для навігаційного меню першого рівня


<ul class="menu">
	<li><a href="#">Home</a></li>
	<li><a href="#">Shop</a></li>
	<li><a href="#">Blog</a></li>
	<li><a href="#">About Us</a></li>
	<li><a href="#">Contact Us</a></li>
</ul>

Тег <a> не залишаємо порожнім. Якщо нам невідоме посилання, то ставимо ‘#‘. Це обов’язково.

Тег <li> це блоковий елемент, щоб зробити його лінійним (пункти поруч один з одним), нам потрійно використовувати css властивість display щоб змінити поведінку елемента.

Нам потрібно використовувати властивість css, яке буде робити пункти меню в одну лінію, але залишить всі інші значення як у блокового елемента.

Допустимо використовувати одне з трьох значень:

  1. display: flex (немає зараз великих проблем при застосуванні)
  2. float: left (потрібно буде додавати додаткові властивості на батьківський контейнер, тому ще після застосування на дочірні <li> елементи властивості float, висота батьківського <ul> дорівнюватиме нулю)
  3. inline-block (потрібно буде враховувати додатковий відступ у 4px, який буде додано на кожен елемент, також будуть проблеми з вертикальним позиціонуванням тексту або інших елементів усередині елемента <li>)

 СSS код для навігаційного меню першого рівня


.menu {
	display: flex; /* задаємо flex на батьківський контейнер щоб зробити вкладені елементи в один рядок */
	background: #4d6719; /* додаю фон на батьківський контейнер */
}
.menu li {
	font-size: 16px; /* розмір шрифту */
	font-family: Arial, Helvetica; /* додаємо через кому шрифти */
	border-left: 1px solid #7ba428; /* візуальний елемент – смужка між пунктами */
	position: relative; /* це потрібно, щоб позиціонувати другий рівень щодо першого */
}
.menu>li:last-child {
	border-right: 1px solid #7ba428; /* ми додали смужку зліва, але у останнього пункту смужки не буде праворуч, тому додаємо її окремо лише на останній пункт */
}
.menu li a {
	display: block; /* робимо тег блоковим, щоб можна було застосувати відступи */
	padding: 0 25px; /* додаю відступи ліворуч і праворуч - щоб був простір між смужками */
	line-height: 40px; /* такої висоти у нас буде контейнер, ми його центруємо по вертикалі. */
	color: #9acd32;
	text-decoration: none;
}
.menu li a:hover, 
.menu li.active>a {
	color: #fff;
	background: #9acd32; 
        /* змінюємо при наведенні колір фону пункту меню, колір тексту, через кому прописуємо значення для активного пункту  */
}

По “.menu li a”:

  • відступи потрібно ставити саме на посилання, щоб користувачеві простіше було натиснути (юзабіліті) на посилання – воно буде розміром на весь елемент.
  • центрувати текст за допомогою відступів складно; центрувати за допомогою align-items – можна, але все одно потрібно задавати розмір на <a>, так як у блокового елемента висота дорівнює нулю і буде в нашому випадку дорівнювати 16px – розміру шрифта навігційного меню. Тому line-height найпростіший і найшвидший спосіб
  • .menu li.active>a – пропишемо через комбінатор (>), щоб ці властивості не наслідував другий рівень меню

Візуально меню буде виглядати так:

Додамо другій рівень меню для пункту “Shop”. Код HTML буд таким


<ul class="menu">
	<li><a href="#">Home</a></li>
	<li class="active">
		<a href="#">Shop</a>
		<ul>
			<li><a href="#">Category 1</a></li>
			<li class="active"><a href="#">Category 2</a></li>
			<li><a href="#">Category 3</a></li>
		</ul>
	</li>
	<li><a href="#">Blog</a></li>
	<li><a href="#">About Us</a></li>
	<li><a href="#">Contact Us</a></li>
</ul>

Код CSS для другого рівня випадаючого меню


/* sublevel */
.menu li ul {
	position: absolute; /* позиціонуємо абсолютно, щоб цей елемент був у межах першого рівня "shop" - я додавав на нього relative */
	top: 40px; /* вказуємо відступ зверху який дорівнює нашому line-height */
	left: 0; /* позиціонування зліва */
	width: 200px; /* задаємо розмір контейнера, інакше ширина дорівнюватиме ширині пункту меню другого рівня */
	border: 1px solid #5c7b1e; /* задамо обводку */
	border-top: none; /* приберемо обведення зверху – воно у нас буде додана на li зверху */
	display: none; /* після того, як усі стилі оформлені, приховуємо другий рівень меню */
}
.menu li ul li {
	border: none; /* обнуляємо стилі з першого рівня */
	border-top: 1px solid #5c7b1e;
}
.menu li ul li a {
	line-height: 23px; /* обнулюємо міжрядковий інтервал з першого рівня */
	background: #c2e184;
	color: #3d5214;
	padding: 10px 15px; /* задаємо відступи */
}
.menu li ul li a:hover, 
.menu li ul li.active a {
	background: #6b9023; 
	color: #fff;
}
/* mouse over */
.menu li:hover ul {
	display: block; /* показуємо меню при наведенні на перший рівень меню */
}

Візуально навігаційне меню виглядатиме так

Код HTML випадаючого меню повністю


<ul class="menu">
	<li><a href="#">Home</a></li>
	<li class="active">
		<a href="#">Shop</a>
		<ul>
			<li><a href="#">Category 1</a></li>
			<li class="active"><a href="#">Category 2</a></li>
			<li><a href="#">Category 3</a></li>
		</ul>
	</li>
	<li><a href="#">Blog</a></li>
	<li><a href="#">About Us</a></li>
	<li><a href="#">Contact Us</a></li>
</ul>

Код CSS випадаючого меню повністю


.menu {
	display: flex; /* задаємо flex на батьківський контейнер щоб зробити вкладені елементи в один рядок */
	background: #4d6719; /* додаю фон на батьківський контейнер */
}
.menu li {
	font-size: 16px; /* розмір шрифту */
	font-family: Arial, Helvetica; /* додаємо через кому шрифти */
	border-left: 1px solid #7ba428; /* візуальний елемент – смужка між пунктами */
	position: relative; /* це потрібно, щоб позиціонувати другий рівень щодо першого */
}
.menu>li:last-child {
	border-right: 1px solid #7ba428; /* ми додали смужку зліва, але у останнього пункту смужки не буде праворуч, тому додаємо її окремо лише на останній пункт */
}
.menu li a {
	display: block; /* робимо тег блоковим, щоб можна було застосувати відступи */
	padding: 0 25px; /* додаю відступи ліворуч і праворуч - щоб був простір між смужками */
	line-height: 40px; /* такої висоти у нас буде контейнер, ми його центруємо по вертикалі. */
	color: #9acd32;
	text-decoration: none;
}
.menu li a:hover, 
.menu li.active>a {
	color: #fff;
	background: #9acd32; 
        /* змінюємо при наведенні колір фону пункту меню, колір тексту, через кому прописуємо значення для активного пункту  */
}
/* sublevel */
.menu li ul {
	position: absolute; /* позиціонуємо абсолютно, щоб цей елемент був у межах першого рівня "shop" - я додавав на нього relative */
	top: 40px; /* вказуємо відступ зверху який дорівнює нашому line-height */
	left: 0; /* позиціонування зліва */
	width: 200px; /* задаємо розмір контейнера, інакше ширина дорівнюватиме ширині пункту меню другого рівня */
	border: 1px solid #5c7b1e; /* задамо обводку */
	border-top: none; /* приберемо обведення зверху – воно у нас буде додана на li зверху */
	display: none; /* після того, як усі стилі оформлені, приховуємо другий рівень меню */
}
.menu li ul li {
	border: none; /* обнуляємо стилі з першого рівня */
	border-top: 1px solid #5c7b1e;
}
.menu li ul li a {
	line-height: 23px; /* обнулюємо міжрядковий інтервал з першого рівня */
	background: #c2e184;
	color: #3d5214;
	padding: 10px 15px; /* задаємо відступи */
}
.menu li ul li a:hover, 
.menu li ul li.active a {
	background: #6b9023; 
	color: #fff;
}
/* mouse over */
.menu li:hover ul {
	display: block; /* показуємо меню при наведенні на перший рівень меню */
}

Робочий приклад випадаючого навігаційного меню

Вас може зацікавити