Archivo de la categoría ‘html5’

Estructura eficiente para un listado de resultados en HTML5

Lunes, 22 de noviembre de 2010

El otro día hubo un pequeño debate en la lista Usable y Accesible sobre cómo estructurar correctamente un listado de resultados (por cierto, somos pocos miembros en la lista, estaría genial poder contar con gente nueva).

Del cruce de emails pude sacar varias conclusiones:

  • No te fíes de los grandes pero tenlos en cuenta: Si pensamos que el listado de resultados de Google es correcto en HTML nos equivocamos. El motivo es que dentro de una lista introduce encabezados h3 y semánticamente no es correcto. Los encabezados en HTML deben ser utilizados para encabezar (valga la rebuznancia) grandes secciones de contenido.
  • Lista ordenada: en un listado de resultados aquellos que aparecen más arriba se les presupone una mayor relevancia o se acercan más a aquello que íbamos buscando. Por tanto utilizaremos ol para listar nuestros resultados.

En xHTML

Veamos como quedaría la cosa. Por supuesto sobra decir que lo siguiente no es más que una propuesta.

<div id="search-results" class="list">
  <h3>Listado de resultados</h3>
  <ol>
     <li class="result">
        <a href="#" title="Ir al resultado 1">Título del resultado</a>
        <p>Resumen del resultado</p>
        <dl class="details">
           <dt>URL</dt>
           <dd>http://...</dd>
        </dl>
     </li>
     <li class="result">...</li>
  </ol>
</div>

En HTML5

Ya que estamos, vamos a ver cómo quedaría en la nueva revisión del lenguaje de marcado.

<div id="search-results">
  <h1>Listado de resultados</h1>
  <ol>
    <li class="result">
      <article>
        <header>
          <h1><a href="#" title="Ir al resultado 1">Título del resultado</a></h1>
        </header>
        <p>Resumen del resultado</p>
        <footer>
          <dl class="details">
            <dt>URL</dt>
            <dd>http://...</dd>
          </dl>
        </footer>
      </article>
    </li>
    <li class="result">
      ...
    </li>
  </ol>
</div>

- Un momento, ¡has hecho trampa! ¡Hay un h1 dentro de una lista!
- No es trampa, y me explico.

En HTML conceptualmente no debemos incluir cabeceras dentro de listados. Sin embargo, dándole un repaso al borrador de HTML5 de la W3C todo queda mucho más claro:

  • Dentro de una lista se espera flow content y article está considerado como tal. Con lo cual, dentro de una lista podemos meter articles
  • Las cabeceras sirven para encabezar una unidad de contenido (sea article, aside, nav o section).

Con lo cual, según la especificación dada, el código es correcto. Es más, si copiáis y pegáis el código de arriba en el validador de la W3C, incluyendo el DOCTYPE, etiquetas html, head, y body, veréis que valida a la perfección.

Obviamente no es la única forma de mostrar un listado de resultados, pero nos sirve para la mayoría de los casos haciendo algún que otro ajuste según vuestras necesidades. Espero que os resulte de ayuda.

Diferencias entre div, section y article

Martes, 15 de junio de 2010

Cuando empecé a estudiar HTML5 me vi también en la tesitura de diferenciar div, section y article. Aunque no fue sencillo, tampoco fue demasiado complicado entender cuáles son los detalles que marcan la diferencia entre unos y otros.

Básicamente está en la carga semántica que le queramos dar al contenido. ¿Cuándo usamos un div, un section o un article?

  • Usaremos article para representar cualquier información que tenga sentido propio por si misma y sea propensa a la reutilización, por ejemplo, mediante sindicación. Un ejemplo: un post de un blog, el resumen de ese post en una portada, un hilo en un foro, un comentario…
  • Usaremos section para agrupar contenido relacionado. Puede servirnos para enmarcar un conjunto de artículos, o incluso nuevas y diferentes secciones, o artículos que se dividan en secciones… la variedad es infinita.
  • div no tiene ninguna intención semántica, es un simple “agrupador” de contenido que nos ayudará a pintarlo con CSS.

Imaginemos un documento. ¿Qué es un documento al fin y al cabo? Una gran cantidad de información. Esta viene divida en secciones, una forma de ayudarnos a entender mejor esta información. Y las secciones pueden (o no) estar divididas en más secciones, que aglutinarán el contenido de nuestro documento (los artículos). Estos además, si su complejidad lo requiere, podemos dividirlos en más secciones y así, ad infinitum. Por compararlo a algo estaríamos hablando del cuerpo humano hasta llegar al nivel de detalle molecular (un cuerpo tiene brazos, el brazo tiene músculos, los músculos células, etc…).

En el artículo anterior puedes ver cómo quedaría el loop de WordPress: una sección para indicar contenido relacionado (los post) y dentro de cada post una sección para aglutinar más contenido relacionado (los comentarios).

¿A que es sencillo?

Loop de WordPress en HTML5, un ejemplo práctico

Lunes, 14 de junio de 2010

Ya está aquí, ya llegó, HTML5 ha venido para quedarse y cada vez escuchamos más y más cosas de la actualización del lenguaje de marcado web por excelencia. El otro día me preguntaba cuándo WordPress daría el salto, supongo que todavía tendremos que esperar.

En cualquier caso, podemos empezar a soltarnos un poco tomando como base la archifamosa plantilla Kubrick, por defecto en nuestro CMS favorito y pasándola a HTML5. Me ahorro el PHP, que lo carga el diablo.


<section id="content" class="posts">
  <h1 hidden>Artículos</h1>
  <article id="post-X" class=hentry>
    <header>
      <h1><a href="url-del-articulo" title="Título del artículo" rel="bookmark">Título del artículo</a></h1>
      <time pubdate>Fecha de publicación</time>
    </header>
    <div class="post-content"> .... </div>
    <footer>
       <p>Publicado en
         <a href="url-categoria" title="Ver todas las entradas de Categoría">categoría</a>
       </p>
    </footer>
    <aside class="comments">
       <h1 hidden>Comentarios</h1>
       <article id="comment-X">
         <h1>
           <a href="url-del-comentarista" title="Ir al blog de X" rel="external nofollow">Nombre del comentarista</a>
         </h1>
         <div><p>Contenido del comentario</p></div>
         <footer>
           <time pubdate>Fecha de publicación del comentario</time>
         </footer>
       </article>
       <!-- repite este misma estructura para el resto de comentarios -->
    </aside>
  </article>
</section>