Янв
Горизонтальный слайдер аккордеон
Один мой знакомый попросил помочь ему интегрировать в его лэндинг горизонтальный слайдер аккордеон (horizontal accordion). Я решил совместить полезное с полезным. Так и родилась эта заметка о создании горизонтального аккордеона на jquery.
И так приступим к созданию горизонтального слайдера аккордеона. По традиции начнём с html и css кода. Наш слайдер будет представлять собой ul
список внутри которого будут находиться блоки li
с классом item, которые будут представлять из себя слайды слайдера(извините за тавтологию). В блок li
у нас будут входить блок с классом trigger
и классом content
. Блок с классом trigger
выполняет функцию корешка с названием слайда, который торчит когда слайдер закрытый. Блок с классом
content
представляет собой сам слайд. У меня в слайде будет заголовок и рыбный текст. Ниже показан листинг html кода нашего слайдера.
<ul class="menu"> <li class="item"> <div class="trigger"> <p>SLIDE 1 SLIDE 1</p> </div> <div class="content"> <h3>SLIDE 1</h3> <p>text1</p> </div> </li> <li class="item"> <div class="trigger"> <p>SLIDE 2 SLIDE 2</p> </div> <div class="content"> <h3>SLIDE 2</h3> <p>text2</p> </div> </li> <li class="item"> <div class="trigger"> <p>SLIDE 3 SLIDE 3</p> </div> <div class="content"> <h3>SLIDE 3</h3> <p>text3</p> </div> </li> </ul>
Листинг css кода
ul{ background-color: #0033cc; position: absolute; height: 500px; top: 100; right: 0; list-style: none; } li{ height: 100%; /*что бы слайды стали горизонтальные*/ float: left; } .trigger{ height: 100%; width: 80px; background-color: #008200; border: 1px solid #49FFA6; position: relative; float: left; cursor: pointer; } .trigger p{ text-align: center; /*что бы текст был одной строкой*/ white-space: nowrap; /*для горизонтальности текста*/ -webkit-transform: rotate(-90deg); transform: rotate(-90deg); position: absolute; top: 50%; left: -50px; font-weight: bold; } .content{ float: left; background-color: #000; /*вся магия в том что убираем ширину блока с контентом, а при клике js добавляет 530 px*/ width: 0; /*обрезает всё что уходит за рамки контейнера*/ overflow: hidden; } .content p, .content h3{ width: 500px; color: #fff; padding: 15px; }
Css код я думаю понятен, не знаю что здесь объяснять. Нужно просто обратить внимание как позиционируются элементы. Теперь перейдём к сердцу нашего слайдера, js коду. Листинг ниже.
$(function(){ //обрабатываем клик по блоку с классом trigger $('.trigger').on('click', function(e){ e.preventDefault(); //получаем нужные нам данные var $this = $(this), //получаем всё блоки menu container = $this.closest('.menu'), //получаем li по которому кликнули item = $this.closest('.item'), //получаем все другие li items = container.find('.item'), //выбираем из li активный activeItem = items.filter('.active'), //выбираем из li по которому кликнули блок контен content = item.find('.content'), //выбираем у li с классом active блок контент activeContent = activeItem.find('.content'); //если нет li с классом active по которому кликнули if (!item.hasClass('active')) { //убираем класс active items.removeClass('active'); //добавляем active кликнутому item.addClass('active'); //у того у кого был active задаём ширину 0 activeContent.animate({ 'width' : '0px' }); //кликнутому 530 content.animate({ 'width' : '530px' }); //иначе } else { item.removeClass('active'); content.animate({ 'width' : '0px' }); } }); // клик вне аккордеона $(document).on('click', function (e) { var $this = $(e.target); if (!$this.closest('.menu').length) { $('.content').animate({ 'width' : '0px' }); $('.item').removeClass('active'); } }); });
Jquery код я прокомментировал достаточно. По сути мы сначала получили все нужные элементы слайдера в разном положении и задали условия, при котором
одному из элементов добавляется width: 530px
, а у другого элемента ширина переходит в 0. Вот таким вот способом я написал горизонтальный
слайдер аккордеон (horizontal accordion) используя jquery и css.
Комментарии
ТАМАРА
11.11.2018 16:19 Ответить
а разве в Bootstrap этого нет??? Фреймворка вполне достаточно
Роман
12.03.2019 13:36 Ответить
Только вертикальный.