tl;dr - JSBin 示例:http : //jsbin.com/ufoceq/8/
一种无需太多努力即可创建无限图像滑块的简单方法如下:为了简单起见,您可以<n>
循环滑动图像,以便在第n
th 个图像之后,下一个要可视化的是1
st(和反之亦然)。
这个想法是创建第一个和最后一个图像的克隆,以便
- 最后一个图像的克隆放在第一个图像之前;
- 第一个图像的克隆附加在最后一个图像之后。
无论您的图像数量是多少,您最多只需要附加 2 个克隆元素。
再次为简单起见,假设所有图像都是100px
宽的,并且它们被包裹在一个容器中,您可以将其向左/向右移动到带有overflow: hidden
. 然后,所有图像都可以轻松地与容器对齐display: inline-block
并white-space: nowrap
设置在容器上(flexbox
现在更容易)。
对于n = 4
DOM 结构将是这样的:
offset(px) 0 100 200 300 400 500
images | 4c | 1 | 2 | 3 | 4 | 1c
/* ^^ ^^
[ Clone of the last image ] [ Clone of the 1st image ]
*/
一开始,你的容器将被定位left: -100px
(或者margin-left: -100px
甚至更好(为了性能) transform: translateX(-100px)
),所以滑块可以显示第一张图像。要从一个图像切换到另一个图像,您需要在您之前选择的同一属性上应用 javascript 动画。
当您的滑块当前位于第 4个图像时,您必须从图像切换4
到1c
,因此我们的想法是在动画结束时执行回调,该回调很快将您的滑块包装器重新定位在真正的第一个图像偏移处(例如,您设置left: -100px
到容器)
当您的滑块当前位于第一个元素时,这类似于:要显示前一个图像,您只需要执行从图像1
到的动画4c
,当动画完成时,您只需移动容器,使滑块立即定位在 4 th图像偏移量(例如,您设置left: -400px
为容器)。
您可以在上面的小提琴上看到效果:这是js/jquery
我使用的最少代码(当然,代码甚至可以优化,因此项目的宽度不会硬编码到脚本中)
$(function() {
var gallery = $('#gallery ul'),
items = gallery.find('li'),
len = items.length,
current = 1, /* the item we're currently looking */
first = items.filter(':first'),
last = items.filter(':last'),
triggers = $('button');
/* 1. Cloning first and last item */
first.before(last.clone(true));
last.after(first.clone(true));
/* 2. Set button handlers */
triggers.on('click', function() {
var cycle, delta;
if (gallery.is(':not(:animated)')) {
cycle = false;
delta = (this.id === "prev")? -1 : 1;
/* in the example buttons have id "prev" or "next" */
gallery.animate({ left: "+=" + (-100 * delta) }, function() {
current += delta;
/**
* we're cycling the slider when the the value of "current"
* variable (after increment/decrement) is 0 or when it exceeds
* the initial gallery length
*/
cycle = (current === 0 || current > len);
if (cycle) {
/* we switched from image 1 to 4-cloned or
from image 4 to 1-cloned */
current = (current === 0)? len : 1;
gallery.css({left: -100 * current });
}
});
}
});
});
如前所述,这个解决方案不需要太多的努力和谈论性能,将这种方法与没有循环的普通滑块进行比较,它只需要在滑块初始化时进行两次额外的 DOM 插入和一些(非常琐碎的)额外逻辑管理向后/向前循环。
这是同时看到两个元素的另一个示例:在这种情况下,您需要克隆更多元素并对逻辑进行一些简单的更改
https://codepen.io/fcalderan/pen/bGbjZdz
我不知道是否存在更简单或更好的方法,但无论如何希望这会有所帮助。
注意:如果您还需要一个响应式画廊,也许这个答案也可能有所帮助