以下方法使用更正式的构造函数和原型,使其保持轻量级,而不是堆叠外壳。构造函数是...
function Slider(slides, transition) {
// Keeps a reference to the current slide index
this._current = 0;
// An array of slides
this._slides = slides;
// A transition function
this._transition = transition;
}
它接受一个幻灯片数组和一个函数,当我们在它们之间转换时将给出两张幻灯片。这意味着我们通过外部化来控制我们的过渡效果。它也与框架无关,并且不依赖于 jQuery 或任何其他框架。构造函数本身并没有做太多事情。下面的方法就是我们的肉...
// The function that swaps slides
Slider.prototype.goto = function(i) {
// Do a bit of sense checking
if(i > this._slides.length || i < 0)
throw new Error("Slide does not exist");
// Swap the slides by passing them to the transition function
var currentSlide = this._slides[this._current];
var nextSlide = this._slides[i];
this._transition(currentSlide, nextSlide);
// Update the current index
this._current = i;
};
它获取幻灯片的新索引并将旧幻灯片和新幻灯片传递给过渡功能。然后它会更新用于跟踪当前幻灯片的索引。然后我们想要实现一个旋转的上一个和下一个函数,所以下面的方法描述了我们如何使用模数来做到这一点,注意我们必须添加幻灯片的长度,因为负模数不能按照我们想要的方式工作。
// Calculate the next index as a rotating index
Slider.prototype.getNextIndex = function() {
return (this._current + 1) % this._slides.length;
};
// Calculate the previous index as a rotating index
Slider.prototype.getPrevIndex = function() {
return (this._current + this._slides.length - 1) % this._slides.length;
};
然后我们加点糖...
// Sugar to go next and prev
Slider.prototype.next = function() {
this.goto(this.getNextIndex());
};
Slider.prototype.prev = function() {
this.goto(this.getPrevIndex());
};
您可能无法将 prev 和 next 按钮与其滑块关联起来。您可以在滑块元素之前和之后找到它们,或者像我在下面所做的那样将它们包含在滑块元素中。要使用 jQuery 设置滑块,您可以执行以下操作...
$(".slider").each(function() {
var slider = new Slider($(this).find(".slide"), function(a, b) {
$(a).hide();
$(b).show();
});
$(this).data("slider", slider);
$(this).find(".prev").click(function() {
slider.prev();
});
$(this).find(".next").click(function() {
slider.next();
});
});
编辑这是在行动http://jsfiddle.net/w8u69/
而且由于转换的逻辑是公开的,您可以很容易地添加转换效果,而无需修改原始Slider
“类”。http://jsfiddle.net/w8u69/1/
编辑只是为了展示这种方法的强大功能,无需修改原始滑块“类”,您可以添加额外的逻辑以在幻灯片之间自动移动。您可以使用装饰器或继承来完成此操作,但此示例显示了如何使用组合来完成。http://jsfiddle.net/w8u69/4/
最后一件事,这可能是纯 OO 方法中最重要的一点,通过简单地更改集成代码并保持 OO“类”不变,我们可以重用我们为滑块编写的逻辑并将其插入一个完全不同的框架。这个小提琴显示它与 MooTools http://jsfiddle.net/w8u69/5/一起使用