Comunidad de diseño web y desarrollo en internet online

Slide imagenes y mostrar texto anexo con jquery en un caption

Citar            
MensajeEscrito el 22 Nov 2011 11:37 pm
Hola a todos, soy nuevo en este foro y recien aprendo jquery.

Lo que estoy haciendo es una slide de imagenes con un div con las imagenes pequeñas que al hacer click en cualquiera se muestre esta imagen pero grande en un div diferente, ademas se muestra un parrafo que esta como hermano de la imagen pequeña, este parrafo debe aparecer en un div caption don de lo meto con .html().
El script es pequeño y me funciona, lo que pasa es qu cuando doy click en todas las imagenes pequeñas al querer volver a dar click en las imagenes ya no aparece el parrafo en el div caption, lo que necesito es saber como hacer para que mostrar los parrafos sea ciclico sin importar si ya vi todas las imagenes.

Este es el codigo html
<body>

<div id="container">
<div id="slider">
<img class="show-img" src="imagenes/base_antienveje_giordani21622_1.png" width="600" height="300" alt="base1" />

</div>

<div id="caption"></div>
<div id="img-caption">
<div class="imagenes">
<img class="img-click"src="imagenes/base_antienveje_giordani21622_1.png" width="100" height="100" alt="base1" rel="<h3>Base Maquillaje Antienvejecimiento Giordani</h3>"/>
<p>Este es un texto de prueba para la primera imagen</p>
</div>
<div class="imagenes">
<img class="img-click" src="imagenes/base_maquillaje_beauty22862_1.png" width="100" height="100" alt="base2" rel="<h3>Base Maquillaje Antienvejecimiento </h3>"/>
<p>Este es un texto de prueba para la segunda imagen</p>
</div>
<div class="imagenes">
<img class="img-click" src="imagenes/base_oxigenante.jpg" width="100" height="100" alt="base3" rel="<h3>Base Maquillaje Antienvejecimiento b3</h3>"/>
<p>Este es un texto de prueba para la tercera imagen</p>
</div>
<div class="imagenes">
<img class="img-click" src="imagenes/base_studioartis_beauty22908_1.png" width="100" height="100" alt="base4" rel="<h3>Base Maquillaje Antienvejecimiento b4</h3>"/>
<p>Este es un texto de prueba para la cuarta imagen</p>
</div>
</div>


</div>
</body>

Y este es el script jquery.

$(document).ready(function(){

// $('#slider img').hide();
// $('.imagenes p').hide();
$('.imagenes img').click(function(){
var $thisPara=$(this);
var $thisText=$thisPara.siblings('p');
var ruta=$thisPara.attr('src');
$('.show-img').attr({src:ruta}).show(2000);
$('#caption').html($(this).siblings('p')).animate({opacity:0.7}, 4000);
//$('#caption').html($(this).attr('rel')).animate({opacity:0.7}, 4000);
});
});



Les agradezco de antemano a quien quiera ayudarme, creo que es problema de colocar un if o un for pero no descubro como hacerlo y ya llevo 2 dias intentandolo.
BENDICIONES..

Por inyfercho

4 de clabLevel



Genero:Masculino  

Bacteriologo Diseñador Web

firefox
Citar            
MensajeEscrito el 23 Nov 2011 12:02 am
Prueba con el script así:

Código Javascript :

$(document).ready(function(){
   $('.imagenes img').click(function(){
      var thisText = $(this).siblings('p').html();
      var ruta = $(this).attr('src');   
      $('.show-img').attr({src:ruta}).show(2000);
      $('#caption').html(thisText).animate({opacity:0.7}, 4000);
   });
});


Observa esta línea "var thisText = $(this).siblings('p').html();"

Un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 23 Nov 2011 10:47 am
:o :o :oops: :oops: ^^ ^^

GRACIAS abducted.

Funcionó perfectamente, pero quisiera saber por que al colocar el .html() al final de la variable, vuelve el ciclo a funcionar, te agradezco otra vez si me lo explicaras.

Además, si sabes de una página donde haya buenos videotutoriales o tutoriales en español o ingles,( aunque preferiblemente en español, se ingles pero a veces me pierdo en los tutoriales, )donde pueda aprender a fondo jquery, te agradeceria aún más, aqui en Bucaramanga no he enocntrado una buena institución donde aprender todos estos lenguajes, bueno o al menos aun no la encuentro y el 80% de lo que ya se lo aprendi en tutoriales y videotutoriales.
Nuevamente muchas gracias, es una solución sencilla y efectiva que nunca hubiera pensado en ella.

BENDICIONES.

Miguel
http://oriempresarios.zobyhost.com

Por inyfercho

4 de clabLevel



Genero:Masculino  

Bacteriologo Diseñador Web

firefox
Citar            
MensajeEscrito el 23 Nov 2011 11:12 am
Cuando hacías esta selección:

Código Javascript :

var $thisText=$thisPara.siblings('p'); 

Estabas seleccionando el párrafo completo incluidos los tags "<p>Tu texto<p>" por lo que la variable "thisText", no era un texto, sino un objeto "<p>" completo. Sabiendo esto, lo que estabas insertando en #caption "$('#caption').html(thisText)" era el propio objeto "<p>", que a su vez estabas haciendo desaparecer de su sitio original, por lo que al volver a intentar invocarlo, este objeto "<p>" ya no existía.

Haciendo la selección de esta manera:

Código Javascript :

var thisText = $(this).siblings('p').html();

Lo que estamos haciendo, es igualar la variable thisText al contenido de la etiqueta "<p>" y no al objeto, por lo que ahora es un texto, y metas la variable donde la metas, el objeto "<p>" sigue existiendo en su lugar original y lo puedes llamar tantas veces como quieras.

El mejor sitio que conozco (y el único que uso) es w3schools.com, eso si, está en inglés, pero los tutoriales están tan bien desarrollados, con ejemplos "modificables por el usuario" para cada cosa, que aunque flojees mucho en ingles no creo que sea un problema.

Además esta gente es la que lanza los estándares de la web, por lo que todo loq ue aprendas ahí, será totalmente estándard.

Un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

firefox
Citar            
MensajeEscrito el 24 Nov 2011 03:24 am
Gracias Abducted.

Ojala en todos lados explicaran de esta forma, o eres profesor o deberias serlo, por que asi todos entenderian jquery facilmente.

Este tema quedo bien entendido.

Si tambien he visto los tutoriales de w3c school y ahi tambien he aprendido muchisimo y los seguire estudiando mas afondo.

Otra pregunta y perdona la isistencia, cuando quiero colocar .show al hacer click en cada imagen, la primera imagen si toma el show, pero las otras si se muestran inmediatamente, sera en una forma distinta lo mismo que el texto o por que no se aplica el show a las otras imagenes. Se que el show asolo sirve para aparecer objetos que han sido previamente ocultados, pero si igual estoy aplicandolo a una classe que es la de las imagenes por que, sigo si entender, solo se aplica a la primera y no a las demas.

Espero no molestar y GRACIAS por todo tu colaboracion.

Miguel.

Por inyfercho

4 de clabLevel



Genero:Masculino  

Bacteriologo Diseñador Web

firefox
Citar            
MensajeEscrito el 24 Nov 2011 08:52 am
Prueba a usar .dequeue() para que no se te aniden las animaciones y baja el tiempo de las animaciones para que quede más dinámico.
ej:

Código Javascript :

//cambia estas lineas
$('.show-img').attr({src:ruta}).show(2000);
$('#caption').html(thisText).animate({opacity:0.7}, 4000);

//por estas líneas
$('.show-img').attr({src:ruta}).show(200).dequeue();
$('#caption').html(thisText).animate({opacity:0.7}, 400).dequeue();
Pruébalo y nos comentas el resultado.

Un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 25 Nov 2011 10:17 am
Hola abducted.

Mirando tu respuesta, tengo una pregunta, no deberia haber iniciado antes llamando a la funcion queue() y luego si llamar a dequeue() para que hiciera el efecto y esta funcion no es solo para colocar en cola funciones que no son de animacion??.

Lo probe tal cual me pusiste y me sigue haciendo lo mismo, gracias de igual forma, seguire investigando si sabes de otra forma te agradezco.

Bendiciones.

Miguel.

Por inyfercho

4 de clabLevel



Genero:Masculino  

Bacteriologo Diseñador Web

firefox
Citar            
MensajeEscrito el 25 Nov 2011 01:58 pm

inyfercho escribió:

no deberia haber iniciado antes llamando a la funcion queue() y luego si llamar a dequeue()
En realidad no, en jQuery todos los elementos tienen su cola de animación, por lo que cuando haces una selección y le aplicas un animate la animación pasa directamente al stack de la cola de animación del objeto.

Código Javascript :

//Si animas así un objeto x que está en left:0 y top:0
$(x).animate({left: "200px"}, 300);
$(x).animate({top: "300px"}, 300);
//Primero se moverá a la izquierda y cuando termine se moverá a la derecha

//Si lo haces de esta manera
$(x).animate({left: "200px"}, 300).deque();
$(x).animate({top: "300px"}, 300);
//Se moverá en diagonal pues hará las 2 a la vez

inyfercho escribió:

Lo probe tal cual me pusiste y me sigue haciendo lo mismo, gracias de igual forma, seguire investigando si sabes de otra forma te agradezco.
Aún no he probado tu codigo, en un rato llego a casa y le hecho un vistazo.

Un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 25 Nov 2011 06:49 pm
He optimizado un poco el código y le he quitado lo que me era prescindible para este ejemplo. Primero he incluido un poco de css para descargar el html. También he cambiado un poco el jQuery a como creo que es más correcto.

Código HTML :

<style type="text/css">
   .show-img {
      width: 600px;
      height: 300px;
      display: none;
   }
   .img-click {
      display: block;
      width: 100px;
      height: 100px;
   }
   .imagenes {
      display:inline-block;
   }
   .imagenes>p {
      display:none;
   }
</style>
El html lo he dejado así, lo demás que tenías luego lo puedes incorporar y probar el resto de animaciones.

Código HTML :

<body>
<div id="container">
    <div id="slider">
        <img class="show-img" src="img/1.png" style="display:block" />
    </div>
    
    <div id="caption">Este es un texto de prueba para la ...</div>
    <div id="img-caption">
        <div class="imagenes">
            <img class="img-click" src="img/1.png"/>
            <p>Este es un texto de prueba para la primera imagen</p>
        </div>
        <div class="imagenes">
            <img class="img-click" src="img/2.png"/>
            <p>Este es un texto de prueba para la segunda imagen</p>
        </div>
        <div class="imagenes">
            <img class="img-click" src="img/3.png"/>
            <p>Este es un texto de prueba para la tercera imagen</p>
        </div>
        <div class="imagenes">
            <img class="img-click" src="img/4.png"/> 
            <p>Este es un texto de prueba para la cuarta imagen</p>
        </div>
    </div>
</div>
</body>

Y el jQuery ha quedado así:

Código Javascript :

<script type="text/javascript">
$(document).ready(function(){
   $('.imagenes img').click(function(){
      //Igualamos la variable var al contenido de el <p> correspondiente
      var texto = $(this).siblings('p').html();
      //Ocultamos el caption
      $('#caption').css('display', 'none');
      //Cambiamos el texto del caption por la variable texto
      $('#caption').html(texto);
      //Hacemos aparecer el caption
      $('#caption').fadeIn(800);
      
      //Creamos el tag <img> desde un String usando el atributo src
      var imagen = '<img class="show-img" src="'+$(this).attr('src')+'"/>';
      //Insertamos la nueva imagen encima de la que hay ahora
      //También podríamos haberla reemplazado dorectamente con
      //$('#slider').html(imagen);
      //Pero si lo hacemos así también le podemos dar una animación
      //de salida a la imagen a reemplazar
      $(imagen).insertAfter('.show-img');
      //Hacemos aparecer la imagen nueva
      $('#slider img:eq(1)').fadeIn(800);
      //Aquí podríamos hacer desaparecer la imagen a reemplazar
      //a la par que aparece la nueva y una vez se haya desvanecido
      //eliminamos la imagen antigua
      $('#slider img:eq(0)').remove();
   });   
});
</script>
Y aquí puedes ver la muestra de como ha quedado.
http://www.coolarts.us/abductedman/cristalab/cambiar_imagen.html

Espero haberte ayudado,
Un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 26 Nov 2011 11:26 am
Nuevamente GRACIAS Abducted.

Gracias por esta nueva forma y sobretodo gracias por el tiempo quete tomas para explicar.

He probado el codigo sugerido y funciona perfecto, le agregare algunas cosas pero esta perfecto a lo que necesito.

Tengo una pregunta, cuando tu insertas la nueve imagen($('#slider img:eq(1)').fadeIn(800);) y despues la remueves($('#slider img:eq(0)').remove();), por favor explicame si estamos apuntando directamente a la primera imagen "img:eq(0)" y a la segunda img:eq(1), y perdon si paso por ignorante, como el codigo continua con las otras imagenes, eso es algo que nunca he podido entender de otros codigos, si apuntando a una img especifica, el sigue con las otras igualmente.

micorreo es [email protected], por si lo quieres mandar a mi correo.

GRACIAS nueavmente y BENDICIONES.

miguel

Por inyfercho

4 de clabLevel



Genero:Masculino  

Bacteriologo Diseñador Web

firefox
Citar            
MensajeEscrito el 26 Nov 2011 01:54 pm

Infercho escribió:

Tengo una pregunta, cuando tu insertas la nueve imagen($('#slider img:eq(1)').fadeIn(800)
En realidad la imagen la estoy introduciendo aqui:

Código Javascript :

//Insertamos la nueva imagen encima de la que hay ahora
$(imagen).insertAfter('.show-img');
En esta linea lo que la estamos haciendo es aparecer:

Código Javascript :

//Hacemos aparecer la imagen nueva
$('#slider img:eq(1)').fadeIn(800);
Cuando usamos (eq(x)) en un selector jquery, estamos indicando una posición concreta dentro de los hijos del selector, según están en el DOOM del documento, así si tuviéramos este html:

Código HTML :

<contenedor>
   <p>Párrafo A</p>
   <p>Párrafo B</p>
   <p>Párrafo C</p>
   <p>Párrafo D</p>
   <p>Párrafo E</p>
   <p>Párrafo F</p>
</contenedor>
Cómo seleccionar los elementos:

Código Javascript :

//Si quisiéramos seleccionar el Párrafo C lo haríamos así
$('contenedor p:eq(2)')
//Este sería el párrafo C pues las posiciones empiezan siempre en 0 como los arrays

//Si quisieras por ejemplo todos los párrafos superiores al id="C" Lo haríamos así
$('contenedor p:gt(2)')
//Con esto estaríamos seleccionando D, E y F;
Aquí te dejos la referencia completa del selector jQuery:
jQuery Selector reference guide

Espero que te sirva,
Un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 26 Nov 2011 05:09 pm
Hola Abducted, como vas.

Con respecto a tu comentario, si, eso te lo entiendo, lo que pasa es que cuando tu tomas la primera imagen, primero la insertamos con insertAfter, listo, pero al hacerlo aparecer con img:eq(1) y el fadeIn() aparece la primera perosi explicitamente no llamamos a las otras o sea a img:eq(2), img:eq(3)..., mi pregunta es como sabe el script o el navegador que al hacer click y llamar la primera y luego esconderla tiene que mostrar las otras si no lo hemos puesto explicitamente en el codigo.

Me encuentro en una encrucijada, por que en si entiendo el script, pero no capto como aparecen las otras imagenes si explicitamente solo estoy lamando a la primera img:eq(1).

Bueno, acabo de ver que sin importar que numero coloque en img:eq("aqui"), el script llama a la imagen en el orden que las clickee.

Perdona, pero es que me gusta saber el por que de todo y si me puedes explicar por que te agradezco y nuevamente perdon por tanta pregunta.

GRACIAS

Miguel

Por inyfercho

4 de clabLevel



Genero:Masculino  

Bacteriologo Diseñador Web

firefox
Citar            
MensajeEscrito el 26 Nov 2011 05:54 pm

inyfercho escribió:

Con respecto a tu comentario, si, eso te lo entiendo, lo que pasa es que cuando tu tomas la primera imagen, primero la insertamos con insertAfter, listo, pero al hacerlo aparecer con img:eq(1) y el fadeIn() aparece la primera perosi explicitamente no llamamos a las otras o sea a img:eq(2), img:eq(3)

Mírate bien el código, no estamos actuando sobre "#img-caption", estamos actuando sobre "#slider" y ahí nunca llega a haber img:eq(2) y img:eq(3), siempre hay sólo 2 la que insertamos con after y la que quitamos con remove. Siempre que metamos una imagen con la clase ".show-img" esta va a estar oculta puen en el css tiene el "atributo" display en "none", por eso según la insertamos la podemos hacer aparecer.

Y con respecto a las imagenes que hay en "#img-caption", ya tomamos el valor de ellas que necesitamos en el click aqui:

Código Javascript :

var imagen = '<img class="show-img" src="'+$(this).attr('src')+'"/>
Un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 27 Nov 2011 02:45 am
Buenas Noches.

Sabes creo que lo que mas me falta es colocarle un poco de logica basica y sentido comun a la creacion del codigo.

Tienes toda la razon, realmente solo estamos actuando sobre el #slider y en el solo hay dos imagenes como tu dices y ya te lo entendi.

Ahora, con el nuevo codigo que me diste los fadeIn y fadeOut no se realizan, en el ejemplo que tu colocaste con el demo si lo hacen pero lo pase al mio y no se realizan, no se por que, me imagino que es alguna pequeña cosa.

GRAcias por todo y estamos hablando.

Bendiciones.

Por inyfercho

4 de clabLevel



Genero:Masculino  

Bacteriologo Diseñador Web

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.