Эффект пошатывания для элементов слайд-шоу
Сегодня мы бы хотели поделиться с вами очередным экспериментальным скриптом, а именно слайд-шоу с эффектом пошатывания слайдов. За основу мы взяли работу GIF Exercise автора Sergey Valiukh, где ко всем элементам интерфейса применяется подобный эффект. Для достижения цели мы воспользовались Snap.svg и анимацией SVG элементов.
Напоминаем, что данные эффекты будут доступны только в последних версиях браузеров.
Набор бесплатных иконок, которые мы используем называется Ballicons 2.
Само слайд-шоу представляет собой обычный ненумерованный список, завёрнутый в блок с id и классом, принимающими значение slideshow:
<div id="slideshow" class="slideshow"> <ul> <li> <div class="slide"> <!-- ... --> </div> </li> <li><!-- ... --></li> <li><!-- ... --></li> <!-- ... --> </ul> </div>
Мы вставляем SVG изображение в виде прямоугольника перед самим слайдом. Само SVG изображение выглядит следующим образом:
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 80 60" preserveAspectRatio="none"> <path d="M33,0C33,0,74,0,74,0C74,0,69,9.871,69,29.871C69,49.871,74,60,74,60C74,60,32.666,60,32.666,60C32.666,60,32.541,60,32.541,60C32.541,60,6,60,6,60C6,60,1,50,1,30C1,10,6,0,6,0C6,0,33,0,33,0" /> </svg>
Три различных SVG формируют следующие фигуры:
Найти все SVG, которые мы используем можно в папке img.
В зависимости от того куда нам нужно передвигать слайд, будем изгибать изображение в ту или иную сторону. Это позволит нам создать необходимый эффект.
Сами фигуры определяем в параметрах слайд-шоу:
SliderFx.prototype.options = { // скорость (ms) speed : 500, // вид анимации easing : 'ease', // определение фигур paths : { rect : 'M33,0h41c0,0,0,9.871,0,29.871C74,49.871,74,60,74,60H32.666h-0.125H6c0,0,0-10,0-30S6,0,6,0H33', curve : { right : 'M33,0h41c0,0,5,9.871,5,29.871C79,49.871,74,60,74,60H32.666h-0.125H6c0,0,5-10,5-30S6,0,6,0H33', left : 'M33,0h41c0,0-5,9.871-5,29.871C69,49.871,74,60,74,60H32.666h-0.125H6c0,0-5-10-5-30S6,0,6,0H33' } } }
А вот пример того, как мы осуществляем анимацию:
SliderFx.prototype._morphSVGs = function( callback ) { var self = this, speed = this.options.speed, pathCurvedLeft = this.options.paths.curve.left, pathCurvedRight = this.options.paths.curve.right, pathRectangle = this.options.paths.rect, dir = this.old < this.curr ? 'right' : 'left'; // преобразуем текущее состояние svg изображения в "curved" this.items[ this.old ].path.stop().animate( { 'path' : dir === 'right' ? pathCurvedLeft : pathCurvedRight }, speed * .5, mina.easeout ); // слайд появляется чуть позже... setTimeout(function() { callback.call(); }, speed * .2 ); // меняем состояние svg для входящего слайда на "curved" var currItem = this.items[ this.curr ]; currItem.querySelector('path').setAttribute( 'd', dir === 'right' ? pathCurvedLeft : pathCurvedRight ); // меняем состояние svg изображения на "rectangle" setTimeout(function() { currItem.path.stop().animate( { 'path' : pathRectangle }, speed * 3, mina.elastic ); }, speed * .5 ); }
Самым важным в этом всём является аспект времени. К примеру, при анимации SVG из изогнутого состояния в прямоугольник, мы должны быть уверены, что этот процесс займёт наполовину больше времени, чем движение слайда (т.е. скорость * .5). Это гарантия того, что мы всё-таки заметим эффект перед тем как слайд исчезнет. Так же делаем небольшую задержку перед запуском смены слайда. Первоначальное состояние SVG изогнутое, но впоследствии мы меняем его на прямоугольное. Вы можете с лёгкостью сменить эффект “пошатывания” на эффект “пружины”. Поменяйте dir === 'right'
на dir === 'left'
, чтобы увидеть разницу. Во время последнего преобразования SVG, мы можем поиграть с двумя параметрами: скоростью преобразования SVG и задержкой.
Вот код после небольших изменений:
// преобразуем текущее состояние svg изображения в "curved" this.items[ this.old ].path.stop().animate( { 'path' : dir === 'right' ? pathCurvedLeft : pathCurvedRight }, speed * .7, mina.easeout ); // слайд появляется чуть позже... setTimeout(function() { callback.call(); }, speed * .3 ); // меняем состояние svg для входящего слайда на "curved" var currItem = this.items[ this.curr ]; currItem.querySelector('path').setAttribute( 'd', dir === 'left' ? pathCurvedLeft : pathCurvedRight ); // меняем состояние svg изображения на "rectangle" setTimeout(function() { currItem.path.stop().animate( { 'path' : pathRectangle }, speed * 5, mina.elastic ); }, speed * .8 );
Больше о Snap.svg вы можете узнать на их сайте и на странице документации.
Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: http://tympanus.net/codrops/2014/10/24/wobbly-slideshow-effect/
Перевел: Станислав Протасевич
Урок создан: 27 Октября 2014
Просмотров: 7190
Правила перепечатки
5 последних уроков рубрики "HTML5"
-
Расширяем возможности HTML за счёт создания собственных тегов
В этом уроке я покажу процесс создания собственных HTML тегов. Пользовательские теги решают множество задач: HTML документы становятся проще, а строк кода становится меньше.
-
Определение доступности атрибута HTML5 с помощью JavaScript
Сегодня мы посмотрим, как можно организовать проверку доступности атрибута HTML5 с помощью JavaScript. Проверять будем работу элементов details и summary.
-
HTML5: API работы с вибрацией
HTML5 - глоток свежего воздуха в современном вебе. Она повлиял не только на классический веб, каким мы знаем его сейчас. HTML5 предоставляет разработчикам ряд API для создания и улучшения сайтов с ориентацией на мобильные устройства. В этой статье мы рассмотрим API для работы с вибрацией.
-
Создание форм с помощью Webix Framework — 4 практических примера
Веб дизайнеры частенько сталкиваются с необходимостью создания форм. Данная задача не простая, и может вызвать головную боль (особенно если вы делаете что-то не стандартное, к примеру, много-страничную форму). Для упрощения жизни можно воспользоваться фрэймворком. В этой статье я покажу вам несколько практических приёмов для создания форм с помощью фрэймворка Webix.
-
Знакомство с фрэймворком Webix
В этой статье мы бы хотели познакомить вас с фрэймворком Webix. Для демонстрации возможностей данного инструмента мы создадим интерфейс online аудио плеера. Не обольщайтесь — это всего лишь модель интерфейса. Исходный код доступен в демо и на странице GitHub.