Подменю в dropdown Bootstrap

Разработчики Bootstrap начиная с третьей версии удалили поддержку подменю в dropdown из-за того, что им никто не пользуется и на мобильных эта функция не актуальна. Ниже представлены примеры как сделать подменю.

1

HTML код

<div class="dropdown">
	<button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">
		Dropdown button <span class="caret"></span>
	</button>
	<ul class="dropdown-menu">
		<li><a href="#">1-й уровень</a></li>
		<li class="dropdown-submenu">
			<a tabindex="-1" href="#">1-й уровень</a>
			<ul class="dropdown-menu">
				<li><a href="#">2-й уровень</a></li>
				<li class="dropdown-submenu">
					<a tabindex="-1" href="#">2-й уровень</a>
					<ul class="dropdown-menu">
						<li><a href="#">3-й уровень</a></li>
						<li><a href="#">3-й уровень</a></li>
					</ul>
				</li>
			</ul>
		</li>
		<li class="dropdown-submenu">
			<a tabindex="-1" href="#">1-й уровень</a>
			<ul class="dropdown-menu">
				<li><a href="#">2-й уровень</a></li>
				<li class="dropdown-submenu">
					<a tabindex="-1" href="#">2-й уровень</a>
					<ul class="dropdown-menu">
						<li><a href="#">3-й уровень</a></li>
						<li><a href="#">3-й уровень</a></li>
					</ul>
				</li>
			</ul>
		</li>
	</ul>
</div>
HTML

CSS

.dropdown-submenu {
	position: relative;
}
.dropdown-submenu > .dropdown-menu {
	top: 0;
	left: 100%;
	margin-top: -6px;
	margin-left: -1px;
	-webkit-border-radius: 0 6px 6px 6px;
	-moz-border-radius: 0 6px 6px 6px;
	border-radius: 0 6px 6px 6px;
}
.dropdown-submenu:hover > .dropdown-menu {
	display: block;
}
.dropdown-submenu > a:after {
	display: block;
	content: " ";
	float: right;
	width: 0;
	height: 0;
	border-color: transparent;
	border-style: solid;
	border-width: 5px 0 5px 5px;
	border-left-color: #cccccc;
	margin-top: 5px;
	margin-right: -10px;
}
.dropdown-submenu:hover > a:after {
	border-left-color: #ffffff;
}
.dropdown-submenu.pull-left {
	float: none;
}
.dropdown-submenu.pull-left > .dropdown-menu {
	left: -100%;
	margin-left: 10px;
	-webkit-border-radius: 6px 0 6px 6px;
	-moz-border-radius: 6px 0 6px 6px;
	border-radius: 6px 0 6px 6px;
}
CSS
2

HTML код

<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" crossorigin="anonymous"></script>

<div class="dropdown">
	<button class="btn btn-secondary dropdown-toggle" type="button" data-toggle="dropdown">
		Dropdown button
	</button>
	<div class="dropdown-menu">
		<a class="dropdown-item" href="#">1-й уровень</a>
		<a class="dropdown-item submenu" href="#">1-й уровень</a>
		<div class="dropdown-menu">
			<a class="dropdown-item" href="#">2-й уровень</a>
			<a class="dropdown-item submenu" href="#">2-й уровень</a>
			<div class="dropdown-menu">
				<a class="dropdown-item" href="#">3-й уровень</a>
	   			<a class="dropdown-item" href="#">3-й уровень</a>
	  		</div>
		</div>
		<a class="dropdown-item submenu" href="#">1-й уровень</a>
		<div class="dropdown-menu">
			<a class="dropdown-item" href="#">2-й уровень</a>
			<a class="dropdown-item submenu" href="#">2-й уровень</a>
			<div class="dropdown-menu">
				<a class="dropdown-item" href="#">3-й уровень</a>
	   			<a class="dropdown-item" href="#">3-й уровень</a>
	  		</div>
		</div>
	</div>
</div>
HTML

CSS

.dropdown-menu .dropdown-menu {
	top: auto;
	left: 100%;
	transform: translateY(-2rem);
}
.dropdown-item + .dropdown-menu {
	display: none;
}
.dropdown-item.submenu::after {
	content: '▸';
	margin-left: 0.5rem;
}
.dropdown-item:hover + .dropdown-menu,
.dropdown-menu:hover {
	display: block;
}
CSS
15.12.2016, обновлено 27.01.2021
24190

Комментарии 8

Тарас Лисняк Тарас Лисняк
30 июня 2020 в 03:50
Автор спасибо большое за труды, но хотел бы Вас попросить поправить баг в работе выпадающего списка с Bootstrap 4, если подменюх несколько, то при переходе в первую(и прогулке по ней) идет коллизия со второй.
вот пример: https://jsfiddle.net/Taras_wind/zxfascmh/2/
Sergey Vlasov Sergey Vlasov
27 января 2021 в 18:38
Вам не удалось победить эту коллизию?
Snipp.ru Snipp.ru
27 января 2021 в 19:22
Версию для Bootstrap 4 исправили (поменялся только CSS).
Sergey Vlasov Sergey Vlasov
27 января 2021 в 21:44
Спасибо большое за наводку
Валерий Герасименко Валерий Герасименко
6 ноября 2021 в 08:43
Меню BS 4. Выглядит красиво! Только не понимаю, как сделать, чтобы второй и последующие уровни показывались не сразу, а, либо по щелчку, либо по наводке мышкой (лучше). Неужели нужно весь геморрой с <nav> тащить?
Я попробовал с Codepen (https://codepen.io/surjithctly/pen/PJqKzQ) - всё получилось, но там другая проблема - второй уровень появляется лишь после второго щелчка мышью, что не слишком хорошо. Видимо проблема со скриптом.
У вас скрипты специализированные или можно обойтись только с официального сайта (https://getbootstrap.com/)?
С уважением ВВГ
Валерий Герасименко Валерий Герасименко
6 ноября 2021 в 09:09
Попробовал поставить ещё пару кнопок - две закрылись, а третья осталась открытой (см. рисунок) - нехорошо! ))
С уважением ВВГ
Валерий Герасименко Валерий Герасименко
6 ноября 2021 в 18:19
Я в восторге от стилей! Всё работает! Для примера построил аж 4-х уровневое меню. Непонятно, правда, откуда берётся стиль .submenu - нигде, кроме как в ваших стилях он не встречается.

, чтобы добавить комментарий.

Другие публикации

Фиксированное горизонтальное меню с активными пунктами
Пример горизонтального меню для лэндингов, в котором реализовано...
12472
+3
Горизонтальное меню justify
В отличии предыдущего меню, где есть отступы у каждого элемента, часто возникает задача сделать резиновое меню без них. Пункты меню должно идти с одинаковыми интервалами и без отступов по бокам.
8354
-1
Главное меню для мобильной версии сайта
Не очень сложное раскрывающееся меню для мобильной версии сайта на JQuery.
43791
+12
Меню-подсказка на затемненном фоне
Пример реализации всплывающей подсказки или меню с затемнением фона на jQuery и CSS, в верстке использованы блок со...
5641
-1
Обработка изображений в PHP
Библиотека GD дает возможность работать с изображениями в PHP. Далее представлены примеры как изменить размер, вырезать часть изображения и т.д.
57870
+14
Загрузка файлов на сервер PHP
В статье приведен пример формы и php-скрипта для безопасной загрузки файлов на сервер, возможные ошибки и рекомендации при работе с данной темой.
71781
+22