Continuando con nuestra larga saga de tutoriales sobre diseño Web, en esta ocasión les traemos un pequeño desarrollo que sin duda puede ser de gran utilidad para nuestros sitios, en especial si queremos montar una especie de portafolio o una simple galería para desplegar imágenes.
En un esfuerzo conjunto e integración de tecnologías como PHP, jQuery, CSS, XHTML y un poco de MySQL, hoy veremos un paso a paso de como construir una simple galería de imágenes desde cero.
El detalle, como siempre, después del salto.
Como siempre, lo primero:
Detalles del tutorial
- Tiempo aproximado de implementación: 60 minutos.
- Dificultad: Intermedio.
- Conocimientos requeridos: Idealmente nociones de PHP, XHTML, CSS, jQuery y bases de datos, especialmente si quieren personalizar el diseño final. De cualquier forma, todo será explicado paso a paso en caso de que deseen implementar tal como está acá.
Implementos necesarios:
- Un servidor que pueda ejecutar archivos PHP. (Recomendamos XAMPP para Windows, Linux y Mac).
- Un sistema gestor de bases de datos MySQL (En XAMPP viene uno incluido).
- Opcionalmente un editor Web (Recomendamos Adobe Dreamweaver o Aptana Studio).
- Un editor de imágenes (Recomendamos Adobe Photoshop).
- La librería jQuery, que pueden obtener desde su sitio oficial.
- Imágenes para montar en la galería. Para este caso utilizamos algunas de la galería de JoesSistah, las cuales están bajo una licencia Creative Commons.
Con eso claro, vamos, manos a la obra:
1.- Lo primero que haremos será crear una base de datos en nuestro MySQL y en el una tabla llamada imagen, la cual contendrá 4 campos de información:
CREATE TABLE 'clh'.'imagen' ( 'id' INT NOT NULL AUTO_INCREMENT PRIMARY KEY , 'titulo' VARCHAR( 50 ) NOT NULL , 'descripcion' TEXT NOT NULL , 'archivo' VARCHAR( 20 ) NOT NULL ) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_unicode_ci
Repasando nuestro código anterior, lo que hemos hecho ha sido crear una tabla llamada imagen, la cual contiene 4 campos:
2.- Luego que hemos creado la tabla, insertaremos información de 4 imágenes:
INSERT INTO imagen( titulo, descripcion, archivo ) VALUES ( 'Paisaje Numero 1', 'Imagen representativa de un paisaje con costa', '1.jpg') INSERT INTO imagen( titulo, descripcion, archivo ) VALUES ( 'Paisaje Numero 2', 'Imagen representativa de un paisaje con nieve', '2.jpg') INSERT INTO imagen( titulo, descripcion, archivo ) VALUES ( 'Paisaje Numero 3', 'Imagen representativa de un paisaje con una luna en el fondo', '3.jpg') INSERT INTO imagen( titulo, descripcion, archivo ) VALUES ( 'Imagen abstracta', 'Representacion de una mariposa', '4.jpg')
3.- Con eso debiésemos tener una tabla de la siguiente forma:
[table id=2 /]
4.- Con nuestra tabla creada, y antes de empezar a codificar, haremos la preparación de nuestras imágenes. Para la galería, necesitaremos 3 tamaños de las mismas imágenes, 2 los fijaremos en imágenes distintas y 1 lo redimensionaremos vía CSS. Así que necesitaremos:
Los 2 primeros pueden hacerlo mediante su editor de imágenes favorito.
5.- Con todo aquello listo, procedemos a codificar. Nuestra galería contará de 2 archivos en formato PHP, uno donde desplegaremos un preview de las imágenes y añadiremos un pequeño efecto en jQuery para que estas aparezcan oscuras al cargar la página y que solo sean completamente visibles cuando el usuario pase el mouse por encima, y el otro funcionará como un visor de la imagen en tamaño completo, con su respectiva información y enlaces para imágenes siguientes y anteriores, así como otro preview de la misma galería en un tamaño más pequeño. Adicionalmente codificaremos un archivo en formato CSS para el estilo de la galería y un archivo en formato JS para nuestras funciones en jQuery. Así que resumiendo, los archivos que crearemos son:
Vamos con el primero. Los comentarios como siempre, dentro del código:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> /* Incluimos la hoja de estilos, la libreria jquery y nuestra libreria de funciones */ <link rel="stylesheet" href="css/estilos.css" /> <script type="text/javascript" src="js/jquery-1.4.2.min.js"></script> <script type="text/javascript" src="js/funciones.js"></script> <title>Galería de Imágenes</title> </head> <body> <div id="galeria"> <h1>Mi galería de imágenes</h1> <?php /* Conectamos a la BD para obtener la informacion de las imagenes que tenemos guardadas */ $conexion = new mysqli('localhost', 'usuario', 'clave', 'clh'); $consulta = "SELECT id, titulo, descripcion, archivo FROM imagen"; // Obtenemos el resultado de la consulta $resultado = $conexion->query($consulta); // Desplegamos las imagenes con un enlace a su id while($filas = $resultado->fetch_array(MYSQLI_ASSOC)) { ?> <a href="visor.php?id=<?php echo $filas['id']; ?>"> <img src="img/t-<?php echo $filas['archivo']; ?>" alt="imagen" /> </a> <?php } ?> </div> </body> </html>
En resumen, lo que hemos hecho en nuestro index.php, yendo paso a paso:
Y ahora continuamos con el visor, en donde podremos mostrar las imágenes en tamaño completo y con más información:
<?php /* Obtenemos el id que fue pasado como parametro por URL, y luego creamos 2 variables: prev y sig que corresponden a la id anterior y siguiente de la imagen actual */ $id = $_GET['id']; $prev = $id-1; $sig = $id+1; /* Conectamos a la BD y obtenemos la informacion de la imagen actual*/ $conexion = new mysqli('localhost', 'usuario', 'clave', 'clh'); $consulta = "SELECT titulo, descripcion, archivo FROM imagen WHERE id = $id"; $resultado = $conexion->query($consulta); $fila = $resultado->fetch_array(MYSQLI_ASSOC); /* Luego conectamos a la BD y obtenemos la primera y ultima id de imagen, para saber cuando se trata de la ultima y/o primera imagen de la galeria */ $consulta = "SELECT min(id) as minimo, max(id) as maximo FROM imagen"; $resultado = $conexion->query($consulta); $datos = $resultado->fetch_array(MYSQLI_ASSOC); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> // Creamos el titulo de la pagina de acuerdo a la imagen <title>Galería de Imágenes - <?php echo $fila['titulo'];?> </title> // Incluimos la hoja de estilo y librerias <link rel="stylesheet" href="css/estilos.css" /> <script type="text/javascript" src="js/jquery-1.4.2.min.js"></script> <script type="text/javascript" src="js/funciones.js"></script> </head> <body> <div id="contenedor"> <?php /* Comparamos la id actual con la menor id de la tabla para saber si es la primera imagen de la galeria. Si no es igual, mostramos un enlace para la imagen anterior */ if($id != $datos['minimo']) { ?> <a href="visor.php?id=<?php echo $prev; ?>"> <img src="img/back.png" /> </a> /* De lo contrario, mostramos una imagen indicando que no hay nada antes */ <?php } else { ?> <img src="img/block.png" alt="Primera imagen" /> <?php } ?> /* Desplegamos la imagen actual en tamaño completo con su respectiva descripcion */ <img id="imgcompleta" src="img/<?php echo $fila['archivo']; ?>" alt="<?php echo $fila['descripcion'];?>" /> /* Comparamos la id actual a la mayor id de la tabla para saber si es la ultima imagen. Si no es igual mostramos un enlace para la imagen siguiente */ <?php if($id != $datos['maximo']){ ?> <a href="visor.php?id=<?php echo $sig; ?>"> <img src="img/next.png" /> </a> /* De lo contrario, mostramos una imagen indicando que no hay nada despues */ <?php } else { ?> <img src="img/block.png" alt="Última imagen" /> <?php }?> /* Establecemos un pequeño div para la informacion de la imagen. Cuando el usuario pase el mouse por encima, apareceran los datos (titulo y descripcion) */ <div id="masinfo"><h4>Información de la imagen <a href="#"><img src="img/add.png" alt="Más información" /></a></h4></div> /* Este div mostrara la informacion de la imagen. Por defecto lo dejaremos oculto mediante CSS y solo se mostrara al pasar el mouse sobre el */ <div id="info"> <p>Título: <?php echo $fila['titulo'];?></p> <p>Descripción: <?php echo $fila['descripcion'];?></p> </div> </div> /* Al igual que en index, mostraremos la galeria completa, solo que esta vez las imagenes seran mas pequeñas */ <div id="galeria-small"> <h3>Mis otras imágenes</h3> <?php $cons = "SELECT id, titulo, descripcion, archivo FROM imagen"; $res = $conexion->query($cons); while($filas = $res->fetch_array(MYSQLI_ASSOC)) { ?> <a href="visor.php?id=<?php echo $filas['id']; ?>"> <img src="img/t-<?php echo $filas['archivo']; ?>" alt="imagen" /> </a> <?php } ?> </div> </body> </html>
Resumiendo el archivo anterior, lo que hicimos fue:
Ya con eso listo, nos falta declarar nuestras funciones en jQuery y nuestra hoja de estilos. Partiremos por las funciones:
$(function(){ /* Este es un efecto inicial sobre la galeria, en el cual decimos basicamente que cuando la pagina cargue, las imagenes se muestren mas oscuras y que al pasar el mouse por encima tomen su opacidad natural. Para esto utilizamos las funciones animate, hover y stop de jQuery. */ $('#galeria img').animate({ "opacity" : .5 }); $('#galeria img').hover(function(){ $(this).stop().animate({ "opacity" : 1 }); }, function(){ $(this).stop().animate({ "opacity" : .5}); }); /* Repetimos el mismo efecto para la galeria pequeña que mostramos en el visor */ $('#galeria-small img').animate({ "opacity" : .5 }); $('#galeria-small img').hover(function(){ $(this).stop().animate({ "opacity" : 1 }); }, function(){ $(this).stop().animate({ "opacity" : .5}); }); /* Ahora aplicamos la funcion para que cuando un usuario pase el mouse por encima del div con id masinfo, se despliegue la informacion del div info del visor. Esto lo haremos mediante las funciones hover, fadeIn y fadeOut de jQuery */ $('#masinfo').hover(function(){ $('#info').fadeIn(); }, function(){ $('#info').fadeOut(); }); });
En resumen, lo que hicimos aquí fue:
Y ahora nos queda la parte final, que es declarar los estilos:
body { background: black; color: white; font-family: Arial, Helvetica, sans-serif; width: 100%; margin: 0 auto; } #galeria{ width: 800px; margin: 0 auto; } #galeria img{ border: 1px solid white; padding: 1px; margin-right: 10px; margin-bottom: 10px; } #galeria-small{ width: 800px; margin: 0 auto; } #galeria-small img{ width: 100px; height: 100px; border: 1px solid white; } #contenedor{ width: 800px; margin: 0 auto; padding-top: 10px; } #imgcompleta{ border: 1px solid white; } a img{ border: none; } /* Este es el div con informacion de la imagen. Inicialmente cargara con display:none para que no sea visto a menos que el usuario pose el mouse encima */ #info { display: none; }
Y con eso tenemos nuestro resultado final:
Primera vista de la galería
La imagen toma su opacidad natural al pasar el mouse por encima
Vista completa de la primera imagen
Información de la primera imagen al pasar el mouse por encima del div de información
Vista completa de imagen que tiene una previa y una siguiente
Vista completa de la última imagen
Antes de terminar, y comprendiendo que este tutorial ha sido largo, integramos una nueva característica a estos tutoriales:
Y con eso damos por terminado este tutorial, recordándoles como siempre que ha sido:
Esperamos que haya sido de utilidad para Uds. Cualquier duda o comentario que puedan tener, los invitamos a dejarnos unas líneas en el área habilitada a continuación.
Muchas gracias por leer y será hasta una próxima oportunidad.
10:33:35 pm
Disculpa el index me marca error en la sintaxis de $resultado = $conexion->mysql_query($consulta);
a que se devera
6:25:34 am
el tutorial esta muy interesante, me gustaria incluir en mi web una galeria con este tipo de funcionamiento, pero de conocimientos ando muy limitado en cuanto a php, jsquery y demas no tengo ni idea, para montar este tipo de tecnologías, como tengo que hacer para incluir el codigo en el html???, y donde tengo que colocar las carpetas, suelo usar el dreamweaver para maquetar la web… un saludo y gracias de antemano antentamente Rafa.
4:32:00 pm
solo una duda al crear el archivo js es = a jsp????
4:29:34 pm
Lo maximo gracias por dejar esta muy buen post y a la vez dejar que lo utilicemos en neustras webs muchas gracias
10:30:26 am
hola muy buenos dias estoy tratando de hacer el tuto aver quetal me sale pero no puedo hacer la base de dato meda error no se si lo estare haciendo mal es que nose mucho de base de datos si me pueden ayudar
10:04:51 am
Tengo mas de 1000 fotos de la naturaleza en general y quiero crear una galeria. Vi su articulo y me gusto mucho. Descargue el XAMPP y lo instale como usted recomienda pero cuando trato de abrir el index.php me dice que no encuentra la pagina. He buscado en la WEB algunas respuestas pero no he resuelto, que podria ser? hay algun tutorial de esto para leer un poco mas? puede ser que yo no este bien informado de estas cosas. Muchas Gracias.
10:50:55 am
Una consulta… Que tipo de imagenes acepta este visor???? por que necesito visualizar imagenes tif almacenadas en la base de datos.. de antemano muchas gracias.
11:40:24 am
Ya sé que ha pasado mucho tiempo, pero me gustaría saber si es estrictamente necesario poner las 2 imágenes (thumbnails (t-) y las normales), ya que me imagino que con CSS se podrían ajustar todas desde solo 1 imagen… No sé si me doy a entender.
2:36:53 am
Hola pana tengo problemas al crear la base de datos soy nuevo en esto y queria ver si me podeis enviar o subir el codigo sql pa subirlo dirctamente a la base de datos 🙂 si es posible gracias y perdona pero soy muy nuevo en esto
1:32:03 am
hola feliz tarde me parece un excelente tutorial, y queria ver si ustedes me podian ayudar, el problema que tengo es que las imagenes me aparecen en la parte superior de la pagina y yo necesito que queden enmedio, ya probe colocar una posicion absoluta en los css pero no lo logra si pudieran ayudarme muchas gracias