Перейти к содержимому

Как сделать бесконечный слайдер на js

  • автор:

Бесконечный слайдер на чистом JS

Делаю слайдер на чистом JS с помощью setInterval. Как можно добиться бесконечной прокрутки слайдов?

let sliderWrapper = document.querySelector(".slider-wrapper"); let sliderElements = document.querySelectorAll(".slider-item"); const sliderItemWidth = sliderElements[0].clientWidth; let counter = 1; let translation = 0; const nextSlide = function() < let start = Date.now(); // запомнить время начала let timer = setInterval(function() < let timePassed = Date.now() - start; nextBtn.classList.add("inactive-button"); if (timePassed >sliderItemWidth) < setTimeout(() =>< nextBtn.classList.remove("inactive-button"); >, 400); clearInterval(timer); translation = sliderItemWidth * counter; counter++; return; > draw(timePassed); >, 0); function draw(timePassed) < sliderElements.forEach((item) =>< item.style.right = translation + timePassed + "px"; >); > >; const prevSlide = function() < let start = Date.now(); let timer = setInterval(function() < let timePassed = Date.now() - start; prevBtn.classList.add("inactive-button"); if (timePassed >sliderItemWidth + 1) < setTimeout(() =>< prevBtn.classList.remove("inactive-button"); >, 400); clearInterval(timer); translation = sliderItemWidth * (counter - 2); counter--; return; > draw(timePassed); >, 0); function draw(timePassed) < sliderElements.forEach((item) =>< item.style.right = translation - timePassed + "px"; >); > >; nextBtn.addEventListener("click", nextSlide); prevBtn.addEventListener("click", prevSlide);
body < margin: 0; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; color: #fff; >.main < display: flex; justify-content: center; align-items: center; >.slider < position: relative; overflow: hidden; width: 800px; >.slider-wrapper < display: flex; >.slider-item < flex: 0 0 100%; max-width: 100%; position: relative; >.slider-item-content < height: 250px; background: coral; >.slider-control < position: absolute; top: 50%; display: flex; align-items: center; justify-content: center; width: 40px; color: #fff; text-align: center; opacity: 0.5; height: 50px; transform: translateY(-50%); background: rgba(0, 0, 0, .5); >.slider-control:hover, .slider-control:focus < color: #fff; text-decoration: none; outline: 0; opacity: .9; >.slider-control-left < left: 0; >.slider-control-right < right: 0; >.slider-control::before < content: ''; display: inline-block; width: 20px; height: 20px; background: transparent no-repeat center center; background-size: 100% 100%; >.slider-control-left::before < background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E"); >.slider-control-right::before < background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E"); >.slider-item>div < line-height: 250px; font-size: 100px; text-align: center; >.inactive-button
 
1
2
3
4

Как сделать бесконечный слайдер?

Привет всем.Подскажите, пожалуйста, как сделать бесконечную прокрутку слайдера?
Гуглить — гуглил, не смог найти то, что мне нужно.
Слик слайдеры и подобные тоже не предлагать — я пытаюсь написать свой
Как сделать чтобы при клике вперед на последнем слайде слайдер начинался с первого?
Понимаю, что как-то клонированием, но как реализовать не понимаю пока
HTML-код

       Document   
ddd
111
22
let position = 0; //Сколько будет показывать элеменов const slidesToShow = 1; //Сколько будет скролить const slidesToScroll = 1; const container = document.querySelector(".slider-container"); // лист с айтемами const track = document.querySelector(".slider-track"); const btnPrev = document.querySelector(".btn-prev"); const btnNext = document.querySelector(".btn-next"); //Количество элементов const items = document.querySelectorAll(".slider-item"); const itemsCount = items.length; //Получаем ширину каждого элемента const itemWidth = container.clientWidth / slidesToShow; const movePosition = slidesToScroll * itemWidth; for(let i = 0; i < itemsCount; i++) < const cloneItem = items[i].cloneNode(true); cloneItem.classList.add('cloneNode') track.appendChild(cloneItem); >items.forEach((item) => < item.style.minWidth = `$px`; >) btnNext.addEventListener('click', () => < const itemsLeft = itemsCount - (Math.abs(position) + slidesToShow * itemWidth) / itemWidth; console.log(itemsLeft); position -= itemsLeft >= slidesToScroll ? movePosition : itemsLeft * itemWidth; ; setPosition() /* checkButtons() */ >); btnPrev.addEventListener('click', () => < const itemsLeft = Math.abs(position) / itemWidth; position += itemsLeft >= slidesToScroll ? movePosition : itemsLeft * itemWidth; setPosition() /* checkButtons() */ >); const setPosition = () => < track.style.transform = `translateX($px)`; >
  • Вопрос задан более двух лет назад
  • 7990 просмотров

1 комментарий

Средний 1 комментарий

Assholiday @Assholiday

Удаление нулевого элемента слайдера и добавка его в конец должна производиться внутри коллбека листенера.
Но за этот код спасибо.
Опираясь на твой код я сделал однорукого бандита.

Решения вопроса 0
Ответы на вопрос 3

approximate_solution

approximate solution @approximate_solution
JS Developer. Angular\React\Vue\Ember
Ответ написан более двух лет назад
Комментировать
Нравится 1 Комментировать

Всем добрый день.. бесконечный слайдер на js это простейшая штука, я не могу понять почему нет ни одного ролика на ютуб об этом, вернее есть но они очень сложно реализованы, куча стилей, смещение слайдов, и очень не понятно. Предлагаю свой вариант. Стилей здесь не будет, это по желанию сами установите.. только логика ..
index .html содержит:

добавил немного классов для удобства, но это не обязательно. главное что нам нужно это две кнопки и блок для вывода изображений.. дальше создаем и подключаем
index.js файл который содержит:

const prevBtn = document.querySelector('.prev') const nextBtn = document.querySelector('.next') const outImg = document.querySelector('.slider__img') const art1 = './img/art1.jpg' const art2 = './img/art2.jpg' const art3 = './img/art3.jpg' const art4 = './img/art4.jpg' const art5 = './img/art5.jpg' const images = [art1, art2, art3, art4, art5] let i = 0 outImg.innerHTML =`>` nextBtn.onclick = () =>< if(i < images.length - 1)< i++ >else < i = 0 >outImg.innerHTML =`>` > prevBtn.onclick = () => < if(i >0 )< i-- >else < i = images.length-1 >outImg.innerHTML =`>` >

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

бесконечная прокрутка карусели на javascript?

В общем. Идея такая. Есть обертка, в ней абсолютным позиционированием размещаются слайдеры. Каждому слайду даю позицию left. При этом каждый слайдер растягивается на всю ширину экрана, то бишь у первого left: 0%, у второго left:100% и тд. Данные позиции заношу в массив move. При клике на prev или next вызываю функцию plusSlide где меняю значения массива move и естественно значения left у слайдов. Получается анимация листания. Сложность создать бесконечную прокрутку. Общую идею понимаю, но реализовать совсем не получается. Скрины прилагаю : 1). html разметка, css стили, скрин слайдера

JS:
window.addEventListener(‘DOMContentLoaded’, function()

let items = document.getElementsByClassName(‘slider-item’),
sliderWrap = document.getElementsByClassName(‘slider-wrap’)[0],
arrayHeight = [],
prev = document.getElementsByClassName(‘prev-wrap’)[0],
next = document.getElementsByClassName(‘next-wrap’)[0],
cirklesWrap = document.getElementsByClassName(‘cirkles’)[0],
cirkles = document.getElementsByClassName(‘cirkle’),
slideIndex = 1;

function heightMax() for (let i = 0; i < items.length; i++) arrayHeight.push(items[i].offsetHeight);
>
sliderWrap.style.height = getMaxOfArray(arrayHeight) + ‘px’;
>
heightMax();

window.addEventListener(‘resize’, function() heightMax();
>);

function getMaxOfArray(numArray) return Math.max.apply(null, numArray);
>

let move = new Array;
arrayMove();
function arrayMove() for (let i = 0; i < items.length; i++) move.push(i*100);
items[i].style.left = move[i] + ‘%’;
>
>

function plusSlide(index) if (index < 0) for (let i = 0; i < items.length; i++) move[i] += 100;
items[i].style.left = move[i] + ‘%’;
>
>
if (index > 0) for (let i = 0; i < items.length; i++) move[i] -= 100;
items[i].style.left = move[i] + ‘%’;
>
>
>

let a = 0;
function cirkleActive(n) a += n;
for (let i = 0; i < cirkles.length; i++) cirkles[i].classList.remove('cirkle-active');
>
if (a > cirkles.length — 1) a = 0;
>
if (a < 0) a = cirkles.length - 1;
>
if (a < cirkles.length && a >= 0) cirkles[a].classList.add(‘cirkle-active’);
>

prev.addEventListener(‘click’, () => plusSlide(-1);
cirkleActive(-1);
>);

next.addEventListener(‘click’, () => plusSlide(1);
cirkleActive(1);
>);

>);

Дополнен 5 лет назад

Пожалуйста. Прошу ответ с минимальным примером. Саму идею понимаю, не могу реализовать нормально) Заранее спасибо)

Курсы javascript

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

http://learn.javascript.ru/play/AbKn5
Я понимаю что строю велосипед есть много примеров на jquery, но я хочу ради урока создать самому с нуля, подскажите что делать надо

Последний раз редактировалось imediasun1, 18.11.2013 в 23:31 .
19.11.2013, 00:16
Регистрация: 23.06.2011
Сообщений: 1,165

http://learn.javascript.ru/play/zfzaeb
извиняюсь за нецензурщину в ссылке, такой адрес выдали, я не виноват

19.11.2013, 00:59
Регистрация: 23.12.2012
Сообщений: 437
Спасибо большое очень благодпрен
можете прокомментировать чтобы легче было разобраться в логике?

  

Последний раз редактировалось imediasun1, 19.11.2013 в 01:06 .
19.11.2013, 09:08
Регистрация: 23.06.2011
Сообщений: 1,165

var picsNum = document.getElementById('slider').getElementsByTagName('img').length; // считаем сколько картинок заложено в слайдер var now = 0; // первой будет выведена картинка с индексом 0 (т.е. первая) var sliderOffset = []; for (var i = 0; i < picsNum; i++) sliderOffset.push(-i * 104 + 'px'); // создаем массив с вариантами смещения слайдера для каждой картинки console.table(sliderOffset); // для отладки, это я забыл убрать. Выводит в консоль получившийся массив. Можете удалить строку document.getElementById('left_arrow').onclick = function() < --now;// уменьшаем индекс картинки if(now < 0) now = picsNum - 1; // если залезли в отрицательную область, делаем текущей последнюю картинку document.getElementById('slider').style.left = sliderOffset[now]; //смещаем слайдер в соответствии с текущей картинкой >document.getElementById('right_arrow').onclick = function() < ++now; // увеличиваем индекс картинки if(now >picsNum - 1) now = 0; // если индекс больше, чем может быть, делаем текущей первую картинку document.getElementById('slider').style.left = sliderOffset[now]; // см. выше >

Добавить комментарий

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