Аккордеон меню на CSS

20 апреля 2015 Антон Кулешов 1927 0

Аккордеон меню – лучший вариант решения вертикального меню для сайта, он идеально подойдет для страниц с обширной навигацией. Главное достоинство аккордеон меню в том, что оно очень компактно, при условии того, что внутренних вкладок может быть очень много. С точки зрения пользователя, вертикальное меню намного удобнее горизонтального, т.к. физиологически человеческая кисть устроена так, что нам проще проводить мышью вертикальные, а не горизонтальные линии. Используя аккордеон меню, мы заботимся и о наших пользователях, и украшаем наш сайт динамическими эффектами, делая его ярче и привлекательнее.

Реклама

Начнем, как всегда, c HTML структуры. Сразу отмечу, решение нестандартное и для его реализации мы будем использовать элементы HTML5 и некоторые свойства CSS3, что самое необычное, стилизованные чекбоксы. Чекбоксы нам необходимы для того, чтобы отследить при помощи псевдо-класса checked пункт, который выбрал пользователь.

Чтобы не усложнять конструкцию внутренними пунктами, в примере я ограничусь скрытыми блоками с простым текстом, вы же можете вложить внутрь любые теги (ссылки, дивы, списки и т.д.). Если будете использовать изображения, то не забудьте следить за размерами, чтобы картинка не растянула аккордеон в нечто невообразимое.

HTML структура:

<div class="conntainer">
	<section class="acc-conntainer">
		<!-- 1 пункт -->
		<div>
			<input id="acc-1" name="accordion-1" type="checkbox" />
			<label for="acc-1">Название первого пункта</label>
			<article class="acc-small">
				Контент первого пункта
			</article>
		</div>
		<!-- 2 пункт -->
		<div>
			<input id="acc-2" name="accordion-1" type="checkbox" />
			<label for="acc-2">Название второго пункта</label>
			<article class="acc-medium">
				Контент второго пункта
			</article>
		</div>
	</section>
</div>

Назначаем стили для нашего аккордеона:

.acc-conntainer{
	width: 400px;
	margin: 50px auto 30px;
	text-align: left;
}
.acc-conntainer label{
	font-family: Arial, sans-serif;
	padding: 5px 20px;
	position: relative;
	z-index: 20;
	display: block;
	height: 30px;
	cursor: pointer;
	color: #777;
	text-shadow: 1px 1px 1px rgba(255, 255, 255, 0.8);
	line-height: 33px;
	font-size: 19px;
	background: #ffffff;
	background: -moz-linear-gradient(top, #ffffff 1%, #eaeaea 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(1%, #ffffff), color-stop(100%, #eaeaea));
	background: -webkit-linear-gradient(top, #ffffff 1%, #eaeaea 100%);
	background: -o-linear-gradient(top, #ffffff 1%, #eaeaea 100%);
	background: -ms-linear-gradient(top, #ffffff 1%, #eaeaea 100%);
	background: linear-gradient(top, #ffffff 1%, #eaeaea 100%);
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffffff", endColorstr="#eaeaea",GradientType=0);
	box-shadow: 
		0px 0px 0px 1px rgba(155, 155, 155, 0.3), 
		1px 0px 0px 0px rgba(255, 255, 255, 0.9) inset, 
		0px 2px 2px rgba(0, 0, 0, 0.1);
}

Подсвечиваем вкладку, на которую пользователь навел курсор:

.acc-conntainer label:hover{
	background-color: #fff;
}

Изменяем стили вкладки открытого блока:

.acc-conntainer input:checked + label,
.acc-conntainer input:checked + label:hover{
	background-color: #c6e1ec;
	color: #3d7489;
	text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.6);
	box-shadow: 
		0px 0px 0px 1px rgba(155, 155, 155, 0.3), 
		0px 2px 2px rgba(0, 0, 0, 0.1);
}

Отрисовываем стрелочку при наведении на закрытую вкладку:

.acc-conntainer label:hover:after,
.acc-conntainer input:checked + label:hover:after{
	content: "";
	background: transparent url(../img/arrow_down.png) no-repeat center center;
	position: absolute;
	right: 13px;
	top: 7px;
	width: 24px;
	height: 24px;
}

Отрисовываем стрелочку при наведении на открытую вкладку:

.acc-conntainer input:checked + label:hover:after{
	background-image: url(../img/arrow_up.png);
}

Прячем input по которому мы отслеживает выбор пользователя:

.acc-conntainer input{
	display: none;
}

Задаем стили раскрывающегося блока:

.acc-conntainer article{
	background-color: rgba(255, 255, 255, 0.5);
	margin-top: -1px;
	overflow: hidden;
	height: 0px;
	position: relative;
	z-index: 10;
	transition: height 0.3s ease-in-out, box-shadow 0.6s linear; /* Добавляем свойство с префиксами */
}
.acc-conntainer article p{
	font-style: italic;
	color: #777;
	line-height: 23px;
	font-size: 14px;
	padding: 20px;
	text-shadow: 1px 1px 1px rgba(255, 255, 255, 0.8);
}

Создаем плавную механику открытия скрытых блоков:

.acc-conntainer input:checked ~ article{
	transition: height 0.5s ease-in-out, box-shadow 0.1s linear; /* Учитываем более старые браузеры, не забываем про префиксы */
	box-shadow: 0px 0px 0px 1px rgba(155, 155, 155, 0.3);
}

Значение высоты открывающегося блока прячем в несколько классов, во избежание ошибок построения блоков. Приходится задавать фиксированную высоту потому, как для данного аккордеона мы не используем JavaScript и ограничены только возможностями CSS:

.acc-conntainer input:checked ~ article.acc-small{
	height: 140px;
}
.acc-conntainer input:checked ~ article.acc-medium{
	height: 180px;
}
.acc-conntainer input:checked ~ article.acc-large{
	height: 230px;
}

На этом реализация меню в виде аккордеона на CSS закончено.

Реклама
Комментариев еще не оставлено
no_avatar
Читайте далее

1em или 16px

31 октября 2015 Антон Кулешов

1em – высота шрифта заданная в браузере по умолчанию или настроенная пользователем, и, на мой взгляд, начисто забытая верстальщиками, а зря! Конечно, на это есть и некоторые причины: пиксели привычнее, ощутимее и не зависят от настроек браузера. Вот мы и лепим их везде, борясь за то, чтобы наши проекты везде и всегда выглядели одинаково, только вопрос, а надо ли? Да, кроссбраузерность это хорошо и к этому надо стремиться, но согласитесь – рассматривать страничку в 1024рх на мониторе в 24 дюйма как-то совсем не очень, сайт сразу теряет свой колорит. Даже так называемая «резиновая» верстка не спасает ситуацию, а почему? Да потому, что хоть и задали ширины в процентах, а шрифты и отступы оставили в px, и таких примеров кучи!

Всплывающие окна на jQuery за 3 минуты

8 сентября 2014 Антон Кулешов

Сегодня я расскажу о том, как сделать всплывающие окна на jQuery потратив на это 3 минуты своего времени. Данное решение будет включать в себя минимум кода.

Как определить пользователя, зашедшего с телефона

3 октября 2014 Антон Кулешов

На сегодняшний день у многих высоко посещаемых и популярных сайтов есть мобильная версия. Но как же эти ресурсы определяют: с чего зашел пользователь на сайт? Этот вопрос мы и рассмотрим в статье, а также разберем скрипт, который поможет нам обеспечить необходимый функционал.