Comunidad de diseño web y desarrollo en internet online

Que Slider me recomiendan!!

Citar            
MensajeEscrito el 03 Mar 2012 04:15 pm
Saludos ultimamente los sliders de contenido se han vuelto como basicos y la verdad he visto algunos pero no tengo mucha experiencia con ellos, cual me recomiendan para empezar? la verad busco alguno sencillo para entender el concepto y despues adaptarlo, de antemano gracias

Por Arturon

20 de clabLevel



Genero:Masculino  

Diseñador Maquetador

firefox
Citar            
MensajeEscrito el 03 Mar 2012 06:39 pm
Yo tengo uno que hice en jQuery, y he ido usando. Es automático, sólo tienes que decirle las medidas de la caja exterior, y cargarle imágenes y en función del número de imágenes y del ancho que le hayas dado al contenedor pues ya calcula las medidas y desplazamientos.

Lo hice hace tiempo y no está optimizado del todo.

Puedes verlo aquí
Slider

Si te gusta, subo el código, lo tengo hecho en 2 formatos, 1º que obtenga las dimensiones y las imágenes de una base de datos en MySQL, ó 2º que las obtenga de un JSON's.

Además si queréis entre todos los podemos depurar, pues aunque no tiene fallos, seguro que se puede programar mejor.

Un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 03 Mar 2012 09:48 pm
Wow, iba a responder a este post, pero el slider de Abducted me ha dejado impactado. Muy excelente aporte =D. Si puedes súbelo, me gustaría ver su funcionamiento y utilización :)

Por min

26 de clabLevel



 

chrome
Citar            
MensajeEscrito el 03 Mar 2012 10:08 pm
wow me dejaste perplejo es mucho mejor de lo que he visot hasta ahora yo solo habia visto algunos como "easy slides" por supuesto que me encantaria hecharle un ojo al codigo. muchas gracias!!!

Por Arturon

20 de clabLevel



Genero:Masculino  

Diseñador Maquetador

firefox
Citar            
MensajeEscrito el 03 Mar 2012 10:48 pm
Ok, voy a tardar un poco en ponerlo, por que lo hice hace tiempo y hay cosas que voy a corregir pues ahora las se hacer de una manera más correcta que cunando lo hice, y sobre todo voy a comentar el código, que lo tengo sin comentar.

Si lo queréis ir viendo es la función cargarSlider() del archivo http://www.jesuscordero.com/js/jesusCordero.js

Un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 03 Mar 2012 11:00 pm
Excelente, muchas gracias ;)

Por min

26 de clabLevel



 

chrome
Citar            
MensajeEscrito el 04 Mar 2012 02:10 am
Bueno, vamos a ver los que sale, no prometo que esté todo bien, pues lo he rehecho sin probarlo, que no tengo tanto tiempo, el css no se corresponde al link de más arriba, debido a que he cogido el slider que cree en un principio que es básicamente igual, pero con otro estilo. En cuanto pueda subo una muestra de este nuevo a mi server y os lo muestro.

Empezamos con los datos, voy a poner un objeto, pero podría ser un JSON con varios sliders o una BD con los datos o ...

Código Javascript :

jsonData = {'anchoImagen': 733,
         'altoImagen': 300,
         'anchoTotal': 930,
         'alturaBox': 75,
         'carpetaImagenes': 'img.cristalab.com/slider/sliderA/',
         'imagenes':[
            {'url': '1.jpg', 'Link': '1.cristalab.com', 'titulo': 'Uno', 'subtitulo': 'Primero'},
            {'url': '2.jpg', 'Link': '2.cristalab.com', 'titulo': 'Dos', 'subtitulo': 'Segundo'},
            {'url': '3.jpg', 'Link': '3.cristalab.com', 'titulo': 'Tres', 'subtitulo': 'Tercero'},
            {'url': '4.jpg', 'Link': '4.cristalab.com', 'titulo': 'Cuatro', 'subtitulo': 'Cuarto'},
            {'url': '5.jpg', 'Link': '5.cristalab.com', 'titulo': 'Cinco', 'subtitulo': 'Quinto'},
         ]
};
Después el html:

Código HTML :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Cristalab slider</title>
    <link href="css/cristalab.slider.css" type="text/css" rel="stylesheet" />
    <script src="jquery.js" type="text/javascript"></script>
    <script src="js/cristalab.slider.js" type="text/javascript"></script>
</head>

<body>
    <div id="contenedor"></div>
</body>
</html>
Como vemos sólo nos hace falta un div contenedor.

Ahora vamos a poner el css (Que no voy a explicar, por si acaso alguno...)

Código HTML :

* {padding: 0; margin: 0; font-size: 12px; font-family: Ubuntu}

.bloqueDisplay {
   display: block;
   border: 1px solid #000;
   overflow: hidden;
   cursor: pointer;
}

.imagen {
   background-color: #FFF;
   border: 1px solid #000;
   display: block;
   position: relative;
   float: left;
}

.boxImg {
   display: block;
   border: 1px solid #000;
   position: relative;
   float: left;
   left: -1px;
}

.contBoxImg {
   width: 100%;
   height: 100%;
   background: #000;
   opacity: 0.65;
   filter: Alpha(opacity=65);
}

.titular {
   color: white;
   font-size: 12px;
   position: relative;
   float: left;
   left: 0;
   padding-left: 15px;
   text-align: left;
}

.subtitular {
   float:left;
   display:block;
   text-align: left;
   color: #FFF;
   font-size: 12px;
   position: relative;
   line-height: 12px
}

.titulo {
   padding-top:18px;
   font-size: 20px;
}

.parpadeo {
   width: 100%;
   height: 100%;
   background: #FFF;
}

.sombra {
   display: block;
   position: relative;
   float: left;
   width:1px;
   height: 0px;
}

.sombraIzquierda {
   box-shadow:          -8px -2px 16px #000;
   -webkit-box-shadow:   -8px -2px 16px #000;
   -moz-box-shadow:      -8px -2px 16px #000;
}

#bgNegro {
   display: block;
   z-index: 2;
   background: #000;
   opacity: 0.9;
   filter: Alpha(opacity=90);
   width: 932px;
   height: 140px;
   color: white;
}

#menuTxt {
   display: block;
   height: 20px;
   background: #000;
   position: relative;
   top: -20px;
}

#menusHover {
   display: block;
   position: relative;
   width: 932px;
   height: 140px;
   z-index: 101;
   top: -40px;
   cursor: pointer;
}
Y al fin el Javascript

Código Javascript :

// Ejecuto cuando el DOM esté completamente cargado
$(document).ready(function () {
   //Defino las variables iniciales
   var cont = $('#contenedor'), // Defino el objeto sobre el que voy a trabajar
      carpetaImagenes = jsonData.carpetaImagenes, // Defino la carpeta imágenes
      anchoImagen = jsonData.anchoImagen, // Defino el ancho de las imágenes
      altoImagen = jsonData.altoImagen, // Defino el alto de las imágenes
      anchoTotal = jsonData.anchoTotal, // Defino el ancho del contenedor
      totalImagenes = jsonData.imagenes.length, // Calculo la catidad de imágenes
      boxNegro = alturaBox, // Defino el alto de la caja inferior de textos
      //Calculo la posición de las imágenes cerradas (cuando hay una en hover)
      cerrado = (anchoTotal-anchoImagen)/(totalImagenes-1),
      imagenes = jsonData.imagenes; // Defino las imágenes
   
   // Añado la clase bloque display al contenedor
   cont.addClass('bloqueDisplay');
   // Aplico las medidas al contenedor
   cont.css({'width': anchoTotal, 'height': altoImagen});

   // Ejecuto la funcion que crea el slider
   crear_slider();
   
   function crear_slider () {
      // Por cada imagen
      for (numero in imagenes) {
         // Creo el div completo como string
         var url = imagenes[imagen].url,
            divImagen = '<div class="imagen" id="imagen'+numero+
            '" valor="'+numero+'" style="width:'+anchoImagen+
            'px; height:'+altoImagen+'px; left:'+
            // Calculo la posicion izquierda de la imagen
            // Divido en ancho del contenedor por el total de imágenes,
            // lo multiplico por el indice
            // Le resto 1 para arreglar el pixel del borde
            //y que en el primero no se vea borde doble a la izquierda
            (((anchoTotal/totalImgagenes)*numero)-1) +
            // Esto de calcular el top es un arreglo chapucero que hice,
            // pues aún no entendía muy bien las position absolute,
            // y lo tenía todo con position relative (MENUDO CAOS...)
            // con usar position absolute podríais saltaros este top
            'px; top:'+(-((altoImagen+2)*numero)-1)+
            // Agrego el div que parpadea al hacer roll over, al final.
            'px; z-index:'+numero+'; background: url('+url+')">'+
            '<div class="parpadeo"></div></div>';
         
         cont.append(divImagen); // Agrego el div al contenedor
      }
      
      // Ejecuto la función que me rellena las imágenes
      rellenar();
   }
   
   function rellenar () {
      // A cada div .imagen le agregamos la clase que le da la sombra
      $('div .imagen').each(function () {
         $(this).addClass('sombraIzquierda')
      });   
      // Desvanezco en 0 ms todos los divs parpadeo
      $('div .parpadeo').each(function () {
         $(this).fadeTo(0, 0).dequeue()
      });
      // A cada div imagen le agrego los contenidos
      $('div .imagen').each(function () {
         // Para los tops que en adelante digo lo mismo que dije arriba,
         // usar position absolute y pasar de calcularlos
         // Creo las cajas inferiores de los textos
         var boxImg = '<div class="boxImg" style="top:'+
            -(boxNegro+1)+'px; width:'+
            anchoImagen+'px; height:'+boxNegro+'px">'+
            '<div class="contBoxImg"></div><div class="titular" style="top:-'+
            boxNegro+'px; width:'+(anchoTotal/totalImagenes)+'px; padding-top:'+
            // Calculo la altura de los textos dentro de la caja
            // Probablemente es más sencillo hacerlo con lineHeight
            // = boxNegro + 2 (Aprox. depende del tamaño del texto)
            ((boxNegro/2)-8)+'px"><\/div><div class="subtitular" style="top:'+
            -boxNegro+'px; left:-'+
            (anchoTotal/totalImagenes)+'px; height:'+
            boxNegro+'px"><\/div><\/div>';
         // Agrego el contenido
         $(this).append(boxImg);
      });
      
      // Agrego los títulos a las imágenes
      $('div .titular').each(function (indice) {
         $(this).append(imagenes[indice].titulo)
      });
      
      // Agrego lso subtítulos a las imágenes
      $('div .subtitular').each(function (indice) {
         // Defino la imagen de la que extraer los datos
         var nodo = imagenes[indice];
         $(this).append(
            '<div class="titulo">'+nodo.titulo+'</div></br>'+nodo.subtitulo
         );
         // Desvanezco en 0 ms todos los divs subtitular
         // (Es lo que se mostrará al hacer hover a la imagen)
         $(this).fadeTo(0, 0).dequeue();
      });
      
      // Creo los eventos del hover
      $('#contenedor > div').hover(
      // La funcion OVER
      function () {
         // Obtengo el número de imagen sobre el que estoy
         var num = $('#contenedor > div').index(this);
         
         // Hago parpadear el div blanco (.parpadeo)
         var parp = $(this).find('div:eq(0)');
         parp.fadeTo(0, 0.5);
         parp.fadeTo(500, 0);
         
         // Desvanezco el Título y hago aparecer el subtítulo
         $(this).find('div:eq(2)').find('div:eq(1)').fadeTo(300,0).dequeue();
         $(this).find('div:eq(2)').find('div:eq(2)').fadeTo(300,1).dequeue();
         
         // Calculo las posiciones y llamo a la función reposicionar
         // Defino un array vacío
         var arr = [];
         
         // Si estamos en la primera imagen
         if (num == 0) {
            // Calculo la posición x de cada imagen y la inserto n el array
            for (i=1; i<totalImagenes; i++) {
               arr.push(anchoImagen+(cerrado*(i-1)))
            }
            
         // Si estoy en la última imagen
         } else if (num == (totImg-1)) {
            // Calculo la posición x de cada imagen y la inserto n el array
            for (i=1; i<totalImagenes; i++) {arr.push(((cerrado*i)+1))}
            
         // Si estoy en cualquier otra imagen
         } else {
            for (i=1; i<totalImagenes; i++) {
               // Si i está antes que la imagen con el Over
               if (i <= num) {arr.push(cerrado*i)}
               // Si está detrás
               else {arr.push(anchoImagen+(cerrado*(i-1)))}
            }
         }
         
         // Ejecuto reposicionar enviando el array
         reposicionar(arr);
      },
      // La funcion OUT
      function () {
         // Desvanezco los subtítulos y hago aparecer los títulos
         $(this).find('div:eq(2)').find('div:eq(1)').fadeTo(300, 1).dequeue();
         $(this).find('div:eq(2)').find('div:eq(2)').fadeTo(300, 0).dequeue();
         // Defino un array vacio
         var pxs = [];
         // Calculo las posiciones principales y se las envío a reposicionar
         for (i=1; i<totalImagenes; i++) {
            pxs.push(parseInt(((anchoTotal/totalImagenes)*i)-1))
         }
         reposicionar(pxs);
      });
      
      $('#contenedor > div').click(function () {
         // Obtengo el número de imagen sobre el que estoy
         var num = $('#contenedor > div').index(this);
         // Cargo la url
         window.location.href = 'http://'+imagenes[num].Link;
      });
   }
});
   
//FUNCION REPOSICIONAR se encarga de todos los movimientos
// recibe un array (PXS)
function reposicionar (pxs) {
   // Por cada dato en el array
   for (i=0; i<pxs.length; i++) {
      // Defino el target por el ID
      var tgt = '#imagen'+(i+1);
      // Le animo el left
      $(tgt).animate({left:pxs[i]}, 300).dequeue();         
   }
}
Ale ahí dejo el chorizo, ahora a darle mordisquitos.

Espero os sirva,
saludos.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 04 Mar 2012 06:33 am
Que Barvaro muchas gracas por el aporte, exelente, comenzare a estudiarlo el css no me s problema pero el js y jason si me son relativamente nuevos, de todas maneras mil gracias!!

Por Arturon

20 de clabLevel



Genero:Masculino  

Diseñador Maquetador

firefox
Citar            
MensajeEscrito el 04 Mar 2012 01:45 pm
Le estoy haciendo arreglos y optimizándolo más, que ayer cuando me puse a revisarlo eran las 12 de la noche y acabé a las 3 de la mañana, y con la caraja que tenía tiene un montón de fallitos. También lo estoy optimizando y arreglando el css para los position absolute.

En un ratito lo subo sin fallos.

Un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 04 Mar 2012 04:17 pm
Bueno ya lo he optimizado, No voy a poner el código comentado, pues excepto pequeñas variaciones, casi todo está intacto, he reducido el número de bucles y he arreglado algunas cosillas, el resultado lo podéis ver aqui:

Slider jQuery

Si no hay ningún tuto sobre como hacer un slider y os interesa que desarrolle uno explicando bien las cosas, cálculos, elemento, estilos... decídmelo y me pondré manos a la obra cuando valla teniendo ratillos

Ahora el código del slider optimizado, tanto este archivo como los estilos los podéis sacar del link de arriba. Lo he optimizado lo que sé, seguro que por ahí hay algún fiera que lo puede pulir del todo, si alguien hiciera el favor lo agradecería muchísimo.

Código Javascript :

jsonData = {
   'anchoImagen': 733,
   'altoImagen': 350,
   'anchoTotal': 930,
   'alturaBox': 75,
   'carpetaImagenes': 'img/',
   'imagenes':[
      {'url': '1.jpg', 'Link': '1.cristalab.com', 'titulo': 'Uno', 'subtitulo': 'Primero'},
      {'url': '2.jpg', 'Link': '2.cristalab.com', 'titulo': 'Dos', 'subtitulo': 'Segundo'},
      {'url': '3.jpg', 'Link': '3.cristalab.com', 'titulo': 'Tres', 'subtitulo': 'Tercero'},
      {'url': '4.jpg', 'Link': '4.cristalab.com', 'titulo': 'Cuatro', 'subtitulo': 'Cuarto'},
      {'url': '5.jpg', 'Link': '5.cristalab.com', 'titulo': 'Cinco', 'subtitulo': 'Quinto'},
   ]
};


$(document).ready(function () {
   
   var cont = $('#contenedor'),
      carpetaImagenes = jsonData.carpetaImagenes,
      anchoImagen = jsonData.anchoImagen,
      altoImagen = jsonData.altoImagen,
      anchoTotal = jsonData.anchoTotal,
      totalImagenes = jsonData.imagenes.length,
      boxNegro = jsonData.alturaBox,
      cerrado = (anchoTotal-anchoImagen)/(totalImagenes-1),
      imagenes = jsonData.imagenes,
      anchoMedia = anchoTotal/totalImagenes;
      
   cont.width(anchoTotal).height(altoImagen).addClass('bloqueDisplay');

   crear_slider();
   
   function crear_slider () {
      for (indice in imagenes) {
         var url = imagenes[indice].url,
            divImagen = '<div class="imagen sombraIzquierda"'+
               'id="imagen'+indice+'"'+
               'style="width:'+anchoImagen+'px;'+
                  'height:'+altoImagen+'px;'+
                  'left:'+(((anchoMedia)*indice)-1)+'px;'+
                  'z-index:'+indice+';'+
                  'background: url('+carpetaImagenes+url+')" />';
         cont.append($(divImagen)
            .append($('<div class="parpadeo" />').fadeTo(0, 0).dequeue())
            .append($('<div class="boxImg" style="width:'+anchoImagen+'px; height:'+boxNegro+'px" />')
               .append('<div class="contBoxImg" />')
               .append($('<div class="titular" style="width:'+anchoMedia+'px; padding-top:'+((boxNegro*0.5)-8)+'px" />')
                  .html(imagenes[indice].titulo)
               )
               .append($('<div class="subtitular" style="left:-'+anchoMedia+'px; height:'+boxNegro+'px" />')
                  .fadeTo(0, 0).dequeue()
                  .append($('<div class="titulo">')
                     .html(imagenes[indice].titulo)
                  )
                  .append('<br>'+imagenes[indice].subtitulo)
               )
            )
         )
      }
      crearListeners()
   }
   
   function crearListeners () {
      
      $('.imagen').click(function () {
         var num = $('#contenedor div.imagen').index(this);         
         window.location.href = '#/'+imagenes[num].Link;
      });
      
      $('.imagen').hover(
         function /*OVER*/ () {
            var num = $('#contenedor div.imagen').index(this),
               titulos = $(this).find('div:eq(1)'),
               parp = $(this).find('.parpadeo'),
               arr = [];
            
            parp.fadeTo(0, 0.5);
            parp.fadeTo(500, 0);
            
            titulos.find('div:eq(1)').fadeTo(300,0).dequeue();
            titulos.find('div:eq(2)').fadeTo(300,1).dequeue();
         
            if (num == 0) {
               for (i=1; i<totalImagenes; i++) {arr.push(anchoImagen+(cerrado*(i-1)))}
            }
            
            else if (num == (totalImagenes-1)) {
               for (i=1; i<totalImagenes; i++) {arr.push(((cerrado*i)+1))}
            }
            
            else {
               for (i=1; i<totalImagenes; i++) {
                  if (i <= num) {arr.push(cerrado*i)}
                  else {arr.push(anchoImagen+(cerrado*(i-1)))}
               }
            }
            
            reposicionar(arr);
         },
     
         function /*OUT*/ () {
            var titulos = $(this).find('div:eq(1)'),
               pxs = [];
            
            titulos.find('div:eq(1)').fadeTo(300, 1).dequeue();
            titulos.find('div:eq(2)').fadeTo(300, 0).dequeue();
            
            for (i=1; i<totalImagenes; i++) {
               pxs.push(parseInt(((anchoTotal/totalImagenes)*i)-1))
            }
            
            reposicionar(pxs);
         }
      );
   }
});

function reposicionar (pxs) {
   for (i=0; i<pxs.length; i++) {
      var objetivo = '#imagen'+(i+1);
      $(objetivo).animate({left:pxs[i]}, 300).dequeue();         
   }
}
Espero le saquéis provecho,
un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 04 Mar 2012 06:04 pm
Disculpa hay algo que no capto al definir la funcion crear_slider() creas un bucle den el que POR cada "indice"en magenes... de donde sale "indice"? no lo veo definido de donde sale? como esta en español no se si es parte de js o jquery ty

Por Arturon

20 de clabLevel



Genero:Masculino  

Diseñador Maquetador

firefox
Citar            
MensajeEscrito el 04 Mar 2012 06:10 pm
Bueno, indice es x o lo que quieras, simplemente es el indice autoincremental del tipo de bucle for.

Podría haber puesto "for (x in imagenes)" y haber usado x, pero he puesto indice para que la gente lo entienda mejor.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 04 Mar 2012 06:28 pm
En esta última versión ya carga 2 sliders diferentes, la muestra en el link.

Slider jQuery

Código Javascript :

jsonData = {
   'anchoImagen': 733,
   'altoImagen': 350,
   'anchoTotal': 930,
   'alturaBox': 75,
   'carpetaImagenes': 'img/',
   'imagenes':[
      {'url': '1.jpg', 'Link': '1.cristalab.com', 'titulo': 'Uno', 'subtitulo': 'Primero'},
      {'url': '2.jpg', 'Link': '2.cristalab.com', 'titulo': 'Dos', 'subtitulo': 'Segundo'},
      {'url': '3.jpg', 'Link': '3.cristalab.com', 'titulo': 'Tres', 'subtitulo': 'Tercero'},
      {'url': '4.jpg', 'Link': '4.cristalab.com', 'titulo': 'Cuatro', 'subtitulo': 'Cuarto'},
      {'url': '5.jpg', 'Link': '5.cristalab.com', 'titulo': 'Cinco', 'subtitulo': 'Quinto'}
   ]
};

jsonDataB = {
   'anchoImagen': 350,
   'altoImagen': 200,
   'anchoTotal': 500,
   'alturaBox': 75,
   'carpetaImagenes': 'imgb/',
   'imagenes':[
      {'url': '1.gif', 'Link': '1.cristalab.com', 'titulo': 'Uno', 'subtitulo': 'Primero'},
      {'url': '2.gif', 'Link': '2.cristalab.com', 'titulo': 'Dos', 'subtitulo': 'Segundo'},
      {'url': '3.gif', 'Link': '3.cristalab.com', 'titulo': 'Tres', 'subtitulo': 'Tercero'},
      {'url': '4.gif', 'Link': '4.cristalab.com', 'titulo': 'Cuatro', 'subtitulo': 'Cuarto'}
   ]
};

$(document).ready(function () {

   crear_slider(jsonData, '#contenedor');
   $('body').append('<div id="contenedorB" />');
   crear_slider(jsonDataB, '#contenedorB');
   
   function crear_slider (datos, contenedorSlider) {
      var cont = $(contenedorSlider),
         carpetaImagenes = datos.carpetaImagenes,
         anchoImagen = datos.anchoImagen,
         altoImagen = datos.altoImagen,
         anchoTotal = datos.anchoTotal,
         totalImagenes = datos.imagenes.length,
         boxNegro = datos.alturaBox,
         imagenes = datos.imagenes,
         anchoMedia = anchoTotal/totalImagenes;
      cont.width(anchoTotal).height(altoImagen).addClass('bloqueDisplay');
      for (indice in imagenes) {
         var url = imagenes[indice].url,
            Link = imagenes[indice].Link,
            divImagen = '<div class="imagen sombraIzquierda"'+
               'id="imagen'+indice+'"'+
               'style="width:'+anchoImagen+'px;'+
                  'height:'+altoImagen+'px;'+
                  'left:'+(((anchoMedia)*indice)-1)+'px;'+
                  'z-index:'+indice+';'+
                  'background: url('+carpetaImagenes+url+')" />';
         cont.append($(divImagen)
            .append($('<div class="links">').html(Link))
            .append($('<div class="parpadeo" />').fadeTo(0, 0).dequeue())
            .append($('<div class="boxImg" style="width:'+anchoImagen+'px; height:'+boxNegro+'px" />')
               .append('<div class="contBoxImg" />')
               .append($('<div class="titular" style="width:'+anchoMedia+'px; padding-top:'+((boxNegro*0.5)-8)+'px" />')
                  .html(imagenes[indice].titulo)
               )
               .append($('<div class="subtitular" style="left:-'+anchoMedia+'px; height:'+boxNegro+'px" />')
                  .fadeTo(0, 0).dequeue()
                  .append($('<div class="titulo">').html(imagenes[indice].titulo))
                  .append('<br>'+imagenes[indice].subtitulo)
               )
            )
         )
      }
      reiniciarListeners();
   }
});

function reiniciarListeners () {
   
   $('.imagen').unbind();
   
   $('.imagen').click(function () {
      var url = $(this).find('.links').html();         
      window.location.href = '#/'+url;
   });
   
   $('.imagen').hover(
      function /*OVER*/ () {
         var num = $($(this).parent().find('.imagen')).index(this),
            anchoTotal = $(this).parent().width(),
            anchoImagen = $(this).width(),
            totalImagenes = $($(this).parent().find('.imagen')).index($(this).parent().find('.imagen:last'))+1,
            cerrado = (anchoTotal-anchoImagen)/(totalImagenes-1)
            titulos = $(this).find('div:eq(1)'),
            parp = $(this).find('.parpadeo'),
            arr = [];
         parp.fadeTo(0, 0.5);
         parp.fadeTo(500, 0);
         titulos.find('div:eq(1)').fadeTo(300,0).dequeue();
         titulos.find('div:eq(2)').fadeTo(300,1).dequeue();
         if (num == 0) {
            for (i=1; i<totalImagenes; i++) {arr.push(anchoImagen+(cerrado*(i-1)))}
         }
         else if (num == (totalImagenes-1)) {
            for (i=1; i<totalImagenes; i++) {arr.push(((cerrado*i)+1))}
         }
         else {
            for (i=1; i<totalImagenes; i++) {
               if (i <= num) {arr.push(cerrado*i)}
               else {arr.push(anchoImagen+(cerrado*(i-1)))}
            }
         }
         reposicionar(arr, $(this).parent().attr('id'));
      },
  
      function /*OUT*/ () {
         var titulos = $(this).find('div:eq(1)'),
            anchoTotal = $(this).parent().width(),
            totalImagenes = $($(this).parent().find('.imagen')).index($(this).parent().find('.imagen:last'))+1,
            pxs = [];
         titulos.find('div:eq(1)').fadeTo(300, 1).dequeue();
         titulos.find('div:eq(2)').fadeTo(300, 0).dequeue();
         for (i=1; i<totalImagenes; i++) {
            pxs.push(parseInt(((anchoTotal/totalImagenes)*i)-1))
         }
         reposicionar(pxs, $(this).parent().attr('id'));
      }
   );
}

function reposicionar (pxs, cont) {
   for (i=0; i<pxs.length; i++) {
      var objetivo = '#imagen'+(i+1),
         contenedor = '#'+cont;
      $(contenedor).find(objetivo).animate({left:pxs[i]}, 200).dequeue();         
   }
}

Un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 04 Mar 2012 08:55 pm
Por no borrar más veces el post y volver a pegarlo (que ya lo he hecho más de 8 veces), voy a hacer un pequeño flood con la última corrección.

En las funciones "hover" over y out hay que hacer esta corrección:

Código Javascript :

//Cambiar el índice de esta linea
titulos = $(this).find('div:eq(1)')
//Por este
titulos = $(this).find('div:eq(2)')

// Y agregar .dequeue() a estas 2 lineas
parp.fadeTo(0, 0.5)
parp.fadeTo(500, 0)
//-----------
parp.fadeTo(0, 0.5).dequeue()
parp.fadeTo(500, 0).dequeue()
Un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 04 Mar 2012 10:16 pm

Arturon escribió:

Saludos ultimamente los sliders de contenido se han vuelto como basicos y la verdad he visto algunos pero no tengo mucha experiencia con ellos, cual me recomiendan para empezar? la verad busco alguno sencillo para entender el concepto y despues adaptarlo, de antemano gracias


Si lo que buscas es algo sencillo para empezar y entender el concepto, te recomiendo este que hice hace algún tiempo, es lo mas básico posible y la lógica es bastante sencilla, tratare de comentar un poco el código para que se entienda.

El html es solo un div contenedor, una lista desordenada con las imágenes dentro y un par de botones para pasar las imágenes.

Código HTML :

<div class='slider'>
         <ul>
               <li><img src="images/slide_1.jpeg" alt="image"></li>
               <li><img src="images/slide_2.jpeg" alt="image"></li>
               <li><img src="images/slide_3.jpeg" alt="image"></li>
               <li><img src="images/slide_4.jpeg" alt="image"></li>
               <li><img src="images/slide_5.jpeg" alt="image"></li>

        
         </ul>
      </div> 

      <div id="nav">
             <button data-dir="prev">prev</button>
             <button data-dir="next">next</button>
              
      </div>  


Ahora el css que también es bastante sencillo y no hace falta comentarlo: (acostumbro a trabajar el css sin indentar para ahorrar espacio y como no tiene mucha importancia en este caso, lo dejare así)

Código :

.slider {width: 960px;  height: 306px; overflow: hidden; margin: 100px 0 15px 0; border-radius: 10px; border: 7px solid #fff; -webkit-box-shadow: 2px 2px 8px rgba(0,0,0,0.5), -2px -2px 8px rgba(0,0,0,0.5);}
.slider ul { width: 10000px;  }
.slider ul li { float: left; }

#nav { width: 100px; margin: 0 auto; }
#nav button { cursor: pointer; }


Por último el Javascript:

Lo que hace este script es básicamente añadir un margen negativo al ul que contiene las imágenes, de esta forma como tiene un overflow: hidden, entonces modifica la posición de las imágenes y nos muestra la siguiente.

Código Javascript :

// función anonima para que las variables no sean globales
(function(){

//Guardamos valores como ancho y alto de las imágenes, cantidad de imágenes y otras cositas:
var img_c = $('.slider').children('ul'),
    img_a = img_c.find('img'),
    img_w = img_a[0].width,
    img_l = img_a.length,
    img_wt = img_w * img_l,
    current = 0; 
//Atamos un evento de click a los botones:    
$('#nav button').on('click', function(){
   //Aca obtenemos el valor data del boton clickeado para saber si avanzar o retroceder (next/prev)
    dir = $(this).data('dir');
    
     //Si Clickaron el boton con valor next ejecutamos lo siguiente:
     if (dir == 'next'){
        //si estamos en la última imagen, nos devuelve a la primera
         if (current == (img_wt * -1) + img_w)  {  
             current = 0; 
            img_c.animate({
               marginLeft: current
               
            })
         //si no es la ultima entonces avanza una posición   
        } else {
           current -= img_w;  
            img_c.animate({
               marginLeft: current
               
            })
        } 
     //Si clickaron el boton prev ejecutamos esto    
     } else {
         //Si estamos en la primera nos lleva a la última
         if (current == 0) {
             current = (img_wt * -1) + img_w;
             img_c.animate({
               marginLeft: current
            })
          //Si no es la primera entonces retrocede una posición
         } else {
            current += img_w;
            img_c.animate({
               marginLeft: current
           })
        }
     }
})



})();


Y eso es todo, bastante sencillo no?

Aca puedes verlo funcionando.

Por HtrMancera

Claber

342 de clabLevel

1 tutorial

Genero:Masculino  

Front-end Developer

chrome
Citar            
MensajeEscrito el 05 Mar 2012 01:22 am
Muchas Gracias

Por Arturon

20 de clabLevel



Genero:Masculino  

Diseñador Maquetador

firefox
Citar            
MensajeEscrito el 06 Mar 2012 01:31 am
Ya he creado un tuto en el que explico como pensar y crear un slider en jQuery, os dejo el link:

Tutorial Slider jQuery

Espero que te sea útil,
Un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome

 

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