Bxslider

Пример 2: Слайдер, стилизованный под рамку картины

Рекомендуемый размер изображений 400x300px. Слайдер отображается ровно по центру страницы. Адаптива под мобильные устрайства — нет.
Если вы новичок в веб, то корректно установить данный слайдер себе на сайт будет проблематично из-за абсолютного позиционирования. Используются тени (box-shadow). Есть возможность самостоятельно скроллить фото.
Radio кнопки для прокрутки изображений появляются при наведении мышки.

Скачать пример 2

CSS оформление

.slider_picture{background-color:#fff;box-shadow:inset 0 0 2px hsla(0,0%,0%,.2),0 3px 1px hsla(0,0%,100%,.75),0 -1px 1px 2px hsla(0,0%,0%,.1);height:18.75em;left:50%;margin:-9.875em -13em;padding:.5em;position:absolute;top:50%;width:25em}
.slider_picture:before{background-color:#22130c;bottom:-2.5em;box-shadow:inset 0 1px 1px 1px hsla(0,0%,100%,.2),inset 0 -2px 1px hsla(0,0%,0%,.4),0 5px 50px hsla(0,0%,0%,.25),0 20px 20px -15px hsla(0,0%,0%,.2),0 30px 20px -15px hsla(0,0%,0%,.15),0 40px 20px -15px hsla(0,0%,0%,.1);content:'';left:-2.5em;position:absolute;right:-2.5em;top:-2.5em;z-index:-1}
.slider_picture:after{background-color:#fff5e5;bottom:-1.5em;box-shadow:0 2px 1px hsla(0,0%,100%,.2),0 -1px 1px 1px hsla(0,0%,0%,.4),inset 0 2px 3px 1px hsla(0,0%,0%,.2),inset 0 4px 3px 1px hsla(0,0%,0%,.2),inset 0 6px 3px 1px hsla(0,0%,0%,.1);content:'';left:-1.5em;position:absolute;right:-1.5em;top:-1.5em;z-index:-1}
.slider_picture li{box-shadow:0 -1px 0 2px hsla(0,0%,0%,.03);list-style:none;position:absolute}
.slider_picture input{display:none}
.slider_picture label{background-color:#111;background-image:linear-gradient(transparent,hsla(0,0%,0%,.25));border:.2em solid transparent;bottom:.5em;border-radius:100%;cursor:pointer;display:block;height:.5em;left:24em;opacity:0;position:absolute;transition:.25s;width:.5em;visibility:hidden;z-index:10}
.slider_picture label:after{border-radius:100%;bottom:-.2em;box-shadow:inset 0 0 0 .2em #111,inset 0 2px 2px #000,0 1px 1px hsla(0,0%,100%,.25);content:'';left:-.2em;position:absolute;right:-.2em;top:-.2em}
.slider_picture:hover label{opacity:1;visibility:visible}
.slider_picture input:checked + label{background-color:#fff}
.slider_picture:hover li:nth-child(1) label{left:.5em}
.slider_picture:hover li:nth-child(2) label{left:2em}
.slider_picture:hover li:nth-child(3) label{left:3.5em}
.slider_picture:hover li:nth-child(4) label{left:5em}
.slider_picture img{height:18.75em;opacity:0;transition:.25s;width:25em;vertical-align:top;visibility:hidden}
.slider_picture li input:checked ~ img{opacity:1;visibility:visible;z-index:10}

Изображения

Слайд-шоуГалерея слайд-шоуМодальные изображенияЛайтбоксАдаптивная Сетка изображенияСетка изображенияГалерея вкладокОверлей изображенияСлайд с наложенным изображениемМасштабирование наложения изображенияНазвание наложения изображенияЗначок наложения изображенияЭффекты изображенияЧерно-белое изображениеТекст изображенияТекстовые блоки изображенийПрозрачный текст изображенияПолное изображение страницыФорма на картинкеГерой изображениеПараллельные изображенияОкругленные изображенияАватар изображенияАдаптивные образыЦентрировать изображенияМиниатюрыПознакомьтесь с командойЛипкое изображениеОтражение изображенияВстряхните изображениеПортфолио галереяПортфолио с фильтрациейМасштабирование изображенияИзображение увеличительное стеклоПолзунок сравнения изображений

Анимируем слайдер на css

Теперь давайте поговорим об
анимации. Мы будем, как мы раньше говорили, изменять состояние слайда когда кнопка или другие будут получать состояние фокус. Так
вот у слайда будут меняться свойства прозрачности с 0 на 1 и от 1 до 15 для того что бы слайд был поверх других. Происходить
это будет плавно за 2 секунды. Про реализацию действия мы поговорим ниже.

Продолжая разбирать тему анимации давайте опишем автоматическую анимацию наших слайдов. До этого мы разбирались с реализацией анимации
при клике по кнопке. Освежить память по свойствам анимации можно здесь.

            .img1{ 
            /*вся анимация для блоков img длится 30с*/ 
            /*и повторяется бесконечно*/
                   animation: imgAnim 30s linear infinite;
                   -webkit-animation: imgAnim 30s linear infinite;
                   -moz-animation: imgAnim 30s linear infinite;
                   -o-animation: imgAnim 30s linear infinite;
            }
            .img2{
            /*--задержка 6 сек----*/
                animation: imgAnim 30s linear 6s infinite;
                /*правила с браузерными префиксами*/
            }
            .img3{
             /*----12 сек-----*/
                animation: imgAnim 30s linear 12s infinite;
                /*правила с браузерными префиксами*/
            }
            .img4{
                animation: imgAnim 30s linear 18s infinite;
                /*правила с браузерными префиксами*/
            }
            .img5{
                animation: imgAnim 30s linear 24s infinite;
                /*правила с браузерными префиксами*/
            }
        

Описанная в листинге выше анимация бесконечна и запускается при загрузке страницы.
Каждая картинка у нас будет показываться и исчезать за счёт изменения её прозрачности. Что бы это не было одновременно
для всех создадим задержку в анимации для определённой картинки. Так как у нас общая анимация 30 сек картинок 5 30/5=6сек.
Такая вот будет у нас задержка перед показом 2й картинки, 12 сек перед показом третьей и тд.

             @keyframes imgAnim {
                0% { opacity: 0; z-index: 5; }
                8% { opacity: 1; z-index: 5; }
                17% { opacity: 1; z-index: 5;}
                25% { opacity: 0; z-index: 5; }
                100% { opacity: 0; z-index: 5; }
            }
            @-webkit-keyframes imgAnim {
                /*------------------*/
            }
            @-o-keyframes imgAnim {
                /*------------------*/
            }
            @-moz-keyframes imgAnim {
               /*------------------*/
            }
        

В листинге выше описаны шаги анимации. Давайте разберёмся как мы их рассчитали. Шаги у нас задаются в % от всего времени анимации. Определим
какое время показывается наша картинка. 5/30=0.1666 17% столько процентов от общего времени показывается один слайд. Чтобы картинка
появлялась плавнее зададим её появление
например (17/2=9) с 9%. Для ие 10 нужно задавать в анимации Z-индекс, если его не задать, то перемещение слайдов видно не будет так как
они все будут закрываться первым слайдом. Теперь давайте напишем css код и для дивов с плашками описания.

             .discript1, .discript2, .discript3, .discript4, .discript5{
                position: absolute;
                width: 35%;
                background-color: rgba(0, 0, 0, 0.56);
                bottom: 15px;
                padding: 10px;
            }
            .tank h3{
                color: #fff;
                margin: 0;
                margin-bottom: 3px;
                font-family: Times New Roman;
            }
            .tank p{
                color: #fff;
                margin: 0;
                font-size: 14px;
                font-family: Times New Roman;
            }
        

Тут я думаю всё просто и комментарии не нужны. Для полноты картины нам осталось только реализовать паузы в анимации при наведении на слайдер.
Сss код ниже.

            .slider:hover .tank{
                -moz-animation-play-state: paused;
                -webkit-animation-play-state: paused;
                -o-animation-play-state: paused;
                animation-play-state: paused;
            }    
        

Вот у нас уже начинает получаться задуманный нами слайдер. На данном этапе если мы сделали всё правильно, слайдер будет
автоматически прокручивать картинки и становиться на паузу при наведении на слайд. Давайте теперь научимся управлять этим процессом вручную.

Create A Slideshow

Step 1) Add HTML:

<!— Slideshow container —><div class=»slideshow-container»>  <!— Full-width images with number and caption text —>  <div class=»mySlides fade»>   
<div class=»numbertext»>1 / 3</div>    <img src=»img1.jpg»
style=»width:100%»>    <div class=»text»>Caption
Text</div>  </div>  <div class=»mySlides fade»>   
<div class=»numbertext»>2 / 3</div>    <img src=»img2.jpg»
style=»width:100%»>    <div class=»text»>Caption
Two</div>  </div>  <div class=»mySlides fade»>   
<div class=»numbertext»>3 / 3</div>    <img src=»img3.jpg»
style=»width:100%»>    <div class=»text»>Caption
Three</div>  </div>  <!— Next and previous
buttons —>  <a class=»prev» onclick=»plusSlides(-1)»>&#10094;</a> 
<a class=»next» onclick=»plusSlides(1)»>&#10095;</a></div><br><!— The dots/circles —><div style=»text-align:center»>  <span class=»dot» onclick=»currentSlide(1)»></span>
  <span class=»dot» onclick=»currentSlide(2)»></span>  
<span class=»dot» onclick=»currentSlide(3)»></span> </div>

Step 2) Add CSS:

Style the next and previous buttons, the caption text and the dots:

* {box-sizing:border-box}/* Slideshow container */.slideshow-container {  max-width: 1000px;  position:
relative;  margin: auto;}/* Hide the images by default */.mySlides {  display: none;}/* Next & previous buttons */
.prev, .next { 
cursor: pointer;  position: absolute; 
top: 50%;  width: auto;  margin-top: -22px;  padding: 16px;  color:
white;  font-weight: bold;  font-size: 18px; 
transition: 0.6s ease;  border-radius: 0 3px 3px 0; 
user-select: none;}/*
Position the «next button» to the right */.next { 
right: 0;  border-radius: 3px 0 0 3px;}/* On hover, add
a black background color with a little bit see-through */.prev:hover, .next:hover { 
background-color: rgba(0,0,0,0.8);}/* Caption text */.text {  color: #f2f2f2;  font-size: 15px;  padding:
8px 12px;  position: absolute;  bottom: 8px; 
width: 100%;  text-align: center;}/* Number text (1/3
etc) */.numbertext {  color: #f2f2f2;  font-size:
12px;  padding: 8px 12px;  position: absolute; 
top: 0;}/* The dots/bullets/indicators */.dot {  cursor: pointer; 
height: 15px;  width: 15px;  margin: 0 2px; 
background-color: #bbb;  border-radius: 50%;  display:
inline-block;  transition: background-color 0.6s ease;}
.active, .dot:hover {  background-color: #717171;}/*
Fading animation */.fade {  -webkit-animation-name:
fade;  -webkit-animation-duration: 1.5s;  animation-name:
fade;  animation-duration: 1.5s;}@-webkit-keyframes
fade {  from {opacity: .4}   to {opacity: 1}}@keyframes
fade {  from {opacity: .4}   to {opacity: 1}}

Step 3) Add JavaScript:

var slideIndex = 1;showSlides(slideIndex);// Next/previous controlsfunction plusSlides(n)
{  showSlides(slideIndex += n);}// Thumbnail image controlsfunction currentSlide(n) { 
showSlides(slideIndex = n);}function showSlides(n) { 
var i;  var slides = document.getElementsByClassName(«mySlides»); 
var dots = document.getElementsByClassName(«dot»);  if (n >
slides.length) {slideIndex = 1}   if (n < 1) {slideIndex =
slides.length}  for (i = 0; i < slides.length; i++) {     
slides.style.display = «none»;   }  for (i = 0; i <
dots.length; i++) {      dots.className = dots.className.replace(»
active», «»); 
}  slides.style.display = «block»;  
dots.className += » active»;}

JavaScript

Сделаем простой плагин для нашего слайдера. Большая часть работы выполняется в CSS, где определяются все анимации. Плагин сфокусирован на добавлении и убирании классов, а также на контроле за текущей выводимой категорией. Для браузеров, которые не поддерживают анимации используется метод «показать/скрыть».

Начнем с кеширования некоторых элементов и инициализации переменных:

		_init : function( options ) {

			// Категории (ul)
			this.$categories = this.$el.children( 'ul' );
			// Навигация
			this.$navcategories = this.$el.find( 'nav > a' );
			var animEndEventNames = {
				'WebkitAnimation' : 'webkitAnimationEnd',
				'OAnimation' : 'oAnimationEnd',
				'msAnimation' : 'MSAnimationEnd',
				'animation' : 'animationend'
			};
			// Название анимации и события
			this.animEndEventName = animEndEventNames;
			// Поддержка анимаций и событий
			this.support = Modernizr.csstransforms && Modernizr.cssanimations;
			// Если анимация проводится
			this.isAnimating = false;
			// Текущая категория
			this.current = 0;
			var $currcat = this.$categories.eq( 0 );
			if( !this.support ) {
				this.$categories.hide();
				$currcat.show();
			}
			else {
				$currcat.addClass( 'mi-current' );
			}
			// Текущая категория навигации
			this.$navcategories.eq( 0 ).addClass( 'mi-selected' );
			// Инициализация событий
			this._initEvents();

		},

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

		_initEvents : function() {

			var self = this;
			this.$navcategories.on( 'click.catslider', function() {
				self.showCategory( $( this ).index() );
				return false;
			} );

			// Сброс при измении размеров окна
			$( window ).on( 'resize', function() {
				self.$categories.removeClass().eq( 0 ).addClass( 'mi-current' );
				self.$navcategories.eq( self.current ).removeClass( 'mi-selected' ).end().eq( 0 ).addClass( 'mi-selected' );
				self.current = 0;
			} );

		},
		showCategory : function( catidx ) {

			if( catidx === this.current || this.isAnimating ) {
				return false;
			}
			this.isAnimating = true;
			// Обновляем выбранную навигацию
			this.$navcategories.eq( this.current ).removeClass( 'mi-selected' ).end().eq( catidx ).addClass( 'mi-selected' );

			var dir = catidx > this.current ? 'right' : 'left',
				toClass = dir === 'right' ? 'mi-moveToLeft' : 'mi-moveToRight',
				fromClass = dir === 'right' ? 'mi-moveFromRight' : 'mi-moveFromLeft',
				// Текущая категория
				$currcat = this.$categories.eq( this.current ),
				// Новая категория
				$newcat = this.$categories.eq( catidx ),
				$newcatchild = $newcat.children(),
				lastEnter = dir === 'right' ? $newcatchild.length - 1 : 0,
				self = this;

			if( this.support ) {

				$currcat.removeClass().addClass( toClass );
				
				setTimeout( function() {

					$newcat.removeClass().addClass( fromClass );
					$newcatchild.eq( lastEnter ).on( self.animEndEventName, function() {

						$( this ).off( self.animEndEventName );
						$newcat.addClass( 'mi-current' );
						self.current = catidx;
						var $this = $( this );
						// Решение для ошибки в Chrome 
						self.forceRedraw( $this.get(0) );
						self.isAnimating = false;

					} );

				}, $newcatchild.length * 90 );

			}
			else {

				$currcat.hide();
				$newcat.show();
				this.current = catidx;
				this.isAnimating = false;

			}

		},
		// На основании http://stackoverflow.com/a/8840703/989439
		forceRedraw : function(element) {
			if (!element) { return; }
			var n = document.createTextNode(' '),
				position = element.style.position;
			element.appendChild(n);
			element.style.position = 'relative';
			setTimeout(function(){
				element.style.position = position;
				n.parentNode.removeChild(n);
			}, 25);
		}

	}

	$.fn.catslider = function( options ) {
		var instance = $.data( this, 'catslider' );
		if ( typeof options === 'string' ) {
			var args = Array.prototype.slice.call( arguments, 1 );
			this.each(function() {
				instance.apply( instance, args );
			});
		}
		else {
			this.each(function() {
				instance ? instance._init() : instance = $.data( this, 'catslider', new $.CatSlider( options, this ) );
			});
		}
		return instance;
	};

Дополнение — как сделать так, чтобы при клике по слайду происходил переход по привязанной к слайду ссылке?

Иными словами, сейчас у нас просто картинки, а как сделать их кликабельными. Для этого у вас уже должен быть готовый слайдер по этому уроку. Далее вам в html-коде нужно найти кусок, отвечающий за сами слайды. Вот он на скриншоте:
Как видите, я вставил внутрь первого и второго слайда ссылки. Итак, при клике на первый слайд произойдет переход на Гугл, при клике на второй — на Яндекс. Хочу отметить, что ссылка будет открываться в этом же окне, то есть текущая страница со слайдером в таком случае исчезнет. Если вам нужно открывать ссылки со слайдов в новом окне, в каждый тег необходимо добавить атрибут target = «_blank».

Но это не все, что нужно сделать! Сейчас еще ничего не работает, чтобы картинки стали кликабельны, нужно добавить в css вот что:

Slides a{
display: block;
width: 100%;
height: 100%;
}

То есть для всех слайдов делаем ссылку блочным элементом, и указываем ей ширину и высоту 100%, чтобы она занимала все пространство картинки. Теперь все должно работать, можете проверить. Просто замените адреса в ссылках и можно пользоваться. Надеюсь, объяснил максимально понятно.

Минуточку вашего внимания:
Все мы хотим размещать свои сайты на надежном хостинге. Я проанализировал сотни хостингов и нашел лучший — HostIQ

В сети сотни положительных отзывов о нем, средняя оценка пользователей — 4.8 из 5. Пусть вашим сайтам будет хорошо.

2. HTML5 Gallery Slideshow

HTML5 Gallery Slideshow — отличный выбор для демонстрации изображений и текста в виде слайдера. Главным преимуществом продаж карусели является ее невероятная простота в использовании. После внедрения в необходимое место, она адаптируется по размеру родительского контейнера, то есть к тегу div или другому тегу HTML.

Еще одна замечательная особенность заключается в возможности расположения нескольких галерей с разным набором изображений и настроек на одной и той же странице.

Плагин легко настраивается. Вы можете поменять цветовую гамму, изменить кнопки и другие элементы, а потом интегрировать в свой сайт. Слайдер оптимизирован для бесперебойной работы на мобильных устройствах.

HTML:

<div class=»slideshow»>
<div class=»slideshow-item»>
<img src=»photo-1.jpg» alt=»»>
<div class=»slideshow-item-text»>
<h5>Заголовок</h5>
<p>Описание</p>
</div>
</div>
<div class=»slideshow-item»>
<img src=»photo-2.jpg» alt=»»>
<div class=»slideshow-item-text»>
<h5>Заголовок</h5>
<p>Описание</p>
</div>
</div>
<div class=»slideshow-item»>
<img src=»photo-3.jpg» alt=»»>
<div class=»slideshow-item-text»>
<h5>Заголовок</h5>
<p>Описание</p>
</div>
</div>
<div class=»slideshow-item»>
<img src=»photo-4.jpg» alt=»»>
<div class=»slideshow-item-text»>
<h5>Заголовок</h5>
<p>Описание</p>
</div>
</div>
</div>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

<div class=»slideshow»>

<div class=»slideshow-item»>

<img src=»photo-1.jpg»alt=»»>

<div class=»slideshow-item-text»>

<h5>Заголовок</h5>

<p>Описание</p>

</div>

</div>

<div class=»slideshow-item»>

<img src=»photo-2.jpg»alt=»»>

<div class=»slideshow-item-text»>

<h5>Заголовок</h5>

<p>Описание</p>

</div>

</div>

<div class=»slideshow-item»>

<img src=»photo-3.jpg»alt=»»>

<div class=»slideshow-item-text»>

<h5>Заголовок</h5>

<p>Описание</p>

</div>

</div>

<div class=»slideshow-item»>

<img src=»photo-4.jpg»alt=»»>

<div class=»slideshow-item-text»>

<h5>Заголовок</h5>

<p>Описание</p>

</div>

</div>

</div>

Пишем код

На различных курсах веб-разработки знакомство с фронтендом начинается с описания основных технологий, а именно:

  • HTML — язык гипертекстовой разметки, на котором пишется «скелет» сайта. Если провести аналогию с домом, то это каркас. Грубо говоря, вы строите разметку, на которую после будет ложиться оформление.
  • CSS — каскадные таблицы стилей или то самое оформление. Вернёмся к примеру с домом: после постройки его нужно облицевать, покрасить, сделать презентабельным, и именно CSS описывает внешний вид сайта.
  • JavaScript — язык программирования, который обеспечивает функциональность. Вы можете взаимодействовать с вещами в вашем доме — включать и выключать свет, бытовую технику, воду и многое другое. Вы точно так же можете взаимодействовать с сайтом, нажимая кнопки, наводя курсор на изображения и заполняя формы. JavaScript обрабатывает все эти взаимодействия, и, как язык сценариев, он может предоставлять правила и логику для определения того, что должно произойти дальше.

HTML

Обучение веб-разработке стоит начать с HTML, так как это каркас сайта. Каждый HTML-документ имеет стандартную структуру:

Но в нашем примере прописывать структуру всей страницы не нужно, ведь мы работаем с отдельным компонентом, который потом будет размещаться между тегами . Здесь всё просто: у нас есть основной блок (тег ), который является родительским и содержит ещё три блока с разными картинками — будущими слайдами:

Обратите внимание, что у каждого тега есть свой класс. Именно по этим классам будет применяться оформление CSS

В тегах мы указываем ссылки на те изображения, которые будут показываться. В атрибуте onclick мы обращаемся к конкретной функции JavaScript, привязывая к кнопке действие по клику.

CSS

В каскадных стилях задаём ширину, высоту, позиционирование, цвет и анимацию. В нашем случае мы работаем отдельно с контейнером слайдера, отдельно с контейнерами картинок, которые прописаны как item, кнопками, добавлением к ним фона и анимацией слайдов:

Со всеми значениями можно поэкспериментировать в редакторе. Если есть сомнения по поводу какого-то из атрибутов, достаточно его удалить и посмотреть, что изменилось.

JavaScript

Веб-разработчик, обучение которого ограничивается HTML и CSS, — это скорее веб-дизайнер. Мы же переходим к главному языку фронтенда, который способен вдохнуть жизнь в визуальное решение:

Но не стоит забывать, что не JavaScript единым: современные библиотеки и фреймворки способны упростить разработку и улучшить функциональность веб-компонента. Например, Bootstrap позволяет верстать сайты в разы быстрее, и даже начинающий разработчик может создать рабочий макет с использованием данного фреймворка. А ещё можно написать слайдер на чистом HTML/CSS, чтобы потренировать навыки в вёрстке и каскадных таблицах стилей.

Приведённый в уроке пример довольно прост и призван показать возможности стандартного взаимодействия HTML, CSS и JavaScript.

Описание слайдера и принципа его работы

ChiefSlider состоит из HTML, CSS и JavaScript кода.

HTML структура слайдера::

<div class="slider">
  <div class="slider__wrapper">
    <div class="slider__items">
      <div class="slider__item">
        <!-- Контент 1 слайда -->
      </div>
      <div class="slider__item">
        <!-- Контент 2 слайда -->
      </div>
      <div class="slider__item">
        <!-- Контент 3 слайда -->
      </div>
    </div>
  </div>
  <!-- Кнопки -->
  <a href="#" class="slider__control" data-slide="prev"></a>
  <a href="#" class="slider__control" data-slide="next"></a>
</div>

Корневой элемент имеет класс .

В нём расположены:

  • – выступает в качестве обёртки;
  • – кнопки, для навигации по слайду (переход к предыдущим и следующим элементам).

Сдаиг слайдов в нужном направлении выполняется в JavaScript коде с помощью метода . Эта метод в зависимости от установленного свойства выполняет перемещение элемента в нужном направлении посредством CSS- трансформации.

Организация зацикленности слайдера выполняется также посредством CSS-трансформации, но не контейнера «», а уже самих элементов «».

Для того чтобы в коде можно было определить какой элемент нужно переместить, а какой не надо, к ним посредством JavaScript добавляются дополнительные data-атрибуты. Они содержат индекс слайда, его текущее положение и значение трансформации.

Добавление этих атрибутов при инициализации слайдера в коде реализовано так:

// $itemList – это элементы .slider__item
for (var i = 0, length = $itemList.length; i < length; i++) {
  $itemList.dataset.index = i;
  $itemList.dataset.order = i;
  $itemList.dataset.translate = 0;
}

Крайние индексы элементов, трансформаций и сами эти элементы в JavaScript хранятся в свойствах: , , , , и .

Обновление этих свойств осуществляется с помощью метода .

Перемещение слайдов для организации зацикленности выполняется с помощью метода .

Автоматическая смена слайдов через определённые промежутки времени осуществляется с помощью функции . Она запускает метод через указанные интервалы времени, которые определяются значением свойства :

this._intervalId = setInterval(function() {
    this._direction = 'next';
    this._move();
  }.bind(this),
  this._config.interval
);

Остановка автоматической смены слайдов при поднесении к нему курсора осуществлена следующим образом:

function onMouseEnter(e) {
  this._autoplay('stop');
}
function onMouseLeave(e) {
  this._autoplay();
}
$root.addEventListener('mouseenter', onMouseEnter.bind(this)); $root.addEventListener('mouseleave', onMouseLeave.bind(this));

Кроме этого, целесообразно также остановить автоматическую смену слайдов, когда страница переходит в фоновый режим (при переключении на другую вкладку).

В коде это выполнено с использованием события следующим образом:

function onVisibilityChange() {
  if (document.visibilityState === 'hidden') {
    this._autoplay('stop');
  } else if (document.visibilityState === 'visible') {
    if (this._config.loop) {
      this._autoplay();
    }
  }
}
document.addEventListener('visibilitychange', onVisibilityChange.bind(this));

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

HTML:

<div class=»sl-container»>
<div class=»swipe»>
<div class=»panel» data-img=»/photo-1.jpg»></div>
<div class=»panel» data-img=»/photo-2.jpg»></div>
<div class=»panel» data-img=»/photo-3.jpg»></div>
<div class=»panel» data-img=»/photo-4.jpg»></div>
<div class=»panel» data-img=»/photo-5.jpg»></div>
</div>
<div class=»sl-info»>
<div class=»inner»>
<h3>Слайдер с фиксированным текстом</h3>
<p>Текст накладывается на слайдер, в котором листаются только фотографии</p>
</div>
<div class=»sl-buttons»>
<button class=»btn-prev» disabled>
<svg xmlns=»http://www.w3.org/2000/svg» width=»40″ height=»40″ viewBox=»0 0 24 24″ fill=»none» stroke=»#fff» stroke-width=»3″ stroke-linecap=»round» stroke-linejoin=»round»><polyline points=»15 18 9 12 15 6″></polyline></svg>
</button>
<button class=»btn-next»>
<svg xmlns=»http://www.w3.org/2000/svg» width=»40″ height=»40″ viewBox=»0 0 24 24″ fill=»none» stroke=»#fff» stroke-width=»3″ stroke-linecap=»round» stroke-linejoin=»round»><polyline points=»9 18 15 12 9 6″></polyline></svg>
</button>
</div>
</div>
</div>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

<div class=»sl-container»>

<div class=»swipe»>

<div class=»panel»data-img=»/photo-1.jpg»></div>

<div class=»panel»data-img=»/photo-2.jpg»></div>

<div class=»panel»data-img=»/photo-3.jpg»></div>

<div class=»panel»data-img=»/photo-4.jpg»></div>

<div class=»panel»data-img=»/photo-5.jpg»></div>

</div>

<div class=»sl-info»>

<div class=»inner»>

<h3>Слайдер с фиксированным текстом</h3>

<p>Текст накладывается на слайдер, в котором листаются только фотографии</p>

</div>

<div class=»sl-buttons»>

<button class=»btn-prev»disabled>

<svg xmlns=»http://www.w3.org/2000/svg»width=»40″height=»40″viewBox=»0 0 24 24″fill=»none»stroke=»#fff»stroke-width=»3″stroke-linecap=»round»stroke-linejoin=»round»><polyline points=»15 18 9 12 15 6″></polyline></svg>

</button>

<button class=»btn-next»>

<svg xmlns=»http://www.w3.org/2000/svg»width=»40″height=»40″viewBox=»0 0 24 24″fill=»none»stroke=»#fff»stroke-width=»3″stroke-linecap=»round»stroke-linejoin=»round»><polyline points=»9 18 15 12 9 6″></polyline></svg>

</button>

</div>

</div>

</div>

Шаг 5 – Переходы

Сейчас мы начинаем создавать переходы слайдера. Что бы создать разнообразные переходы для каждого изображения, мы добавим разные классы ко всем изображениям.

HTML

<ul class="s-slides">
    <li id="slide-1" class="slideLeft"><img src="img/slide1.png" alt="" /></li>
    <li id="slide-2" class="slideRight"><img src="img/slide2.png" alt="" /></li>
    <li id="slide-3" class="slideTop"><img src="img/slide3.png" alt="" /></li>
    <li id="slide-4" class="slideBottom"><img src="img/slide4.png" alt="" /></li>
    <li id="slide-5" class="zoomIn"><img src="img/slide5.png" alt="" /></li>
    <li id="slide-6" class="zoomOut"><img src="img/slide6.png" alt="" /></li>
    <li id="slide-7" class="rotate"><img src="img/slide7.png" alt="" /></li>
</ul>

CSS

Для создания переходов мы будем использовать @keyframes. Анимация создается припомощи постепенного изменения от одного набора стилей CSS к другому. Чтобы указать, когда анимация начнется, изменится и завершится, мы будем использовать проценты, тое-есть 0% – начало анимации и 100% – когда анимация завершена. Давайте начнем создавать эту анимацию ..

Сдвиг изображения слева

В начале анимации, изображение будет позиционированно с отрицательным значением (слева 500px), когда анимация завершается, изображение будет позиционироваться 0px слева. Установив длительность анимации до 1 секунды мы получим слайд эффект слева на право.

/* Slide Left */
 
@-webkit-keyframes 'slideLeft' {
    0% { left: -500px; }
    100% { left: 0; }
}
 
ul.s-slides li.slideLeft:target {
    z-index: 100;
 
    -webkit-animation-name: slideLeft;
    -webkit-animation-duration: 1s;
    -webkit-animation-iteration-count: 1;
}

Сдвиг изображения справа

/* Slide Right */
 
@-webkit-keyframes 'slideRight' {
    0% { left: 500px; }
    100% { left: 0; }
}
 
ul.s-slides li.slideRight:target {
    z-index: 100;
 
    -webkit-animation-name: slideRight;
    -webkit-animation-duration: 1s;
    -webkit-animation-iteration-count: 1;
}

Сдвиг изображения сверху

/* Slide Top */
 
@-webkit-keyframes 'slideTop' {
    0% { top: -350px; }
    100% { top: 0; }
}
 
ul.s-slides li.slideTop:target {
    z-index: 100;
 
    -webkit-animation-name: slideTop;
    -webkit-animation-duration: 1s;
    -webkit-animation-iteration-count: 1;
}

Сдвиг изображения снизу

/* Slide Bottom */
 
@-webkit-keyframes 'slideBottom' {
    0% { top: 350px; }
    100% { top: 0; }
}
 
ul.s-slides li.slideBottom:target {
    z-index: 100;
 
    -webkit-animation-name: slideBottom;
    -webkit-animation-duration: 1s;
    -webkit-animation-iteration-count: 1;
}

Внутреннее увеличение изображение

Для создания зумирующего перехода, мыбудем использовать трансформирующие свойства CSS3. В начале анимации изображение будет иметь размер в 10% и к окончанию вернётся к своему оригинальному размеру. Мы поместим его с отступом в 4px сверху, чтобы исправить пробел, который появляется в нижней части.

/* Zoom In */
 
@-webkit-keyframes 'zoomIn' {
    0% { -webkit-transform: scale(0.1); }
    100% { -webkit-transform: none; }
}
 
ul.s-slides li.zoomIn:target {
    z-index: 100;
    top: 4px;
 
    -webkit-animation-name: zoomIn;
    -webkit-animation-duration: 1s;
    -webkit-animation-iteration-count: 1;
}

Вращение и увеличение изображение

/* Rotate */
 
@-webkit-keyframes 'rotate' {
    0% { -webkit-transform: rotate(-360deg) scale(0.1); }
    100% { -webkit-transform: none; }
}
 
ul.s-slides li.rotate:target {
    z-index: 100;
    top: 4px;
 
    -webkit-animation-name: rotate;
    -webkit-animation-duration: 1s;
    -webkit-animation-iteration-count: 1;
}

Внешнее увеличение изображение

/* Zoom Out */
 
@-webkit-keyframes 'zoomOut' {
    0% { -webkit-transform: scale(2); }
    100% { -webkit-transform: none; }
}
 
ul.s-slides li.zoomOut:target {
    z-index: 100;
 
    -webkit-animation-name: zoomOut;
    -webkit-animation-duration: 1s;
    -webkit-animation-iteration-count: 1;
}
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector