Дергается скролл при добавлении блока в начало списка
Здравствуйте!
Я пытаюсь сделать вертикальный слайдер. Чтобы добиться эффекта бесконечной прокрутки я клонирую слайды с помощью .clone() Когда жмется кнопка Вперед, то клонируется первый слайд и ставится в конец. Когда жмется кнопка Назад, то - наоборот, клонируется последний слайд и ставится в начало. Клонируемые слайды, соответственно удаляются. После клонирования я плавно смещаю скролл родителя:
container.stop().animate({scrollTop: shift});
Проблема: Когда жмем Вперед, удаляется первый слайд и ставится в конец. В этот момент происходит смещение скролла, а потом анимация. Выглядит это как рывок, а не как плавный скролл. При нажатии Назад все ровно и гладко. Вот здесь код: https://jsfiddle.net/indigorf/d0m7zv8a/ Я уже перепробовал все, что в голову пришло, максимум чего добился, сделал еще хуже чем есть. Подскажите пожалуйста, как можно решить этот вопрос? Заранее спасибо! |
Цитата:
Либо воспользоваться чем-то уже имеющимся. |
бесконечная вертикальная прокрутка
Цитата:
ниже весь код целиком, обёртывать в $(function() { }); нет необходимости.
$(window).on("load", function() {
var container = $(".feedwrap__container");
function nextSlide(e) {
e.preventDefault();
var slide = $(".slide:first", container), height = slide.outerHeight(true);
container.stop().animate({scrollTop:height}, function() {
container.append(slide);
container.scrollTop(0);
});
}
$(".feedwrap__next").on("click", nextSlide);
function prevSlide(e) {
e.preventDefault();
var slide = $(".slide:last", container), height = slide.outerHeight(true);
container.prepend(slide);
container.scrollTop(height);
container.stop().animate({scrollTop:0});
}
$(".feedwrap__prev").on("click", prevSlide);
});
|
Спасибо за ответ! Ваш код работает, но есть нюанс.
Я только сейчас понял, что не написал об этом. Мне надо не просто скролить блоки, а чтобы активный блок был строго по центру родителя, а предыдущий и следующий обрезались поровну сверху и снизу. Вот скрин, как должно выглядеть: https://disk.yandex.ru/i/eolj7KemmfvYRA И когда я пытаюсь добавить этот функционал в Ваш код, то все начинает дергаться, как и в моем коде. Я вычисляю расстояние скролла таким образом:
var container = $(".feedwrap__container"),
wrapHeight = $('.feedwrap').height(),
activeSlideHeight = $('.feedwrap__container > .slide:first-child').outerHeight();
var shift = (wrapHeight - activeSlideHeight) / 4;
container.stop().animate({scrollTop: shift});
Вычисляется почти правильно. Только shift выдается погрешность +/- 10px. Не критично на данный момент. Но вот при попытке отскролить до этого shift происходит рывок. И именно эту проблему я хочу решить. |
Цитата:
|
| Часовой пояс GMT +3, время: 18:01. |