Адаптивный аккордеон на CSS и JAVASCRIPT
12 ноября 2013 | Опубликовано в css | Нет комментариев »
В сегодняшнем уроке мы будем создавать адаптивный аккордеон. При открытии он будет скользить с верхней части страницы и раскрывать содержимое. Будут добавлены также CSS3 переходы для стрелок. Начнем!
Посмотреть демо или скачать исходные файлы вы можете, нажав на ссылки под изображением ниже.
РАЗМЕТКА
HTML структура будет состоять из обертки с классом и ID st-accordion и неупорядоченного списка. Список изделий будет иметь ссылку, которая будет служить в качестве пункта названия, изначально скрытой информации.
<div id="st-accordion" class="st-accordion"> <ul> <li> <a href="#"> Item Title <span class="st-arrow">Open or Close</span> </a> <div class="st-content"> <p>Some content</p> </div> </li> <li> ... </li> </ul> </div>
Давайте посмотрим на стили!
CSS
По-первых, зададим стили главной обертке. Ширина будет 100%. Обертка в демо версии имеет максимальную ширину 800 пикселей и ширину 90%. Класс st-accordion будет с минимальной шириной в 270 пикселей:
.st-accordion{ width:100%; min-width:270px; margin: 0 auto; }
Определим стили для каждого элемента списка. Установим начальную высоту в 100 пикселей.
.st-accordion ul li{ height: 100px; border-bottom: 1px solid #c7deef; border-top:1px solid #fff; overflow: hidden; }
Первый элемент не должен иметь верхнюю границу:
.st-accordion ul li:first-child{ border-top:none; }
Добавим цветовой переход при наведении курсора мыши. Высота строки должна быть такой же, как начальная высота элемента списка:
.st-accordion ul li > a{ font-family: 'Josefin Slab',Georgia, serif; text-shadow: 1px 1px 1px #fff; font-size: 46px; display: block; position: relative; line-height: 100px; outline:none; -webkit-transition: color 0.2s ease-in-out; -moz-transition: color 0.2s ease-in-out; -o-transition: color 0.2s ease-in-out; -ms-transition: color 0.2s ease-in-out; transition: color 0.2s ease-in-out; } .st-accordion ul li > a:hover{ color: #1693eb; }
Для стрелок span будет позиционироваться абсолютно, и мы спрячем его, установив непрозрачность 0.
.st-accordion ul li > a span{ background: transparent url(../images/down.png) no-repeat center center; text-indent:-9000px; width: 26px; height: 14px; position: absolute; top: 50%; right: -26px; margin-top: -7px; opacity:0; -webkit-transition: all 0.2s ease-in-out; -moz-transition: all 0.2s ease-in-out; -o-transition: all 0.2s ease-in-out; -ms-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; } .st-accordion ul li > a:hover span{ opacity:1; right: 10px; }
Зададим стили класса st-open:
.st-accordion ul li.st-open > a{ color: #1693eb; } .st-accordion ul li.st-open > a span{ -webkit-transform:rotate(180deg); -moz-transform:rotate(180deg); transform:rotate(180deg); right:10px; opacity:1; }
Стили контента и его элементов:
.st-content{ padding: 5px 0px 30px 0px; } .st-content p{ font-size: 16px; font-family: Georgia, serif; font-style: italic; line-height: 28px; padding: 0px 4px 15px 4px; } .st-content img{ width:125px; border-right:1px solid #fff; border-bottom:1px solid #fff; }
С media query убедимся, что размер шрифта названия товара будет меньше:
@media screen and (max-width: 320px){ .st-accordion ul li > a{ font-size:36px; } }
Перейдем к JavaScript.
JAVASCRIPT
Посмотрим на самые важные части этого плагина. Начнем с параметров по умолчанию:
$.Accordion.defaults = { // index of opened item. -1 means all are closed by default. open : -1, // if set to true, only one item can be opened. // Once one item is opened, any other that is // opened will be closed first oneOpenedItem : false, // speed of the open / close item animation speed : 600, // easing of the open / close item animation easing : 'easeInOutExpo', // speed of the scroll to action animation scrollSpeed : 900, // easing of the scroll to action animation scrollEasing : 'easeInOutExpo' };
Выводим функции инициализации::
_init : function( options ) { this.options = $.extend( true, {}, $.Accordion.defaults, options ); // validate options this._validate(); // current is the index of the opened item this.current = this.options.open; // hide the contents so we can fade it in afterwards this.$items.find('div.st-content').hide(); // save original height and top of each item this._saveDimValues(); // if we want a default opened item... if( this.current != -1 ) this._toggleItem( this.$items.eq( this.current ) ); // initialize the events this._initEvents(); },
Функция _saveDimValues сохраняет первоначальную высоту и верх элементов.
Функция _toggleItem заботится о двух случаях при нажатии на пункт: когда пункт открыт (класс st-open) или закрыт. Если он открыт, мы установим для current значение «-1».
_toggleItem : function( $item ) { var $content = $item.find('div.st-content'); ( $item.hasClass( 'st-open' ) ) ? ( this.current = -1, $content.stop(true, true).fadeOut( this.options.speed ), $item.removeClass( 'st-open' ).stop().animate({ height : $item.data( 'originalHeight' ) }, this.options.speed, this.options.easing ) ) : ( this.current = $item.index(), $content.stop(true, true).fadeIn( this.options.speed ), $item.addClass( 'st-open' ).stop().animate({ height : $item.data( 'originalHeight' ) + $content.outerHeight( true ) }, this.options.speed, this.options.easing ), this._scroll( this ) ) },
Функцией _initEvents мы инициализируем два события, нажимая на элемент и изменение размера окна. Когда мы нажимаем на элемент, который либо открываем, либо закрываем, вызывается функция _toggleItem и, если мы установим опцию oneOpenedItem, как «true», сначала закроем открытые элементы перед открытием текущего.
_initEvents : function() { var instance = this; // open / close item this.$items.find('a:first').bind('click.accordion', function( event ) { var $item = $(this).parent(); // close any opened item if oneOpenedItem is true if( instance.options.oneOpenedItem && instance._isOpened() && instance.current!== $item.index() ) { instance._toggleItem( instance.$items.eq( instance.current ) ); } // open / close item instance._toggleItem( $item ); return false; }); $(window).bind('smartresize.accordion', function( event ) { // reset original item values instance._saveDimValues(); // reset the content's height of any item that is currently opened instance.$el.find('li.st-open').each( function() { var $this = $(this); $this.css( 'height', $this.data( 'originalHeight' ) + $this.find('div.st-content').outerHeight( true ) ); }); // scroll to current if( instance._isOpened() ) instance._scroll(); }); },
Надеемся, вам понравился этот простой урок.
Автор — MARY LOU.
Перевод — Дежурка.
Читайте также: