«Slideshow Barak Obama» con jQuery.
Es más o menos conocido ya en la comunidad de desarrolladores web el tema de la web oficial de Barak Obama que, aparte de haber sido descrita como una joya de diseño, accesibilidad y buen trabajo, usa un elegante «slideshow» de imágenes y noticias… no nuevo pero de un estilo, como digo, muy elegante.
El trabajo en dicha web se basa en «InnerFade» de Medienfreunde Hofmann (http://medienfreunde.com/lab/innerfade/) con «jQuery». Así que yo, siguiendo con mi pasión por jQuery y viendo que ninguno de los scripts me servía del todo o no me agradaba -no quería un timeout o intervalo sino clicks o la opción de ambas cosas-, me he creado el mío propio con el diseño CSS del «BarakSlideshow» -hecho con MooTools- de Guillermo Rauch (http://devthought.com/) y que pienso adaptar para la galería de imágenes de laguardiadejaen.com.
Images Slideshow, código
Así ha quedado lo poco que he hecho hasta ahora, es obvio que no está adaptado a las necesidades de una galería dinámica ni acabado, pero ya estoy viendo lo fácil que va a ser incluir las peticiones… y es que es eso, cada día me gusta más «jQuery»:
Actualización
El código de este slideshow es un boceto y está obsoleto -con sólo un día ggg
-.
La entrada actualizada es esta:
«Images Slideshow» basado en el slideshow de Barak Obama, con jQuery.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| /* Images Slideshow:
* Copyright 2008 by J.A.Cobo aka Covi for laguardiadejaen.com working on jQuery.
*
* Inspired in Barak Obama website slideshow and
* adapted from CSS style by Guillermo Rauch (http://devthought.com/).
*
* TODO: Procesar para imágenes (css) u otros recursos.
* License: GPL, CC-BY
* ------------------------------------------------------ */
// Div contenedor:
var slideshowContainer = $('div.sld_slideshow');
// Si existe al menos uno:
if ( (slideshowContainer.length)>0 ) {
// CSS para Slideshow:
var slideshowCSS = '<link rel="stylesheet" type="text/css" href="<?php bloginfo('template_url');?>/css/barackslideshow.css" media="screen" />';
$(slideshowCSS).appendTo("head");
// Proceso:
$('ul.sld_menu li').each(function(){
// Click:
$(this).children('a').click(function(){
/* Parámetros internos */
// Lo más importante, el recurso enlazado:
var thisHref = $(this).attr('href');
var thisImg = $('img[src*="'+thisHref+'"]');
/* Proceso real */
// Efecto carga...
$('.sld_loading').show();
// Si el recurso existe, procedemos:
$.get(thisHref, function(){
$('.sld_loading').hide();
$('.sld_content').fadeTo('slow', 0.1, function(){
$(this).css('background', 'url('+thisHref+')').fadeTo('slow', 1);
});
});
$(this).parent().addClass('current').siblings('.current').removeClass('current');
return false;
});
});
}
/* End Slideshow
/-------------------------------------------------------- */ |
Jiji ^^!
Obviamente, sin ver el CSS y el marcado no podemos sacar mucho pero… se puede intuir un poco.
Hay mucha línea, digamos, inútil pues como se indica lo importante es el «proceso real».
Básicamente lo que hacemos es lo siguiente:
Si encontramos el div contendor con la clase sld_slideshow inyectamos el CSS al head del documento, así no usamos ancho innecesario aunque se puede incluir en una hoja de estilo global -yo tengo ya muchas y no es plan ^^-.
Un típico efecto de carga -loading- y cargamos el recurso mediante AJAX en el div de contenido sld_content.
Como digo todo es un boceto por ahora y para ilustrar lo fácil que es casi cualquier cosa con esta librería o «framework» -que se peleen otros en esto
-.
El menú del listado de imágenes (o secciones), es una lista con la clase sld_menu, cada vínculo enlaza a una imagen real (o recurso), así nos sirve sin JS también (la idea, simple, común, proviene de BarakSlideshow, al César lo que es del César).
Así, capturamos el atributo href de cada item de la lista y con ese simple dato cargamos como fondo ese recurso… que en este caso son imágenes pero podría ser cualquier cosa adaptando el código para inyección HTML $(el).html(código) por ejemplo.
Resumiendo
Se carga como fondo CSS del visor cada recurso que se enlaza desde el menú.
Simple.
Mi trabajo
Mi adaptación, al margen del código con JQuery propio pues partí de 0, es usar un fondo en lugar de incrustar imágenes.
Te ahorras marcado extra (una lista completa de imágenes por un div) aunque quizá sea menos accesible y semántico.
Además, sin JS una lista de imágenes seguiría funcionando mostrando un listado de ellas con un menú que te lleva a ver la imagen, pero si sólo quieres una galería slideshow y que funcione bajo JS, sólo necesitas eso.
Pero como es lógico se puede hacer de ambas formas o incluso de las dos maneras, el caso es que jQuery, nos ayuda muchísimo a ello.
El marcado
Adaptado de «BarakSlideshow» de Guillermo Rauch (http://devthought.com/).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| <div class="sld_slideshow">
<span class="sld_loading">Loading...</span>
<div class="sld_content"></div>
<!-- Para XHTML1.1, XML de verdad <div class="sld_pictures" /> -->
<ul class="sld_menu">
<li><a href="images/cities/melbourne.jpg">Melbourne</a></li>
<li><a href="images/cities/buenos_aires.jpg">Buenos Aires</a></li>
<li><a href="images/cities/urubamba.jpg">Urubamba</a></li>
<li><a href="images/cities/london.jpg">London</a></li>
<li><a href="images/cities/venice.jpg">Venice</a></li>
<li><a href="images/cities/paris.jpg">Paris</a></li>
<li><a href="images/cities/osaka.jpg">Osaka</a></li>
</ul>
</div> |
El CSS
Adaptado de «BarakSlideshow» de Guillermo Rauch (http://devthought.com/).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
| .sld_slideshow * {margin:0; padding:0;}
.sld_slideshow {
background:url('../images/barakSlideshow/bg_shadow.gif') no-repeat top;
position:relative;
padding:14px 0 15px;
width:603px;
height:276px;
}
.sld_slideshow ul {list-style:none !important;}
.sld_slideshow .sld_menu, .sld_slideshow .sld_pictures, .sld_slideshow .sld_loading {
position:absolute;
}
.sld_slideshow .sld_loading {
background:url('../images/barakSlideshow/spinner.gif');
display:block;
top:158px;
left:205px;
text-indent:-5000px;
width:24px;
height:24px;
display:none;
z-index:5;
}
.sld_slideshow .sld_pictures {
background:url('../images/barakSlideshow/bg.jpg');
width:437px;
height:277px;
left:0;
overflow:hidden;
}
.sld_slideshow .sld_menu {
background:url('../images/barakSlideshow/bg_side.jpg');
width:166px;
height:257px;
right:0;
padding-top:20px;
}
.sld_slideshow .sld_menu li {
display:block;
z-index:1000;
position:relative;
}
.sld_slideshow .sld_menu li a {
display:block;
text-decoration:none;
padding:0.7em 0 0.7em 2.8em;
z-index:1000;
color:#ccc;
line-height:1.4em;
vertical-align:middle;
}
.sld_slideshow .sld_menu li a:hover {
color:#fff;
}
.sld_slideshow .sld_menu li.current a {
font:15px "Georgia";
color:#fff;
padding:5px 0 5px 28px;
line-height:18px;
}
.sld_slideshow .sld_menu li.background {
background:url('../images/barakSlideshow/arrow.gif') no-repeat left center !important;
position:absolute;
font-size:1px;
height:7px;
width:4px;
z-index:5;
}
/* WP */
.postText ul li:before {content:"";} |
Eso es todo, ya pondré una demo o ya se verá en la Galería de la web de La Guardia ^^!