123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- /**
- * slider插件可悬停控制
- */
- ; $(function ($, window, document, undefined) {
-
- Slider = function (container, options) {
- /*
- options = {
- auto: true,
- time: 3000,
- event: 'hover' | 'click',
- mode: 'slide | fade',
- controller: $(),
- activeControllerCls: 'className',
- exchangeEnd: $.noop
- }
- */
- "use strict"; //stirct mode not support by IE9-
- if (!container) return;
- var options = options || {},
- currentIndex = 0,
- cls = options.activeControllerCls,
- delay = options.delay,
- isAuto = options.auto,
- controller = options.controller,
- event = options.event,
- interval,
- slidesWrapper = container.children().first(),
- slides = slidesWrapper.children(),
- length = slides.length,
- childWidth = container.width(),
- totalWidth = childWidth * slides.length;
- function init() {
- var controlItem = controller.children();
- mode();
- event == 'hover' ? controlItem.mouseover(function () {
- stop();
- var index = $(this).index();
- play(index, options.mode);
- }).mouseout(function () {
- isAuto && autoPlay();
- }) : controlItem.click(function () {
- stop();
- var index = $(this).index();
- play(index, options.mode);
- isAuto && autoPlay();
- });
- isAuto && autoPlay();
- }
- //animate mode
- function mode() {
- var wrapper = container.children().first();
- options.mode == 'slide' ? wrapper.width(totalWidth) : wrapper.children().css({
- 'position': 'absolute',
- 'left': 0,
- 'top': 0
- })
- .first().siblings().hide();
- }
- //auto play
- function autoPlay() {
- interval = setInterval(function () {
- triggerPlay(currentIndex);
- }, options.time);
- }
- //trigger play
- function triggerPlay(cIndex) {
- var index;
- (cIndex == length - 1) ? index = 0 : index = cIndex + 1;
- play(index, options.mode);
- }
- //play
- function play(index, mode) {
- slidesWrapper.stop(true, true);
- slides.stop(true, true);
- mode == 'slide' ? (function () {
- if (index > currentIndex) {
- slidesWrapper.animate({
- left: '-=' + Math.abs(index - currentIndex) * childWidth + 'px'
- }, delay);
- } else if (index < currentIndex) {
- slidesWrapper.animate({
- left: '+=' + Math.abs(index - currentIndex) * childWidth + 'px'
- }, delay);
- } else {
- return;
- }
- })() : (function () {
- if (slidesWrapper.children(':visible').index() == index) return;
- slidesWrapper.children().fadeOut(delay).eq(index).fadeIn(delay);
- })();
- try {
- controller.children('.' + cls).removeClass(cls);
- controller.children().eq(index).addClass(cls);
- } catch (e) { }
- currentIndex = index;
- options.exchangeEnd && typeof options.exchangeEnd == 'function' && options.exchangeEnd.call(this, currentIndex);
- }
- //stop
- function stop() {
- clearInterval(interval);
- }
- //prev frame
- function prev() {
- stop();
- currentIndex == 0 ? triggerPlay(length - 2) : triggerPlay(currentIndex - 2);
- isAuto && autoPlay();
- }
- //next frame
- function next() {
- stop();
- currentIndex == length - 1 ? triggerPlay(-1) : triggerPlay(currentIndex);
- isAuto && autoPlay();
- }
- //init
- init();
- //expose the Slider API
- return {
- prev: function () {
- prev();
- },
- next: function () {
- next();
- }
- }
- };
- }(jQuery, window, document));
|