Здесь мы разберем с вами принцип работы слайдеров с фотографиями и как его реализовать на Javascript.
Суть работы слайдера достаточно простая, он состоит из двух основных частей — это контейнер (окно слайдера) и трек (лента с картинками), а далее мы берем трек и двигаем по одной оси в контейнере, тем самым часть фото отображается, а основные «обрезаются». Обрезка происходит с помощью свойства overflow:hidden.
Рассмотрим ниже готовую верстку, стили и скрипт слайдера.
index.hmtl — разметка слайдера
<div class="slider-container"> <div class="arrow-left"> <div class="arrow-bg"> <div class="arrow"></div> </div> </div> <div class="arrow-right"> <div class="arrow-bg"> <div class="arrow"></div> </div> </div> <!-- .slider-track - лента с фотографиями --> <div class="slider-track"> <div class="slider-item"> <img src="img/1.jpg" alt=""> </div> <div class="slider-item"> <img src="img/2.jpg" alt=""> </div> <div class="slider-item"> <img src="img/3.jpg" alt=""> </div> <div class="slider-item"> <img src="img/4.jpg" alt=""> </div> </div> </div>
style.css
/* Контейнер с ограниченными размерами, он будет выполнять роль "окна" */ .slider-container { width: 600px; height:600px; position: relative; overflow: hidden; } /* Лента с фото, имеет неограниченную ширину и тип flex, чтобы картинки не переносились */ .slider-track { height:600px; display: flex; transition-duration: .5s; } /* Стили для оформления кнопок prev/next */ .arrow { width:7px; height:7px; border-top:#cacaca 3px solid; border-right:#cacaca 3px solid; position: absolute; } .arrow-bg { width:30px; height:30px; background: #fff; box-shadow: 0 0 4px 2px rgba(0,0,0,.2); border-radius: 50%; position: relative; opacity: .8; cursor: pointer; } .arrow-left .arrow { transform: rotate(-135deg); top:10px; left:12px; } .arrow-right .arrow { transform: rotate(45deg); top:10px; left:8px; } .arrow-left { position: absolute; top:50%; left:10px; transform: translateY(-50%); z-index: 2; } .arrow-right { position: absolute; top:50%; right:10px; transform: translateY(-50%); z-index: 2; }
scripts.js — файл с кодом слайдера
$(document).ready(function(){ let sliderPosition = 0; // начальная позиция дорожки const sliderContainer = $('.slider-container'); const sliderTrack = $('.slider-track'); const sliderItem = $('.slider-item'); const sliderItemWidth = sliderItem.width(); const sliderContainerWidth = sliderContainer.width(); // ширина дорожки определяется как разница между шириной всех картинок и шириной контейнера // разница нужна для того, чтобы прокрутка не проводилась дальше последнего фото const sliderTrackWidth = sliderItem.length * sliderItemWidth - sliderContainerWidth; const sliderButtonPrev = $('.arrow-left'); const sliderButtonNext = $('.arrow-right'); sliderButtonPrev.on('click', function(){ sliderPosition += sliderItemWidth; // увеличиваем отступ при нажатии назад // поскольку отступ будет всегда отрицательный, нужно сравнивать с нулем, // чтобы исключить пустые прокрутки if (sliderPosition > 0) { sliderPosition = 0; } sliderTrack.css('transform', `translateX(${sliderPosition}px`); sliderButtons(); }); sliderButtonNext.on('click', function(){ sliderPosition -= sliderItemWidth; // так как отступы отрицательные, нужно сравнить с отрицательной длинной дорожки, // чтобы исключить пустые прокрутки if (sliderPosition < -sliderTrackWidth) { sliderPosition = -sliderTrackWidth; } sliderTrack.css('transform', `translateX(${sliderPosition}px`); sliderButtons(); }); // скрываем кнопки prev/next, когда нельзя больше крутить const sliderButtons = () => { if (sliderPosition == 0) { sliderButtonPrev.hide(); } else { sliderButtonPrev.show(); } if (sliderPosition == -sliderTrackWidth) { sliderButtonNext.hide(); } else { sliderButtonNext.show(); } }; sliderButtons(); });
На этом слайдер готов, остались вопросы, задавайте в комментариях и подписывайтесь на youtube-канал, там будет еще много видео по разработке и не только.