Приходилось ли вам использовать аккордеон в своем проекте? Обычно, для таких задач используется какой-нибудь плагин jQuery или вариант на чистом JavaScript. Назначение аккордеона - демонстрация изображений или списка свойств и особенностей продукта. В таком случае можно легко обойтись только возможностями CSS3? которые позволят обрабатывать событие OnClick и построить анимацию для смены слайдов.
Версия jQuery
Первая демонстрация нашего урока содержит аккордеон, построенный на плагине jQuery liteAccordion:
<!DOCTYPE HTML>
<html lang="ru">
<head>
<meta charset="utf-8" />
<title>Преобразуем аккордеон jQuery в аккордеон CSS3 | Материалы сайта RUSELLER.COM</title>
<!-- Файлы CSS -->
<link href="css/layout.css" rel="stylesheet" />
<link href="css/liteaccordion.css" rel="stylesheet" />
<!-- jQuery -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<!-- jQuery easing -->
<script src="js/jquery.easing.1.3.js"></script>
<!-- Бибилиотека liteAccordion для jQuery -->
<script src="js/liteaccordion.jquery.js"></script>
<script>
$(document).ready(function(){
$('#js_version').liteAccordion({
theme : 'dark',
rounded : true,
enumerateSlides : true,
firstSlide : 1,
linkable : true,
easing: 'easeInOutSine'
});
});
</script>
</head>
<body>
<header>
<h2>Преобразуем аккордеон jQuery в аккордеон CSS3</h2>
</header>
<h1>Аккордеон jQuery (с использованием liteAccordion)</h1>
<div id="js_version" class="accordion">
<ol>
<li data-slide-name="slide1">
<h2><span>Слайд Один</span></h2>
<div>
<img src="images/1.jpg" alt="Slide One" />
</div>
</li>
<li data-slide-name="slide2">
<h2><span>Слайд Два</span></h2>
<div>
<img src="images/2.jpg" alt="Slide Two" />
</div>
</li>
<li data-slide-name="slide3">
<h2><span>Слайд Три</span></h2>
<div>
<img src="images/3.jpg" alt="Slide Three" />
</div>
</li>
<li data-slide-name="slide4">
<h2><span>Слайд Четыре</span></h2>
<div>
<img src="images/4.jpg" width="768" alt="Slide Four" />
</div>
</li>
<li data-slide-name="slide5">
<h2><span>Слайд Пять</span></h2>
<div>
<img src="images/5.jpg" alt="Slide Five" />
</div>
</li>
</ol>
<noscript>
<p>Для работы приложения требуется JavaScript</p>
</noscript>
</div>
<a href="index2.html#slide1"><h2>Версия аккордеона на CSS3</h2></a>
</body>
</html>
В заголовке добавляются все необходимые библиотеки и стили (jQuery, jquery.easing и liteAccordion), а также инициализация плагина. А в теле документа представлена структура аккордеона (упорядоченный список) со слайдами. Типовая структура для аккордеонов.
Аккордеон на CSS3
Теперь построим аккордеон на CSS3. Для начала удалим весь код JavaScript и файл стилей liteaccordion.css. Подготовим собственные стили для нашего проекта. Также добавим ссылки в заголовки слайдов, чтобы получить возможность переключать слайды. в результате изменений структура документа станет следующей:
<!DOCTYPE HTML>
<html lang="ru">
<head>
<meta charset="utf-8" />
<title>Преобразуем аккордеон jQuery в аккордеон на CSS3 | Материалы сайта RUSELLER.COM</title>
<!-- Файлы CSS -->
<link href="css/layout.css" rel="stylesheet" />
<link href="css/main.css" rel="stylesheet" />
</head>
<body>
<header>
<h2>Преобразуем аккордеон jQuery в аккордеон на CSS3</h2>
</header>
<h1>Версия на CSS3</h1>
<div class="accordion css3accordion">
<span id="slide1"></span>
<span id="slide2"></span>
<span id="slide3"></span>
<span id="slide4"></span>
<span id="slide5"></span>
<ol>
<li class="slide1">
<a href="#slide1"><h2><span>Слайд Один</span></h2></a>
<div>
<img src="images/1.jpg" alt="Слайд Один" />
</div>
</li>
<li class="slide2">
<a href="#slide2"><h2><span>Слайд Два</span></h2></a>
<div>
<img src="images/2.jpg" alt="Слайд Два" />
</div>
</li>
<li class="slide3">
<a href="#slide3"><h2><span>Слайд Три</span></h2></a>
<div>
<img src="images/3.jpg" alt="Слайд Три" />
</div>
</li>
<li class="slide4">
<a href="#slide4"><h2><span>Слайд Четыре</span></h2></a>
<div>
<img src="images/4.jpg" alt="Слайд Четыре" />
</div>
</li>
<li class="slide5">
<a href="#slide5"><h2><span>Слайд Пять</span></h2></a>
<div>
<img src="images/5.jpg" alt="Слайд Пять" />
</div>
</li>
</ol>
</div>
<a href="index3.html"><h2>Версия аккордеона на CSS3 с автоматическим проигрыванием</h2></a>
</body>
</html>
Также добавим несколько элементов span. По умолчанию они будут скрыты, но мы будем использовать их для обработки события Onclick. Теперь создадим стили для аккордеона CSS3 - сначала для внешнего контейнера и внутренних элементов span:
/* Аккордеон CSS3 */
.css3accordion {
border: 9px solid #353535;
border-radius: 6px;
padding: 5px 5px 6px 0;
background: #030303;
height: 320px;
width: 960px;
/* Тени CSS3 */
-webkit-box-shadow: 0 -1px 0 #555 inset, 0 5px 15px rgba(0, 0, 0, 0.5);
-moz-box-shadow: 0 -1px 0 #555 inset, 0 5px 15px rgba(0, 0, 0, 0.5);
-ms-box-shadow: 0 -1px 0 #555 inset, 0 5px 15px rgba(0, 0, 0, 0.5);
-o-box-shadow: 0 -1px 0 #555 inset, 0 5px 15px rgba(0, 0, 0, 0.5);
box-shadow: 0 -1px 0 #555 inset, 0 5px 15px rgba(0, 0, 0, 0.5);
}
/* Скрываем первый уровень */
.css3accordion > span {
display: none
}
И затем определяем стили для остальных элементов:
/* Основные стили и слайды аккордеона */
.css3accordion ol {
height: 100%;
list-style: none;
overflow: hidden;
position: relative;
}
.css3accordion li {
float: left;
height: 100%;
overflow: hidden;
position: relative;
width: 48px;
/* Переходы CSS3 для слайдов */
-webkit-transition: all 0.9s ease-in-out;
-moz-transition: all 0.9s ease-in-out;
-ms-transition: all 0.9s ease-in-out;
-o-transition: all 0.9s ease-in-out;
transition: all 0.9s ease-in-out;
}
.css3accordion li a {
display: block;
float: left;
height: 320px;
position: relative;
width: 48px;
}
/* Заголовки слайдов */
.css3accordion h2 {
font-size: 16px;
font-weight: normal;
height: 48px;
left: 0;
line-height: 265%;
margin: 0;
position: absolute;
top: 0;
width: 320px;
z-index: 1;
-webkit-backface-visibility: hidden;
-webkit-transform: translateX(-100%) rotate(-90deg);
-webkit-transform-origin: right top;
-moz-transform: translateX(-100%) rotate(-90deg);
-moz-transform-origin: right top;
-ms-transform: translateX(-100%) rotate(-90deg);
-ms-transform-origin: right top;
-o-transform: translateX(-100%) rotate(-90deg);
-o-transform-origin: right top;
transform: translateX(-100%) rotate(-90deg);
transform-origin: right top;
}
.css3accordion h2 span {
background-color: #353535;
border-radius: 4px;
color: #fff;
display: block;
margin-top: 5px;
padding-right: 10%;
text-align: right;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;
}
.css3accordion h2 span:hover {
background-color: #353535;
background: -webkit-gradient(linear, left top, right top, color-stop(0%,#353535), color-stop(100%,#555555));
background: -webkit-linear-gradient(left, #353535 0%,#555555 100%);
background: -moz-linear-gradient(left, #353535 0%, #555555 100%);
background: -ms-linear-gradient(left, #353535 0%,#555555 100%);
background: -o-linear-gradient(left, #353535 0%,#555555 100%);
background: linear-gradient(left, #353535 0%,#555555 100%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#353535', endColorstr='#555555',GradientType=1 );
}
/* Внутреннее содержание слайда */
.css3accordion li div {
margin-left: 5px;
padding-left: 48px;
}
Теперь разберемся, как выводить счетчик слайдов в каждом заголовке. Для решения будем использовать элемент :after:
/* Объект-счетчика */
.css3accordion h2 span:after {
color: #080808;
font-weight: bold;
left: 10%;
position: absolute;
text-shadow: -1px 1px 0 #555555;
top: 10%;
/* Вращение CSS3 для счетчика */
-webkit-transform: rotate(90deg);
-moz-transform: rotate(90deg);
-ms-transform: rotate(90deg);
-o-transform: rotate(90deg);
transform: rotate(90deg);
}
/* Значения счетчика */
li.slide1 h2 span:after {
content: "1";
}
li.slide2 h2 span:after {
content: "2";
}
li.slide3 h2 span:after {
content: "3";
}
li.slide4 h2 span:after {
content: "4";
}
li.slide5 h2 span:after {
content: "5";
}
И в завершении реализуем обработку события Onclick:
/* Действия по нажатию кнопки мыши */
#slide1:target ~ ol li.slide1,
#slide2:target ~ ol li.slide2,
#slide3:target ~ ol li.slide3,
#slide4:target ~ ol li.slide4,
#slide5:target ~ ol li.slide5 {
width: 768px;
}
#slide1:target ~ ol li.slide1 span,
#slide2:target ~ ol li.slide2 span,
#slide3:target ~ ol li.slide3 span,
#slide4:target ~ ol li.slide4 span,
#slide5:target ~ ol li.slide5 span {
background: #353535;
background: -webkit-gradient(linear, left top, right top, color-stop(0%,#353535), color-stop(100%,#555555));
background: -webkit-linear-gradient(left, #353535 0%,#555555 100%);
background: -moz-linear-gradient(left, #353535 0%, #555555 100%);
background: -ms-linear-gradient(left, #353535 0%,#555555 100%);
background: -o-linear-gradient(left, #353535 0%,#555555 100%);
background: linear-gradient(left, #353535 0%,#555555 100%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#353535', endColorstr='#555555',GradientType=1 );
}
Автоматическое проигрывание
Для реализации автоматического проигрывания отключим обработку события Onclick и изменим анимацию:
/* Автоматическая анимация */
.css3accordion li {
-webkit-animation-name: anim_slides;
-webkit-animation-duration: 25.0s;
-webkit-animation-timing-function: ease-in-out;
-webkit-animation-iteration-count: infinite;
-webkit-animation-direction: normal;
-webkit-animation-delay: 0;
-webkit-animation-play-state: running;
-webkit-animation-fill-mode: forwards;
-moz-animation-name: anim_slides;
-moz-animation-duration: 25.0s;
-moz-animation-timing-function: ease-in-out;
-moz-animation-iteration-count: infinite;
-moz-animation-direction: normal;
-moz-animation-delay: 0;
-moz-animation-play-state: running;
-moz-animation-fill-mode: forwards;
}
.css3accordion li:nth-child(2) {
-webkit-animation-delay: 5.0s;
-moz-animation-delay: 5.0s;
}
.css3accordion li:nth-child(3) {
-webkit-animation-delay: 10.0s;
-moz-animation-delay: 10.0s;
}
.css3accordion li:nth-child(4) {
-webkit-animation-delay: 15.0s;
-moz-animation-delay: 15.0s;
}
.css3accordion li:nth-child(5) {
-webkit-animation-delay: 20.0s;
-moz-animation-delay: 20.0s;
}
@-webkit-keyframes anim_slides {
0% {
width: 48px;
}
20% {
width: 768px;
}
40% {
width: 48px;
}
100% {
width: 48px;
}
}
@-moz-keyframes anim_slides {
0% {
width: 48px;
}
20% {
width: 768px;
}
40% {
width: 48px;
}
100% {
width: 48px;
}
}