I'm building a marquee/carousel effect with 2 collections of items. Looping both item-collection
spans with translateX
is not difficult (here the fiddle), but I don't like the empty space at the end of each loop.
Knowing that both collections might differ in width, how could I achieve an effect of "continuity" so after the first loop, the first collection (cyan) appears right after the second (magenta).
Any pointer to CSS or JS solutions is highly appreciated... =)
I'm building a marquee/carousel effect with 2 collections of items. Looping both item-collection
spans with translateX
is not difficult (here the fiddle), but I don't like the empty space at the end of each loop.
Knowing that both collections might differ in width, how could I achieve an effect of "continuity" so after the first loop, the first collection (cyan) appears right after the second (magenta).
Any pointer to CSS or JS solutions is highly appreciated... =)
Share Improve this question edited Nov 30, 2016 at 5:50 Harry 89.8k26 gold badges214 silver badges223 bronze badges asked Nov 29, 2016 at 19:00 sdudesdude 8,2352 gold badges23 silver badges25 bronze badges 1- 1 That is not really possible using CSS alone. There is a reason that most such slider scripts clone some elements ... – C3roe Commented Nov 29, 2016 at 19:03
1 Answer
Reset to default 8If the marquee is big enough, you can swap one of the collections at mid animation.
This is as far as you can get with CSS alone, I think
.marquee {
width: 100%;
height: 80px;
margin: 0 auto;
overflow: hidden;
white-space: nowrap;
border: 1px solid blue;
}
.marquee-content {
display: inline-block;
margin-top: 5px;
animation: marquee 5s linear infinite;
}
.item-collection-1 {
position: relative;
left: 0%;
animation: swap 5s linear infinite;
}
@keyframes swap {
0%, 50% {
left: 0%;
}
50.01%,
100% {
left: 100%;
}
}
.marquee-content:hover {
animation-play-state: paused
}
.item1 {
display: inline-block;
height: 70px;
width: 140px;
background: cyan;
vertical-align: top;
margin-left: 15px;
}
.item2 {
display: inline-block;
height: 70px;
width: 100px;
background: magenta;
vertical-align: top;
margin-left: 15px;
line-height: 14px;
}
/* Transition */
@keyframes marquee {
0% {
transform: translateX(0)
}
100% {
transform: translateX(-100%)
}
}
<div class="marquee">
<div class="marquee-content">
<span class="item-collection-1">
<span class="item1"></span>
<span class="item1"></span>
<span class="item1"></span>
<span class="item1"></span>
<span class="item1"></span>
<span class="item1"></span>
<span class="item1"></span>
</span>
<span class="item-collection-2">
<span class="item2"></span>
<span class="item2"></span>
<span class="item2"></span>
<span class="item2"></span>
<span class="item2"></span>
<span class="item2"></span>
<span class="item2"></span>
<span class="item2"></span>
</span>
</div>
<div>