Desarrollando un #timeline responsivo, solo con #HTML y #CSS

Cuando empiezas a maquetar tus primeras webs, tu objetivo principal es que la maqueta resultante sea lo más fiel posible al diseño que te han entregado. Es un trabajo difícil, pero muy satisfactorio, ver que has sido capaz de respetar todo lo que te han definido desde diseño.

Según va creciendo tu experiencia, esta fidelidad empieza a darse por supuesta, y el auténtico reto del maquetador es conseguir que el código que has usado para realizarla sea semántico,adecuado y sobre todo (al menos en mi caso) el mínimo posible. Conseguir “adelgazar” al máximo la cantidad de código HTML se ha convertido con los años en una auténtica obsesión, aunque creo que es una de las actividades más saludables que puede tener cualquier maquetador que se precie.

Hace algunos meses, Sergio Ortega, uno de los organizadores de UXSpain, propuso que hiciéramos la maquetación de la web del evento. Ya tenían el diseño realizado y “solo” necesitaban a alguien que hiciera las maquetas estáticas en HTML plano. Por supuesto, aceptamos sin dudarlo.

El principal reto que tenía este desarrollo es que a iba a ser mantenido por distintas personas, sin gestor de contenido alguno y editando directamente el HTML, por lo que el código debía ser lo más simple y sencillo posible. Por eso, de todo el site, me voy a centrar en la maquetación delprograma del evento. Es el caso perfecto para ilustrar las ventajas del “adelgazamiento” que os comentaba antes.

Vamos a ver cómo una sección fundamental para un evento (el programa de ponencias), con un diseño relativamente complejo, se puede maquetar de una forma muy sencilla, semántica, accesible, escalable, responsive, sin Javascript, sin imágenes bitmap (garantizando el correcto funcionamiento en todas las densidades de pantalla y nivel de zoom) y con muy pocas líneas de código.

¡A maquetar!

Al abrir el fichero con el diseño de la sección “Programa” me encontré con que esa sección tenía la siguiente estructura (ojo, todos los datos son ficticios):

Lo primero que vemos es que el programa es un listado con 3 tipos de eventos. Hay un tipo de evento principal (la charla) que consta de hora de inicio, foto, nombre del ponente y título de su charla. Además están las pausas, que pueden ser de 3 tipos (café, descanso o comida). Por último eventos “menores” como el registro, la presentación y la cena de gala.

Por tanto, optamos por comenzar a montar la página dentro de un listado:

1 <section class="programa">
2  <h3>Viernes, 5 Junio 2017</h3>
3  <ul>       
4   <li>
5      <span class="hora">9:30</span>
6      <span class="titulo">Registro y acrehhditaciones</span>
7   </li>
8   <li>
9      <span class="hora">10:00</span>
10      <span class="titulo">Presentación</span>
11   </li>
12  </ul>
13 </section>

Para los “eventos” simples, en los que solo necesitamos la hora de inicio y el título, usamos dos span’s dentro de cada li con los siguientes estilos:

1 .programa li {
2     clear: both;
3     overflow: hidden;
4     margin-bottom: 3rem;
5     padding-left: 2.3rem;
6     position: relative;
7 }
8 .hora {
9     float: left;
10     width: 6rem;
11     text-align: right;
12     color: #767676;
13     font-family: Poppins, sans-serif;
14     font-size: 1.8rem;
15     font-weight: 400;
16     line-height: 2.4rem;
17     margin-right: 3rem;
18 }
19 .titulo {
20     float: left;
21     color: #000;
22     font-family: Poppins, sans-serif;
23     font-size: 1.8rem;
24     font-weight: 400;
25     line-height: 2.4rem;
26 }

Y así tenemos nuestros primeros dos eventos del programa:

El siguiente tipo de evento es la charla que, al tener más datos, requiere un poco más de código, pero tan sencillo que cualquiera puede entender:

1 <li>
2   <span class="hora">10:30</span>
3   <div class="charla">
4     <a href="detallePonente.html" title=”Ficha de Nombre del Ponente”><imgsrc="../img/fotoPonente.jpg" alt="Nombre del ponente"></a>
5     <a href="detallePonente.html" class="link" title=”Ficha de Nombre del Ponente”>Valentín Morales</a>Cómo dar una charla de UX sin que te dé la risa
6   </div>
7 </li>

Seguimos manteniendo el span con la hora de inicio y hemos añadido un div que alberga la foto y nombre del ponente y el título de la charla. Sus estilos son los siguientes:

1 .programa .charla {
2     float: left;
3     width: 80rem;
4     font-family: Poppins, sans-serif;
5     font-size: 1.8rem;
6     line-height: 2.4rem;
7     overflow: hidden;
8     margin-top: 0.4rem;
9 }
10 .link {
11     color: #e42f67;
12 }
13 .programa .charla img {
14     float: left;
15     width: 5.5rem;
16     margin-right: 3rem;
17 }
18 .charla .nombre {
19     font-weight: 700;
20     color: #e42f67;
21     margin-bottom: 0.5rem;
22 }

Como veis, nada especial, una imagen flotando a la izquierda del nombre y el título. Lo que conseguimos es esto:


Ahora vamos a por las pausas, que pueden ser de tres tipos. En principio necesitamos una estructura similar a la de los eventos simples, excepto por el icono del tipo de pausa. Para hacer el del “café” le añadimos una clase “cafe” a la estructura del evento simple:

1 <li class="cafe">
2   <span class="hora">12:00</span>
3   <span class="titulo">Café</span>
4 </li>

Y, usando el pseudo-elemento ::before, le ponemos el icono correspondiente. Lo mismo haremos para la comida y el descanso:

1 .programa li.cafe::before {
2     background-image: url(../img/icoCafe.svg);
3     background-repeat: no-repeat;
4     width: 2.3rem;
5 }
6 .programa li.comida::before {
7     background-image: url(../img/icoComida.svg);
8     background-repeat: no-repeat;
9     background-position: 0 4px;
10     width: 2.3rem;
11 }
12 .programa li.descanso::before {
13     background-image: url(../img/icoDescanso.svg);
14     background-repeat: no-repeat;
15     width: 2.3rem;
16 }

Y podemos comprobar que ha funcionado correctamente:

De esta misma forma le podemos poner el icono a todos los demás ítems del programa:

1 .programa li::before {
2     position: absolute;
3     content: " ";
4     width: 2rem;
5     height: 2rem;
6     background: #f2f2f2 url(../img/icoCircleGris.svg);
7     left: 0;
8     top: 0;
9     border-bottom: 0.2rem solid #f2f2f2;
10     border-top: 0.2rem solid #f2f2f2;
11 }

Esas dos últimas líneas de borde superior e inferior servirán para “romper” la línea vertical que vamos a poner uniendo todos los iconos. Si ahora lo vemos en un navegador ya casi tenemos nuestra lista con el formato deseado:

Ahora tenemos que unir con una línea vertical todos los iconos. Haremos algo similar, usando el::before, pero esta vez aplicado al listado completo (al ul, vamos), crearemos una capa con un alto igual al 100% y un ancho de 3 píxeles y fondo gris oscuro:

1 .programa ul::before {
2     position: absolute;
3     content: ' ';
4     width: 0.3rem;
5     height: 100%;
6     background-color: #e9e9e9;
7     left: 0.8rem;
8 }

Y ya tenemos unidos todos nuestros iconos. Si miramos lo que tenemos hecho, veremos que el círculo del primer ítem del listado y el último debería ser rosa, y que el último tiene un trozo de línea gris vertical que nos sobra y que debemos corregir.

Para ello, usaremos “:first-child” y “:last-child” y corregiremos estos últimos defectos:

1 .programa li:first-child::before,
2 .programa li:last-child::before {
3     background-image: url(../img/icoCirclePink.svg);
4     background-repeat: no-repeat;
5 }

De esta manera hemos conseguido que el código HTML de esta sección sea muy sencillo, dejando la magia para el CSS, lejos de la persona que va a mantenerlo y “alimentarlo”. Como siempre pasa en maquetación, probablemente vosotros lo habríais hecho de otra manera, quizá mejor que la nuestra, pero en este caso pretendíamos reducir el posible error humano al mínimo gracias a una estructura sencilla y minimalista.

Faltaría el código para las versiones responsive, que habría que añadir a sus correspondientes media queries. En este caso, la principal diferencia es que desaparece la foto del ponente en tablet vertical (portrait) y móviles:

1 @media screen and (max-width: 767px)
2 li .charla img {
3    display: none;
4 }

Y así queda nuestra pantalla:

Os dejamos el enlace a la versión final.

Esperamos haberlo conseguido y haber podido contribuir al éxito de un evento como este, al que acudiremos por sexta vez consecutiva, ya que se ha convertido en una de nuestras citas imprescindibles del año.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s