Адаптивный / Анимированный SVG слайдер на jQuery

Во время поиска в Интернете для вдохновения мы столкнулись с красиво оформленным веб-сайтом Honda HR-V. Когда вы переходите от раздела к другому, переход украшается анимированной фигурой, созданной с помощью элемента <canvas>.

 

ДЕМО
ИСХОДНИКИ

 

Мы решили создать что-то подобное, но вместо того, чтобы использовать холст, мы играли с SVG. Кроме того, вместо создания вертикального макета, который требует принудительной прокрутки для просмотра анимации, мы превратили весь ресурс в ползунок героя.

Используемые ресурсы:

  1. Snap.svg для анимации элементов SVG.
  2. Иконки из библиотеки Nucleo.
  3. Изображения из Unsplash.

 

Создание структуры

HTML структурирован в 3 основных элемента: неупорядоченный список ul.cd-slider, содержащий слайды, упорядоченный список ol.cd-slider-navigation для навигации слайдера и оболочку div.cd-svg, Используется для создания анимированной формы, видимой при переключении с одного слайда на следующий.

<section class="cd-slider-wrapper">
<ul class="cd-slider">
<li class="visible">
<div>
<h2>Animated SVG Slider</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Animi, explicabo.</p>
<a href="#0" class="cd-btn">Article &amp; Download</a>
</div>
</li>

<li>
<!-- slide content here -->
</li>

<!-- additional slides here -->
</ul> <!-- .cd-slider -->

<ol class="cd-slider-navigation">
<li class="selected"><a href="#0"><em>Item 1</em></a></li>
<li><a href="#0"><em>Item 2</em></a></li>
<li><a href="#0"><em>Item 3</em></a></li>
<li><a href="#0"><em>Item 4</em></a></li>
</ol> <!-- .cd-slider-navigation -->

<div class="cd-svg-cover" data-step1="M1402,800h-2V0.6c0-0.3,0-0.3,0-0.6h2v294V800z" data-step2="M1400,800H383L770.7,0.6c0.2-0.3,0.5-0.6,0.9-0.6H1400v294V800z" data-step3="M1400,800H0V0.6C0,0.4,0,0.3,0,0h1400v294V800z" data-step4="M615,800H0V0.6C0,0.4,0,0.3,0,0h615L393,312L615,800z" data-step5="M0,800h-2V0.6C-2,0.4-2,0.3-2,0h2v312V800z" data-step6="M-2,800h2L0,0.6C0,0.3,0,0.3,0,0l-2,0v294V800z" data-step7="M0,800h1017L629.3,0.6c-0.2-0.3-0.5-0.6-0.9-0.6L0,0l0,294L0,800z" data-step8="M0,800h1400V0.6c0-0.2,0-0.3,0-0.6L0,0l0,294L0,800z" data-step9="M785,800h615V0.6c0-0.2,0-0.3,0-0.6L785,0l222,312L785,800z" data-step10="M1400,800h2V0.6c0-0.2,0-0.3,0-0.6l-2,0v312V800z">
<svg height='100%' width="100%" preserveAspectRatio="none" viewBox="0 0 1400 800">
<title>SVG cover layer</title>
<desc>an animated layer to switch from one slide to the next one</desc>
<path id="cd-changing-path" d="M1402,800h-2V0.6c0-0.3,0-0.3,0-0.6h2v294V800z"/>
</svg>
</div> <!-- .cd-svg-cover -->
</section> <!-- .cd-slider-wrapper -->

 

Добавление стиля

По умолчанию все слайды имеют opacity: 0, находятся в абсолютной позиции и размещаются одна поверх других top: 0 and left:0. Класс .visible добавляется к выбранному слайду, чтобы сделать его видимым opacity: 1.

.cd-slider-wrapper {
  position: relative;
}
 
.cd-slider > li {
  position: absolute;
  top: 0;
  left: 0;
  opacity: 0;
}
.cd-slider > li.visible {
  /* selected slide */
  position: relative;
  z-index: 2;
  opacity: 1;
}

 

Обработка событий

Чтобы анимировать SVG, мы анимировали атрибут 'd' элемента пути внутри контейнера .cd-svg.

Прежде всего, мы должны были определить различные шаги анимации (в нашем случае 5 шагов для анимации от слайда к следующему и еще 5 шагов для анимации от слайда к предыдущему); В основном нам нужно было создать 10 различных элементов пути svg (все с одинаковым числом опорных точек для правильной работы анимации), как показано на следующем скриншоте (обратите внимание, что некоторые шаги кажутся пустыми, но все они содержат путь).

 

Как только пути определены, мы добавили в .cd-svg-cover атрибут data-stepn (по одному для каждого шага), равный атрибуту 'd' для определенного пути (чтобы легко получить его с помощью JavaScript).

Затем мы использовали метод animate (), предоставленный Snap.svg для анимации пути к следующему:

var svgCoverLayer = $('.cd-slider-wrapper').find('div.cd-svg-cover'),
	svgPath = Snap('#cd-changing-path'),
	path1 = svgCoverLayer.data('step1');
 
svgPath.animate({'d': path2}, 300, customMinaAnimation, function(){
	//...
});

 

Вот и всё!


🔖 Выбор по тегам ×

Top