miércoles, 20 de febrero de 2019

Marquesina de artículos con CSS3 (sin javascript)

Para un sitio web necesitaba una especie de slideshow con las introducciones a los artículos destacados.

Quería hacer algo sencillo, solo con HTML y CSS. Y buscando di con este video del canal Sala de Estudo (está en portugués, pero se entiende perfectamente):



Como se ve, en el video se explica cómo hacer un slideshow de fotografías, pero se puede adaptar perfectamente a lo que estaba buscando.

Por ejemplo, a continuación escribí un HTML de la página de prueba, a la que le incluí la introducción a tres artículos del blog (uno sobre Scribus, otro sobre Inkscape y el tercero sobre Gimp):

<!DOCTYPE html>
<html>
<head>
 <title>Slideshow</title>
 <meta charset=utf-8" />
 
 <style>
 
 </style>
</head>

<body>
 
 <section class="rotativa">

<div class="intro-noticia">
   <h1>Creaci&oacute;n, desde cero, de un d&iacute;ptico con Scribus (parte I) </h1>
   <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/85/Scribus_logo.svg/600px-Scribus_logo.svg.png">
   <p>Con esta entrada comienzo una serie con la que espero poder explicar c&oacute;mo hacer, desde cero, un d&iacute;ptico tama&ntilde;o A5 utilizando <i>Scribus</i> como base.<br>
   El trabajo final estar&aacute; pensado para tres destinos: web, impresora de escritorio e impreso comercial (en sistema <a href="http://es.wikipedia.org/wiki/%C3%93fset">offset</a>).<br>
   En el proceso tambi&eacute;n utilizar&eacute; <i>Inkscape</i>, <i>GIMP</i> y <i>Krita</i>...</p>
   <p><a href="https://javiersam.blogspot.com/2015/04/creacion-desde-cero-de-un-diptico-con_28.html">[ Leer + ]</a></p> 
  </div>
  <div class="intro-noticia">
   <h1>100 consejos y trucos &uacute;tiles para trabajar con Inkscape (de Mark Crutch para Full Circle Magazine)</h1>
   <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Inkscape.logo.svg/390px-Inkscape.logo.svg.png">
   <p>El mes pasado la <a href="http://fullcirclemagazine.org/">revista <i>"Full Circle"</i></a> marc&oacute; un hito. Lleg&oacute; a las <a href="http://www.javiersam.blogspot.com.uy/2015/08/full-circle-100-agosto-2015.html">100 ediciones</a>. Cifra muy dif&iacute;&iacute;cil de alcanzar para cualquier publicaci&oacute;n seriada, y, m&aacute;&aacute;s a&uacute;n, con las caracter&iacute;sticas y tem&aacute;tica de &eacute;sta en particular.<br>
    As&iacute; que, nuevamente, mis felicitaciones a <b><i>Ronnie Tucker</i></b> y al equipo de gente que colabora con &eacute;l.<br>
    En esa edici&oacute;n aniversario, con art&iacute;culos especiales y m&aacute;s p&aacute;ginas que lo habitual, me result&oacute; m&aacute;s que interesante el art&iacute;culo de <a href="http://www.peppertop.com/blog/"><i><b>Mark Crutch</b></i></a>, qui&eacute;n todos los meses escribe muy buenos y detallados art&iacute;culos sobre <i>Inkscape</i>.<br>
    Tan es as&iacute; que decid&iacute; traducirlo al espa&ntilde;ol y publicarlo, porque vale la pena: creo que hasta los usuarios avanzados de Inkscape van a encontrar algunos trucos novedosos.<br>
    Aqu&iacute; va...</p>
   <p><a href="https://javiersam.blogspot.com/2015/09/100-consejos-y-trucos-utiles-para.html">[ Leer + ]</a></p> 
  </div>
  <div class="intro-noticia">
   <h1>BIMP, un plugin de GIMP para la manipulaci&oacute;n de im&aacute;genes por lotes</h1>
   <img src="https://upload.wikimedia.org/wikipedia/commons/b/be/Wilber-gimp.png">
   <p>En <a href="https://www.atareao.es/">el atareao</a> me enter&eacute; de la existencia de <a href="https://www.atareao.es/software/fotografia/bimp-o-como-redimensionar-cientos-de-imagenes-con-gimp-en-ubuntu/">BIMP</a>, un complemento de GIMP para editar im&aacute;genes por lotes, o sea, aplicar modificaciones (ya sea de dimensiones, recortado, girado, correcci&oacute;n de color, etc) a muchas im&aacute;genes simult&aacute;neamente...</p>
   <p><a href="https://javiersam.blogspot.com/2015/11/bimp-un-plugin-de-gimp-para-la.html">[ Leer + ]</a></p> 
  </div>

 </section>

</body>

</html>

El código precedente, se ve así en un navegador:





Entre las etiquetas de apertura y cierre <style> (línea 8) coloqué el siguiente código CSS para controlar la apariencia de la página:
 * {
  margin: 0;
  padding: 0;
 }

 body {
  font-family: sans-serif;
 }

 h1 {
  font-family: Georgia, 'Times New Roman', Times, serif;
  color: white;
  padding: 0.4em;
  background-color: steelblue;
 }

 .rotativa {
  margin: 20px auto;
  width: 400px;
  position: relative;
 }

 .intro-noticia {
  border: 1px solid steelblue;
 }

 .intro-noticia img {
  width:40%;
  float:right;
 }

 .intro-noticia p {
  padding: 0.4em;
 }

 .intro-noticia p:last-child {
  text-align: right;
  font-weight: bold;
 }

Con esa configuración de estilo ahora la página se ve así:


Luego, es el turno de empezar la “magia”. Para eso, hay que agregar las siguientes declaraciones de estilo:

 .intro-noticia {
  position: absolute;
  opacity: 0;
  animation: animacion 21s infinite;
 }

 @keyframes animacion {

  25% {
   opacity: 1;
   z-index: 1;
  }

  50% {
   opacity: 0;
   z-index: 0;
  }
 }

 .intro-noticia:nth-child(1) {

 }

 .intro-noticia:nth-child(2) {
  animation-delay: 7s;
 }

 .intro-noticia:nth-child(3) {
  animation-delay: 14s;
 
 }

Entre las líneas 1 y 5, a la clase intro-noticia (que es la que lleva aplicada cada noticia que se muestra en la página html) se le define la opacidad en valor 0 (transparente) y se le aplica una animación de nombre animacion que dura 21 segundos y que se ejecuta en un bucle infinito.
Entre las líneas 7 y 18 se definen los “marcos clave” de la animación: en el 25% la opacidad pasa a valor 1 (totalmente visible) y en el 50% vuelve a 0 (transparente). Además, en el 25 % se mueve la caja que tiene aplicada la clase intro-noticia a arriba de todo en el orden de apilamiento (z-index: 1;) y en el 50 % se la envía al fondo (z-index: 0;). Esto es para que los vínculos (etiquetas a) queden accesibles, porque sino quedan tapadas por la caja de más arriba (aunque esta sea transparente) y no se pueden pinchar.
Finalmente, entre las líneas 20 y 31 se establece un retraso en la ejecución de la animación de cada intro-noticia, para que no se superpongan y se muestren una tras otra. Por cada noticia que haya en la página, hay que agregar una .intro-noticia:nth-child (X), donde "X" debe ser sustituido por el número de noticia.

El resultado de todo este código se muestra en acción en el siguiente video:

2 comentarios:

Lo que escriba a continuación será revisado antes de publicarse.
Gracias por tus comentarios.