Ну, это просто умно. Спасибо за помощь, принял ваш ответ!
ледовал заэта фантастическая статья, который демонстрирует, как сделать простую карусель с использованием двух директив и одного компонента в Angular.
Набор функций очень ограничен и не включаетбесконечная прокруткарежим, который я хотел бы добавить.
По 'бесконечный свиток'- я имею в виду что-то вроде этого jQuery эквивалента:
var carousel = $('#carousel'),
threshold = 150,
slideWidth = 500,
dragStart,
dragEnd;
$('#next').click(function() {
shiftSlide(-1)
})
$('#prev').click(function() {
shiftSlide(1)
})
carousel.on('mousedown', function() {
if (carousel.hasClass('transition')) return;
dragStart = event.pageX;
$(this).on('mousemove', function() {
dragEnd = event.pageX;
$(this).css('transform', 'translateX(' + dragPos() + 'px)')
})
$(document).on('mouseup', function() {
if (dragPos() > threshold) {
return shiftSlide(1)
}
if (dragPos() < -threshold) {
return shiftSlide(-1)
}
shiftSlide(0);
})
});
function dragPos() {
return dragEnd - dragStart;
}
function shiftSlide(direction) {
if (carousel.hasClass('transition')) return;
dragEnd = dragStart;
$(document).off('mouseup')
carousel.off('mousemove')
.addClass('transition')
.css('transform', 'translateX(' + (direction * slideWidth) + 'px)');
setTimeout(function() {
if (direction === 1) {
$('.slide:first').before($('.slide:last'));
} else if (direction === -1) {
$('.slide:last').after($('.slide:first'));
}
carousel.removeClass('transition')
carousel.css('transform', 'translateX(0px)');
}, 700)
}
$carousel-width: 600px;
$carousel-height: 300px;
body {
background: #333;
color: #fff;
font-size: 22pt;
text-align: center;
font-family: 'Teko';
letter-spacing: 0.15em;
}
body * {
-webkit-user-select: none
}
.wrap {
position: relative;
width: $carousel-width;
height: 300px;
margin: 0 auto;
box-shadow: 7px 7px 5px 0px rgba(0, 0, 0, 0.25);
}
.window {
overflow: hidden;
position: relative;
background: #222;
}
#carousel {
width: 10000px;
position: relative;
top: 0;
left: -450px;
}
.slide {
height: 300px;
width: 500px;
cursor: pointer;
float: left;
display: flex;
flex-direction: column;
justify-content: center;
}
.slide#b1 {
background: #556270
}
.slide#b2 {
background: #4ECDC4
}
.slide#b3 {
background: #9CE462
}
.slide#b4 {
background: #FF6B6B
}
.slide#b5 {
background: #C44D33
}
#prev,
#next {
cursor: pointer;
position: absolute;
bottom: -40px;
font-size: 14pt;
}
#prev {
left: 0
}
#next {
right: 0
}
.transition {
transition: .7s;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h1>INFINITE CAROUSEL</h1>
<div class="wrap">
<div class="window">
<div id="carousel">
<span class="slide" id="b1">SLIDE-1</span>
<span class="slide" id="b2">SLIDE-2</span>
<span class="slide" id="b3">SLIDE-3</span>
<span class="slide" id="b4">SLIDE-4</span>
<span class="slide" id="b5">SLIDE-5</span>
</div>
</div>
<span id="prev">PREV</span>
<span id="next">NEXT</span>
</div>
(карусель можно бесконечно прокручивать в каждом направлении, сохраняя правильный порядок слайдов)
Я пробовал несколько подходов, чтобы добавить эту функцию, и ни один из них не удалось, что я пытался (и впоследствии удалил):
Динамически добавляя и удаляя фрагменты слайдов по обе стороны от просматриваемого в данный момент подмножества - т.е. если карусель содержала 3 слайда, я дублировал бы их по обе стороны от оригинального `1-2-3 1-2-3, а затем добавлял / удалял фрагменты как пользователь прокручивает. Это почти сработало, единственная проблема состояла в том, что Angular запутался при удалении кусков и вращал карусель как сумасшедший, потому что у него все еще была ссылка на номер слайда, которого больше не было.
Динамическое добавление и удаление отдельных слайдов, аналогично описанному выше подходу. Та же проблема.
Прямо дублируя слайды сотни раз. Это работает, но, очевидно, ужасно неэффективно и кажется глупым.