2012-01-22 8 views
15

Necesito recorrer algunos divs usando jQuery. Lo que quiero decir por ciclo es que tengo una serie de 7 divs:Cycle Through Divs

<div id="content-1">Sample text</div> 
<div id="content-2">Sample text</div> 
<div id="content-3">Sample text</div> 
<div id="content-4">Sample text</div> 
<div id="content-5">Sample text</div> 
<div id="content-6">Sample text</div> 
<div id="content-7">Sample text</div> 

lo que tengo que pasar es cada 5 segundos que necesito que cambien. Así que el div "Content-1" se mostraría durante 5 segundos y luego el div "Content 2" se mostraría durante 5 segundos, etc.

Siento que esto es fácil de hacer, pero soy un idiota cuando se trata de JavaScript y jQuery.

Respuesta

36
var divs = $('div[id^="content-"]').hide(), 
    i = 0; 

(function cycle() { 
    divs.eq(i).fadeIn(400) 
       .delay(5000) 
       .fadeOut(400, cycle); 

    i = ++i % divs.length; // increment i, 
          // and reset to 0 when it equals divs.length 
})(); 

DEMO:(con un retraso más corto)http://jsfiddle.net/eFjnU/


Si no desea que la animación se desvanecen, y utiliza showhide. Aún necesita dar una duración para que el delay y la devolución de llamada funcionen.

var divs = $('div[id^="content-"]').hide(), 
    i = 0; 

(function cycle() { 

    divs.eq(i).show(0) 
       .delay(1000) 
       .hide(0, cycle); 

    i = ++i % divs.length; 

})(); 

DEMO:(con un retraso más corto)http://jsfiddle.net/eFjnU/1/

+0

Gracias taaaaaaaaaaaaaan mucho! ¡Esto es genial! Solo tengo otras 2 preguntas que espero que no sean un gran problema para implementar.1) ¿Es posible agregar algo que hace que la animación se detenga cuando pasas el cursor sobre div? y 2) ¿Cómo puedo hacer para que cualquier div en el que estoy reciba una clase asignada? Tengo ciertos estilos que me gustaría aplicar al div actual. ¡Gracias de nuevo! – user1163942

+0

haciendo que se detenga cuando pase el mouse va a ser un poco más complicado, pero [aquí hay una actualización] (http://jsfiddle.net/eFjnU/2/) para agregar/eliminar una clase cuando se desplaza. –

+1

@ Si8: Creo que es un poco más limpio sin usar los índices. https://jsfiddle.net/egLefjwv/11/ El suyo no estaba manejando el caso donde el '++' llevaría el índice más allá del último índice del elemento. Para solucionarlo, podría tomar el resto de la división por 'vAlertLen', que lo devolverá a' 0' cuando el índice sea igual a la longitud, y luego hará el incremento. '(vCurrentDispItem% vAlertLen + 1)' Te dejaré llevarlo desde allí con las animaciones. ¡Buena suerte! –

5

simple jQuery galería de desvanecimiento de slide

con pausa en vuelo estacionario:

// FADESHOW // Simple fade gallery 
 
$(".fadeShow").each(function() { 
 

 
    var $slides = $(this).children(), 
 
     tot = $slides.length, 
 
     itv = null, 
 
     idx = 0; 
 
     
 
    $slides.eq(idx).show(); 
 
    
 
    function anim() { $slides.fadeOut().eq(++idx % tot).fadeIn(); } 
 
    function play() { itv = setInterval(anim, 2000); } 
 
    function stop() { clearInterval(itv); } 
 
    
 
    $(this).hover(stop, play); 
 
    
 
    play(); 
 
    
 
});
body{margin:0;} 
 

 
/* FADESHOW basic CSS */ 
 
.fadeShow { 
 
    position:relative; 
 
} 
 
.fadeShow > * { 
 
    position:absolute; 
 
    display:none; 
 
    height: inherit; 
 
    width: 100%; 
 
} 
 

 
/* FADESHOW (your styles) */ 
 
.gal_1 { height:80px; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div class="fadeShow gal_1"> 
 
    <div style="background:#0bf;">1 Hover to pause</div> 
 
    <div style="background:#fb0;">2 You can have as many slideshows as you want</div> 
 
    <div style="background:#b0f;">3</div> 
 
</div> 
 

 
<div class="fadeShow"> 
 
    <p>LOREM</p> 
 
    <p>IPSUM</p> 
 
    <p>DOLOR</p> 
 
    <p>SOMETHING</p> 
 
</div>

.fadeShow() jQuery plugin de

Si desea convertirlo en un plugin de jQuery simpls con el fin de permitir que diferentes desvanecimiento y pausa valores e incluir otras opciones:

// FADESHOW // Simple fade gallery by Roko :) 
 
(function($){ 
 
    $.fn.fadeShow = function(options) { 
 

 
    var op = $.extend({ 
 
     pause : 3800, 
 
     fade : 600, 
 
     pauseHover : true 
 
    }, options); 
 

 
    return this.each(function() { 
 

 
     var $slides = $(this).children(), 
 
      tot = $slides.length, 
 
      itv = null, 
 
      idx = 0; 
 

 
     $slides.eq(idx).show(); 
 

 
     function anim() { $slides.fadeOut(op.fade).eq(++idx % tot).fadeIn(op.fade); } 
 
     function play() { itv = setInterval(anim, op.fade+op.pause); } 
 
     function stop() { clearInterval(itv); } 
 

 
     if(op.pauseHover) $(this).hover(stop, play); 
 

 
     play(); 
 

 
    }); 
 
    }; 
 
}(jQuery)); 
 

 

 
// Basic example 
 
$(".gal1").fadeShow(); 
 

 
// With options 
 
$(".gal2").fadeShow({ 
 
    pause : 4000, 
 
    fade : 1000, 
 
    pauseHover : false 
 
});
/* FADESHOW basic CSS */ 
 
.fadeShow { 
 
    position:relative; 
 
} 
 
.fadeShow > * { 
 
    position:absolute; 
 
    display:none; 
 
    height: inherit; 
 
    width: 100%; 
 
} 
 

 
/* FADESHOW (your styles) */ 
 
.gal1 { height:80px; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div class="fadeShow gal1"> 
 
    <div style="background:#0bf;">1 Hover to pause</div> 
 
    <div style="background:#fb0;">2 You can have as many slideshows as you want</div> 
 
    <div style="background:#b0f;">3</div> 
 
</div> 
 

 
<div class="fadeShow gal2"> 
 
    <p>pauseHover : false</p> 
 
    <p>IPSUM</p> 
 
    <p>DOLOR</p> 
 
    <p>SOMETHING</p> 
 
</div>

+1

gracias por la actualización! Estoy tratando de hacer que esto funcione, lamentablemente no estaba del todo claro en mi pregunta (¡lo siento!). He escrito uno mejor aquí: [http://stackoverflow.com/questions/8966117/cycle-divs-and-thumbnails] y espero poder implementar lo que ha proporcionado? – user1163942

+0

Esto es asombroso. ¿Cómo puedo agregar la opción Siguiente/Anterior a la reproducción y pausa en el vuelo estacionario? Gracias. – Si8

+0

https://jsfiddle.net/egLefjwv/7/ También puedo usar el auto pero ¿por qué están uno encima del otro en lugar de estar uno encima del otro? Gracias. – Si8

1

Necesitamos iterar un conjunto y manejar su visibilidad properti es.

Antes que nada, permítame mostrarle dos bibliotecas que he creado. La primera es Iterable, que está diseñado para manejar todo tipo de iteraciones:

function Iterable(params) { 
    var prevHandlers = []; 
    var nextHandlers = []; 
    var that = this; 
    this.current = params.current; 

    function ensureArray() { 
     if (!that.elements) { 
      that.elements = []; 
     } else if (!Array.isArray(that.elements)) { 
      that.elements = $.map(that.elements, function(value, index) { 
       return [value]; 
      }); 
     } 
     return that.elements; 
    } 

    function calculateCount() { 
     that.count = ensureArray().length; 
    } 

    this.setElements = function(elements) { 
     this.elements = elements; 
     calculateCount(); 
    }; 

    this.prev = function(amount) { 
     if (amount === undefined) { 
      amount = 1; 
     } 
     //Modulo twice to make sure current will be positive 
     that.current = (((that.current - amount) % that.count) + that.count) % that.count; 
     while (amount--) { 
      for (var prevHandler in prevHandlers) { 
       prevHandlers[prevHandler](params); 
      } 
     } 
    }; 

    this.next = function(amount) { 
     if (amount === undefined) { 
      amount = 1; 
     } 
     that.current = (that.current + amount) % that.count; 
     while (amount--) { 
      for (var nextHandler in nextHandlers) { 
       nextHandlers[nextHandler](params); 
      } 
     } 
    }; 

    this.getCurrent = function() { 
     return that.elements[that.current]; 
    }; 

    this.setCurrent = function(current) { 
     for (var index in that.elements) { 
      if (that.elements[index] === current) { 
       that.current = index; 
       return true; 
      } 
     } 
     return false; 
    }; 

    this.pushElement = function(element) { 
     that.elements.push(element); 
    }; 

    this.pushElements = function(elements) { 
     for (var element in elements) { 
      that.pushElement(elements[element]); 
     } 
    }; 

    this.insertElement = function(element, index) { 
     that.elements.splice(index, 0, element); 
    }; 

    this.insertElements = function(elements, indexes, leftToRight) { 
     var start = 0; 
     var end = indexes.length - 1; 
     if (leftToRight === false) { 
      var aux = start; 
      start = end; 
      end = aux; 
     } 
     var leap = (start < end) ? 1 : -1; 
     while (start - leap !== end) { 
      that.insertElement[elements[indexes[start]]]; 
      start += leap; 
     } 
    }; 

    this.popElement = function() { 
     that.elements.pop(); 
    }; 

    this.popElements = function(amount) { 
     that.elements.splice(that.elements.length - amount, amount); 
    }; 

    this.removeElement = function(index) { 
     that.elements.splice(index, 1); 
    }; 

    this.removeElements = function(indexes, leftToRight) { 
     var start = 0; 
     var end = indexes.length - 1; 
     if (leftToRight === false) { 
      var aux = start; 
      start = end; 
      end = aux; 
     } 
     var leap = (start < end) ? 1 : -1; 
     while (start - leap !== end) { 
      that.removeElement(indexes[start]); 
      start += leap; 
     } 
    }; 

    this.register = { 
     prev: function(param) { 
      if (Array.isArray(param)) { 
       for (var func in param) { 
        prevHandlers.push(param[func]); 
       } 
      } else { 
       prevHandlers.push(param); 
      } 
     }, 
     next: function(param) { 
      if (Array.isArray(param)) { 
       for (var func in param) { 
        nextHandlers.push(param[func]); 
       } 
      } else { 
       nextHandlers.push(param); 
      } 
     } 
    }; 

    this.setElements(params.elements); 
    if ((!!this.current) && (!Array.isArray(params.elements))) { 
     this.setCurrent(params.elements[params.current]); 
    } 

} 

La segunda es Visiblary, que está diseñado para manejar todo tipo de eventos de visibilidad:

/* 
* params: 
*  - selector: jQuery selector 
*  - init: function which gets the Visiblary object to initialize it 
*  - events: object/array 
*   - root: a selector which contain all the affected tags, default is "body" 
*   - types: array, which contains the string representation of the events 
*   - selector: inner selector to identify the target set 
*   - handler: handler function 
*/ 
function Visiblary(params) { 
    var instance = this; 
    if (!params.toggleClass) { 
     params.toggleClass = "invisible"; 
    } 
    this.hideAll = function() { 
     $(params.selector).addClass(params.toggleClass); 
     return instance; 
    }; 
    this.hideSubset = function(subsetSelector) { 
     $(params.selector).filter(subsetSelector).addClass(params.toggleClass); 
     return instance; 
    }; 
    this.hideOnly = function(subsetSelector) { 
     $(params.selector).not(subsetSelector).removeClass(params.toggleClass); 
     $(params.selector).filter(subsetSelector).addClass(params.toggleClass); 
     return instance; 
    }; 
    this.showAll = function() { 
     $(params.selector).removeClass(params.toggleClass); 
     return instance; 
    }; 
    this.showSubset = function(subsetSelector) { 
     $(params.selector).filter(subsetSelector).removeClass(params.toggleClass); 
     return instance; 
    }; 
    this.showOnly = function(subsetSelector) { 
     $(params.selector).not(subsetSelector).addClass(params.toggleClass); 
     $(params.selector).filter(subsetSelector).removeClass(params.toggleClass); 
     return instance; 
    }; 
    this.invert = function() { 
     $(params.selector).each(function() { 
      $(this).hasClass(params.toggleClass) ? $(this).removeClass(params.toggleClass) : $(this).addClass(params.toggleClass); 
     }); 
     return instance; 
    }; 
    if (!!params.init) { 
     params.init(this); 
    } 
    if (!!params.events) { 
     for (var event in params.events) { 
      $(!!params.events[event].root ? params.events[event].root : "body").on(params.events[event].types.join(" "), params.events[event].selector, params.events[event].handler); 
     } 
    } 
    return instance; 
} 

y, suponiendo que uno utiliza estas herramientas y los siete elementos que ya se ha creado, este es el script que resuelve el problema:

var myVisiblary = new Visiblary({ 
    selector: "#content-1, #content-2, #content-3, #content-4, #content-5, #content-6, #content-7" 
}); 
myVisiblary.showOnly("#content-1"); 
var myIterable = new Iterable({ 
    elements: $("#content-1, #content-2, #content-3, #content-4, #content-5, #content-6, #content-7"), 
    current: 0 
}); 
myIterable.register.next(function() {myVisiblary.showOnly($(myIterable.getCurrent()))}); 
setInterval(function(){ myIterable.next(); }, 5000);