<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-9062857839648306280</atom:id><lastBuildDate>Thu, 24 Oct 2024 15:12:11 +0000</lastBuildDate><category>CSS</category><category>HTML5</category><category>Accesibilidad</category><category>Optimización</category><category>Blogger</category><title>Hexagonal Alien</title><description></description><link>http://www.hexagonalalien.es/</link><managingEditor>noreply@blogger.com (LuisFran)</managingEditor><generator>Blogger</generator><openSearch:totalResults>39</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-9189604432218426225</guid><pubDate>Sat, 21 Jan 2017 18:24:00 +0000</pubDate><atom:updated>2017-05-10T23:13:55.846+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CSS</category><title>Sticky Footer: o cómo poner el pie de página en su sitio</title><description>&lt;figure class=&quot;post-img&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpmCnBaVyhJTbT2EqXMaZe6zmzTCS_0KzQLXkUBZJbumhdklnwUDYrwVI9BDOUQmezoXEtRBWplzX8vOGRtHZn99JE7V-_WW5iAZN6jNMkCSeHbyY43ADKdPA5MkzDKeIADZEQ6Ty-k7U/s1600/empujando-coche.jpg&quot; alt=&quot;Hombre empujando coche&quot; /&gt;
&lt;figcaption&gt;Imagen de &lt;a href=&quot;https://www.flickr.com/photos/16210667@N02/&quot;&gt;Craig Sunter&lt;/a&gt;.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;En diseño, un sticky footer es un pie de página que se queda &quot;pegado&quot;, independientemente de la cantidad de contenido, a la parte inferior de la ventana del navegador. Con esto evitamos que nuestro diseño se rompa al aparecer el pie de página en mitad del documento, cuando el propio documento tiene poco contenido. No debemos confundirlo con un pie de página que se queda fijo y es visible a lo largo de todo el documento, eso es arena de otro costal.&lt;/p&gt;

&lt;p&gt;Hay varias formas de hacerlo, y cada una de ellas con sus pros y sus contras. De momento voy a pasar por alto el uso de Grid Layout, por la escasa compatibilidad que aún existe en los diferentes navegadores, aunque es probablemente una de las mejores y más limpias formas de conseguirlo. Así que no perdamos el tiempo y ¡al lío!.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;section&gt;&lt;h2&gt;Sticky footer con márgenes negativos&lt;/h2&gt;

&lt;p&gt;Esta es la forma más elemental de conseguir nuestro objetivo y quizás la más compatible, pero con una gran pega, necesitamos dar un alto concreto a nuestro pie de página, y como supongo que ya sabrás, los altos fijos son algo que se debe evitar en diseño web.&lt;/p&gt;

&lt;p&gt;Realmente hay tres variantes usando márgenes negativos, en función de como usemos el elemento que evita el solapamiento, cuando el contenido es lo suficientemente amplio para enviar por sí sólo al pie de página a su sitio. A fondo sólo voy a explicar la primera de ellas, en las otras dos sólo será necesario ver las modificaciones necesarias para evitar el solapamiento.&lt;/p&gt;

&lt;h3&gt;Contenedor + elemento auxiliar&lt;/h3&gt;

&lt;p&gt;La forma de conseguir un sticky footer con márgenes negativos es relativamente sencilla. Hay que tener en cuenta que lo que desconocemos en todo momento es el alto de los elementos de la web y el alto del viewport (zona visible del navegador donde se muestra el documento), por tanto no podemos calcular cuanto tenemos que desplazar el pie de página para ponerlo en su sitio.&lt;/p&gt;

&lt;p&gt;Para ello necesitamos englobar todo el contenido, excepto el pie de página, en un contenedor auxiliar al que daremos el valor &lt;code&gt;min-height: 100%&lt;/code&gt;. Ahora tenemos el pie de página justo por debajo del viewport. Esto podemos corregirlo usando márgenes negativos (en el contenedor o en el pie de página), pero para ello necesitamos saber el valor exacto del alto del pie de página, lo que nos obliga a darle un valor concreto, que es la gran pega de este método.&lt;/p&gt;

&lt;p&gt;Si visualizamos un documento con poco contenido y usando este método justo hasta este punto concreto, todo parece funcionar correctamente. Sin embargo, si hay contenido suficiente para empujar el pie de página hasta su lugar correcto, veremos que se produce un solapamiento. Para ello deberemos de usar un elemento auxiliar que situaremos dentro del contenedor y al final de todo el contenido, con un alto del mismo valor que el del pie de página.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;div id=&amp;quot;contenedor&amp;quot;&amp;gt;
    &amp;lt;header&amp;gt;
        contenido
    &amp;lt;/header&amp;gt;
    &amp;lt;main&amp;gt;
        contenido
    &amp;lt;/main&amp;gt;
    &amp;lt;div id=&amp;quot;push&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;footer&amp;gt;
    contenido
&amp;lt;/footer&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
html, body {
    height: 100%;
}

#contenedor {
    min-height: 100%;
    margin-bottom: -8em;
}

footer, #push {
    height: 8em;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Doble contenedor&lt;/h3&gt;

&lt;p&gt;Para este caso cambiaremos el elemento auxiliar, por otro contenedor, teniendo así una estructura de dos elementos contenedores anidados. El primer contenedor tendrá los mismo parámetros que en el caso anterior y el segundo, que es el que envuelve el contenido directamente, un &lt;code&gt;padding-bottom&lt;/code&gt; de valor igual al alto del pie de página.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;div id=&amp;quot;contenedor&amp;quot;&amp;gt;
    &amp;lt;div id=&amp;quot;contenedor-auxiliar&amp;quot;&amp;gt;
        &amp;lt;header&amp;gt;
            contenido
        &amp;lt;/header&amp;gt;
        &amp;lt;main&amp;gt;
            contenido
        &amp;lt;/main&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;footer&amp;gt;
    contenido
&amp;lt;/footer&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
html, body {
    height: 100%;
}

#contenedor {
    min-height: 100%;
    margin-bottom: -8em;
}

#contenedor-auxiliar {
    padding-bottom: 8em;
}

footer {
    height: 8em;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Contenedor + box-sizing&lt;/h3&gt;

&lt;p&gt;Este último caso es realmente una variación del segundo, ya que cambiando el modelo de cajas mediante &lt;code&gt;box-sizing: border-box&lt;/code&gt; no necesitamos el segundo contenedor, podemos darle un &lt;code&gt;padding-bottom&lt;/code&gt; de valor igual a el alto del pie de página directamente al contenedor principal, con lo que nos ahorramos algo de marcado en html.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;div id=&amp;quot;contenedor&amp;quot;&amp;gt;
    &amp;lt;header&amp;gt;
        contenido
    &amp;lt;/header&amp;gt;
    &amp;lt;main&amp;gt;
        contenido
    &amp;lt;/main&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;footer&amp;gt;
    contenido
&amp;lt;/footer&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
* {
    box-sizing: border-box;
}

html, body {
    height: 100%;
}

#contenedor {
    min-height: 100%;
    margin-bottom: -8em;
    padding-bottom: 8em;
}

footer {
    height: 8em;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Sticky footer con display:table&lt;/h2&gt;

&lt;p&gt;Un elemento cualquiera con una &lt;code&gt;height: 100%&lt;/code&gt; tiende a ocupar el 100% del alto de su contenedor padre, independientemente de si hay o no otros elementos. Esto, que en ocasiones puede resultar útil, es lo que en los ejemplos anteriores nos obligaba a corregir la posición del pie de página con un margen negativo.&lt;/p&gt;

&lt;p&gt;También, este comportamiento es lo que nos hace fijar tanto al elemento &lt;code class=&quot;html-code&quot;&gt;html&lt;/code&gt; como al elemento &lt;code class=&quot;html-code&quot;&gt;body&lt;/code&gt; a un &lt;code&gt;height: 100%&lt;/code&gt;. Es lógico, puesto que necesitamos que nuestro contenedor principal ocupe el 100% del viewport, y para ello sus ancestros deben tener también esa medida. La explicación es muy sencilla, el elemento &lt;code class=&quot;html-code&quot;&gt;html&lt;/code&gt; es el elemento raíz, por tanto no tiene elemento padre, tomando como valor de referencia el wieport.&lt;/p&gt;

&lt;p&gt;Este comportamiento afecta a todos los elementos de tipo bloque (recuerda que básicamente hay dos tipos de elementos, si consideramos únicamente el &lt;a href=&quot;https://madebymike.com.au/writing/the-invisible-parts-of-CSS/#display-types&quot;&gt;display  externo&lt;/a&gt;, de bloque y en línea), que bien pueden ser los que definimos mediante &lt;code&gt;diplay: block&lt;/code&gt;, &lt;code&gt;display: table&lt;/code&gt; e incluso &lt;code&gt;display: flex&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para este caso concreto lo que nos importa es el comportamiento de las tablas, para ser exactos, de como se comportan los elementos que hay en el interior de una tabla. Un elemento definido con &lt;code&gt;display: table&lt;/code&gt; se comporta, en lo referente a un alto del 100%, tal cual lo haría uno definido con &lt;code&gt;display:block&lt;/code&gt;, pero no los elementos internos, que podemos definir con una serie de propiedades &lt;code&gt;display&lt;/code&gt; para que se comporten como si de una tabla &quot;real&quot; se tratase.&lt;/p&gt;

&lt;p&gt;Una tabla tiene un comportamiento específico, y si no se le asigna ningún valor al alto y al ancho, esta tiende a ocupar el mismo espacio que ocupan los elementos que contiene. No es algo que nos convenga, por tanto debemos dar a nuestro elemento contenedor un &lt;code&gt;height: 100%&lt;/code&gt; y un &lt;code&gt;widht: 100%&lt;/code&gt;. A nuestro contenido le asignaremos un &lt;code&gt;display: table-row&lt;/code&gt; para que se comporte como si de una fila se tratase, y aquí es de donde proviene la magia. Si le asignamos un &lt;code&gt;height: 100%&lt;/code&gt; tiende a ocupar el 100% del espacio disponible, no el 100% de su elemento contenedor. Esto es lo que realmente nos interesa, puesto que de esta forma no necesitamos corregir la posición del pie de página con márgenes negativos (debemos englobar tanto contenido como pie de de página dentro de un mismo elemento contenedor). Tampoco es necesario fijar una altura al pie de página, podemos dejarlo con medidas fluidas, que es como se debe hacer.&lt;/p&gt;

&lt;p&gt;Eso sí, no todo son ventajas, hay una pequeña pega. Hay algunos elementos dentro de una tabla que no soportan determinadas propiedades, en concreto, a una fila no le podemos dar valor a &lt;code&gt;padding&lt;/code&gt;, si necesitamos hacer esto debemos usar un contenedor auxiliar. Si estás interesado en saber como se comportan las tablas más a fondo, puedes leer el artículo &lt;a href=&quot;https://www.sitepoint.com/web-foundations/table-formatting/&quot;&gt;Table Formatting&lt;/a&gt; publicado en &lt;a href=&quot;https://www.sitepoint.com/&quot;&gt;Site Point&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;body&amp;gt;
    &amp;lt;header&amp;gt;
        contenido
    &amp;lt;/header&amp;gt;
    &amp;lt;main&amp;gt;
        &amp;lt;div class=&amp;quot;contenedor&amp;quot;&amp;gt;
            contenido
        &amp;lt;/div&amp;gt;
    &amp;lt;/main&amp;gt;
    &amp;lt;footer&amp;gt;
        contenido
    &amp;lt;/footer&amp;gt;
&amp;lt;/body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
html, body {
  height: 100%;
  margin: 0;
}

body {
  display: table;
  width: 100%;
}

main {
  height: 100%;
  display: table-row;
}

.contenedor {
  padding: 1em;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Sticky footer con flexbox&lt;/h2&gt;

&lt;p&gt;La forma de hacerlo con &lt;code&gt;display: flex&lt;/code&gt; es muy parecida ha cuando usamos &lt;code&gt;display: table&lt;/code&gt;. Necesitamos un contenedor principal (también podemos usar el mismo &lt;code class=&quot;html-code&quot;&gt;body&lt;/code&gt;), para englobar todos los elementos de la página (cabecera, contenido, pie de página ...), dar  a los elementos &lt;code class=&quot;html-code&quot;&gt;html&lt;/code&gt; y &lt;code class=&quot;html-code&quot;&gt;body&lt;/code&gt; un valor de alto del 100% (ya sabes para que) y distribuir el espacio disponible para que este sea ocupado por el contenido.&lt;/p&gt;

&lt;p&gt;Cuando hacemos que un elemento sea flexible, todos sus hijos pasan a comportarse de una manera concreta, en función a las propiedades que hayamos definido en este. A su vez, sus hijos disponen también de unas pocas propiedades que de otra forma no estarían disponibles para su uso. De entre estas últimas propiedades hay una que nos interesa, &lt;code&gt;flex-grow&lt;/code&gt; que nos permite distribuir el espacio libre disponibles entre los elementos contenidos dentro de un elemento flexible de la forma en que queramos.&lt;/p&gt;

&lt;p&gt;La gran ventaja de usar flexbox frente a &lt;code&gt;display:table&lt;/code&gt; es que nos podemos ahorrar el contenedor extra que necesitamos en caso de querer usar alguna propiedad que &lt;code&gt;display:table-row&lt;/code&gt; no soporta, como por ejemplo &lt;code&gt;padding&lt;/code&gt;. Por el resto es todo igual, nada de márgenes negativos y podemos tener un pie de página con medidas fluidas.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;body&amp;gt;
    &amp;lt;header&amp;gt;
        encabezado
    &amp;lt;/header&amp;gt;
    &amp;lt;main&amp;gt;
        contenido
    &amp;lt;/main&amp;gt;
    &amp;lt;footer&amp;gt;
        pie de página
    &amp;lt;/footer&amp;gt;
&amp;lt;/body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
html, body {
  height: 100%;
}
body {
  display: flex;
  flex-direction: column;
}
main {
  flex: 1;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;</description><link>http://www.hexagonalalien.es/2017/01/sticky-footer.html</link><author>noreply@blogger.com (LuisFran)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpmCnBaVyhJTbT2EqXMaZe6zmzTCS_0KzQLXkUBZJbumhdklnwUDYrwVI9BDOUQmezoXEtRBWplzX8vOGRtHZn99JE7V-_WW5iAZN6jNMkCSeHbyY43ADKdPA5MkzDKeIADZEQ6Ty-k7U/s72-c/empujando-coche.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-207665565542261309</guid><pubDate>Sat, 08 Oct 2016 17:58:00 +0000</pubDate><atom:updated>2016-10-08T19:58:50.853+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">HTML5</category><title>Details y Summary: efecto acordeón nativo de HTML5</title><description>&lt;figure class=&quot;post-img&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeloD3EjRfTQKCXXUKU5KRVC99ylZSq2pyReS_DovT-iNGkXb1y8jRd_2htvmCPl3lYfRMA83i8GFYaSAit_bGKti8VzEMjdelnkx02GqNhsLi4qBqaxEnlvYMYxtiqNFSavOkJsm8NHs/s1600/acordeon.jpg&quot; alt=&quot;Composición artística con un acordeón&quot; /&gt;
&lt;figcaption&gt;Imagen de &lt;a href=&quot;https://www.flickr.com/photos/andreshuco/&quot;&gt;Andreshuco&lt;/a&gt;.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Este Septiembre ha sido mucho más duro de lo esperado. Nuevo trabajo, nuevos estudios, las niñas empiezan al cole ..., y al final me he ido quedando sin tiempo para escribir. Así que una vez dejado atrás Septiembre y tantos cambios, mejor retomamos las buenas costumbres con un post sobre un par de interesantes elementos interactivos de HTML5, que ya hacía algún tiempo me rondaba por la cabeza.&lt;/p&gt;

&lt;p&gt;Los elementos &lt;code class=&quot;html-code&quot;&gt;details&lt;/code&gt; y &lt;code class=&quot;html-code&quot;&gt;summary&lt;/code&gt; son de esos elementos de HTML5 poco extendidos y por tanto poco conocidos. La excesiva avalancha de posts sobre los elementos semánticos (de la cual yo también soy responsable), ha dejado de lado ciertos elementos que aportan funciones muy interesantes, y que si bien todo esto se puede hacer con Javascript, ¿a quién no le apetece ahorrarse unas cuantas líneas de código?.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;section&gt;&lt;h2&gt;Cómo funcionan Details y Summary&lt;/h2&gt;

&lt;p&gt;Lo primero de todo es ponernos en situación, y bien podría ir a la especificación sobre &lt;a href=&quot;http://w3c.github.io/html/interactive-elements.html&quot;&gt;elementos interactivos&lt;/a&gt;, pero para este caso en concreto no creo que sea necesario, pues &lt;code class=&quot;html-code&quot;&gt;details&lt;/code&gt; no es mas que un widget que permite ocultar contenido y a demanda del usuario mostrarlo. Vamos, que es el típico efecto toggle o de acordeón.&lt;/p&gt;

&lt;p&gt;Como complemento a &lt;code class=&quot;html.code&quot;&gt;details&lt;/code&gt; tenemos el elemento &lt;code class=&quot;html.code&quot;&gt;summary&lt;/code&gt;, que  necesariamente debe ser hijo suyo, y muestra un resumen o leyenda que complementa la información que estamos ocultando. Es un elemento opcional, así que si prescindimos de él será el navegador quien decida el texto a mostrar, por ejemplo &quot;detalles&quot;.&lt;/p&gt;

&lt;p&gt;Seguro que sólo con lo que te he contado hasta ahora ya se te han ocurrido ejemplos de uso. ¿Tal vez para un spoiler?, ¿o quizás para la ficha técnica de un producto en una tienda online?. Ambas son soluciones sencillas con el uso de estos elementos, pero teniendo en cuante que tanto &lt;code class=&quot;html-code&quot;&gt;details&lt;/code&gt; como &lt;code class=&quot;html-code&quot;&gt;summary&lt;/code&gt; admiten otros elementos como hijos suyos, no sólo texto, y además está permitido el anidamiento de varios elementos &lt;code class=&quot;html-code&quot;&gt;details&lt;/code&gt;, esto da alas a diseñar, por ejemplo, un menú desplegable, y da igual el número de niveles que necesitemos, el ahorro de código es sustancial.&lt;/p&gt;

&lt;p&gt;Hay una última particularidad en el elemento &lt;code class=&quot;html.code&quot;&gt;details&lt;/code&gt;, y es cómo el navegador o agente de usuario conoce el estado de dicho elemento. Se hace de forma binaria, con el atributo &lt;code&gt;open&lt;/code&gt;, que se añade al elemento cuando su estado es expandido y se elimina cuando su estado se encuentra colapsado. Por tanto esto nos permite cambiar su estado inicial si añadimos este atributo en el HTML.&lt;/p&gt;

&lt;p&gt;Con un ejemplo, seguro que entiendes mejor toda la parrafada que te he soltado hasta ahora:&lt;/p&gt;

&lt;details&gt;
    &lt;summary&gt;Aquí hay mucho más de lo que parece&lt;/summary&gt;
    No, no es magia, sólo es HTML5.
&lt;/details&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;details&amp;gt;
    &amp;lt;summary&amp;gt;Aquí hay mucho más de lo que parece&amp;lt;/summary&amp;gt;
    No, no es magia, sólo es HTML5.
&amp;lt;/details&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Un poco de estilo&lt;/h2&gt;

&lt;p&gt;Aprovechando el atributo &lt;code&gt;open&lt;/code&gt; podemos cambiar el aspecto de &lt;code class=&quot;html.code&quot;&gt;details&lt;/code&gt; cuando este se encuentra expandido con CSS, mediante el &lt;a href=&quot;http://www.hexagonalalien.es/2016/03/selectores-de-css.html#selector-de-atributo&quot;&gt;selector de atributo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Lo ideal sería poder darle también estilo a ese triángulo que el navegador genera y que rota para indicar si su estado desplegado o colapsado. Los navegadores Webkit tienen un elemento para esto &lt;code&gt;::-webkit-details-marker&lt;/code&gt; que nos permite cambiar algunos estilos, como el color, el fondo y el tamaño. Sin embargo, a día de hoy, no es posible reemplazar ese triángulo. Aún así, nada nos impide ocultarlo aprovechando este pseudo-elemento y reemplazarlo usando &lt;code&gt;::before&lt;/code&gt; o &lt;code&gt;::after&lt;/code&gt;, o usar alguno de los trucos que has aprendido leyendo este blog.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Soporte en navegadores&lt;/h2&gt;

&lt;p&gt;Este sea quizás el punto por el cual estos dos elementos no está muy extendidos. Hasta hace bien poco el soporte era únicamente por parte de Chrome, Opera y Safari. A fecha de este artículo Firefox también les da soporte a partir de la versión 49. Por contra, tanto IE como Edge siguen sin darles soporte.&lt;/p&gt;

&lt;p&gt;Puedes consultar la página de &lt;a href=&quot;http://caniuse.com/#search=details&quot;&gt;caniuse&lt;/a&gt; para estar al tanto del soporte de estas propiedades en cuanto a navegadores.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;¿Y qué hay de la accesibilidad?&lt;/h2&gt;

&lt;p&gt;La accesibilidad es uno de los puntos negros cuando usamos ciertos tipos de controles, sobre todo cuando somos nosotros los que creamos dichos controles.&lt;/p&gt;

&lt;p&gt;En este caso, estamos usando una función nativa de HTML5, y es por tanto el navegador el que nos da soporte para que todo funcione correctamente, con lo cual la accesibilidad también está pensada.&lt;/p&gt;

&lt;p&gt;En navegación por teclado el elemento &lt;code class=&quot;html.code&quot;&gt;details&lt;/code&gt; es accesible con la tecla tabulador y la información oculta puede ser desplegada o colapsada tanto con la tecla enter, como con la barra espaciadora. Todo son ventajas.&lt;/p&gt;&lt;/section&gt;</description><link>http://www.hexagonalalien.es/2016/10/details-y-summary-efecto-acordeon.html</link><author>noreply@blogger.com (LuisFran)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeloD3EjRfTQKCXXUKU5KRVC99ylZSq2pyReS_DovT-iNGkXb1y8jRd_2htvmCPl3lYfRMA83i8GFYaSAit_bGKti8VzEMjdelnkx02GqNhsLi4qBqaxEnlvYMYxtiqNFSavOkJsm8NHs/s72-c/acordeon.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-4418431502322988934</guid><pubDate>Sat, 10 Sep 2016 15:33:00 +0000</pubDate><atom:updated>2017-06-16T12:33:05.485+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CSS</category><title>El box model y la propiedad box-sizing</title><description>&lt;figure class=&quot;post-img&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrRlvd-ZAP2UH4l6F1uIq2WEfmlIzqmDX8vGa9DnhvZJE8SHmW1oHYobFaP2hTpdKBFnr3ya-Fn2fTBT_Rd9vCwMUn3631OsVqZeV7q9LOGuQyQoH4SRiw__H3e5DjN7CmTiSwq7qojhE/s1600/crates.jpg&quot; alt=&quot;Composición artística con cajas&quot; /&gt;
&lt;figcaption&gt;Imagen de &lt;a href=&quot;https://www.flickr.com/photos/carsten_tb/&quot;&gt;Carsten ten Brink&lt;/a&gt;.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;El box model, o modelo de cajas, es uno de los pilares básicos para comprender el funcionamiento de CSS. Suele traer de cabeza a los que se inician con las hojas de estilo en cascada, y en ocasiones también a los no tan iniciados. Su entendimiento es la base para conseguir un layout sólido, sin miedo alguno a que en algún punto este se rompa.&lt;/p&gt;

&lt;p&gt;Con el tiempo el box model se ha ido quedando un poco desactualizado, y lo que antes era sólo una cuestión de entendimiento y unos pocos cálculos, con los layouts actuales se ha ido convirtiendo en una auténtica pesadilla. De ahí, que en CSS3 se incluyera la propiedad &lt;code&gt;box-sizing&lt;/code&gt;, que nos permite cambiar la forma en que se calculan las dimensiones de las cajas y nos hace la vida mucho más sencilla.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;h2&gt;¿Qué es una caja?&lt;/h2&gt;

&lt;p&gt;En HTML todos los elementos generan una caja que los contiene y sobre esta actúan los estilos que damos con CSS. Cada caja tiene una particularidad, en función del tipo de elemento que sea (generalmente son elementos en línea o de bloque), lo que redunda en como se relaciona con otros elementos.&lt;/p&gt;

&lt;p&gt;Una caja se define mediante las propiedades &lt;code&gt;width&lt;/code&gt;, &lt;code&gt;height&lt;/code&gt;, &lt;code&gt;padding&lt;/code&gt;, &lt;code&gt;border&lt;/code&gt; y &lt;code&gt;margin&lt;/code&gt;. En conjunto conforman el box model o modelo de caja.&lt;/p&gt;

&lt;h2&gt;Calculando las dimensiones de una caja&lt;/h2&gt;

&lt;p&gt;Por defecto, el ancho de una caja se calcula mediante la suma de &lt;code&gt;width&lt;/code&gt;, &lt;code&gt;padding&lt;/code&gt; horizontal y &lt;code&gt;border&lt;/code&gt; horizontal. Para el alto haríamos lo mismo, pero con &lt;code&gt;height&lt;/code&gt; y la suma de los valores verticales. También hay que tener en cuenta el &lt;code&gt;margin&lt;/code&gt; respecto al espacio que dicha caja ocupa en el documento, aunque realmente no compute para el cálculo del ancho o alto de la caja.&lt;/p&gt;

&lt;p&gt;Así, si por ejemplo le damos a una caja un &lt;code&gt;width&lt;/code&gt; de 30em y un &lt;code&gt;height&lt;/code&gt; de 20em, con un padding de 2em y un border de 0.1em, la anchura de la caja es 30 + 0.1 + 2 + 2 + 0.1 = 34.2em y no 30em que es lo que declaramos como ancho para la caja con la propiedad &lt;code&gt;width&lt;/code&gt;. De la misma forma calculamos el alto de la caja que nos da 24.2em y no 20em.&lt;/p&gt;

&lt;p&gt;Este es el modelo de caja tradicional, donde lo que definimos con &lt;code&gt;width&lt;/code&gt; y &lt;code&gt;height&lt;/code&gt; es el espacio reservado para el contenido, y todos los demás valores se añaden a él para conformar el tamaño final de la caja generada. Es todo una cuestión de estandarización, pues así se acordó en el documento de la W3C &lt;a href=&quot;https://www.w3.org/TR/CSS2/box.html&quot;&gt;Box model&lt;/a&gt;, para que todos los navegadores calculasen los tamaños de las cajas de la misma forma. Aunque como siempre en esto de las estandarizaciones hay alguna oveja negra, en este caso Microsoft y sus Ies.&lt;/p&gt;

&lt;p&gt;No tiene por qué gustarte, de hecho hay bastantes detractores, pero así es el box model y con él se ha trabajado durante años. Por suerte hay forma de cambiarlo, mediante la propiedad &lt;code&gt;box-sizing&lt;/code&gt;. Y digo por suerte, porque cuando trabajábamos con layouts fijos, sólo era cuestión de entender bien el box model y realizar unos pocos cálculos, para que todo saliese tal y como esperábamos. Sin embargo con los layouts de hoy en día, donde todas la medias son relativas y se trabaja mucho con porcentajes, la cosa no es tan sencilla.&lt;/p&gt;

&lt;p&gt;Cierto que se puede hacer un layout responsive con el modelo de cajas tradicional, pero en ese caso todas la medidas deben ir en porcentajes, y hay que hacer muy bien los cálculos sin dejarnos nada, o al final en algún punto, se romperá. Y esto puede que sea un gusto personal, pero a mí no me entusiasma para nada dar el valor de un borde en porcentaje. Me gusta que los bordes tengan siempre el mismo tamaño, y no que se vean o muy finos en dispositivos pequeños o muy gruesos para tamaños de pantalla grandes, con lo cual lo mejor es cambiar el modelo de caja.&lt;/p&gt;

&lt;h2&gt;Box-sizing: cambiando el modelo de caja&lt;/h2&gt;

&lt;p&gt;La propiedad &lt;code&gt;box-sizing&lt;/code&gt; nos permite cambiar el modelo de caja tradicional, y se puede declarar para cualquier elemento que soporte las propiedades &lt;code&gt;width&lt;/code&gt; y &lt;code&gt;height&lt;/code&gt;. Ah, por cierto, no se hereda.&lt;/p&gt;

&lt;p&gt;Tiene cuatro valores posibles:&lt;p&gt;

&lt;ul&gt;&lt;li&gt;&lt;code&gt;content-box&lt;/code&gt;: Es el valor por defecto, vamos el modelo de caja tradicional. El borde y margen interior (&lt;code&gt;padding&lt;/code&gt;) se dibujan por fuera del alto y ancho de la caja (se suman).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;padding-box&lt;/code&gt;: El margen interior, relleno o &lt;code&gt;padding&lt;/code&gt; se dibuja dentro. Esto significa que el &lt;code&gt;padding&lt;/code&gt; no modifica el tamaño de la caja, por contra resta el espacio disponible para el contenido. El espacio para el contenido es el alto y ancho menos el &lt;code&gt;paddind&lt;/code&gt;. Actualmente no está soportada por ningún navegador, aunque sí en algunas versiones anteriores de Firefox.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;border-box&lt;/code&gt;: El relleno y el borde se dibujan dentro del alto y del ancho. Con lo cual para calcular el tamaño disponible para el contenido dentro de la caja deberemos restar &lt;code&gt;border&lt;/code&gt; y &lt;code&gt;padding&lt;/code&gt; de &lt;code&gt;widht&lt;/code&gt; y &lt;code&gt;height&lt;/code&gt;. Lo realmente interesante es que ahora el borde y el relleno no modifican el tamaño de la caja.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;inherit&lt;/code&gt;: El elemento toma el valor de &lt;code&gt;box-sizing&lt;/code&gt; declarado en su padre o ancestro más próximo.&lt;/li&gt;&lt;/ul&gt;


&lt;h2&gt;Usando box-sizing&lt;/h2&gt;

&lt;p&gt;Generalmente cuando usamos &lt;code&gt;box-sizing&lt;/code&gt; queremos hacerlo para todo el documento, lo cual nos lleva ha realizar algún tipo de &quot;reset&quot;. El primer reset para usar esta propiedad es así de sencillo:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
* {
    box-sizing: border-box;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Funciona bastante bien, pero no tener en cuenta los pesudoelementos puede darnos alguna que otra sorpresa desagradable. Así que no tardó en aparecer una versión actualizada de este reset:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
*, *:before, *:after {
    box-sizing: border-box;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Es otro buen reset, pero el uso del selector * complica el cambio del modelo de caja a &lt;code&gt;content-box&lt;/code&gt; o &lt;code&gt;padding-box&lt;/code&gt; en algún punto del CSS. Lo que nos lleva a este último reset, que se apoya en la herencia para cambiar el modelo de caja en todo el documento, lo que también facilita posibles cambios en puntos concretos:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
html {
    box-sizing: border-box;
}
*, *:before, *:after {
    box-sizing: inherit;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Como bien te podrás imaginar, estos reset no me los he inventado yo, me los han chivado en CSS-Tricks, en un artículo de Marie Mosley dedicado a &lt;a href=&quot;https://css-tricks.com/box-sizing/&quot;&gt;Box Sizing&lt;/a&gt;.</description><link>http://www.hexagonalalien.es/2016/09/el-box-model-y-la-propiedad-box-sizing.html</link><author>noreply@blogger.com (LuisFran)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrRlvd-ZAP2UH4l6F1uIq2WEfmlIzqmDX8vGa9DnhvZJE8SHmW1oHYobFaP2hTpdKBFnr3ya-Fn2fTBT_Rd9vCwMUn3631OsVqZeV7q9LOGuQyQoH4SRiw__H3e5DjN7CmTiSwq7qojhE/s72-c/crates.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-5863737190418331148</guid><pubDate>Sat, 27 Aug 2016 14:14:00 +0000</pubDate><atom:updated>2016-08-31T14:48:42.665+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CSS</category><title>Cómo posicionar un elemento en el borde izquierdo de la pantalla: un caso práctico</title><description>&lt;figure class=&quot;post-img&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRBXXdSFfJayMEH4UMWIMF2BD9tsPaAjCDGhIDwrWmKwQKEhyW3BB83HW409SNRv-cIuqUYQeb413CojMllBxUUbL0fXUPD7IZy7DzzVygY64X21encoitEKSiPWqzzHjSdqFFMmw3xW8/s1600/mano-apuntando.jpg&quot; alt=&quot;Graffitti de mano apuntando a la izquierda&quot; /&gt;
&lt;figcaption&gt;Imagen de &lt;a href=&quot;https://www.flickr.com/photos/quinnanya/&quot;&gt;Quinn Dombrowski&lt;/a&gt; - modificada.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;De vez en cuando me doy de bruces con un caso que aunque a priori parece muy sencillo, termina complicándose hasta el punto de no saber por donde atajarlo. Para este caso concreto, por más que he buscado, rebuscado y leído, no he encontrado una solución a la que dar crédito, salvo la que vamos a ver en el artículo de hoy.&lt;/p&gt;

&lt;p&gt;Bien parece un caso simple, y de hecho lo es, si se trabaja con las herramientas adecuadas y no confundes el funcionamiento de algunas de la propiedades o valores que vamos a usar. Sin embargo es un caso específico, en que jugamos con márgenes automáticos, por tanto desconocemos completamente las medidas. Así que mejor vamos al lío.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;section&gt;&lt;h2&gt;Poniéndonos en situación&lt;/h2&gt;

&lt;p&gt;Lo primero de todo es ver el layout con el que vamos a trabajar. De hecho no nos hace falta verlo al completo, sólo una parte que es la que bien podría ser una entrada de cualquier blog.&lt;/p&gt;

&lt;p&gt;Tenemos por tanto un elemento padre, que contiene una entrada, con su encabezado y sus párrafos. Todo ello diseñado según el nuevo dogma, sí, responsive o fluido, como prefieras llamarlo.&lt;/p&gt;

&lt;p&gt;Este es el problema principal para el posicionamiento de nuestro elemento, que para este caso va a ser el &lt;code&gt;h1&lt;/code&gt; del artículo, ya que no conocemos ninguna medida concreta, y esto es lo que realmente lo complica todo. El código html es el siguiente:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;article&amp;gt;
    &amp;lt;h1&amp;gt;Título&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;Contenido&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;Más contenido&amp;lt;/p&amp;gt;
&amp;lt;/article&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ahora vamos añadir css muy básico, para que quede claro el punto de partida. Todo es fluido, por lo tanto &lt;code&gt;article&lt;/code&gt; ocupará el 100% del ancho de la pantalla en dispositivos pequeños, menos unos márgenes a izquierda y derecha para evitar que el texto quede pegado a los extremos de la pantalla, que los daremos mediante &lt;code&gt;padding&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Cuando el dispositivo sea mayor, &lt;code&gt;article&lt;/code&gt; no puede ser tan grande como todo el ancho de la pantalla, ya que líneas de texto muy largas pierden legibilidad. Por tanto, lo suyo es limitar su anchura mediante &lt;code&gt;max-width&lt;/code&gt; y centrarlo con márgenes automáticos.&lt;/p&gt;

&lt;p&gt;En cuando al encabezado y los párrafos no hay mucho que decir, son elementos de bloque y por tanto ocupan el 100% de su padre, y supongo que ya vas adivinando donde está el problema.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.article {
    max-width: 50em;
    margin: 0 auto;
    padding: 0 1em;
}

h1, p {
    margin: 1.25em 0;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;La primera tentativa&lt;/h2&gt;

&lt;p&gt;Lo lógico y según van las cosas es pensar en un posicionamiento absoluto, pero hay un problema, el solapamiento. Un elemento posicionado de forma absoluta, como supongo ya sabes, se sale del flujo normal del programa y pasa a ocupar la esquina superior izquierda de su elemento contenedor. Por contra, el resto de elementos se sitúan de la misma forma que si &lt;code&gt;h1&lt;/code&gt; no existiese, por tanto el encabezado y el primer párrafo acabarían solapándose.&lt;/p&gt;

&lt;p&gt;Cierto que esa no es la posición que buscamos, ya que lo queremos en el extremo izquierdo, pero nada nos asegura que su anchura vaya a ser tan pequeña para que no sobrepase lo márgenes automáticos de &lt;code&gt;article&lt;/code&gt;, y en dispositivos de pequeña pantalla pasaría sí o sí.&lt;/p&gt;

&lt;p&gt;Además no sabemos la altura del encabezado, por tanto no podemos dar un margen superior al primer párrafo para evitar el solapamiento. Se podría calcular, en función al tamaño de la fuente, pero nada nos garantiza que el texto vaya a ocupar una sola línea. Es lo que ocurre con diseños fluidos.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
h1 {
    position: absolute;
    left: 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Por tanto esto, no es lo que buscamos.&lt;/p&gt;

&lt;h2&gt;Acercándonos a la solución&lt;/h2&gt;

&lt;p&gt;Si no podemos usar una posición absoluta para luego mover el elemento, existen otras dos formas para hacerlo y que se mantenga el espacio que este debería ocupar: con una posición relativa o bien usando la propiedad &lt;code&gt;transform&lt;/code&gt; con la función &lt;code&gt;translate()&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
/*primera solución*/
h1 {
    position: relative;
    left: -x;
}

/*segunda solución*/
h1 {
    transform: translateX(-x);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;El problema radica en que no sabemos cuanto tenemos que mover el encabezado a la izquierda. Con el elemento posicionado de forma relativa no nos sirve el valor cero para la propiedad &lt;code&gt;left&lt;/code&gt;, ya que a diferencia de un elemento posicionado de forma absoluta, un elemento posicionado de forma relativa mantiene su posición de la misma forma que si estuviese posicionado de forma estática (que es el valor por defecto).&lt;/p&gt;

&lt;p&gt;Además toma su referencia para el desplazamiento en función al lugar donde está ubicado, y no a la esquina superior izquierda de la pantalla como lo hace un elemento posicionado de forma absoluta (siempre que no tenga algún ancestro posicionado de forma absoluta o relativa).&lt;/p&gt;

&lt;p&gt;Por tanto un elemento posicionado de forma relativa con los valores a cero de &lt;code&gt;left&lt;/code&gt; y &lt;code&gt;top&lt;/code&gt; se queda en el mismo punto en que estaba.&lt;/p&gt;

&lt;p&gt;Así que tanto para el caso de que posicionásemos el elemento de forma relativa, como si pensamos moverlo mediante la función &lt;code&gt;translate()&lt;/code&gt;, necesitamos saber cuanto vamos a moverlo hacia la izquierda, y sin ninguna medida concreta, la cosa se complica.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Y por fin, la solución&lt;/h2&gt;

&lt;p&gt;Como ya comenté al principio del artículo, no he encontrado ningún artículo, ni ninguna referencia para solucionar este problema, al menos no de forma directa. Por suerte soy un hambriento lector de todo tipo de artículo sobre CSS, y no hacía mucho que había leído uno de &lt;a href=&quot;https://twitter.com/chriscoyier&quot;&gt;Chris Coyier&lt;/a&gt; en el que daba una serie de formas para conseguir que un elemento sobrepasase los límites de su contenedor. El artículo, &lt;a href=&quot;https://css-tricks.com/full-width-containers-limited-width-parents/&quot;&gt;Full Width Containers in Limited Width Parents&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Aunque evidentemente no es una solución directa a nuestro problema, si que se parece en cierta forma. En varias de las soluciones que se dan en este artículo manejan las unidades de viewport, que son la clave para calcular el desplazamiento de nuestro elemento.&lt;/p&gt;

&lt;p&gt;Vamos a repasar que es lo que sabemos: con las unidades de viewport, en todo momento sabemos cuando mide a lo ancho la pantalla del navegador, y también sabemos lo que mide a lo ancho nuestro encabezado. Sí, ocupa del 100% de su contenedor. También conocemos el &lt;code&gt;padding&lt;/code&gt; que usamos para evitar que el texto se sitúe demasiado cerca de los bordes de la pantalla en dispositivos pequeños, pero este dato es irrelevante.&lt;/p&gt;

&lt;p&gt;Y ahora, lo que no sabemos: desconocemos la distancia, tanto a la izquierda como a la derecha, de nuestro contenedor (&lt;code&gt;article&lt;/code&gt;) respecto a los bordes del navegador.&lt;/p&gt;

&lt;p&gt;Con todo esto ya podemos calcular el desplazamiento a la izquierda. El tamaño del viewport horizontal menos el tamaño del elemento que queremos mover, nos da el valor de los huecos vacíos que tenemos a derecha e izquierda (esto incluye &lt;code&gt;margin&lt;/code&gt; y &lt;code&gt;padding&lt;/code&gt;). Por tanto la mitad de este valor, es la distancia que debemos mover nuestro objeto, para situarlo justo en el borde izquierdo de la pantalla.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
/*Posicionar elemento en borde izquierdo*/
h1 {
    transform: translateX(calc((-100vw + 100%)/ 2));
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Podemos hacer exactamente lo mismo para desplazar el elemento hacia la derecha, sin embargo las unidades de viewport no tienen en cuenta las barras de desplazamiento, y el calculo de un viewport 100 lo hace sin ella. Esto hace que el elemento se sitúe como si no existiese esa barra de desplazamiento, lo que al final se traduce en un &quot;overflow&quot; y la aparición de la nada deseada barra de desplazamiento horizontal.&lt;/p&gt;

&lt;p&gt;Por supuesto se puede arreglar. Como no sabemos el ancho de la barra de desplazamiento vertical, y dudando que sea el mismo para todos los navegadores, el problema podemos solucionarlo con &lt;code&gt;overflow-x&lt;/code&gt;. Además, hay que tener en cuenta que no todos lo navegadores muestran por defecto la barra de desplazamiento vertical, generalmente los navegadores de dispositivos móviles la tienen ocultan y sólo la muestran cuando nos desplazamos, con lo cual jugar con &lt;code&gt;overflow-x&lt;/code&gt; es la mejor solución.&lt;/p&gt;

 
&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
/*Posicionar elemento en borde derecho*/
body {
    overflow-x: hidden;
}

h1 {
    transform: translateX(calc((100vw - 100%)/ 2));
    padding-right: 1em; /*para evitar que se nos corte el texto*/
}
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;p&gt;Este no ha sido el típico artículo que suelo publicar en el blog, pero ante las complicaciones que encontré para realizar algo, en principio tan simple, me pareció apropiado comentarlo por si puede serle útil a alguien. Además, de paso, aprovecho para aclarar ciertos conceptos e ir introduciendo en el blog las unidades viewport, que si bien no creo que sean el paradigma para el diseño responsive, en ciertas ocasiones nos vienen muy bien.&lt;/p&gt;</description><link>http://www.hexagonalalien.es/2016/08/posicionar-elemento-borde-izquierdo-pantalla.html</link><author>noreply@blogger.com (LuisFran)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRBXXdSFfJayMEH4UMWIMF2BD9tsPaAjCDGhIDwrWmKwQKEhyW3BB83HW409SNRv-cIuqUYQeb413CojMllBxUUbL0fXUPD7IZy7DzzVygY64X21encoitEKSiPWqzzHjSdqFFMmw3xW8/s72-c/mano-apuntando.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-8905306658391162594</guid><pubDate>Sat, 13 Aug 2016 17:19:00 +0000</pubDate><atom:updated>2017-03-01T23:02:50.302+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Accesibilidad</category><category domain="http://www.blogger.com/atom/ns#">CSS</category><title>7 formas de ocultar elementos con CSS</title><description>&lt;figure class=&quot;post-img&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg86uDIJN7Eleh8ikLQZtifq3YvukG_5SVfqZAaZx9QgT6XC4Wt8LCA8uCvV4MAtaFX50jk8_DqExXbOKYIrSyRAWqoJok1AkRZ2lbhtLYASBCeKQtAjvfNmx3Upt3CaDXRVfIiJa3qR2U/s1600/oculta-tras-un-arbol.jpg&quot; alt=&quot;Mujer oculta tras un árbol&quot; /&gt;
&lt;figcaption&gt;Imagen de &lt;a href=&quot;https://www.flickr.com/photos/andielinn/&quot;&gt;Andie Linn&lt;/a&gt; - modificada.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Es muy sencillo ocultar un elemento con CSS, sólo debemos escoger la propiedad adecuada y aplicarla. ¿Pero realmente sabemos que es lo que está ocurriendo?, porque no es lo mismo hacer &lt;code&gt;opacity: 0&lt;/code&gt; que &lt;code&gt;display: none&lt;/code&gt;, de hecho difieren bastante. Según que técnica usemos tendrá unos u otros efectos, pero no sólo sobre él mismo, sino que también puede afectar al resto de elementos posteriores a él.&lt;/p&gt;

&lt;p&gt;En este artículo vamos a ver 7 formas de ocultar un elemento con CSS y también veremos que es lo que realmente hace la propiedad que usemos para tal efecto. ¿Se compromete o no la accesibilidad?, ¿qué pasa con la navegación por teclado?, y porqué no, ¿hay algún efecto negativo en cuanto a SEO?. Todas estas preguntas deberemos hacérnoslas para elegir la forma idónea para ocultar un elemento.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;section&gt;&lt;h2&gt;Opacity&lt;/h2&gt;

&lt;p&gt;La propiedad &lt;code&gt;opacity&lt;/code&gt; nos permite controlar el grado de transparencia de un elemento. Si la ponemos a cero hace que desaparezca de la vista del usuario, pero a efectos del layout el elemento sigue ocupando el mismo espacio que si fuese totalmente opaco.&lt;/p&gt;

&lt;p&gt;El elemento que ocultamos de esta forma sigue respondiendo a las acciones del usuario (un enlace sigue siendo clicable), recibe el foco si usamos la navegación por teclado y será leído por cualquier screen reader. A todos los efectos el elemento sigue ahí, lo único que ha cambiado es que ahora es transparente.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.oculto {
    opacity: 0;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Visibility&lt;/h2&gt;

&lt;p&gt;La propiedad &lt;code&gt;visibility&lt;/code&gt; con el valor &lt;code&gt;hidden&lt;/code&gt; nos permite ocultar un elemento, de hecho de una forma muy parecida a la propiedad &lt;code&gt;opacity&lt;/code&gt; aunque con alguna diferencia sustancial.&lt;/p&gt;

&lt;p&gt;Al igual que ocurre con la propiedad &lt;code&gt;opacity&lt;/code&gt; el elemento que ocultamos toma su lugar dentro del layout. La gran diferencia es que el usuario no puede interactuar con el elemento. Además el elemento no recibe el foco en la navegación por teclado y no es accesible de cara al uso de screen readers.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.oculto {
    visibility: hidden;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Display&lt;/h2&gt;

&lt;p&gt;Si le aplicamos el valor &lt;code&gt;none&lt;/code&gt; a la propiedad &lt;code&gt;display&lt;/code&gt; conseguimos ocultar el elemento en el sentido estricto de la palabra. El elemento ocultado de esta manera no genera modelo de caja, con lo cual además de estar oculto a la vista, el elemento es sacado del flujo normal de programa. A efectos del resto de elementos, estos se comportan como si el elemento no existiese en el DOM.&lt;/p&gt;

&lt;p&gt;Puesto que el elemento queda ocultado completamente, el usuario no puede interactuar con él, ni es accesible mediante la navegación por teclado, ni mucho menos va a ser anunciado por un screen reader. A todos los efecto hemos hecho que desaparezca, tanto él como sus descendientes.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.oculto {
    display: none;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Posicionar el elemento fuera de pantalla&lt;/h2&gt;

&lt;p&gt;Desplazar un elemento lo suficiente para que se salga de la pantalla (o viewport) siempre ha sido una de las formas clásicas de hacer desaparecer un elemento. Mediante la propiedad &lt;code&gt;display&lt;/code&gt; con su valor &lt;code&gt;position&lt;/code&gt; y alguna de las cuatro propiedades de colocación &lt;code&gt;top&lt;/code&gt;, &lt;code&gt;right&lt;/code&gt;, &lt;code&gt;bottom&lt;/code&gt; o &lt;code&gt;left&lt;/code&gt;, con un valor lo suficiente grande, podemos hacer desaparecer un elemento sacándolo del campo de visión.&lt;/p&gt;

&lt;p&gt;Como lo único que hemos hecho es desplazar el elemento, este es accesible desde teclado, pudiendo recibir el foco, lo cual si se usa este tipo de navegación puede resultar confuso, ya que este desaparece también del campo de visión. Está en nuestras manos corregir este problema, haciendo por ejemplo que vuelva a aparecer el elemento cuando recibe el foco.&lt;/p&gt;

&lt;p&gt;Ocultando el elemento de esta forma los screen readers pueden anunciarlo. En cuanto a la interacción del usuario con un elemento ocultado de esta forma, queda claro que no es posible, ni con ratón, ni mediante una pantalla táctil (como la de cualquier teléfono móvil). Sin embargo si que podemos interactuar con él mediante la navegación por teclado, ya que puede recibir el foco.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.oculto {
    position: absolute;
    top: -9999px;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Jugando con el tamaño&lt;/h2&gt;

&lt;p&gt;Si un objeto no tiene ninguna dimensión, está claro que no es visible. En CSS podemos poner los tamaños (&lt;code&gt;width&lt;/code&gt; y &lt;code&gt;height&lt;/code&gt;) de un elemento a cero y mágicamente este desaparece. Es aconsejable también poner a cero &lt;code&gt;margin&lt;/code&gt;, &lt;code&gt;padding&lt;/code&gt; y &lt;code&gt;border&lt;/code&gt;, por si el elemento tuviese algún valor por defecto en alguna de estas propiedades.&lt;/p&gt;

&lt;p&gt;Además es recomendable usar &lt;code&gt;overflow:hidden&lt;/code&gt; para evitar desbordamientos y poner también a cero la propiedad &lt;code&gt;line-height&lt;/code&gt; en elementos &lt;code&gt;inline-block&lt;/code&gt; para evitar espacios no deseados que generan algunos navegadores.&lt;/p&gt;

&lt;p&gt;Con este tipo de ocultación, creo que queda claro que no es posible que el usuario realice ninguna acción sobre el elemento, salvo por teclado, ya que el elemento puede recibir el foco. En teoría, un screen reader anunciaría el elemento, aunque al no haber testado este tipo de ocultación con ellos, no me atrevo a aventurar nada.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.oculto {
    width: 0;
    height: 0;
    margin: 0;
    padding: 0;
    border: 0;
    line-height: 0; /* sólo en caso de elementos inline-block */
    overflow: hidden;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Clip&lt;/h2&gt;

&lt;p&gt;Realizar un recorte con la propiedad &lt;code&gt;clip&lt;/code&gt; es también una buena forma de ocultar un elemento. Es tan sencillo como declarar las cuatro coordenadas con las que creamos la forma recortada, que según esta propiedad sólo puede ser un rectángulo, con un mismo valor. Para que sea accesible a los screen readers es recomendable no usar el valor cero, ya que algunos de ellos tienen problemas y pueden no anunciar el elemento.&lt;/p&gt;

&lt;p&gt;Al igual que ocurre con otras formas de ocultar elementos no permite acción alguna por parte del usuario, salvo en la navegación por teclado, ya que puede recibir el foco.&lt;/p&gt;

&lt;p&gt;Es una de las forma más usadas para ocultar un elemento cuando queremos mantener la accesibilidad, y no es porque lo diga yo, muchos expertos en accesibilidad así lo aseguran, como &lt;a href=&quot;https://twitter.com/olgacarreras&quot;&gt;Olga Carreras&lt;/a&gt;, que en su artículo &lt;a href=&quot;http://olgacarreras.blogspot.com.es/2011/11/ocultar-contenido-sin-comprometer-la.html&quot;&gt;ocultar contenido sin comprometer la accesibilidad ni el posicionamiento de la página&lt;/a&gt;, realiza un análisis de 5 técnicas para ocultar contenido desde el punto de vista de la accesibilidad.&lt;/p&gt;

&lt;p&gt;Tan sólo un apunte más, el elemento debe estar posicionado de forma absoluta para permitir realizar un recorte mediante la propiedad &lt;code&gt;clip&lt;/code&gt;, es una de la limitaciones de esta propiedad, sobre la que puedes leer más en el interesante artículo &lt;a href=&quot;https://www.impressivewebs.com/css-clip-property/&quot;&gt;The CSS Clip Property&lt;/a&gt; de Louis Lazaris.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.oculto {
    position: absolute
    clip: rect(1px, 1px, 1px, 1px);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Clip-path&lt;/h2&gt;

&lt;p&gt;La propiedad &lt;code&gt;clip-path&lt;/code&gt; viene a sustituir a la obsoleta propiedad &lt;code&gt;clip&lt;/code&gt; (que se sigue usando para ocultación de elementos). A diferencia de la propiedad &lt;code&gt;clip&lt;/code&gt;, &lt;code&gt;clip-path&lt;/code&gt; permite más formas de recorte que un simple rectángulo, además de la aplicación de patrones de recorte mediante SVGs, tanto en línea como externos, aunque sobre esto ya hablamos en el artículo &lt;a href=&quot;http://www.hexagonalalien.es/2016/07/recortando-con-css-clip-path.html&quot;&gt;recortando con CSS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Lo que nos interesa de &lt;code&gt;clip-path&lt;/code&gt; en este caso, es la posibilidad de ocultar un elemento, y se hace de forma muy similar a como lo hicimos con &lt;code&gt;clip&lt;/code&gt;. Para ello podemos usar cualquiera de las formas básica de CSS o un SVG, siempre que creemos una región de recorte de valor igual a cero. Esto no quiere decir que los valores sean igual a cero, tan sólo el valor de la región de recorte, de hecho al igual que ocurriese para la propiedad &lt;code&gt;clip&lt;/code&gt; debemos evitar los valores a cero para mantener la accesibilidad.&lt;/p&gt;

&lt;p&gt;A mi parecer la forma más sencilla de hacerlo es con la forma básica &lt;code&gt;polygon&lt;/code&gt;, que nos permite crear cualquier tipo de polígono mediante pares de coordenadas. Lo único de debemos hacer es que estos pares de coordenadas tengan el mismo valor. Por cierto, se puede aplicar &lt;code&gt;clip-path&lt;/code&gt; sobre cualquier elemento, no es necesario que esté posicionado de forma absoluta.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.oculto {
    clip-path: polygon(1px 1px, 1px 1px, 1px 1px);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;h2&gt;¿Y qué pasa con el SEO?&lt;/h2&gt;

&lt;p&gt;Habrás notado que a pesar de ser una de la preguntas que me hacía en la introducción, no he hablado nada sobre SEO, y es que realmente no creo que ninguna de estas técnicas tenga ningún efecto negativo. A pesar de ello hay expertos que aseguran que las formas más fiables de cara al SEO son &lt;code&gt;clip&lt;/code&gt; y &lt;code&gt;clip-path&lt;/code&gt;, no deberíamos tener problemas con ninguna de las otras técnicas siempre que no ocultemos contenido con fines perniciosos.&lt;/p&gt;

&lt;p&gt;Piénsalo fríamente, ¿tiene sentido algún tipo de penalización por parte de San Google cuando intentamos que nuestra web sea más accesible?, pues no. Es muy habitual ocultar contenido cuando complementamos enlaces del tipo &quot;leer más&quot;, o cuando ocultamos el típico menú &quot;saltar a&quot;. Ambas con soluciones para favorecer una mejor navegación a usuarios de screen readers, y que generalmente son ocultados porque no ofrecen ninguna ventaja en una navegación tradicional.&lt;/p&gt;

&lt;p&gt;Así que cuando ocultes contenido, en cuando a SEO, mas que pensar en la forma de ocultarlo, piensa si lo que estás ocultando lo haces para mejorar la accesibilidad, la navegación, o algún punto importante de tu web, o sólo para que tus usuarios no vean que intentas engañar a Google, y no deberías tener ningún problema.&lt;/p&gt;</description><link>http://www.hexagonalalien.es/2016/08/7-formas-de-ocultar-elementos-con-css.html</link><author>noreply@blogger.com (LuisFran)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg86uDIJN7Eleh8ikLQZtifq3YvukG_5SVfqZAaZx9QgT6XC4Wt8LCA8uCvV4MAtaFX50jk8_DqExXbOKYIrSyRAWqoJok1AkRZ2lbhtLYASBCeKQtAjvfNmx3Upt3CaDXRVfIiJa3qR2U/s72-c/oculta-tras-un-arbol.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-4789200057856568720</guid><pubDate>Mon, 01 Aug 2016 07:00:00 +0000</pubDate><atom:updated>2017-02-12T22:52:31.436+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CSS</category><title>Ni tan fácil ni tan difícil: centrando con CSS</title><description>&lt;figure class=&quot;post-img&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEuMrgENtu7cdKOkLT93V_Tbvc5U5ehLZ5AKPOtm_ol-RpLlej22pGFK3oic5r3WQFYWE3zMhbb8ueDsBoYoABP1duOgXHeljfqfIAMDk0-7VMmFqbOTgP-092Q4ndXreSUMJQXUqL6J4/s1600/flor.jpg&quot; alt=&quot;Flor delante de una valla&quot; /&gt;
&lt;figcaption&gt;Imagen de &lt;a href=&quot;https://www.flickr.com/photos/aftab/&quot;&gt;Aftab Uzzaman&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;El centrado en CSS es uno de los temas más recurrentes, y es que ¿quién no ha tenido algún percance con un elemento que quería centrar?, ¿quién no se ha dado de cabezazos contra la mesa?, o ¿quién no ha llegado a lanzar el teclado por la ventana?.&lt;/p&gt;

&lt;p&gt;Si en alguna ocasión te ha ocurrido algo de esto, no desesperes, tan sólo preocúpate de recoger el teclado (lo vas a necesitar), del resto nos vamos a ocupar hoy en este artículo. Porque el centrado en CSS no es tan fácil, pero tampoco tan difícil.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;p&gt;Por regla general, a la hora de centrar un elemento, no tenemos en cuenta el modelo de caja con el que estamos trabajando, ni tampoco las propiedades definidas sobre dicho elemento. Esto nos lleva a cometer cierto tipo de errores que al final nos lleva irremediablemente a no conseguir centrar el elemento. En este artículo vamos a ver unas cuantas formas de centrado (que con el tiempo iré ampliando), para conseguir centrar un elemento en cualquier situación.&lt;/p&gt;

&lt;h2&gt;Centrado horizontal&lt;/h2&gt;

&lt;h3&gt;Centrado horizontal de un elemento en línea&lt;/h3&gt;

&lt;p&gt;Un elemento en línea toma como valor la anchura de su contenido, con lo cual siempre y cuando el contenido del elemento tenga una anchura menor que la del padre del elemento, podemos centrarlo. ¿Y cómo?, pues con la propiedad &lt;code&gt;text-align&lt;/code&gt; y su valor &lt;code&gt;center&lt;/code&gt; aplicada sobre su padre.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.contenedor {
    text-align: center;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Este tipo de centrado también podemos usarlo si el elemento a centrar es &lt;code&gt;inline-block&lt;/code&gt;.&lt;/p&gt;


&lt;h3&gt;Centrado horizontal de un elemento en bloque con anchura declarada&lt;/h3&gt;

&lt;p&gt;El caso más sencillo para centrar un elemento horizontalmente es conociendo su anchura, y nos da igual si sus medidas son fijas o relativas. Para ello sólo necesitamos el valor &lt;code&gt;auto&lt;/code&gt; de la propiedad &lt;code&gt;margin&lt;/code&gt;. Con esto conseguimos que el espacio del padre no ocupado por el hijo, se reparta equitativamente tanto a su izquierda como a su derecha.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.centrado {
    width: 12em;
    margin: 0 auto;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Centrado horizontal de un elemento de bloque sin anchura declarada: márgenes&lt;/h3&gt;

&lt;p&gt;Un elemento de bloque sin anchura declarada ocupa el 100% de su ancho disponible, con lo cual y a priori podrías pensar que no se puede centrar, pues no es así.&lt;/p&gt;

&lt;p&gt;Jugando con sus márgenes podemos conseguir centrarlo, tan sólo necesitamos dar el mismo valor tanto a la izquierda como a la derecha, y voila, elemento centrado.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.centrado {
    margin-left: 1em;
    margin-right: 1em;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Centrado horizontal de un elemento sin anchura declarada: display:table&lt;/h3&gt;

&lt;p&gt;Un elemento con &lt;code&gt;display:table&lt;/code&gt; se comporta exactamente igual a una tabla, y hay una propiedad muy interesante que nos interesa cuando intentamos centrar horizontalmente un elemento al cual no le hemos declarado un ancho. Una tabla amolda su ancho, siempre que sea posible, a su contenido.&lt;/p&gt;

&lt;p&gt;Esta peculiaridad nos permite usar el margen automático a derecha e izquierda para poder centrarlo.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.centrado {
    display: table;
    margin: 0 auto;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;También podríamos podríamos usar este centrado con un ancho declarado, aunque lo cierto es que no tiene mucho sentido hacerlo.&lt;/p&gt;

&lt;h2&gt;Centrado vertical&lt;/h2&gt;

&lt;h3&gt;Centrado vertical de un elemento en línea&lt;/h3&gt;

&lt;p&gt;Este caso es muy común, sobre todo para elementos de texto, aunque vale para cualquier elemento en línea. Sólo hay que tener en cuenta que este elemento en línea debe estar contenido dentro de un elemento en bloque sin altura definida, como por ejemplo un texto dentro de un elemento &lt;code&gt;p&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Un elemento en bloque sin altura definida toma como valor la misma que la de su contenido, por tanto para centrar verticalmente su contenido tan sólo es necesario darle un mismo valor a su &lt;code&gt;padding&lt;/code&gt; superior e inferior.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
p {
    padding-top: 2em;
    pading-bottom: 2em;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Centrado vertical de un elemento en línea que ocupa una sola línea&lt;/h3&gt;

&lt;p&gt;Este es un caso muy particular, y podría resolverse de la misma forma que el caso anterior, pero si conocemos la altura del elemento contenedor, podemos jugar con la propiedad &lt;code&gt;line-height&lt;/code&gt; igualando su valor al de la altura del contenedor, y de esta forma el elemento en línea contenido aparecerá centrado verticalmente.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.contenedor {
    line-height: 5em;
    height: 5em;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Centrado vertical de un elemento con display:table&lt;/h3&gt;

&lt;p&gt;La propiedad &lt;code&gt;display&lt;/code&gt; junto con su valor &lt;code&gt;table&lt;/code&gt; nos permite jugar con una propiedad de CSS para centrar elementos de forma vertical, que no es ni mas ni menos que &lt;code&gt;vertical-align&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para ello necesitaremos un contenedor al que le aplicaremos &lt;code&gt;display:table&lt;/code&gt; y un elemento a centrar con &lt;code&gt;display: table-cell&lt;/code&gt;. Muchos puristas aseguran que es necesario un elemento intermedio con &lt;code&gt;display:table-row&lt;/code&gt;, pero en realidad el centrado se realiza sin necesidad de él. ¡Ah!, y por mucho que te digan, realmente CSS no es semántico.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.contenedor {
    display: table;
}

.centrado {
    display: table-cell;
    vertical-align: middle;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Doble centrado&lt;/h2&gt;

&lt;p&gt;Hago esta clasificación para englobar propiedades que permiten centrar tanto horizontalmente como verticalmente, aunque también se pueden usar para centrar sólo verticalmente o sólo horizontalmente.&lt;/p&gt;

&lt;h3&gt;Doble centrado con medidas de padre e hijo conocidas: elemento posicionado&lt;/h3&gt;

&lt;p&gt;Si conocemos la altura y anchura tanto del padre como del hijo, podemos recurrir al posicionamiento para centrar el hijo, aplicando una simple fórmula: &lt;code&gt;top = (altura del padre - altura del hijo) / 2&lt;/code&gt; y &lt;code&gt;left = (ancho del padre - ancho del hijo) / 2&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.contenedor {
    position: relative;
    widht; 6em;
    height: 8em;
}

.centrado {
    position: absolute;
    widht: 3em;
    height: 4em;
    top: 2em;
    left: 1em;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Doble centrado con medidas conocidas del elemento a centrar: márgenes negativos&lt;/h3&gt;

&lt;p&gt;Si únicamente conocemos las medidas del elemento a centrar el procedimiento es muy similar al caso anterior, pero en vez de aplicar la fórmula (de la que desconocemos datos) podemos jugar con márgenes negativos.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.contenedor {
    position: relative;
}

.centrado {
    position: absolute;
    top: 50%;
    left: 50%;
    widht: 6em;
    height: 4em;
    margin-top: -2em;
    margin-left: -3em;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Necesitamos usar márgenes negativos porque la referencia que tomamos del elemento es la esquina superior izquierda (borde superior y borde izquierdo), y lo que necesitamos es su centro. Es tan sencillo como mover el elemento (mediante márgenes negativos) hacia arriba y a la izquierda, concretamente la mitad de su alto y la mitad de su ancho.&lt;/p&gt;


&lt;h3&gt;Doble centrado con medidas desconocidas: transform&lt;/h3&gt;

&lt;p&gt;En ocasiones necesitamos realizar un doble centrado y no conocemos las medidas del elemento a centrar, y tampoco las del padre. En este caso la propiedad &lt;code&gt;transform&lt;/code&gt; con su valor &lt;code&gt;translate&lt;/code&gt; es todo lo que necesitamos.&lt;p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.contenedor {
    position: relative;
}

.centrado {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate (-50%, -50%);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;El centrado se realiza con el mismo cálculo que usamos con los márgenes negativos, teniendo en cuenta que cuando usamos porcentajes con el valor &lt;code&gt;translate&lt;/code&gt; estos toman como referencia el tamaño (heigth o width) del elemento sobre el que se aplica &lt;code&gt;transform&lt;/code&gt;. Puedes leer más a fondo sobre la propiedad &lt;code&gt;transform&lt;/code&gt; y este comportamiento en el documento de la W3C &lt;a href=&quot;https://www.w3.org/TR/css-transforms-1/#transform-property&quot;&gt;CSS Transforms Module Level 1&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Doble centrado con medidas desconocidas: propiedades left/top/rigth/bottom.&lt;/h3&gt;

&lt;p&gt;Esta es una forma muy original de realizar un doble centrado, que vi por primera vez en este &lt;a href=&quot;http://jsfiddle.net/mBBJM/1/&quot;&gt;JsFiddle&lt;/a&gt;, referenciado en el artículo &lt;a href=&quot;https://www.smashingmagazine.com/2013/08/absolute-horizontal-vertical-centering-css/&quot;&gt;Absolute Horizontal And Vertical Centering In CSS&lt;/a&gt; de Smashing Magazine. Simplemente pura magia.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.contenedor {
    position: relative;
}

.centrado {
    position: absolute;
    top: 0;
    rigth: 0;
    bottom: 0;
    left: 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Doble centrado con medidas desconocidas: Flexbox&lt;/h3&gt;

&lt;p&gt;La &quot;caja flexible&quot; de CSS3 hace que las cosas sean muy sencillas y el centrado no podía ser menos. Definimos un contenedor con la propiedad &lt;code&gt;display:flex&lt;/code&gt; y todos sus hijos son obedientes cajas flexibles (¡todos al centro!, ¡ar!).&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.contenedor {
    display: flex;
    justify-content: center;
    align-items: center;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Doble centrado con medidas desconocidas: Flexbox y margin:auto&lt;/h3&gt;

&lt;p&gt;Una de las peculiaridades de Flexbox es como se comportan los elementos con esta propiedad cuando tiene algún margen en tamaño automático. Te aconsejo leas esta interesante artículo de Sam Provenza titulado &lt;a href=&quot;https://medium.com/@samserif/flexbox-s-best-kept-secret-bd3d892826b6#.ditc3elzc&quot;&gt;Flexbox’s Best-Kept Secret&lt;/a&gt; y entenderás lo fácil que es hacer este centrado.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.contenedor {
    display: flex;
}

.centrado {
    margin: auto;
}
&lt;/code&gt;&lt;/pre&gt;</description><link>http://www.hexagonalalien.es/2016/08/centrado-vertical-horizontal-css.html</link><author>noreply@blogger.com (LuisFran)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEuMrgENtu7cdKOkLT93V_Tbvc5U5ehLZ5AKPOtm_ol-RpLlej22pGFK3oic5r3WQFYWE3zMhbb8ueDsBoYoABP1duOgXHeljfqfIAMDk0-7VMmFqbOTgP-092Q4ndXreSUMJQXUqL6J4/s72-c/flor.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-4900756169582065373</guid><pubDate>Sat, 16 Jul 2016 14:13:00 +0000</pubDate><atom:updated>2017-02-17T13:17:47.077+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CSS</category><title>Recortando con CSS: clip-path</title><description>&lt;figure class=&quot;post-img&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj2484exwMqNXCgaDPmXNK-ltmk_E4csgfvjPx8zjXpAAAzGKhXMdLsryFsyJFTk-nIXnhcte2kEaTAZw_hrjJwL60MLmpLZNmI8tKsJcfr0kHmcUHaBj9y-bs_33stUkTo3BDsfxA8uY/s1600/recorte.jpg&quot; alt=&quot;Collage de recortes sobre trozo de madera&quot; /&gt;
&lt;figcaption&gt;Imagen de &lt;a href=&quot;https://www.flickr.com/photos/hoodedfang/&quot;&gt;Barret Cook&lt;/a&gt; - modificada.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;CSS y SVG tienen cada vez más cosas en común, y es que hay una clara tendencia a introducir nuevas propiedades en CSS que vienen directamente importadas de SVG. Entre ellas se encuentra clip-path, una operación que forma parte de la especificación de SVG desde 2000 y que ha sido trasladada a CSS, permitiéndonos realizar &quot;recortes&quot; sobre elementos HTML.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;


&lt;section&gt;&lt;h2&gt;Pero, ¿qué es un recorte en CSS?&lt;/h2&gt;

&lt;p&gt;Un recorte (clipping) es una operación gráfica que permite ocultar partes de un elemento, bien sea de forma parcial o total. Las partes del elemento que son mostradas u ocultadas son determinadas por una &quot;trayectoria de recorte&quot; (clipping path).&lt;/p&gt;

&lt;p&gt;Cuando definimos una &quot;trayectoria de recorte&quot;, estamos creando una región dentro de la cual todo es visible, por contra, todo lo que está fuera de ella desaparece del lienzo o canvas. Esto no sólo incluye fondos, bordes o sombreados, sino también eventos del tipo hover o click.&lt;/p&gt;

&lt;p&gt;A pesar de que el nuevo elemento creado mediante esta operación, tiene nuevas dimensiones sea o no rectangular, el resto de elementos fluyen dentro del documento de la misma forma que si no se le hubiese aplicado dicho recorte. Para conseguir que el resto del contenido fluya, en función de la nueva forma que hemos creado mediante la operación de recorte, debemos usar las propiedades para formas de CSS &lt;code&gt;shape-outside&lt;/code&gt; o &lt;code&gt;shape-inside&lt;/code&gt; especificadas en el documento de la W3C &lt;a href=&quot;https://www.w3.org/TR/css-shapes/&quot;&gt;CSS Shapes&lt;/a&gt;. Si quieres profundizar algo más sobre el tema te invito a que leas el interesante artículo &lt;a href=&quot;https://sarasoueidan.com/blog/css-shapes/&quot;&gt;CSS Shapes de Sara Soueidan&lt;/a&gt;.&lt;/p&gt;&lt;/section&gt;

&lt;h2&gt;Clip-path no es lo mismo que clip&lt;/h2&gt;

&lt;p&gt;La propiedad &lt;code&gt;clip&lt;/code&gt; de CSS2.1 es una antigua y restrictiva propiedad, que permitía realizar recortes únicamente mediante formas rectangulares sobre elementos posicionados de forma absoluta. Actualmente ha sido reemplazada por &lt;code&gt;clip-path&lt;/code&gt;.

&lt;p&gt;Sin embargo aún se sigue usando, ya que es una de las mejores formas de &lt;a href=&quot;http://www.hexagonalalien.es/2016/08/7-formas-de-ocultar-elementos-con-css.html&quot;&gt;ocultar un elemento a la vista&lt;/a&gt; y que este siga siendo accesible.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.objeto {
  clip: rect(110px, 160px, 170px, 60px);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;La forma de construcción del rectángulo también difiere de la forma en que se construye en &lt;code&gt;clip-path&lt;/code&gt; mediante la forma básica &lt;code&gt;inset()&lt;/code&gt;. Si quieres profundizar más en esta propiedad hay un buen &lt;a href=&quot;https://www.impressivewebs.com/css-clip-property/&quot;&gt;artículo de Louis Lazaris sobre la propiedad clip&lt;/a&gt;, que además explica de forma gráfica cómo se calcula el rectángulo de recorte.&lt;/p&gt; 

&lt;section&gt;&lt;h2&gt;Sintaxis y uso de clip-path&lt;/h2&gt;

&lt;p&gt;La sintaxis correcta para el uso de esta propiedad es:&lt;/p&gt;

&lt;pre&gt;clip-path: &amp;lt;clip-source&amp;gt; | [ &amp;lt;basic-shape&amp;gt; || &amp;lt;geometry-box&amp;gt; ] | none&lt;/pre&gt;

&lt;p&gt;Para esta primera toma de contacto con la propiedad &lt;code&gt;clip-path&lt;/code&gt; vamos a obviar el valor geometry-box, que además es opcional, y centrarnos en lo sencillo que es crear un recorte bien sea mediante clip-source, que será un URL que especifica un elemento &lt;code class=&quot;html-code&quot;&gt;clipPath&lt;/code&gt; de un SVG en línea o externo, o bien mediante basic-shape, que será una de las &lt;a href=&quot;https://www.w3.org/TR/css-shapes-1/#typedef-basic-shape&quot;&gt;formas básicas de CSS&lt;/a&gt; especificadas en el documento de la W3C &lt;a href=&quot;https://sarasoueidan.com/blog/css-shapes/&quot;&gt;CSS Shapes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Es mucho más simple y directo de lo que parece:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
/* referenciando una trayectoria de un SVG en línea &lt;code class=&quot;html-code&quot;&gt;clipPath&lt;/code&gt; */
clip-path: url(#path1); 

/* referenciando una trayectoria de un SVG externo */
clip-path: url(path.svg#path1);

/* usando una forma básica de CSS */
clip-path: polygon(...);
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Formas básicas de CSS&lt;/h2&gt;

&lt;p&gt;En CSS y según la especificación que he mencionado anteriormente de la W3C, podemos crear cuatro formas geométricas básicas: círculos, elipses, rectángulos y polígonos de x lados. Estas formas básicas se pueden pasar como un valor a una propiedad como &lt;code&gt;shape-outside&lt;/code&gt;, o a la propiedad &lt;code&gt;clip-path&lt;/code&gt;, con el fin de cambiar el flujo de contenido entorno a ella o realizar un recorte, respectivamente.&lt;/p&gt;

&lt;h3&gt;Inset()&lt;/h3&gt;

&lt;pre&gt;inset( &amp;lt;shape-arg&amp;gt;{1,4} [round &amp;lt;border-radius&amp;gt;]? )&lt;/pre&gt;

&lt;p&gt;La función &lt;code&gt;inset()&lt;/code&gt; permite la creación de formas rectangulares. La primera parte de la función sigue las mismas reglas que la versión abreviada de la propiedad &lt;code&gt;margin&lt;/code&gt;, permitiendo uno, dos o cuatro valores. Si se usan cuatro valores el orden es superior, derecha, inferior e izquierda y definen la distancia entre los lados del rectángulo creado con respecto a los bordes del elemento sobre el que se aplica la función.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.objeto {
    clip-path: inset(100px 100px 100px 100px);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;En este ejemplo estamos creado un rectángulo cuyo lado superior está a 100px del lado superior de .objeto, el lado derecho a 100px del lado derecho, el lado inferior a 100px del lado inferior y el la izquierdo a 100px del lado izquierdo. En función del tamaño de .objeto el rectángulo será mayor o menor, pero siempre manteniendo las distancias fijadas sobre los bordes del objeto sobre el que lo aplicamos.&lt;/p&gt;

&lt;p&gt;La segunda parte de la función es opcional y usa la forma abreviada de la propiedad &lt;code&gt;border-radius&lt;/code&gt; con el fin de redondear las cuatro esquinas del rectángulo creado, tanto horizontal como verticalmente. Al igual que en la propiedad original &lt;code&gt;border-radius&lt;/code&gt; puede tener de uno a ocho valores. Estos valores debe ir precedidos de la palabra clave reservada &lt;code&gt;round&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;La propiedad &lt;code&gt;border-radius&lt;/code&gt; es una vieja conocida de este blog. A si que si no la dominas o necesitar refrescarte un poco la memoria no dudes en volver a leerte el artículo &lt;a href=&quot;http://www.hexagonalalien.es/2015/09/border-radius-redondear-bordes-css.html&quot;&gt;cómo redondear bordes con CSS&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Circle()&lt;/h3&gt;

&lt;pre&gt;circle( [&amp;lt;shape-radius&amp;gt;]? [at &amp;lt;position&amp;gt;]? )&lt;/pre&gt;

&lt;p&gt;La función &lt;code&gt;circle()&lt;/code&gt; se usa para crear círculos y ambos valores son opcionales. Si algunos de ambos valores se omite se tomará un valor por defecto marcado por el navegador.&lt;/p&gt;

&lt;p&gt;El argumento shape-radius representa el radio del círculo, y no puede tomar valores negativos. Este argumento también puede tomar como valor dos palabras reservadas &lt;code&gt;closest-side&lt;/code&gt; y &lt;code&gt;farthest-side&lt;/code&gt;. La palabra reservada &lt;code&gt;closest-side&lt;/code&gt; es el valor por defecto, tomando como valor la distancia más corta entre el centro del círculo y uno de los cuatro lados del elemento. La palabra reservada &lt;code&gt;farthest-side&lt;/code&gt; toma como valor la distancia entre el centro del círculo y el lado más alejado respecto a este.&lt;/p&gt;

&lt;p&gt;El argumento position representa el centro del círculo, que se calcula mediante dos coordenadas (x, y) con respecto a la esquina superior izquierda del elemento, y estos valores deben ir precedidos de la palabra clave reservada &lt;code&gt;at&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.objeto {
    clip-path: circle(10px at 20px 30px);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;En el ejemplo recortamos un círculo cuyo radio es de 10px y que está posicionado a 20px horizontalmente y 30px verticalmente de la esquina superior izquierda de .objeto.&lt;/p&gt;

&lt;h3&gt;Ellipse()&lt;/h3&gt;

&lt;pre&gt;ellipse( [&amp;lt;shape-radius&amp;gt;{2}]? [at &amp;lt;position&amp;gt;]? )&lt;/pre&gt;

&lt;p&gt;La función &lt;code&gt;ellipse()&lt;/code&gt; se usa para crear una elipse y toma la misma lista de argumentos que la función &lt;code&gt;circle()&lt;/code&gt;, a excepción que en lugar de tomar un valor para el radio toma dos, un radio para el eje x y otro para el eje y, en ese orden en concreto.&lt;/p&gt;

&lt;p&gt;Para el resto de valores que puede tomar y cómo funcionan sus argumento únicamente tienes que consultar lo detallado para la función &lt;code&gt;circle()&lt;/code&gt;.

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.objeto {
    clip-path: ellipse(10px 20x at 10px 10px);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;En el ejemplo recortamos una ellipse posicionada a 10px horizontalmente y 10px verticalmente, y cuyos radios son de 10px y 20px respectivamente.&lt;/p&gt;

&lt;h3&gt;Polygon()&lt;/h3&gt;

&lt;pre&gt;polygon( [&amp;lt;fill-rule&amp;gt;,]? [&amp;lt;shape-arg&amp;gt; &amp;lt;shape-arg&amp;gt;]# )&lt;/pre&gt;

&lt;p&gt;La función &lt;code&gt;polygon()&lt;/code&gt; se usa para construir formas complejas usando un número determinado de puntos. Estos puntos se definen mediante pares de coordenadas (&amp;lt;shape-arg&amp;gt; &amp;lt;shape-arg&amp;gt;). El primer argumento determina la posición x del punto y el segundo la posición y del mismo. La forma poligonal final se consigue uniendo la sucesión de puntos, para al final unir el último punto al primero de la sucesión. Cada par de coordenadas deber se separado mediante comas.&lt;/p&gt;

&lt;p&gt;Adicionalmente a la sucesión de pares de coordenadas, la función &lt;code&gt;polygon()&lt;/code&gt; admite un argumento opcional llamado fill-rule que especifica cómo tratar las áreas dentro de la forma poligonal que pueden cortarse consigo mismo. Para más información sobre este argumento puedes consultar la especificación de la W3C sobre &lt;a href=&quot;https://www.w3.org/TR/SVG/painting.html#FillRuleProperty&quot;&gt;fill-rule&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.objeto {
    clip-path: polygon(0 40px, 75px 0, 150px 40px, 150px 120px, 75px 200px, 0 120px);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;En el ejemplo recortamos una forma compleja de 6 puntos, básicamente un hexágono, que si tienes paciencia para dibujarlo coordenada a coordenada te darás cuenta que es el mismo usado para crear el logo de Hexagonal Alien.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Compatibilidad en navegadores&lt;/h2&gt;

&lt;p&gt;La propiedad &lt;code&gt;clip-path&lt;/code&gt; es relativamente nueva, de hecho pasó a &quot;candidate recommendation&quot; el 20 de Marzo de 2014, y ya sabemos lo lentas que van estas cosas.&lt;/p&gt;

&lt;p&gt;El soporte es aún pobre, de hecho ni IE ni Edge la soportan aún, Firefox lo hace de forma parcial, y Chrome, Opera y Safary necesitan el prefijo &lt;code&gt;-webkit-&lt;/code&gt;. Puedes mantenerte al tanto de la evolución de su compatibilidad en &lt;a href=&quot;http://caniuse.com/#search=clip-path&quot;&gt;Can I use&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Sin embargo no está demás ir trasteando con la posibilidades que nos dan ciertas nuevas propiedades antes de que el soporte sea total, así no te pillará el toro y al menos tendrás una idea de como funcionan y de lo que puedes hacer con ellas.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;¿Qué se puede hacer con clip-path?&lt;/h2&gt;

&lt;p&gt;Más abajo te dejo una lista de demos que usan la propiedad &lt;code&gt;clip-path&lt;/code&gt;, para que veas lo que se puede hacer con ella y lo sencillo que es en comparación con otras técnicas:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;http://codepen.io/SitePoint/pen/oxRJyg&quot;&gt;Text with clip-path&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://codepen.io/SitePoint/pen/YqbdOq&quot;&gt;Images with clip-path&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://codepen.io/SitePoint/pen/KzLbGe&quot;&gt;A clip-path animation&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://codepen.io/jeremyfrank/pen/zvdXZM&quot;&gt;Angled edge with clip-path&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://codepen.io/imohkay/pen/KpdBrw&quot;&gt;Clip-path: Diamanod grid&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</description><link>http://www.hexagonalalien.es/2016/07/recortando-con-css-clip-path.html</link><author>noreply@blogger.com (LuisFran)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj2484exwMqNXCgaDPmXNK-ltmk_E4csgfvjPx8zjXpAAAzGKhXMdLsryFsyJFTk-nIXnhcte2kEaTAZw_hrjJwL60MLmpLZNmI8tKsJcfr0kHmcUHaBj9y-bs_33stUkTo3BDsfxA8uY/s72-c/recorte.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-5654843433337746956</guid><pubDate>Sat, 18 Jun 2016 11:12:00 +0000</pubDate><atom:updated>2016-07-14T17:00:46.830+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Accesibilidad</category><category domain="http://www.blogger.com/atom/ns#">CSS</category><title>Checkbox personalizada y accesible sólo con CSS</title><description>&lt;figure class=&quot;post-img&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzeDlHr56mz8cJh5uckU1jUs3bJGkQED6nojUAVfuiqAYxzPQFwt96vZSuy51BbfC2v26cSzqqoUSac7k1Tom1m-NsobauFbR2RIZUXkjEmOaejkJfJnvYx-vJXVdy_vSbV2CYK0nmlkw/s1600/checkbox.jpg&quot; alt=&quot;Dibujo a mano alzada de dos casillas de verificación&quot; /&gt;
&lt;figcaption&gt;Imagen de &lt;a href=&quot;https://www.flickr.com/photos/otacke/&quot;&gt;Oliver Tacke&lt;/a&gt; - modificada.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Con CSS podemos dar estilo a prácticamente cualquier elemento de nuestra web. Y digo prácticamente porque hay algunos elementos &quot;rebeldes&quot; que se nos resisten. Entre ellos se encuentran las checkboxes (casillas de verificación) y los botones de tipo radio.&lt;/p&gt;

&lt;p&gt;Puede que en algunos diseños el estilo por defecto de una checkbox quede perfectamente integrado, pero en la mayoría de los casos no es así. Por ello se ha tendido a crear este tipo de controles con elementos &lt;code class=&quot;html-code&quot;&gt;div&lt;/code&gt; o &lt;code class=&quot;html-code&quot;&gt;span&lt;/code&gt;, perdiendo por el camino la semántica, la accesibilidad y teniendo que recurrir a javascript para darles la funcionalidad requerida.&lt;/p&gt;

&lt;p&gt;En este tutorial vamos a ver una forma de conseguir dar estilo a una checkbox, manteniendo los aspectos básicos de este elemento y sin tener que recurrir a javascript, porque CSS3 es suficiente para suplir lo que debería ser un estándar, poder dar estilo a todos y cada uno de los elementos de HTML.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;section&gt;&lt;h2&gt;Malas prácticas a la hora de dar estilo&lt;/h2&gt;

&lt;p&gt;De forma recurrente se ha usado CSS inadecuadamente para dar estilo a determinados elementos. En general se han usado elementos genéricos y recurrido a técnicas innecesarias cuando frente a nosotros teníamos el elemento adecuado para hacerlo. Un ejemplo muy claro es la creación de botones bien mediante elementos &lt;code class=&quot;html-code&quot;&gt;div&lt;/code&gt; o &lt;code class=&quot;html-code&quot;&gt;span&lt;/code&gt; cuando para ello tenemos el elemento &lt;code class=&quot;html-code&quot;&gt;button&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Con este tipo de prácticas lo único que conseguimos es cargarnos de trabajo innecesario pues tenemos que dotar al nuevo elemento creado de su supuesta funcionalidad mediante javascript, asignarle un nuevo rol por medio de &lt;a href=&quot;http://www.hexagonalalien.es/2016/06/wai-aria-haciendo-la-web-mas-accesible.html&quot;&gt;WAI-ARIA&lt;/a&gt;, y hacer que sea accesible mediante teclado con la propiedad &lt;code&gt;tabindex&lt;/code&gt;. Como decía antes, trabajo innecesario, ya que usando el elemento correcto todo este trabajo ya está hecho.&lt;/p&gt;

&lt;p&gt;La cosa cambia cuando ante nosotros tenemos un elemento al cual no es posible darle otro estilo mediante CSS, entonces parece inevitable el uso de técnicas que la propia W3C recomienda no usar. Si embargo con CSS3 y un poco de imaginación podemos conseguir nuestra meta y para ello sólo necesitamos usar el elemento &lt;code class=&quot;html-code&quot;&gt;input type=&quot;checkbox&quot;&lt;/code&gt;. ¿Pero cómo?.&lt;/p&gt;

&lt;p&gt;Parece extraño que la solución para dar estilo a una checkbox, un elemento al que no podemos darle estilo mediante CSS, se usar la propia checkbox, pero ya hemos usado esta técnica en este blog, por ejemplo cuando creamos un &lt;a href=&quot;http://www.hexagonalalien.es/2015/12/icono-animado-hamburguesa-css.html&quot;&gt;icono animado estilo hamburguesa en CSS puro&lt;/a&gt;. Usando la conocida técnica del &quot;checkbox hack&quot;.&lt;/p&gt;

&lt;p&gt;Para ello vamos a necesitar una checkbox, una etiqueta &lt;code class=&quot;html-code&quot;&gt;label&lt;/code&gt; que de todas formas habría que usar para dar la información referente a la casilla de verificación y el pseudo-elemento &lt;code&gt;:checked&lt;/code&gt;.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Una checkbox en CSS puro&lt;/h2&gt;

&lt;p&gt;Lo que vamos a hacer es muy sencillo. Vamos a usar la checkbox únicamente como una marcador binario, con lo cual vamos a ocultarla pues no nos sirve par nada mas, eso sí, hay que ocultarla correctamente para no perder la accesibilidad.&lt;/p&gt;

&lt;p&gt;Después usaremos la etiqueta &lt;code class=&quot;html-code&quot;&gt;label&lt;/code&gt;, a parte de para dar la información referente a la checbox, para crear nuestra nueva checkbox, usando el pseudo-elemento &lt;code&gt;:checked&lt;/code&gt; para dibujarla, bien seleccionada o de-seleccionada.&lt;/p&gt;

&lt;p&gt;Vamos a comenzar con el marcado en HTML, que como verás es muy sencillo.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;div&amp;gt;
  &amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;box1&amp;quot;&amp;gt;
  &amp;lt;label for=&amp;quot;box1&amp;quot;&amp;gt;Checkbox 1&amp;lt;/label&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Lo único a tener en cuenta en este marcado es asociar las etiquetas &lt;code class=&quot;html-code&quot;&gt;input&lt;/code&gt; y &lt;code class=&quot;html-code&quot;&gt;label&lt;/code&gt; mediante los atributos &lt;code&gt;id&lt;/code&gt; y &lt;code&gt;for&lt;/code&gt;. Ambos deben tener el mismo valor.&lt;/p&gt;

&lt;p&gt;Lo primero en cuanto a estilo es eliminar algunos valores estándar, como los márgenes interiores y exteriores, y también cambiaremos el modelo de caja. Así trabajaremos más a gusto.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
*,
*:before,
*:after {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;El siguiente paso es ocultar nuestra checkbox, para esta caso vamos a usar la propiedad &lt;code&gt;opacity&lt;/code&gt;, aunque también serviría &lt;code&gt;clip&lt;/code&gt;. Y de paso vamos a dibujar la nueva checkbox valiéndonos de la etiqueta &lt;code class=&quot;html-code&quot;&gt;label&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
div {
    position: relative;

    height: 2em;
    margin-bottom: 1em;
}

input[type*=&#39;checkbox&#39;] {
    opacity: 0;
}

label {
    line-height: 2em;

    position: absolute;
    left: 0;

    margin-bottom: 10em;
    padding: 0 1.5em 0 2.5em;
}

label:before {
    font-size: 2em;
    line-height: .5em;

    position: absolute;
    left: 0;

    width: 1em;
    height: 1em;

    content: &#39;&#39;;
    text-align: center;

    border: .2em solid #eb7260;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Con esto lo que nos queda es dibujar nuestra checkbox cuando su estado es seleccionada, para ello usaremos el pseudo-elemento &lt;code&gt;:checked&lt;/code&gt;. Voy a usar &lt;a href=&quot;http://fontawesome.io/&quot;&gt;Font-Awesome&lt;/a&gt; para dibujar la típica &quot;uve&quot; de selección, así que lo primero es referenciar esta fuente. Lo vamos a hacer directamente en nuestro CSS.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
@import url(&#39;//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.min.css&#39;);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Y ahora dibujamos nuestra checkbox en el estado seleccionada.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
input[type*=&#39;checkbox&#39;]:checked + label:before {
    font-family: FontAwesome;

    content: &#39;\f00c&#39;;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Por último, y sólo para hacerla más accesible desde teclado, vamos a añadir un detalle más para saber en qué momento nuestra checkbox tiene el foco, valiéndonos nuevamente de uno de los iconos de Font-Awesome.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
input[type*=&#39;checkbox&#39;]:focus + label:after {
    font-family: FontAwesome;

    position: absolute;
    right: 0;

    content: &#39;\f177&#39;;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;¿Es realmente accesible?&lt;/h2&gt;

&lt;p&gt;Para comprobarlo lo único que tenemos que hacer es ver lo que hemos hecho. Si te fijas bien estamos usando los mismos elementos que usaríamos si usásemos una checkbox por defecto, un elemento &lt;code class=&quot;html-code&quot;&gt;input type=&quot;checkbox&quot;&lt;/code&gt; y un elemento &lt;code class=&quot;html-code&quot;&gt;label&lt;/code&gt;, con lo cual mantenemos la semántica.&lt;/p&gt;

&lt;p&gt;En ningún momento perdemos la funcionalidad, ya que realmente usamos la checkbox en todo momento, tanto seleccionándola como deseleccionándola, tan sólo la hemos ocultado y aprovechamos la etiqueta &lt;code class=&quot;html-code&quot;&gt;label&lt;/code&gt; para volver a dibujarla, pero en realidad todo funciona igual que usando una checkbox por defecto.&lt;/p&gt;

&lt;p&gt;Sigue siendo accesible por teclado y también será anunciada si usamos algún tipo de screenreader, puesto que sólo la hemos ocultado, y lo hemos hecho correctamente.&lt;/p&gt;

&lt;p&gt;Y por último, hemos añadido un detalle más que ayuda a saber donde tenemos el foco si usamos la navegación mediante teclado, puesto que la representación del foco en los navegadores, en muchas ocasiones, es demasiado sutil para el usuario, sobre todo si usamos colores claros en nuestro diseño. Nunca está demás comprobar si realmente vemos donde está o no el foco usando la navegación por teclado.&lt;/p&gt;

&lt;p&gt;Puedes ver un ejemplo con tres checkboxes para que veas que todo funciona tal y como he dicho en el pen que he preparado para este tutorial. Además así podrás trastear con él todo lo que quieras y ver las posibilidades que tienes para dar estilo a una checkbox.&lt;/p&gt;&lt;/section&gt;

&lt;p data-height=&quot;265&quot; data-theme-id=&quot;0&quot; data-slug-hash=&quot;dXXKbY&quot; data-default-tab=&quot;result&quot; data-user=&quot;amram1977&quot; data-embed-version=&quot;2&quot; class=&quot;codepen&quot;&gt;See the Pen &lt;a href=&quot;http://codepen.io/amram1977/pen/dXXKbY/&quot;&gt;Custom &amp; accessible checkbox in pure CSS&lt;/a&gt; by amram (&lt;a href=&quot;http://codepen.io/amram1977&quot;&gt;@amram1977&lt;/a&gt;) on &lt;a href=&quot;http://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;
&lt;script async src=&quot;//assets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;</description><link>http://www.hexagonalalien.es/2016/06/checkbox-custom-accesible-css.html</link><author>noreply@blogger.com (LuisFran)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzeDlHr56mz8cJh5uckU1jUs3bJGkQED6nojUAVfuiqAYxzPQFwt96vZSuy51BbfC2v26cSzqqoUSac7k1Tom1m-NsobauFbR2RIZUXkjEmOaejkJfJnvYx-vJXVdy_vSbV2CYK0nmlkw/s72-c/checkbox.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-1376227715963493285</guid><pubDate>Sat, 11 Jun 2016 14:02:00 +0000</pubDate><atom:updated>2016-09-03T10:04:15.558+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Accesibilidad</category><category domain="http://www.blogger.com/atom/ns#">HTML5</category><title>WAI-ARIA: haciendo la web más accesible</title><description>&lt;figure class=&quot;post-img&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXam2Cv7yItAHGQcMt_G4ekOXbGMJ5Aws7Hp0uAvbrZFkYA1n0fqSN0zFGE7ZvPsGGcO85X3u0f6BI8HQMa8W95txsSalFg9RUqrxx-LlulnFN0U4WDheDS8gwWcEzKz3zjkAhFn0FRfo/s1600/ojos-vendados.jpg&quot; alt=&quot;Grupo de personas con los ojos vendados&quot; /&gt;
&lt;figcaption&gt;Imagen de &lt;a href=&quot;https://www.flickr.com/photos/hikingartist/&quot;&gt;Frits Ahlefeldt-Laurvig&lt;/a&gt;.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;No hace tanto que diseñar un sitio web accesible era sinónimo de soso o aburrido. Había que eliminar cualquier adorno que no cumpliese con la estricta semántica dada por HTML.&lt;/p&gt;

&lt;p&gt;Por suerte hoy en día esto ya no es así (aunque hay quién aún lo piensa). WAI-ARIA nos ayuda a dar significado a esas partes de nuestro código que se salen de la semántica de HTML, dando apoyo a las aplicaciones de accesibilidad para que las personas que las usan comprendan nuestra web o aplicación.&lt;/p&gt;

&lt;p&gt;¿Pero qué es en realidad WAI-ARIA?, ¿se debe usar en todas las etiquetas de HTML?, y aún más importante ¿qué es lo que no se debe hacer con esta tecnología?. A estas y seguramente otras preguntas voy a tratar de responder, en lo que pretende ser una aproximación a la accesibilidad web. ¿Te apuntas?.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;section&gt;&lt;h2&gt;¿Qué es WAI-ARIA?&lt;/h2&gt;

&lt;p&gt;WAI-ARIA (Web Accessibility Initiative – Accesible Rich Internet Applications), es una especificación de la W3C cuyo propósito es dar significado a aquellos elementos que no lo tienen, estableciendo roles para cada elemento, relacionándolos entre ellos, informando de su estado y facilitando los controles a través de teclado, dando así soporte a las APIs de accesibilidad.&lt;/p&gt;

&lt;h3&gt;Roles ARIA&lt;/h3&gt;

&lt;p&gt;El rol o funcionamiento de un elemento se añade al marcado HTML de igual forma que cualquier otro atributo, y define el tipo de elemento y para que sirve.&lt;/p&gt;

&lt;p&gt;El nombre del rol debe ser uno de los definidos por la especificación WAI-ARIA y debe usarse de forma correcta. En el siguiente ejemplo, sugerimos que el contenido del elemento proporciona algún tipo de información sobre el elemento en el cual se encuentra contenido, lo que viene a ser un pie de página:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;div role=&amp;quot;contentinfo&amp;quot;&amp;gt;
    Esta web está diseñada por un alienígena loco por el CSS.
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Atributos ARIA&lt;/h3&gt;

&lt;p&gt;Un atributo ARIA proporciona información específica sobre un objeto concreto y forma parte de la definición de la naturaleza de los roles. Tiene un comportamiento dinámico (no como el rol que no cambia), permitiendo definir las propiedades y estados de los elementos.&lt;/p&gt;

&lt;p&gt;Realmente estos atributos se dividen en dos tipos: propiedades y estados. Sin embargo su diferencia es muy sutil, como tantas otras a las que tan acostumbrados nos tiene la W3C. La mayor diferencia es que las propiedades cambian menos que los estados. Si quieres profundizar un poco más puedes consultar el documento &lt;a href=&quot;https://www.w3.org/TR/wai-aria/states_and_properties&quot;&gt;WAI-ARIA 1.0 (Propiedades y Estados Soportados)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Un ejemplo muy claro de los atributos ARIA, en este caso un estado, sería su uso para una checkbox, ya que esta posee dos estados: seleccionada y no-seleccionada. Para este ejemplo creamos una checkbox indicando que su estado por defecto es seleccionada:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;span role=&amp;quot;checkbox&amp;quot; aria-checked=&amp;quot;true&amp;quot;&amp;gt;
&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;ARIA también tiene reglas&lt;/h2&gt;

&lt;p&gt;Lo principal a tener siempre en mente es que no debemos usar WAI-ARIA para todo, de hecho cuanto menos WAI-ARIA uses mejor. Su finalidad está muy clara, por tanto esto es lo que debes hacer:&lt;/p&gt;

&lt;h3&gt;Usa elementos semánticos de HTML siempre que sea posible&lt;/h3&gt;

&lt;p&gt;Elementos de HTML5 como &lt;code class=&quot;html-code&quot;&gt;nav&lt;/code&gt;, &lt;code class=&quot;html-code&quot;&gt;header&lt;/code&gt; o &lt;code class=&quot;html-code&quot;&gt;footer&lt;/code&gt; llevan implícitos los roles ARIA &lt;code&gt;role=&quot;navigation&quot;&lt;/code&gt;, &lt;code&gt;role=&quot;banner&quot;&lt;/code&gt; y &lt;code&gt;role=&quot;contentinfo&quot;&lt;/code&gt; respectivamente. Por tanto no hagas lo que yo he hecho en los ejemplos anteriores y en vez de &lt;code&gt;&amp;lt;div role=&amp;quot;contentinfo&amp;quot;&amp;gt;&lt;/code&gt;, mejor usar &lt;code class=&quot;html-code&quot;&gt;footer&lt;/code&gt;. Es mucho más correcto. Eso sí, no hagas sobre-marcado, no es necesario añadir ningún role porque ya está implícito.&lt;/p&gt;

&lt;p&gt;Para saber que roles lleva asociado cada elemento o que roles, estados o propiedades podemos usar en él siempre puedes consultar esta tabla de la W3C sobre las &lt;a href=&quot;https://www.w3.org/TR/html-aria/#docconformance&quot;&gt;reglas de uso de los atributos ARIA&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Por ejemplo, vamos a hacer un botón con un elemento &lt;code class=&quot;html-code&quot;&gt;span&lt;/code&gt; y le daremos significado semántico mediante el rol apropiado:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;span class=&amp;quot;boton&amp;quot; rol=&amp;quot;button&amp;quot;&amp;gt;
&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Con esto sólo conseguimos que por ejemplo un screenreader anuncie el elemento &lt;code class=&quot;html-code&quot;&gt;span&lt;/code&gt; como si fuese un botón, sin embargo para el navegador no tiene significado alguno. Lo que quiero decir con esto es que a fin de cuentas no es un botón real, falta darle el aspecto necesario para que se asemeje a uno, lo que haríamos con CSS. Pero hay más, porque tampoco es accesible desde teclado, con lo cual deberemos usar el atributo &lt;code&gt;tabindex=&quot;0&quot;&lt;/code&gt; para que este elemento pueda coger el foco. Lo lógico sería usar la etiqueta &lt;code class=&quot;html-code&quot;&gt;button&lt;/code&gt; y problema resuelto.&lt;/p&gt;

&lt;h3&gt;Un sólo rol por elemento&lt;/h3&gt;

&lt;p&gt;Un elemento de HTML sólo puede tener un rol. Un rol tiene un significado semántico de una u otra forma, por tanto un elemento no puede ser dos tipos de objetos diferentes. ¿Acaso puede una cabecera ser también un pie de página?.&lt;/p&gt;

&lt;p&gt;Usa los roles con cabeza y elige siempre aquel que se aproxime más al funcionamiento de tu elemento.&lt;/p&gt;

&lt;h3&gt;No cambies la semántica de un elemento&lt;/h3&gt;

&lt;p&gt;Nunca (salvo casos excepcionales) uses un rol para contrarrestar el efecto del rol que lleva un elemento de forma implícita. En su lugar usa un elemento apropiado a lo que buscas, o sino es posible, siempre es preferible anidar elementos HTML.&lt;/p&gt;

&lt;p&gt;Por ejemplo, pongamos que tengo una imagen como único elemento de la cabecera principal de una web, como puede ser un logo. Bien podría pensar en hacer lo siguiente:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;header rol=&amp;quot;img&amp;quot;&amp;gt;
&amp;lt;/header&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Evidentemente no es correcto. Como comenté anteriormente no es posible tener más de un rol por elemento, por tanto el &lt;code&gt;rol=&quot;banner&quot;&lt;/code&gt; que implícitamente lleva asignado &lt;code class=&quot;html-code&quot;&gt;header&lt;/code&gt; queda reemplazado por el nuevo que le hemos asignado. Así de cara a cualquier tecnología de asistencia, &lt;code class=&quot;html-code&quot;&gt;header&lt;/code&gt; será anunciado como una imagen, mientras que para el navegador seguirá siendo una etiqueta &lt;code class=&quot;html-code&quot;&gt;header&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Lo correcto sería hacerlo hacerlo de la forma siguiente, donde queda claro que nuestra imagen, que es un logo corporativo, forma parte de la cabecera principal de la página.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;header&amp;gt;
    &amp;lt;img src=&amp;quot;logo.gif&amp;quot; alt=&amp;quot;Logo&amp;quot; /&amp;gt;
&amp;lt;/header&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Para información más detallada a cerca  de como usar WAI-ARIA en HTML siempre puedes consultar el documento de la W3C 
&lt;a href=&quot;https://www.w3.org/TR/aria-in-html/&quot;&gt;Notas sobre el uso de ARIA en HTML&lt;/a&gt;.&lt;/p&gt;&lt;/section&gt;</description><link>http://www.hexagonalalien.es/2016/06/wai-aria-haciendo-la-web-mas-accesible.html</link><author>noreply@blogger.com (LuisFran)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXam2Cv7yItAHGQcMt_G4ekOXbGMJ5Aws7Hp0uAvbrZFkYA1n0fqSN0zFGE7ZvPsGGcO85X3u0f6BI8HQMa8W95txsSalFg9RUqrxx-LlulnFN0U4WDheDS8gwWcEzKz3zjkAhFn0FRfo/s72-c/ojos-vendados.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-5887311109841894189</guid><pubDate>Sat, 28 May 2016 15:04:00 +0000</pubDate><atom:updated>2016-05-28T17:04:07.807+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CSS</category><title>Pseudo-elementos CSS: dando estilo a tu web</title><description>&lt;p&gt;Como supongo ya te habrás dado cuenta, soy un loco apasionado del CSS (además de un poco alienígena) y de todas las posibilidades que este nos ofrece. Cambio una y mil veces mis diseños, y los pseudo-elementos son la forma más rápida, sencilla y útil de conseguir darle ese toque original y de calidad que todos buscamos.&lt;/p&gt;

&lt;p&gt;Son herramientas que nos permiten conseguir más fácilmente la separación entre estructura y presentación, lo que a fin de cuentas da una web mejor estructurada, semántica y más apetecible de cara a los buscadores. Y esto no sería posible sin el uso de pseudo-elementos.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;section&gt;&lt;h2&gt;Sintaxis, ¿dos o cuatro puntos?&lt;/h2&gt;

&lt;p&gt;Esta parece ser la duda existencial de todo desarrollador, y lo cierto es que no debiera serlo. En CSS3 se introdujo la variación de los cuatro puntos (::) para matizar la diferencia entre pseudo-elementos y &lt;a href=&quot;http://www.hexagonalalien.es/2016/04/pseudo-clases-css.html&quot;&gt;pseudo-clases&lt;/a&gt;, que sólo llevan dos puntos, como por ejemplo &lt;code&gt;:hover&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;No obstante, los pseudo-elementos son anteriores a la tercera versión de CSS y por tanto su sintaxis anterior era la misma que la de las pseudo-clases, de ahí que se siga aceptando la antigua sintáxis. Por lo general se suele usar la sintáxis antigua de sólo dos puntos, sobre todo para dar mayor compatibilidad a nuestro código en navegadores antiguos.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;::first-line&lt;/h2&gt;

&lt;p&gt;El pseudo-elemento &lt;code&gt;::first-line&lt;/code&gt; nos permite seleccionar la primera línea dentro de un elemento. Por ejemplo. la siguiente regla CSS nuestra la primera línea de un párrafo en color rojo:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
p:first-line { color: red; }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Evidentemente podríamos haberlo hecho mediante una clase introducida directamente en nuestro HTML, pero imagínate el trabajo y &quot;código sucio extra&quot; si tenemos que hacerlo en multitud de párrafos.&lt;/p&gt;

&lt;p&gt;Además esto sólo sería posible si el diseño es rígido, ya que si tenemos un diseño fluido o responsive, el tamaño de la primera línea variará en función del tipo del dispositivo donde se vea nuestra web, lo cual nos lleva al uso irremediable de &lt;code&gt;::first-line&lt;/code&gt;.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;::first-letter&lt;/h2&gt;

&lt;p&gt;El pseudo-elemento &lt;code&gt;::first-letter&lt;/code&gt; selecciona la primera letra (también afecta a otros caracteres y signos de puntuación) del texto de un elemento. Puntualizar que este selector sólo puede usarse en elementos de bloque. Así, para la siguiente regla de CSS ponemos en mayúscula la primera letra de cada párrafo:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
p:first-letter { text-transform: uppercase; }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Evidentemente, y al igual que ocurría con &lt;code&gt;::first-line&lt;/code&gt; podemos hacer lo mismo mediante una clase introducida en el HTML; sin embargo, nuestro código queda mucho más limpio y estructurado si hacemos uso de este pseudo-elemento.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;::before y ::after&lt;/h2&gt;

&lt;p&gt;Sin duda alguna estos dos pseudo-elementos son la &quot;crema de la tarta&quot; de los selectores de CSS. Son una herramienta muy útil a la hora de dar estilo a nuestro documento, pero eso sí, hay que tener mucho cuidado según que cosas queremos hacer.&lt;/p&gt;

&lt;p&gt;Los pseudo elementos &lt;code&gt;::before&lt;/code&gt; y &lt;code&gt;::after&lt;/code&gt; en combinación con la propiedad &lt;code&gt;content&lt;/code&gt; nos permiten añadir contenido antes y después de contenido original de un elemento. Por ejemplo, la siguiente regla de CSS añade el texto &quot;Capítulo - &quot; delante de cada encabezado &lt;code&gt;h1&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
h1:before { content: &quot;Capítulo - &quot;; }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Como puedes ver es una herramienta poderosa, y que como suele pasar con estas cosas hay que utilizarla con cabeza y sumo cuidado. Ten en cuenta que el contenido debe ir siempre en el HTML a fin que pueda ser bien rastreado por los buscadores, con lo cual únicamente debemos usar estos elementos con fines estéticos, y si introducimos algún tipo de contenido que este no sea importante y que si se elimina no cambie el significado del contenido del elemento original.&lt;/p&gt;

&lt;p&gt;Su uso está muy extendido, y más que usarlos como en el ejemplo de arriba, se usan por ejemplo para cambiar los iconos de una web por fuentes, introduciéndolas mediante una regla bien con &lt;code&gt;::before&lt;/code&gt; o &lt;code&gt;:after&lt;/code&gt; como en este &lt;a href=&quot;http://codepen.io/ricardpriet/pen/aAehf&quot;&gt;pen de Ricardo Prieto&lt;/a&gt;, o bien podríamos &lt;a href=&quot;http://www.hexagonalalien.es/2015/09/como-dibujar-triangulos-con-css.html&quot;&gt;crear un triángulo con CSS&lt;/a&gt; y usarlo como indicador de elemento seleccionado en un menú. Esto ya es cosa de tu imaginación.&lt;/p&gt;&lt;/section&gt;</description><link>http://www.hexagonalalien.es/2016/05/pseudo-elementos-css-dando-estilo-tu-web.html</link><author>noreply@blogger.com (LuisFran)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-2403833889426777819</guid><pubDate>Sat, 14 May 2016 11:08:00 +0000</pubDate><atom:updated>2016-05-28T17:53:56.052+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CSS</category><title>Spinner animado en CSS puro</title><description>&lt;figure class=&quot;post-img&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9Z68tPB_wB2MntN4CNqHRK5PI6C2AfojyNfby2MEwqZXM3mMP2YdJ3mvumvbh0EoRPxwGHHjmgHTO0_knu8TXg0jI8MfoKe01Wh71eTVIsaeW6dnnrs2Mi5PJqgWckAwobK75BAGxfJ4/s1600/spin-paintings.jpg&quot; alt=&quot;Exposición de pinturas: giros&quot; /&gt;
&lt;figcaption&gt;Imagen de &lt;a href=&quot;https://www.flickr.com/photos/matthewvenn/&quot;&gt;matthew venn&lt;/a&gt; - modificada.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Después de recrear la clásica &lt;a href=&quot;http://www.hexagonalalien.es/2016/04/barra-de-progreso-animada-en-css-puro.html&quot;&gt;barra de progreso usando sólo CSS&lt;/a&gt;, hoy vamos a hacer lo propio con uno de los indicadores de carga más usados en aplicaciones, los spinners. Si bien durante mucho tiempo han sido imágenes de tipo GIF, con las nuevas propiedades de CSS, esto ha cambiado radicalmente y la tendencia es realizar este tipo de animaciones mediante código, que sin duda es mucho más liviano.&lt;/p&gt;

&lt;p&gt;Por esta razón vamos a construir un spinner, que va a ser muy básico, pero que queda muy bien para cualquier proceso de carga. Va a constar de dos círculos incompletos que giran en sentidos opuestos y con el que espero que te hagas una idea de lo que podemos llegar a conseguir con las propiedades &lt;code&gt;animation&lt;/code&gt;, &lt;code&gt;keyframes&lt;/code&gt; y &lt;code&gt;transform&lt;/code&gt;.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;section&gt;&lt;h2&gt;Dibujando los círculos incompletos&lt;/h2&gt;

&lt;p&gt;Dibujar un círculo en CSS es algo muy sencillo que ya hemos visto en el artículo sobre &lt;a href=&quot;http://www.hexagonalalien.es/2015/09/border-radius-redondear-bordes-css.html&quot;&gt;la propiedad border-radius y sus posibilidades&lt;/a&gt;. Aunque en esta caso concreto no buscamos exactamente dibujar un círculo, sino mas bien una circunferencia, con lo cual necesitamos usar los bordes del elemento &lt;code class=&quot;html-code&quot;&gt;div&lt;/code&gt; que usamos como constructor, pero no al completo, sino únicamente tres de ellos.&lt;/p&gt;

&lt;p&gt;Para esto sólo tenemos que aplicar un &lt;code&gt;border-radius&lt;/code&gt; del 50% para conseguir que los bordes se curven para formar la circunferencia y dar como color el valor &lt;code&gt;transparent&lt;/code&gt; a uno de los 4 bordes para dar la sensación de que este desaparece.&lt;/p&gt;

&lt;p&gt;Por último haremos lo mismo para el otro círculo que va a ir anidado en su interior, para lo cual usaremos el pseudo-elemento &lt;code&gt;::before&lt;/code&gt; y lo posicionaremos con &lt;code&gt;position:absolute&lt;/code&gt; en el lugar exacto.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.spinner {
    position: relative;
    width: 6em;
    height: 6em;
    border-top: 1em solid #eb7260;
    border-right: 1em solid #eb7260;
    border-bottom: 1em solid #eb7260;
    border-left: 1em solid transparent;
    border-radius: 50%;
}

.spinner:before {
    position: absolute;
    top: 0;
    left: 0;
    width: 4em;
    height: 4em;
    border-top: 1em solid #77c5f7;
    border-right: 1em solid #77c5f7;
    border-bottom: 1em solid #77c5f7;
    border-left: 1em solid transparent;
    border-radius: 50%;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Haciéndolos girar&lt;/h2&gt;

&lt;p&gt;Para la animación de los círculos vamos a necesitar &lt;a href=&quot;http://www.hexagonalalien.es/2016/03/animaciones-css3-keyframes-animation.html&quot;&gt;las propiedades keyframes y animation&lt;/a&gt; con la ayuda de &lt;code&gt;transform&lt;/code&gt;, así que sino las conoces muy bien te recomiendo leas el artículo que les dediqué a ellas, porque en este tutorial no vamos a ver como funcionan sino un ejemplo práctico de lo que podemos hacer con ellas.&lt;/p&gt;

&lt;p&gt;El proceso es muy sencillo. Haremos que ambos círculos giren indefinidamente a lo largo del tiempo, y los haremos girar 360 grados a la derecha y 360 grados a la izquierda con la propiedad &lt;code&gt;transform&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Sólo debemos tener en cuenta una cosa, y es que en el DOM el pseudo-elemento &lt;code&gt;::before&lt;/code&gt; se crea como hijo del &lt;code class=&quot;html-code&quot;&gt;div&lt;/code&gt; que usamos para crear el primer círculo, con lo que al animar este animaremos los dos al mismo tiempo. Para conseguir que nuestro segundo círculo gire en sentido contrario su tiempo de animación deber ser menor, ya que si es mayor girará en el mismo sentido aunque más despacio y si es igual, ambas animaciones se contrarrestarán y por tanto no girará.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.spinner {
    animation: loading 1s linear infinite;

}

.spinner:before {
    animation: loading2 .5s linear infinite;
}

@keyframes loading {
    from {
        transform: rotate(0deg);
    }
    to {
        transform: rotate(360deg);
    }
}

@keyframes loading2 {
    from {

        transform: rotate(0deg);
    }
    to {

        transform: rotate(-360deg);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;p&gt;Es aconsejable que cuando uses las propiedades de animación uses los prefijos para asegurarte la compatibilidad en los diferentes navegadores, en el ejemplo no los he usado para no alargar tanto el código, pero en el pen que te dejo al final de este tutorial, sí.&lt;/p&gt;

&lt;p data-height=&quot;265&quot; data-theme-id=&quot;0&quot; data-slug-hash=&quot;zqXKzV&quot; data-default-tab=&quot;result&quot; data-user=&quot;amram1977&quot; data-embed-version=&quot;2&quot; class=&quot;codepen&quot;&gt;See the Pen &lt;a href=&quot;http://codepen.io/amram1977/pen/zqXKzV/&quot;&gt;Spinner doble en CSS puro&lt;/a&gt; by amram (&lt;a href=&quot;http://codepen.io/amram1977&quot;&gt;@amram1977&lt;/a&gt;) on &lt;a href=&quot;http://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;
&lt;script async src=&quot;//assets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;</description><link>http://www.hexagonalalien.es/2016/05/spinner-animado-en-css-puro.html</link><author>noreply@blogger.com (LuisFran)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9Z68tPB_wB2MntN4CNqHRK5PI6C2AfojyNfby2MEwqZXM3mMP2YdJ3mvumvbh0EoRPxwGHHjmgHTO0_knu8TXg0jI8MfoKe01Wh71eTVIsaeW6dnnrs2Mi5PJqgWckAwobK75BAGxfJ4/s72-c/spin-paintings.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-5587635417829315324</guid><pubDate>Sat, 07 May 2016 18:11:00 +0000</pubDate><atom:updated>2016-05-09T10:29:25.675+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CSS</category><title>Las pseudo-clases estructurales a fondo</title><description>&lt;p&gt;Tal y como prometí en el artículo dedicado a las &lt;a href=&quot;http://www.hexagonalalien.es/2016/04/pseudo-clases-css.html&quot;&gt;pseudo-clases&lt;/a&gt;, hoy vamos a ampliar el apartado dedicado a las pseudo-clases estructurales, ya que las vimos muy por encima y en cuanto a las fórmulas creo que me quede muy, pero que muy escaso.&lt;/p&gt;

&lt;p&gt; En el artículo de hoy vamos a verlas todas de nuevo, aunque mucho más detalladas, y sobre todo nos adentraremos en las fórmulas y todo lo que podemos conseguir con ellas, que por cierto no es poco. Así que no estaría de más que te aprovisionases antes en tu nevera, porque esto comienza ya.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;section&gt;&lt;h2&gt;Las fórmulas&lt;/h2&gt;

&lt;p&gt;Aunque pueda parecer un poco bestia, vamos a entrar directamente con el plato fuerte, las fórmulas. Para ello y aunque no vas a necesitar conocimientos previos sobre ciertas de las pseudo-clases estructurales, aunque sólo sea a nivel de definición, te recomendaría leyeses antes el &lt;a href=&quot;http://www.hexagonalalien.es/2016/04/pseudo-clases-css.html&quot;&gt;artículo que le dediqué a las pseudo-clases&lt;/a&gt;, para que te hagas una idea global de lo que podemos conseguir con estas expresiones numéricas.&lt;/p&gt;

&lt;p&gt;De todas las pseudo-clases estructurales sólo cuatro de ellas admiten una fórmula, y son: &lt;code&gt;:nth-child(N)&lt;/code&gt;, &lt;code&gt;:nth-last-child(N)&lt;/code&gt;, &lt;code&gt;:nth-of-type(N)&lt;/code&gt; y &lt;code&gt;:nth-last-of-type(N)&lt;/code&gt;. (N) es el argumento que usan estas pseudo-clases para seleccionar el elemento o elementos a los que aplicarles los estilos, y puede ser una palabra reservada, un número entero, o una expresión numérica del estilo an+b.&lt;/p&gt;

&lt;p&gt;La expresión an+b se compone de tres datos. El número a indica cada cuantos elementos queremos contar, el número b por dónde empezar a contar, y en número n actúa como un índice para recorrer los elementos y empieza por cero. Así por ejemplo para una expresión 3n+2, Empezaríamos a contar por el segundo elemento y lo haríamos de tres en tres. En este caso la expresión selecciona el segundo, quinto, octavo, décimo-primero, y así sucesivamente, elementos.&lt;/p&gt;

&lt;p&gt;Es importante tener en cuanta que tanto a como b pueden tomar valores negativos, aunque sólo se aplican los valores resultante positivos de N (que es el argumento global). Jugar con valores negativos puede ser muy útil, ya que con sólo valores positivos no abarcamos todas las opciones. Imagínate que queremos seleccionar los cinco primeros elementos de una lista de diez, con valores sólo positivos es imposible, sin embargo aplicando valores negativos es bastante sencillo. La expresión para este caso sería -n+5.&lt;/p&gt;

&lt;p&gt;Por último decirte que las fórmulas también se pueden simplificar, supongo que los has notado en el ejemplo anterior con la expresión -n+5 donde he omitido el valor de a. Los casos donde podemos hacer alguna simplificación son:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Cuando los valores de a y b con iguales o b es 0. En este caso podemos omitir el valor de b ya que por ejemplo 4n+4 y 4n+0 dan el mismo resultado que 4n. Si no me crees haz el cálculo.&lt;/li&gt;
&lt;li&gt;Si a es igual a 1 también se puede omitir. Por ejemplo 1n+3 es lo mismo que n+3.&lt;/li&gt;
&lt;li&gt;Si a es igual a 0, que indica que no vamos a seguir un patrón de repetición, sólo es necesario el valor de b. Por ejemplo 0n+3 es lo mismo que 3.&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Lo último que nos queda es ver algún que otro ejemplo práctico, pero eso vamos a ir haciéndolo según detallemos cada pseudo-clase estructural, de ahí el empezar con las fórmulas. Lo que sí vamos a hacer es la estructura HTML con la que vamos a trabajar en los ejemplos, y que no va a ser otra cosa que un par de listas desordenadas y cuatro párrafos, todo ello contenido en un elemento &lt;code class=&quot;html-code&quot;&gt;article&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;article&amp;gt;
    &amp;lt;p&amp;gt;Texto 1&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;Texto 2&amp;lt;/p&amp;gt;
    &amp;lt;ul&amp;gt;
        &amp;lt;li&amp;gt;Objeto 1&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Objeto 2&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Objeto 3&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Objeto 4&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
    &amp;lt;p&amp;gt;Texto 3&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;Texto 4&amp;lt;/p&amp;gt;
    &amp;lt;ul&amp;gt;
        &amp;lt;li&amp;gt;Objeto 5&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Objeto 6&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;Objeto 7&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
&amp;lt;/article&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;:root&lt;/h2&gt;

&lt;p&gt;La pseudo-clase &lt;code&gt;:root&lt;/code&gt; permite seleccionar el elemento padre de mayor nivel dentro del DOM o árbol del documento. En la mayoría de los casos te encontrarás que &lt;code&gt;:root&lt;/code&gt; selecciona el elemento &lt;code class=&quot;html-code&quot;&gt;html&lt;/code&gt;, aunque hay otras posibilidades ya que CSS se puede usar para estilar otro tipo de documentos, como SVG o XML, es cuyo caso el resultado sería diferente.&lt;/p&gt;

&lt;p&gt;Sólo hay que tener en cuenta una cosa más, y es que el selector &lt;code&gt;:root&lt;/code&gt; tiene una especificidad mayor que el selector &lt;code&gt;html&lt;/code&gt;, y en caso de que ambos seleccionen el mismo elemento, &lt;code&gt;:root&lt;/code&gt; prevalece sobre &lt;code&gt;html&lt;/code&gt;.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;:first-child&lt;/h2&gt;

&lt;p&gt;Esta pseudo-clase nos permite seleccionar un elemento que es el primer elemento contenido dentro de otro elemento, o lo que es lo mismo, el primer elemento hijo contenido en un elemento padre.&lt;/p&gt;

&lt;p&gt;Vamos con un ejemplo apoyándonos en la estructura HTML anterior. Los que vamos ha hacer es seleccionar Objeto 1 y Objeto 5, que con esta pseudo-clase es así de sencillo: &lt;code&gt;li:first-child&lt;/code&gt;.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;:last-child&lt;/h2&gt;

&lt;p&gt;El selector &lt;code&gt;:last-child&lt;/code&gt; selecciona un elemento que es el último elemento contenido dentro de otro elemento.&lt;/p&gt;

&lt;p&gt;Como ejemplo vamos ahora a seleccionar los últimos elementos de las dos listas del código HTML, que son Objeto 4 y Objeto 7. El selector que necesitamos para ello es: &lt;code&gt;li:last-child&lt;/code&gt;.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;:nth-child(N)&lt;/h2&gt;

&lt;p&gt;La pseudo-clase &lt;code&gt;:nth-child&lt;/code&gt; te permite seleccionar uno o varios elementos hijos en función a la posición que ocupan dentro de su padre de acuerdo a una fórmula o expresión numérica. Como ya hemos visto las expresiones numéricas a fondo ahora será más sencillo entender el ejemplo que te pongo a continuación.&lt;/p&gt;

&lt;p&gt;Para este ejemplo vamos a cambiar un poco la dinámica, poniendo primero el código y viendo que es lo que estamos seleccionando. El código es el siguiente: &lt;code&gt;p:nth-child(2n+1)&lt;/code&gt;. Según la fórmula seleccionaremos los párrafos situados en la posición 1, 3, 5, 7, 9, etc. No tenemos tanto elementos, tan sólo 6 (los hijos de &lt;code class=&quot;html-code&quot;&gt;article&lt;/code&gt;) y no todos ellos son un párrafo.&lt;/p&gt;

&lt;p&gt;También hay que tener en cuenta la forma en que se numeran los elementos hijos dentro del padre, del primero al último, quedando así: El primero, Texto 1; el segundo, Texto 2; el tercero, una lista desordenada; el cuarto, Texto 3; el quinto, Texto 4;  por último el sexto, que otra vez es una lista desordenada. Por tanto, en este caso estamos seleccionando Texto 1 y Texto 4.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;:nth-last-child(N)&lt;/h2&gt;

&lt;p&gt;No es una pseudo-clase nada compleja si se sabe usar bien &lt;code&gt;:nth-child&lt;/code&gt;, ya que funciona exactamente igual salvo que comenzamos a contar desde el último elemento hasta el primero, por tanto los elementos se numeran de forma inversa.&lt;/p&gt;

&lt;p&gt;Para este ejemplo no voy a cambiar nada con respecto al usado para &lt;code&gt;:nht-child&lt;/code&gt;, para que así veas mejor su funcionamiento. Así que partiendo de la misma fórmula el código a usar es: &lt;code&gt;p:nth-last-child(2n+1)&lt;/code&gt; y los párrafos a seleccionar según su posición siguen siendo 1, 3, 5, 7, 9, etc.&lt;/p&gt;

&lt;p&gt;Lo único a tener en cuenta es que comenzamos desde el último elemento y terminamos en el primero, con lo cual numeramos de la siguiente forma: El primero, una lista desordenada; el segundo, Texto 4; el tercero, Texto 3; el cuarto, otra lista desordenada; el quinto, Texto 2; y por último Texto 1 que ocupa la sexta posición. Con lo cual estamos seleccionado Texto 3 y Texto 2.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;:first-of-type&lt;/h2&gt;

&lt;p&gt;La pseudo-clase &lt;code&gt;:first-of-type&lt;/code&gt; selecciona el primer elemento contenido dentro de otro y que a su vez es de un tipo determinado. Es muy parecido a &lt;code&gt;first-child&lt;/code&gt; pero más específico.&lt;/p&gt;

&lt;p&gt;Imaginemos que queremos seleccionar la primera de las listas desordenadas que tenemos en el ejemplo. Podríamos hacerlo si conocemos su posición exacta con &lt;code&gt;:nth-child&lt;/code&gt;, pero también con &lt;code&gt;:first-of-type&lt;/code&gt; y además no es necesario conocer su posición, ya que únicamente queremos seleccionar la primera de todas ellas. El código es así de sencillo: &lt;code&gt;ul:first-of-type&lt;/code&gt;.&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;:last-of-type&lt;/h2&gt;

&lt;p&gt;Esta pseudo-clase selecciona el último elemento contenido dentro de otro y que a su vez es de un tipo determinado. Al igual que con la anterior pseudo-clase este se parece mucho a &lt;code&gt;:last-child&lt;/code&gt;, pero mucho más específica.&lt;/p&gt;

&lt;p&gt;Vamos a hacer lo mismo que en el anterior ejemplo, pero en vez de seleccionar la primera lista desordenada vamos a seleccionar la última. También podríamos usar otras pseudo-clases, pero con esta es suficiente. El código el que sigue: &lt;code&gt;ul:last-of-type&lt;/code&gt;.&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;:nth-of-type(N)&lt;/h2&gt;

&lt;p&gt;La pseudo-clase &lt;code&gt;:nth-of-type(N)&lt;/code&gt; selecciona un elemento hijo de un tipo determinado en función a la posición que ocupa dentro de su padre y de acuerdo a la expresión numérica que usemos.&lt;/p&gt;

&lt;p&gt;Es muy similar a &lt;code&gt;:nth-child(N)&lt;/code&gt; salvo que para la selección del elemento o elementos sólo numeramos aquellos que sean del mismo tipo, y no todos los elementos dentro del padre como ocurría con &lt;code&gt;:nth-child(N)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Así para el ejemplo que estamos usando si aplicamos la misma fórmula que para &lt;code&gt;:nth-child(N)&lt;/code&gt; que es 2n+1 y queremos seleccionar los párrafos el código que quedaría sería: &lt;code&gt;p:nth-of-type(2n+1)&lt;/code&gt;. Hay que tener en cuenta que sólo numeramos los párrafos, por tanto el primer elemento es Texto 1; el segundo, Texto 2; el tercero, Texto 3 y el cuarto, Texto 4. Por tanto y según este código de ejemplo estamos seleccionando Texto 1 y Texto 3.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;:nth-last-of-type(N)&lt;/h2&gt;

&lt;p&gt;Esta es una pseudo-clase muy sencilla de dominar si conocemos bien &lt;code&gt;:nth-of-type(N)&lt;/code&gt;, ya que la única diferencia radica en que comenzamos a contar desde el último elemento del mismo tipo hasta el primero, por tanto los elementos se numeran de forma inversa.&lt;/p&gt;

&lt;p&gt;Para este ejemplo vamos a usar la mista fórmula que usamos en el anterior, para ver mejor las diferencias. El código que vamos a usar es: &lt;code&gt;p:nth-last-of-type(2n+1)&lt;/code&gt; y la numeración a tener en cuenta es: el primer elemento es Texto 4; el segundo, Texto 3; el tercero, Texto 2 y el cuarto, Texto 1. Como supongo ya has deducido los elementos que seleccionamos son Texto 4 y Texto 2.&lt;/p&gt;&lt;/section&gt;

&lt;p&gt;Y hasta aquí ha llegado este artículo dedicado a las pseudo-clases estructurales, donde espero haber aclarado un poco su funcionamiento y también como se manejan las dichosas formulitas. También aprovecho para aconsejarte &lt;a href=&quot;https://css-tricks.com/examples/nth-child-tester/&quot;&gt;:nth Tester&lt;/a&gt;, una aplicación de &lt;a href=&quot;https://css-tricks.com/&quot;&gt;CSS-Tricks&lt;/a&gt;, donde podrás trastear con las pesudo-clases del tipo :nth y sus fórmulas.&lt;/p&gt;</description><link>http://www.hexagonalalien.es/2016/05/pseudo-clases-estructurales.html</link><author>noreply@blogger.com (LuisFran)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-3315328480663305270</guid><pubDate>Sat, 23 Apr 2016 15:14:00 +0000</pubDate><atom:updated>2016-04-23T17:17:42.059+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">HTML5</category><title>Cómo usar correctamente figure y figcaption</title><description>&lt;p&gt;En prensa, revistas y libros es muy común encontrarnos con imágenes, gráficos o fragmentos de código acompañados de una leyenda (un texto explicativo de dicho elemento). Hasta la aparición de HTML5 no era posible dar ningún carácter semántico a este tipo de elementos, ya que por ejemplo para un motor de búsqueda una imagen y la leyenda que la acompaña no tienen relación alguna. Además, y desde el punto de vista de diseño, debemos usar elementos adicionales para conseguir que la leyenda nos quede ajustada al elemento que queremos darle significado.&lt;/p&gt;

&lt;p&gt;Las etiquetas &lt;code class=&quot;html-code&quot;&gt;figure&lt;/code&gt; y &lt;code class=&quot;html-code&quot;&gt;figcaption&lt;/code&gt;, vienen resolver estos problemas. En el aspecto semántico, al crear una figura que contiene una leyenda, este texto queda unido a dicha figura, aportándole un valor semántico. En cuanto a diseño, una leyenda se coloca bien arriba a la izquierda o abajo a la izquierda (según la situemos en el código) de la figura que hayamos creado, lo que simplifica el marcado HTML y también el CSS para lograr tal posicionamiento. Como todo son ventajas, ¿qué tal si las vemos un poco más a fondo?.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;section&gt;&lt;h2&gt;Las figuras son algo más que imágenes&lt;/h2&gt;

&lt;p&gt;El uso más común del elemento &lt;code class=&quot;html-code&quot;&gt;figure&lt;/code&gt; es con las imágenes (sobre todo acompañadas de una leyenda con &lt;code class=&quot;html-code&quot;&gt;figcaption&lt;/code&gt;), pero no es la única forma de usar este elemento.&lt;/p&gt;

&lt;p&gt;Podemos usar el elemento &lt;code class=&quot;html-code&quot;&gt;figure&lt;/code&gt; para una imagen con o sin leyenda, para un fragmento de código, en un vídeo relacionado con el contenido o también en una cita. También debemos tener en cuenta que una figura puede contener más de un elemento, así podemos tener varias imágenes, varios vídeos o porqué no, imágenes y vídeos, siempre teniendo en cuenta que sólo podemos usar una leyenda, ya que esta se asocia a la figura que hemos creado.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;No todos las imágenes tienen que ser figuras&lt;/h2&gt;

&lt;p&gt;Con lo que hemos visto hasta ahora podrías verte tentado en crear figuras con todas y cada una de la imágenes de tu web, pero no lo hagas, es un completo disparate. Un elemento &lt;code class=&quot;html-code&quot;&gt;figure&lt;/code&gt;, según la especificación de la &lt;a href=&quot;http://dev.w3.org/html5/markup/figure.html&quot;&gt;W3C&lt;/a&gt;, representa una unidad de contenido, con una leyenda opcional, que si bien se relaciona con el flujo principal, su posición es independiente de este. Por ejemplo una imagen para ilustrar un texto, bien puede ir antes, después o incrustada dentro del mismo, y no cambia con ello su significado.&lt;/p&gt;

&lt;p&gt;Por tanto, nunca se debe usar un elemento &lt;code class=&quot;html-code&quot;&gt;figure&lt;/code&gt; para elementos de navegación, bien sean imágenes o iconos, para logos o elementos gráficos de una cabecera, en definitiva, para ningún elemento cuya posición dentro del documento sea relevante.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;¿Y qué pasa con la propiedad alt?&lt;/h2&gt;

&lt;p&gt;Puede parecer raro, pero no es la primera vez que me encuentro con una imagen sin su correspondiente &lt;code&gt;alt&lt;/code&gt; por la sencilla razón de estar contenido dentro de una figura con su correspondiente leyenda. Es un error garrafal, primero porque &lt;code&gt;alt&lt;/code&gt; es una propiedad obligatoria cuando usamos una etiqueta &lt;code clas=&quot;html-code&quot;&gt;img&lt;/code&gt; según las especificaciones de la &lt;a href=&quot;https://www.w3.org/TR/2012/WD-html5-20121025/the-img-element.html#alt&quot;&gt;W3C&lt;/a&gt; y de &lt;a href=&quot;https://html.spec.whatwg.org/multipage/embedded-content.html#alt&quot;&gt;WHATWG&lt;/a&gt; y segundo, porque en lo que respecta a accesibilidad, el atributo &lt;code&gt;alt&lt;/code&gt; es una descripción de la imagen que se visualiza cuando esta no puede ser vista por el usuario.&lt;/p&gt;

&lt;p&gt;Una leyenda es también un texto explicativo, pero en este caso de la figura (recuerda que una figura puede contener más de un elemento), y que si la figura contiene una única imagen, bien puede coincidir con el texto del atributo &lt;code&gt;alt&lt;/code&gt;, aunque no es necesario que así sea. Hay que tener claro que son dos conceptos diferentes y que el uso de una leyenda no exime del uso de la etiqueta &lt;code&gt;alt&lt;/code&gt; en la imagen o imágenes que usemos.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Uso de figure y figcaption&lt;/h2&gt;

&lt;p&gt;Como lo más sencillo es ver ejemplos de código, eso es lo que vamos a hacer. Voy a poner tres ejemplos, todos ellos basados en imágenes, aunque son perfectamente extrapolables a cualquier otro tipo de elemento.&lt;/p&gt;

&lt;h3&gt;Figure sin figcaption&lt;/h3&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;figure id=&amp;quot;figura1&amp;quot;&amp;gt;
    &amp;lt;img src=&amp;quot;imagen1.jpg&amp;quot; alt=&amp;quot;Una imagen&amp;quot;&amp;gt;
&amp;lt;/figure&amp;gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;h3&gt;Figure con figcaption&lt;/h3&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;figure id=&amp;quot;figura2&amp;quot;&amp;gt;
    &amp;lt;img src=&amp;quot;torre.jpg&amp;quot; alt=&amp;quot;La torre Eiffel&amp;quot;&amp;gt;
    &amp;lt;figcaption&amp;gt;Disfrutando de la torre Eiffel en mis vacaciones&amp;quot;&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Figure con varias imágenes&lt;/h3&gt;

&lt;p&gt;El elemento &lt;code class=&quot;html-code&quot;&gt;figcaption&lt;/code&gt; puede ir tanto al principio como al final de la figura, pero nunca entre los elementos que componen la figura.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;figure id=&amp;quot;figura3&amp;quot;&amp;gt;
    &amp;lt;figcaption&amp;gt;Mis dos hijas, Lucía y Alba&amp;lt;/figcaption&amp;gt;
    &amp;lt;img src=&amp;quot;lucia.jpg&amp;quot; alt=&amp;quot;Mi hija Lucía&amp;quot;&amp;gt;
    &amp;lt;img src=&amp;quot;alba.jpg&amp;quot; alt=&amp;quot;Mi hija Alba&amp;quot;&amp;gt;
&amp;lt;/figure&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;</description><link>http://www.hexagonalalien.es/2016/04/como-usar-figure-figcaption.html</link><author>noreply@blogger.com (LuisFran)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-4590818947227391057</guid><pubDate>Sat, 09 Apr 2016 15:09:00 +0000</pubDate><atom:updated>2016-04-25T10:50:21.891+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CSS</category><title>Barra de progreso animada en CSS puro</title><description>&lt;p&gt;Después de ver lo sencillo que es crear animaciones en CSS con &lt;code&gt;@keyframes&lt;/code&gt; y &lt;code&gt;animation&lt;/code&gt;, como vimos en el artículo &lt;a href=&quot;http://www.hexagonalalien.es/2016/03/animaciones-css3-keyframes-animation.html&quot;&gt;Animando con CSS3: keyframes y animation&lt;/a&gt;, hoy vamos a hacer una barra de progreso, una animación un poco más compleja, que como verás, al final no lo es tanto.&lt;/p&gt;

&lt;p&gt;Las barras de progreso son de esos elementos que no suelen faltar en casi ninguna aplicación, y evidentemente las aplicaciones web no son menos. Tradicionalmente se han implementado mediante algún lenguaje de programación, generalmente Javascript, pero las funcionalidades de CSS3 son muchas, y con las nuevas implementaciones de HTML5 que nos permiten hasta crear videojuegos, una barra de progreso ligera y funcional es mucho mejor que las clásicas soluciones. Ya sabes, cuanto menos Javascript mejor.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;section&gt;&lt;h2&gt;La estructura&lt;/h2&gt;

&lt;p&gt;Para crear una barra de progreso no necesitamos mucho, así que nuestra estructura en HTML va a ser muy sencilla. Tan sólo vamos a usar tres etiquetas &lt;code class=&quot;html-code&quot;&gt;div&lt;/code&gt;, una como contenedor general, que también hará de barra global. La segunda será la que mostrará el progreso de forma gráfica, llenando poco a poco el contenedor. Y la última es sólo un capricho, ya que además de mostrar el progreso de forma gráfica, lo haremos de forma porcentual, y con algún truquillo CSS para que quede lo mejor posible.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;div id=&amp;quot;contenedor&amp;quot;&amp;gt;
  &amp;lt;div id=&amp;quot;barra&amp;quot;&amp;gt;
    &amp;lt;div id=&amp;quot;texto&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Dibujando la barra&lt;/h2&gt;

&lt;p&gt;Ahora que ya tenemos nuestra estructura HTML es momento de ponernos a dibujar nuestra barra de progreso. Vamos a definir un alto y un largo para nuestro contenedor general, además le daremos un borde al que le asignaremos un color determinado, así ya tendremos nuestra barra. Después damos estilo a &lt;code&gt;#barra&lt;/code&gt;, haciendo que ocupe el 100% del alto y dejando su ancho a cero, ya que inicialmente este será el valor a mostrar por la barra de progreso. Lógicamente le vamos a dar un color de fondo.&lt;/p&gt;

&lt;p&gt;Sólo con lo anterior ya tendríamos dibujada nuestra barra de progreso, ahora viene &quot;el capricho&quot;. Con nuestro contenedor &lt;code&gt;#texto&lt;/code&gt; lo que vamos ha hacer es centrar su contenido tanto vertical como horizontalmente. El texto, como queremos que sea para mostrar un progreso no podemos tenerlo directamente en el HTML, así que lo inyectaremos mediante la propiedad &lt;code&gt;content&lt;/code&gt; del pseudo-elemento &lt;code&gt;::after&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
#contenedor {
    width: 25em;
    height: 4em;
    margin: 0 auto;
    border: 2px solid #eb7260;
}

#barra {
    width: 0;
    height: 100%;
    background: #eb7260;
}

#texto {
    font-size: 2em;
    font-weight: bold;
    line-height: 2em;
    width: 12.5em;
    height: 100%;
    text-align: center;
    color: #eb7260;
    mix-blend-mode: multiply;
}

#texto:after {
    content: &#39;0%&#39;;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Creando la animación&lt;/h2&gt;

&lt;p&gt;Lo primero que vamos a hacer es crear las &lt;code&gt;@keyframes&lt;/code&gt;. Para la barra vamos a jugar con su ancho (&lt;code&gt;width&lt;/code&gt;) para simular el efecto de una barra que se llena poco a poco, para lo cual únicamente necesitaremos dos estado, el inicial con &lt;code&gt;width:0&lt;/code&gt; y el final con &lt;code&gt;width:100%&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para las &lt;code&gt;@keyframes&lt;/code&gt; de nuestro campo de texto vamos a necesitar algunos estados más, para al menos mostrar los estados 0%, 25%, 50%, 75% y 100%. Podemos añadir tantos como queramos, pero para este ejemplo será más que suficiente.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
@keyframes progreso {
    0% {
        width: 0;
    }
    100% {
        width: 100%;
    }
}

@keyframes porcentaje {
    0% {
        content: &#39;0%&#39;;
    }
    25% {
        content: &#39;25%&#39;;
    }
    50% {
        content: &#39;50%&#39;;
    }
    75% {
        content: &#39;75%&#39;;
    }
    100% {
        content: &#39;100%&#39;;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Por último nos quedan las propiedades de animación que hay que asignar a los elementos que vamos a animar, en nuestro caso &lt;code&gt;#barra&lt;/code&gt; y &lt;code&gt;#texto&lt;/code&gt;. No vamos a usar ningún valor complicado, tan sólo les daremos a ambas la misma duración (como es lógico), definiremos que el ritmo de la animación sea linear (sobre todo a causa de los porcentajes), y le daremos el valor infinito para la duración de la animación.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
#barra {
    animation: progreso 5s linear infinite;
}

#texto:after {
    animation: porcentaje 5s linear infinite;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;p&gt;Como ves no es tan difícil hacer una barra de progreso animada, y eso que lo he complicado un poco con ese &quot;caprichito&quot;. Tan sólo puntualizar un par de cosas. La primera es que es aconsejable usar los prefijos tanto para &lt;code&gt;@keyframes&lt;/code&gt; como para &lt;code&gt;animation&lt;/code&gt;, para no tener problemas con los navegadores, sobre todo es aconsejable el prefijo &lt;code&gt;-webkit-&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;La segunda es sobre una propiedad que he usado y que no es muy frecuente, &lt;code&gt;mix-blend-mode&lt;/code&gt;, y que nos permite realizar diversos efectos mezclando los colores de un elemento con todo lo que tenga debajo. En este &lt;a href=&quot;http://codepen.io/team/css-tricks/pen/ZYdjmZ&quot;&gt;pen&lt;/a&gt; puedes hacerte una idea general de como funcionan sus valores. Además he creado un pen con la animación que hemos creado en este post, para que puedas trastear con ella todo lo que quieras.&lt;/p&gt;

&lt;p data-height=&quot;268&quot; data-theme-id=&quot;0&quot; data-slug-hash=&quot;XdVBLW&quot; data-default-tab=&quot;result&quot; data-user=&quot;amram1977&quot; class=&quot;codepen&quot;&gt;See the Pen &lt;a href=&quot;http://codepen.io/amram1977/pen/XdVBLW/&quot;&gt;Barra de progreso animada sólo con CSS&lt;/a&gt; by amram (&lt;a href=&quot;http://codepen.io/amram1977&quot;&gt;@amram1977&lt;/a&gt;) on &lt;a href=&quot;http://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;
&lt;script async src=&quot;//assets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;</description><link>http://www.hexagonalalien.es/2016/04/barra-de-progreso-animada-en-css-puro.html</link><author>noreply@blogger.com (LuisFran)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-1442638519231259291</guid><pubDate>Sat, 02 Apr 2016 14:04:00 +0000</pubDate><atom:updated>2016-05-20T16:53:55.339+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CSS</category><title>Entendiendo las pseudo-clases de CSS</title><description>&lt;p&gt;En el anterior artículo sobre &lt;a href=&quot;http://www.hexagonalalien.es/2016/03/selectores-de-css.html&quot;&gt;Selectores de CSS&lt;/a&gt; vimos muy por encima las pseudo-clases y los pseudo-elementos. Ambos selectores son grandes armas para dar estilo a nuestros documentos y conseguir buenos resultados con muy poco, por eso ahora es momento de verlos a fondo, aunque hoy únicamente vamos a ver las pseudo-clases.&lt;/p&gt;

&lt;p&gt;No pretendo que los veamos todas, pero si al menos las más importantes y más usadas, o al menos las que a mi gusto son las más útiles. Vamos a por ello, y que no se diga que no eres capaz de seguir a un alienígena.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;p&gt;Las pseudo-clases, simplificando, son muy parecidas a un atributo &lt;code&gt;class&lt;/code&gt; de HTML, eso sí, sin estar especificadas explícitamente en el marcado. Hay muchas, pero que muchas y a la par también hay un sin fin de formas de clasificarlas. La W3C tiene la suya propia, que puedes ver en el &lt;a href=&quot;https://drafts.csswg.org/selectors-4/#linguistic-pseudos&quot;&gt;Editor&#39;s Draft&lt;/a&gt; y que comienzan a partir del apartado dedicado a las pseudoclases-lingüísticas.&lt;/p&gt;

&lt;p&gt;En este artículo voy a usar una clasificación diferente, ya que como dije no voy a tocarlas todas, que no recuerdo muy bien donde la vi por primera vez (si lo recordase le pondría un enlace). Para las pseudo-clases que vamos a ver creo que es una clasificación muy acertada y que seguramente te ayudará a comprenderlas mejor.&lt;/p&gt;

&lt;section&gt;&lt;h2&gt;Pseudo-clases relacionadas con enlaces&lt;/h2&gt;

&lt;p&gt;Las pseudo-clases &lt;code&gt;:link&lt;/code&gt; y &lt;code&gt;:visited&lt;/code&gt; fueron introducidas en la primera versión de CSS (también &lt;code&gt;:active&lt;/code&gt; que veremos después), pero únicamente para un elemento &lt;code class=&quot;html-code&quot;&gt;a&lt;/code&gt;. Posteriormente en CSS2 esto cambió para que pudieran aplicarse a cualquier elemento.&lt;/p&gt;

&lt;p&gt;Estas pseudo-clases nos permiten seleccionar un elemento en función al estado del enlace, si ha sido o no visitado con anterioridad, y evidentemente depende del historial del navegador en que visualicemos el documento. Su uso es muy sencillo y sólo hay una pega, y es que son mutuamente excluyentes, es decir no podemos combinarlas en un selector:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
a:link, a:visited {
    color: blue;
}

a:link:visited {
    color: red;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;En el ejemplo, el primer caso es totalmente válido, ya que lo que hacemos es dar el mismo estilo a &lt;code class=&quot;html-code&quot;&gt;a&lt;/code&gt; tanto si ha sido visitado como si no. El segundo caso por contra no es correcto, ya que aunque podemos combinar pseudo-clases para crear selectores más específicos, &lt;code&gt;:link&lt;/code&gt; y &lt;code&gt;:visited&lt;/code&gt; son mutuamente excluyentes, un enlace no puede estar sin visitar y a la vez haber sido visitado (pura lógica).&lt;/p&gt;

&lt;p&gt;Dentro de esta clasificación también tenemos la pseudo-clase &lt;code&gt;:target&lt;/code&gt;, que nos permite dar estilo a un elemento cuya &lt;code&gt;id&lt;/code&gt; coincide con el identificador de fragmentos de la URL del documento (una URL que ternima con el signo &quot;#&quot; y un identificador). Por ejemplo si tenemos una url www.misitio.com/#inicio el selector que usaríamos sería &lt;code&gt;#inicio:target&lt;/code&gt;.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Pseudo-clases dinámicas&lt;/h2&gt;

&lt;p&gt;Las pseudo-clases dinámicas seleccionan un elemento en función de un estado que ha sido alterado por la acción del usuario. Vamos a ver tres: &lt;code&gt;:hover&lt;/code&gt;, &lt;code&gt;:active&lt;/code&gt; y &lt;code&gt;:focus&lt;/code&gt;, que son las más usadas. Las pseudo-clase &lt;code&gt;:active&lt;/code&gt; fue introducida en la primera versión de CSS, al igual que &lt;code&gt;:link&lt;/code&gt; y &lt;code&gt;visited&lt;/code&gt;, y selecciona un elemento cuando esta ha recibido el foco, bien sea mediante teclado, ratón u otro tipo de entrada.&lt;/p&gt;

&lt;p&gt;Las otras dos pseudo-clases, &lt;code&gt;:hover&lt;/code&gt; y &lt;code&gt;:active&lt;/code&gt; fuero introducidas en CSS2 junto con &lt;code&gt;:lang&lt;/code&gt; y &lt;code&gt;:first-child&lt;/code&gt;. La pseudo-clase &lt;code&gt;:hover&lt;/code&gt; es quizás una de las más usadas. Nos permite seleccionar un elemento cuando el usuario designa este elemento con algún dispositivo de señalización, por ejemplo el puntero del ratón, sin necesidad alguna de activarlo.&lt;/p&gt;

&lt;p&gt;La pseudo-clase &lt;code&gt;:active&lt;/code&gt; selecciona un elemento cuando este está siendo activado por el usuario. Por ejemplo cuando el usuario presiona el botón del ratón y luego lo suelta, lo que produce un evento de tiempo muy corto.&lt;/p&gt;

&lt;p&gt;El orden de la declaración en las pseudo-clases dinámicas, en función de lo que se desea lograr, es muy importante. El comportamiento que normalmente se usa, teniendo en cuenta también las pseudo-clases relacionadas con enlaces, es el siguiente:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
a:link {
    declaraciones;
}

a:visited {
    declaraciones;
}

a:focus {
    declaraciones;
}

a:hover {
    declaraciones;
}

a:active {
    declaraciones;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Pseudo-clases para formularios&lt;/h2&gt;

&lt;p&gt;Son muchas las novedades que CSS3 ha incluido en cuando al tratamiento de formularios mediante pseudo-clases, que unidas a las de las versiones anteriores nos dan una completa lista para darles estilo de casi cualquier forma:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;code&gt;:enabled&lt;/code&gt;: Selecciona un campo de entrada &lt;code class=&quot;html-code&quot;&gt;input&lt;/code&gt; que está en su estado por defecto, habilitado y listo para ser usado.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:disabled&lt;/code&gt;: Selecciona un elemento &lt;code class=&quot;html-code&quot;&gt;input&lt;/code&gt; que contiene el atributo &lt;code&gt;disabled&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:checked&lt;/code&gt;: Selecciona una checkbox cuyo estado es &quot;comprobado&quot;. Es un recurso muy usado que permite además de dar estilo a las checkboxes, crear &lt;a href=&quot;http://www.hexagonalalien.es/2015/12/icono-animado-hamburguesa-css.html&quot;&gt;iconos animados&lt;/a&gt; y &lt;a href=&quot;http://www.hexagonalalien.es/2016/01/css-menu-off-canvas.html&quot;&gt;menús ocultos&lt;/a&gt; mediante el  checkbox hack.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:requiered&lt;/code&gt;: Permite seleccionar un elemento &lt;code class=&quot;html-code&quot;&gt;input&lt;/code&gt; que contiene el atributo &lt;code&gt;requiered&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:valid&lt;/code&gt;: Selecciona un elemento &lt;code class=&quot;html-code&quot;&gt;input&lt;/code&gt; cuyo campo de entrada es válido en función al valor del atributo &lt;code class=&quot;html-code&quot;&gt;type&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:invalid&lt;/code&gt;: Selecciona un elemento &lt;code class=&quot;html-code&quot;&gt;input&lt;/code&gt; cuyo campo de entrada es no válido en función al valor del atributo &lt;code class=&quot;html-code&quot;&gt;type&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Pseudo-clases estructurales&lt;/h2&gt;

&lt;p&gt;Estas pseudo-clases permiten seleccionar un elemento en función a su posición en el árbol del documento y a su relación con otros elementos.&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;code&gt;:root&lt;/code&gt;: Selecciona el elemento raíz del documento. Generalmente es el elemento &lt;code class=&quot;html-code&quot;&gt;html&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:first-child&lt;/code&gt;: Selecciona el primer elemento hijo, independientemente del tipo, en un elemento padre.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:last-child&lt;/code&gt;: Muy parecido al anterior, pero en este caso selecciona el último elemento hijo en un elemento padre, con independencia de su tipo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:nth-child(n)&lt;/code&gt;: Esta pseudo-clase permite seleccionar un elemento hijo en función a la posición que ocupa dentro de un elemento padre. El valor &lt;code&gt;(n)&lt;/code&gt; puede ser un valor entero (que selecciona un único elemento), una fórmula como por ejemplo &lt;code&gt;(5n)&lt;/code&gt; que selecciona &quot;cada quinto elemento (5, 10, 15, ...)&quot; o una fórmula de compensación como por ejemplo &lt;code&gt;(5n+1)&lt;/code&gt;, donde también se permiten valores negativos.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:nth-last-child(n)&lt;/code&gt;: Funciona de forma parecida a &lt;code&gt;:nth-child&lt;/code&gt; pero lo hace contanto de forma inversa y empezando por el último elemento hijo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:first-of-type&lt;/code&gt;: Selecciona el primer elemento hijo, de este tipo, en un elemento padre.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:last-of-type&lt;/code&gt;: Al igual que el anterior selecciona el último elemento hijo, de este tipo, en un elemento padre.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nth-of-type(n)&lt;/code&gt;: Selecciona un elemento del tipo indicado en función a la posición que ocupa dentro del elemento padre indicada por el valor de &lt;code&gt;(n)&lt;/code&gt;, que como ya vimos puede ser un valor entero, una fórmula o una una fórmula de compensación.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nth-last-of-type(n)&lt;/code&gt;: Selecciona el elemento de igual forma que &lt;code&gt;:nth-of-type(n)&lt;/code&gt; pero cuenta hacia arriba desde el último elemento.&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Esto tipo de pseudo-clases son quizás las más confusas de entender, por lo cual las veremos más a fondo en un artículo dedicado sólo a ellas, donde ampliaré su descripción y veremos las fórmulas de una forma más completa, todo ello con la ayuda de unos cuantos ejemplos.&lt;/p&gt;&lt;/section&gt;</description><link>http://www.hexagonalalien.es/2016/04/pseudo-clases-css.html</link><author>noreply@blogger.com (LuisFran)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-6802444229386284792</guid><pubDate>Mon, 28 Mar 2016 06:50:00 +0000</pubDate><atom:updated>2016-04-25T10:48:34.128+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CSS</category><title>Animando con CSS3: keyframes y animation</title><description>&lt;figure class=&quot;post-img&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJLL6trxzDOirFg73RYAHScWwtLiSkS0HH5f_An0moEgGoQyYCMLAdSP0F8hodWZ-ojiaFjNj3NujZNGxUMblZwitRQF1BbrO_Ea8ijOjW5SI9dvhsXos1u_TtbMbA1F5e1Fgek9zSfts/s1600/animation-frame.jpg&quot; alt=&quot;Animación en fotogramas&quot; /&gt;
&lt;figcaption&gt;Imagen de &lt;a href=&quot;https://www.flickr.com/photos/32535532@N07/&quot;&gt;Juliana&lt;/a&gt; - modificada.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Las animaciones son un gran arma cuando intentamos captar la atención del usuario en aquellas zonas de la web que estimamos de vital importancia. Porque a fin de cuentas somos simples, muy simples, y nos encantan las cosas brillantes y todo aquello que se mueva.&lt;/p&gt;

&lt;p&gt;En animación web siempre hemos tenido que recurrir a otros lenguajes para este tipo de usos, sobre todo Javascript, pero CSS3 ha cambiado todo esto. A parte de las animaciones simples que podemos realizar con &lt;code&gt;transition&lt;/code&gt;, CSS3 nos da una herramienta mucho más potente, &lt;code&gt;@keyframes&lt;/code&gt;, que nos permite realizar animaciones más complejas, con ciclos y la posibilidad de iniciarla y pararla. Por esto Javascript se ha ido relegando a un segundo plano. Así que no pierdas el tiempo, ha llegado el momento de crear animaciones con CSS3.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;p&gt;Las animaciones en CSS constan de dos grandes bloques:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Keyframes - con &lt;code&gt;@keyframes&lt;/code&gt; definimos los estados y estilos de la animación.&lt;/li&gt;
&lt;li&gt;Propiedades de la animación - en este bloque asignamos los &lt;code&gt;@keyframes&lt;/code&gt; a una regla específica de nuestro CSS y definimos como va a ser animado el elemento de HTML seleccionado por nuestra regla.&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Vamos a verlos con más detalle.&lt;/p&gt;

&lt;section&gt;&lt;h2&gt;Las keyframes&lt;/h2&gt;

&lt;p&gt;Las keyframes son la parte fundamental de la animación. Con ellas definimos cómo se verá la animación en cada estado de la línea de tiempo (timeline). Cada &lt;code&gt;@keyframes&lt;/code&gt; se compone de:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Nombre de la animación: Un nombre que describa la animación (esto es sólo un consejo) que luego va a ser usado en la propiedades de la animación mediante la propiedad &lt;code&gt;animation-name&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Estados de la animación: cada animación debe poseer al menos dos estados, uno para el inicio y otro para el final. Estos estados se representan mediante un porcentaje, 0% para el inicio y 100% para el final, aunque para estos dos estados también podemos usar las palabras reservadas &lt;code&gt;from&lt;/code&gt; y &lt;code&gt;to&lt;/code&gt;. Entre medias podemos añadir tantos estados como queramos, siempre expresados en porcentajes.&lt;/li&gt;
&lt;li&gt;Propiedades de CSS: Las propiedades de CSS  definidas para cada estado de la animación en la línea de tiempo.&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Para que quede más claro vamos con un ejemplo que iremos construyendo poco a poco en este tutorial. Va a ser algo muy sencillo, tan sólo una caja que se mueve de izquierda a derecha y viceversa, de forma infinita. Este es el &lt;code&gt;@keyframes&lt;/code&gt; que vamos a usar:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
@keyframes moving-box {
  0% {left:10%}
  100% {left:80%}
}
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Las propiedades de la animación&lt;/h2&gt;

&lt;p&gt;Ahora que ya tenemos creado nuestro &lt;code&gt;@keyframes&lt;/code&gt; tenemos que añadir las propiedades de la animación para darle funcionalidad. Como ya vimos con ellas haremos dos cosas: asignamos las &lt;code&gt;@keyframes&lt;/code&gt; al elemento que queremos animar y definimos cómo será animado.&lt;/p&gt;

&lt;p&gt;Las propiedades de la animación las asignaremos a una regla CSS del elemento que queremos animar. Como mínimo debemos definir al menos dos propiedades &lt;code&gt;animation-name&lt;/code&gt; y &lt;code&gt;animation-duration&lt;/code&gt;. Por supuesto hay más propiedades CSS, en concreto seis, lo que da un total de ocho propiedades. Vamos a verlas de forma resumida para que te hagas una idea de lo que podemos hacer con ellas:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;code&gt;animation-name&lt;/code&gt;: El nombre de la animación, que previamente hemos definido en las &lt;code&gt;@keyframes&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;animation-duration&lt;/code&gt;: Con esta propiedad definimos el tiempo que durará la animación, expresado bien en segundos(s) o en milisegundos(ms).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;animation-timing-function&lt;/code&gt;: Define la curva de velocidad o ritmo de la animación. Podemos definirla con las palabras reservadas &lt;code&gt;ease&lt;/code&gt;, &lt;code&gt;linear&lt;/code&gt;, &lt;code&gt;ease-in&lt;/code&gt;, &lt;code&gt;ease-out&lt;/code&gt;, &lt;code&gt;ease-in-out&lt;/code&gt;, &lt;code&gt;initial&lt;/code&gt; e &lt;code&gt;inherit&lt;/code&gt;, o de forma más compleja mediante la &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/timing-function&quot;&gt;curva de Bézier&lt;/a&gt;. El valor por defecto (si no le damos otro) es &lt;code&gt;ease&lt;/code&gt;. Si en alguna ocasión has trabajado con &lt;code&gt;transition&lt;/code&gt; seguro que ya las conoces.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;animation-delay&lt;/code&gt;: Permite definir cuando comenzará la animación. Si es un valor positivo la animación comenzará en el instante que hayamos especificado. Si por el contrario el valor es negativo, la animación comenzará inmediatamente, pero ya habrá pasado el tiempo que hayamos especificado, es decir, nos perderemos el trozo de animación correspondiente al tiempo que hayamos dado. El valor se puede expresar tanto en segundos(s) como en milisegundos(ms). La propiedad &lt;code&gt;animation-delay&lt;/code&gt; es muy útil cuando queremos concatenar varias animaciones.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;animation-iteration-count&lt;/code&gt;: Aquí definimos el número de veces que la animación se va a ejecutar. Los valores que puede tomar son:
&lt;ul&gt;&lt;li&gt;&lt;code&gt;#&lt;/code&gt;: Un valor numérico (por defecto es 1).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;infinite&lt;/code&gt;: La animación se repite de forma recursiva.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;initial&lt;/code&gt;: Establece el número de iteraciones en el valor predeterminado.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;inherit&lt;/code&gt;: Hereda el valor de su padre.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;animation-direction&lt;/code&gt;: Especifica si la animación se ejecutará hacia adelante, hacia atrás o en ciclos alternos (hacia adelante y hacia atrás). Los valores que puede tomar son:
&lt;ul&gt;&lt;li&gt;&lt;code&gt;normal&lt;/code&gt;: Es el estado por defecto. La animación se ejecuta hacia adelante y en cada ciclo vuelve a empezar desde el estado inicial (0%).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reverse&lt;/code&gt;: La animación se ejecuta hacia atrás, por tanto en cada ciclo empieza desde su estado final (100%).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;alternate&lt;/code&gt;: La animación cambia de sentido en cada ciclo. Así en los ciclos impares lo hará hacia adelante y el los ciclos pares lo hará hacia atrás.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reverse-alternate&lt;/code&gt;: Parecido al estado anterior pero justo al revés. En los ciclos impares lo hará hacia atrás y en los ciclos pares hacia adelante.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;animation-fill-mode&lt;/code&gt;: Especifica si los estilos de la animación son visibles antes o después que esta comience. Por defecto la animación no afecta a los estilos del elemento antes que esta comience o una vez que esta haya terminado. Con esta propiedad podemos cambiar estos valores:
&lt;ul&gt;&lt;li&gt;&lt;code&gt;backwards&lt;/code&gt;: Antes de que comience la animación los estilos del keyframe inicial (0%) son aplicados al elemento.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;forwards&lt;/code&gt;: Una vez acabada la animación los estilos aplicados por la animación en el keyframe final (100%) se mantienen aplicados.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;both&lt;/code&gt;: La animación aplica las dos reglas anteriores, aplicando los estilos antes de que la animación comience y también después que haya finalizado.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;normal&lt;/code&gt;: Es el estado por defecto. Los estilos sólo se aplican al elemento mientras la animación está en curso.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;animation-play-state&lt;/code&gt;: Con esta propiedad determinamos cuando la animación está en curso o en pausa. Los valores que puede tomar son &lt;code&gt;running&lt;/code&gt; (aunque también funciona con playing) y &lt;code&gt;paused&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;Al igual que en otras propiedades CSS tenemos una forma abreviada, que es la que se aconseja usar siempre que sea posible:&lt;/p&gt;

&lt;pre&gt;
animation: [animation-name] [animation-duration] [animation-timing-function] [animation-delay] [animation-iteration-count] [animation-direction] [animation-fill-mode] [animation-play-state];
&lt;/pre&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;La animación&lt;/h2&gt;

&lt;p&gt;Ahora que ya hemos visto las posibilidades que tenemos con las propiedades &lt;code&gt;animation&lt;/code&gt;, es momento de ponerlo todo es práctica. Anteriormente ya habíamos definidos las &lt;code&gt;@keyframes&lt;/code&gt; para nuestra animación, ahora es momento de puntualizar un poco más que es lo que vamos a hacer.&lt;/p&gt;

&lt;p&gt;Como dije va a ser muy sencilla. Vamos a hacer una animación cíclica e infinita en el tiempo. Moveremos una caja de izquierda a derecha y viceversa, y tendremos otra caja adicional, centrada en la pantalla, que nos permitirá pausar la animación al pasar el cursor sobre ella (usaremos el &lt;a href=&quot;http://www.hexagonalalien.es/2016/03/selectores-de-css.html&quot;&gt;selector de adyacentes&lt;/a&gt;). si has llegado hasta aquí seguro que sabes como hacerla:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
#caja1, #caja2 {
  width: 8em;
  height: 8em;
  position: absolute;
  top: 3em;
}

#caja1 {
  background: rgba(0,0,255,.5);
  left: 45%;
  text-align: center;
  line-height: 8em;
  color: #fff;
  z-index: 10;
}

#caja2 {
  left:10%;
  background: rgba(255,0,0,.5);
  animation: moving-box 5s infinite alternate running;
}

#caja1:hover + #caja2 {
  animation-play-state: paused;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;p data-height=&quot;268&quot; data-theme-id=&quot;0&quot; data-slug-hash=&quot;eZpjLv&quot; data-default-tab=&quot;result&quot; data-user=&quot;amram1977&quot; class=&quot;codepen&quot;&gt;See the Pen &lt;a href=&quot;http://codepen.io/amram1977/pen/eZpjLv/&quot;&gt;Cajas en movimiento con CSS&lt;/a&gt; by amram (&lt;a href=&quot;http://codepen.io/amram1977&quot;&gt;@amram1977&lt;/a&gt;) on &lt;a href=&quot;http://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;
&lt;script async src=&quot;//assets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;</description><link>http://www.hexagonalalien.es/2016/03/animaciones-css3-keyframes-animation.html</link><author>noreply@blogger.com (LuisFran)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJLL6trxzDOirFg73RYAHScWwtLiSkS0HH5f_An0moEgGoQyYCMLAdSP0F8hodWZ-ojiaFjNj3NujZNGxUMblZwitRQF1BbrO_Ea8ijOjW5SI9dvhsXos1u_TtbMbA1F5e1Fgek9zSfts/s72-c/animation-frame.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-6553657401913791268</guid><pubDate>Wed, 16 Mar 2016 08:02:00 +0000</pubDate><atom:updated>2017-02-05T23:29:08.669+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CSS</category><title>Selectores de CSS</title><description>&lt;p&gt;La idea de las hojas de estilo en cascada (CSS), es la de separar la estructura de un documento de su presentación. Esto puede hacerse de forma separada, mediante un documento a parte, o dentro del propio documento HTML. Para ello necesitamos de un mecanismo específico entre los estilos y los elementos del documento HTML. Este mecanismo no es ni mas ni menos que una regla CSS.&lt;/p&gt;

&lt;p&gt;Las reglas CSS se componen de un selector y de una declaración, formada por una serie de propiedades con sus valores. De modo sencillo podríamos decir que la declaración indica &quot;qué hay que hacer&quot;, mientras que el selector nos permite seleccionar los elementos del DOM (Document Object Model), a los que queremos darles estilo. Por tanto los selectores son imprescindibles para aplicar de forma correcta los estilos CSS a una página, y con un conocimiento profundo podemos ahorrarnos el uso de lenguajes de programación adicionales (como Javascript) que cargan en exceso nuestro documento.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;section&gt;&lt;h2&gt;Selectores básicos&lt;/h2&gt;

&lt;p&gt;Hay cuatro tipos de selectores básicos, y en la mayoría de webs y blogs, con ellos es más que suficiente para realizar su diseño. Como mucho se usa el combinador descendiente (que luego veremos) sin que en muchas ocasiones su diseñador sepa que lo está usando (debido en parte a su notación, un espacio en blanco).&lt;/p&gt;

&lt;h3&gt;Selector universal&lt;/h3&gt;

&lt;p&gt;El selector universal, que se introdujo por primera vez en la segunda versión de CSS, selecciona todos los elementos de una página. Es un selector de poco uso, ya que generalmente no se necesita darle el mismo estilo a todos y cada uno de los elementos; sin embargo, bien usado puede ser muy útil.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
* {
    color: blue;
    font-size: 20px;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Con estas dos simple líneas, contenidas entre las llaves, conseguimos que todos los elementos de nuestro documento tengan un tamaño de texto de 20px y de color azul (no es muy útil, pero sólo es un ejemplo). Como puedes ver el selector universal se representa por un asterisco (*).&lt;/p&gt;

&lt;h3&gt;Selector de etiqueta&lt;/h3&gt;

&lt;p&gt;El selector de etiqueta o selector de tipo, nos permite seleccionar uno o más elementos HTML con idéntico nombre. Por ejemplo, si queremos seleccionar todos los elementos &lt;code class=&quot;html-code&quot;&gt;p&lt;/code&gt; de nuestro documento HTML usaríamos el selector &lt;code&gt;p&lt;/code&gt; que daría estilo a todos los párrafos de la página.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
p {
    color: blue;
    font-size: 20px;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Selectores class e ID&lt;/h3&gt;

&lt;p&gt;En CSS tenemos la posibilidad de seleccionar un elemento HTML en función al valor del atributo &lt;code&gt;class&lt;/code&gt; o del valor del atributo &lt;code&gt;ID&lt;/code&gt;. El valor de estos elementos es una cadena de mínimo un carácter, que no puede contener espacios, y que evidentemente nosotros elegimos cuando creamos el HTML.&lt;/p&gt;

&lt;p&gt;Este selector usa el mismo nombre que el valor que tenga el atributo en HTML precedido bien por un punto (.), si es un selector &lt;code&gt;class&lt;/code&gt; o una almohadilla (#), si es un selector &lt;code&gt;ID&lt;/code&gt;. La única diferencia es que en nuestro HTML el valor de &lt;code&gt;ID&lt;/code&gt; debe ser único y el de &lt;code&gt;class&lt;/code&gt; puede ser el mismo para diferentes elementos, permitiéndonos en CSS seleccionar un único elemento o varios según usemos uno u otro.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;div id=&amp;quot;rojo&amp;quot;&amp;gt;
   &amp;lt;p&amp;gt;texto&amp;lt;/p&amp;gt;
   &amp;lt;p class=&amp;quot;azul&amp;quot;&amp;gt;texto&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&amp;quot;azul&amp;quot;&amp;gt;
   &amp;lt;p&amp;gt;texto&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
#rojo {
    color:red;
}

.azul {
    color:blue;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;En el ejemplo hemos creado una clase cuyo valor es azul y una &lt;code&gt;ID&lt;/code&gt; con valor rojo. Mediante CSS damos estilo a las etiquetas de HTML a las que les hemos asignado esos atributos. Por tanto el primer párrafo será rojo, debido a la herencia recibida de la etiqueta &lt;code class=&quot;html-code&quot;&gt;div&lt;/code&gt; con id=&quot;rojo&quot;. Sin embargo el siguiente párrafo será azul, ya que tiene asignada la clase &quot;azul&quot;. También será azul el contenido de la etiqueta &lt;code class=&quot;html-code&quot;&gt;div&lt;/code&gt; con clase azul.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Combinadores&lt;/h2&gt;

&lt;p&gt;CSS nos de una herramienta muy útil que nos permite crear selectores más complejos y específicos combinando los selectores básicos. El selector creado a partir de los combinadores puede ser tan largo como sea necesario, aunque para un mejor rendimiento es aconsejable no excederse. En esencia funcionan de manera muy similar a los operadores de cualquier lenguaje de programación.&lt;/p&gt;

&lt;h3&gt;Selector de descendientes&lt;/h3&gt;

&lt;p&gt;El selector de descendientes, o más exactamente combinador de descendientes, nos permite crear un selector más específico para dar estilo a todos los descendientes que cumplan la norma creada por el selector. Esto incluye no sólo a sus descendientes inmediatos, también llamados hijos, sino también a los descendientes de estos y sucesivos. Un elemento es descendiente de otro cuando se encuentra entre las etiquetas de apertura y de cierre del otro elemento. Su notación es quizás la más confusa, ya que se usa un espacio en blanco.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
#contenedor .parrafo {
    margin: 5px;
    padding: 2px;
    background-color: green;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Con este selector daremos estilo a todos lo elementos que tengan un atributo &lt;code&gt;class&lt;/code&gt; de valor &quot;parrafo&quot; y además estén contenidos dentro de un elemento con un atributo &lt;code&gt;ID&lt;/code&gt; de valor &quot;contenedor&quot;. Mejor lo vemos con este código HTML:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;div id=&amp;quot;contenedor&amp;quot;&amp;gt;
    &amp;lt;p class=&amp;quot;parrafo&amp;quot;&amp;gt;texto&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;texto&amp;lt;/p&amp;gt;
    &amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;&amp;lt;p class=&amp;quot;parrafo&amp;quot;&amp;gt;texto&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;En este ejemplo damos etilo a primer y tercer párrafos, ya que ambos cumplen con el selector que hemos creado. El segundo párrafo no tiene la clase de valor &quot;parrafo&quot;. El tercer párrafo, a pesar de estar contenido dentro de un anchor, cumple con el selector ya que sólo tiene que ser descendiente de &quot;contenedor&quot; y en este caso lo es.&lt;/p&gt;

&lt;h3&gt;Selector de hijos&lt;/h3&gt;

&lt;p&gt;Es un selector similar al de descendientes, sin embargo su funcionamiento es algo diferente. Se utiliza para seleccionar sus hijos inmediatos y se indica mediante el signo &quot;mayor que&quot; (&gt;).&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
p &gt; span {
    color: red;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;p&amp;gt;texto&amp;lt;span&amp;gt;texto&amp;lt;/span&amp;gt;más texto&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;texto&amp;lt;span&amp;gt;texto&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;más texto&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;En este ejemplo sólo se aplica el estilo a la primera etiqueta &lt;code class=&quot;html-code&quot;&gt;span&lt;/code&gt;, ya que la segunda al estar contenida en un anchor no es hija directa de &lt;code class=&quot;html-code&quot;&gt;p&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;Selector de adyacentes&lt;/h3&gt;

&lt;p&gt;El selector de adyacentes nos permite seleccionar el elemento hermano que se encuentra inmediatamente después en el código HTML. Su sintaxis es &lt;code&gt;elemento1 + elemento2&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
p + p {
    color: red;
    font-size: 20px;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;p&amp;gt;Un texto&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Otro texto&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Otro texto más&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;En el caso de este ejemplo la regla se aplica tanto segundo como al tercer párrafo, ya que el segundo es hermano directo del primero y el tercero es hermano directo del segundo.&lt;/p&gt;

&lt;h3&gt;Selector general de hermanos&lt;/h3&gt;

&lt;p&gt;Es un selector muy parecido al selector de adyacentes, pero más general, ya que selecciona a todos los elementos hermanos que se encuentren después en el HTML. su sintaxis es &lt;code&gt;elemento1 ~ elemento2&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
h2 ~ p {
    margin: 10px 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;h2&amp;gt;Título&amp;lt;/h2&amp;gt;
&amp;lt;p&amp;gt;Un texto&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;Otro texto&amp;lt;/p&amp;gt;
&amp;lt;div class=&amp;quot;caja&amp;quot;&amp;gt;
    &amp;lt;p&amp;gt;Otro texto más&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;En este ejemplo seleccionamos los dos primeros párrafos, pues ambos son hermanos de &lt;code class=&quot;html-code&quot;&gt;h2&lt;/code&gt; y se encuentran después de él en el HTML. El tercer párrafo, por contra, no se selecciona, ya que aunque se encuentra después de &lt;code class=&quot;html-code&quot;&gt;h2&lt;/code&gt;, no es su hermano.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2 id=&quot;selector-de-atributo&quot;&gt;Selector de atributo&lt;/h2&gt;

&lt;p&gt;El selector de atributo selecciona un elemento basándose en la presencia y/o valor de un atributo en HTML, y se declara usando corchetes. Para la selección del elemento tenemos seis posibilidades, basándonos en si seleccionamos sólo el atributo o si por contra nos basamos también en su valor:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;elemento[atributo]: seleccionamos todos los elementos que disponen de ese atributo.&lt;/li&gt;
    &lt;li&gt;elemento[atributo^=&quot;valor&quot;]: seleccionamos todos los elementos que disponen de ese atributo y cuyo valor comienza exactamente por la cadena de texto indicada.&lt;/li&gt;
    &lt;li&gt;elemento[atributo$=&quot;valor&quot;]: seleccionamos todos los elementos que disponen de ese atributo y cuyo valor termina exactamente en la cadena de texto indicada.&lt;/li&gt;
    &lt;li&gt;elemento[atributo*=&quot;valor&quot;]: seleccionamos todos los elementos que disponen de ese atributo y cuyo valor es exactamente el de la cadena de texto. En este caso el asterisco (*) es opcional.&lt;/li&gt;
    &lt;li&gt;elemento[atributo~=&quot;valor&quot;]: seleccionamos todos lo elementos que disponen de ese atributo y cuyo valor es una lista de palabras separadas por espacios en blanco, en la que al menos una es exactamente igual a valor.&lt;/li&gt;
    &lt;li&gt;elemento[nombre_atributo|=&quot;valor&quot;]: seleccionamos todos lo elementos que disponen de ese atributo y cuyo valor es una serie de palabras separadas con guiones y que comienza con valor. Este selector sólo es útil para atributos de tipo lang.&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;form class=&amp;quot;contact_form&amp;quot; action=&amp;quot;#&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;
    &amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;Nombre:&amp;lt;/label&amp;gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;nombre&amp;quot;  placeholder=&amp;quot;Nombre y apellidos&amp;quot; autofocus required /&amp;gt;
    &amp;lt;label for=&amp;quot;email&amp;quot;&amp;gt;Email:&amp;lt;/label&amp;gt;
    &amp;lt;input type=&amp;quot;email&amp;quot; name=&amp;quot;email&amp;quot; placeholder=&amp;quot;ejemplo@ejemplo.com&amp;quot; required /&amp;gt;
    &amp;lt;label for=&amp;quot;website&amp;quot;&amp;gt;Sitio Web:&amp;lt;/label&amp;gt;
    &amp;lt;input type=&amp;quot;url&amp;quot; name=&amp;quot;web&amp;quot; placeholder=&amp;quot;http://www.tuweb.com&amp;quot; /&amp;gt;
    &amp;lt;label for=&amp;quot;Mensaje&amp;quot;&amp;gt;Mensaje:&amp;lt;/label&amp;gt;
    &amp;lt;textarea name=&amp;quot;mensaje&amp;quot; required &amp;gt;&amp;lt;/textarea&amp;gt;
    &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Enviar&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
input[type=&quot;text&quot;] {
    backgroun-color: #444;
    widht: 150px;
}

input[placeholder^=&quot;http&quot;] {
   color: blue;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;En este ejemplo seleccionamos la etiqueta &lt;code class=&quot;html-code&quot;&gt;input&lt;/code&gt; que tiene el atributo &lt;code&gt;type&lt;/code&gt; y cuyo valor es exactamente text y le damos color de fondo igual a #444 y un ancho de 150px. También seleccionamos otra etiqueta &lt;code class=&quot;html-code&quot;&gt;input&lt;/code&gt;, pero esta vez la que tiene el atributo &lt;code&gt;placeholder&lt;/code&gt; y cuyo valor empieza por http. Evidentemente podríamos haber hecho lo mismo usando el selector &lt;code&gt;class&lt;/code&gt; o el seletor &lt;code&gt;ID&lt;/code&gt;, pero dependiendo de lo que vayamos a seleccionar nos vendrá mejor una u otra solución, además nos hemos ahorrado algo de marcado en el HTML.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Pseudo-clases y pseudo-elementos&lt;/h2&gt;

&lt;h3&gt;Pseudo-clases&lt;/h3&gt;

&lt;p&gt;Una pseudo-clase selecciona un elemento dentro del DOM pero bajo determinadas condiciones, como por ejemplo respecto a la posición que ocupa en relación a sus hermanos o cuando está bajo un estado determinado. Se podría decir actúa de la misma forma que si hubiésemos añadido una clase a un elemento en nuestro marcado. Su sintáxis es &lt;code&gt;selector:pseudo-clase&lt;/code&gt;. La más común, y que seguramente ya has usado en alguna ocasión es &lt;code&gt;:hover&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
a:hover {
    color: red;
    text-decoration: none;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Por defecto los enlaces de texto son de color azul y subrayados. En este ejemplo cambiamos su color a rojo y eliminamos el subrayado cuando pasamos el ratón por encima del enlace.&lt;/p&gt;

&lt;p&gt;Sin embargo la clasificación de las pseudo-clases es muy extensa. Por ejemplo &lt;code&gt;:hover&lt;/code&gt; pertenece a las pseudo-clases dinámicas, también llamadas de acción de usuario por la W3C, pero hay muchas más como las que se basan en los elementos de entrada (&lt;code&gt;:enabled&lt;/code&gt; o &lt;code&gt;:checked&lt;/code&gt;), las estructurales que permiten la selección del elemento basándose en la información extra que existe en el árbol del documento pero que no es accesible mediante selectores básicos o combinadores (&lt;code&gt;:first-child&lt;/code&gt; o &lt;code&gt;:nth-of-type()&lt;/code&gt;) ... Prometo que me extenderé más en un artículo especifíco y veremos al menos las más usadas.&lt;/p&gt;

&lt;h3&gt;Pseudo-elementos&lt;/h3&gt;

&lt;p&gt;Un pseudo-elemento crea un nuevo elemento que no se ha especificado dentro del marcado, pero que podemos manipular al igual que cualquier otro elemento. Esto nos permite dar estilo a aquellas situaciones en las que ninguno de los anteriores selectores funciona, como por ejemplo dar estilo a la primera línea de una párrafo, o porqué no a la primera letra del mismo.&lt;/p&gt;

&lt;p&gt;En cuanto a su notación se puede usar exactamente la misma que para las pseudo-clases para mayor compatibilidad con navegadores antiguos o &quot;dobles dos puntos&quot; (::), que es su notación correcta en la especificación de CSS3.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
.caja::before {
    content: &quot;&quot;;
    display: block;
    widht: 20px;
    height: 40px;
    background-color: blue;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;En este ejemplo lo que hacemos es crear una caja de 20x40px y de color rojo inmediatamente antes de cada elemento cuya clase tenga el valor &quot;caja&quot;. También ampliaremos las pseudo-clases en otro artículo más específico.&lt;/p&gt;&lt;/section&gt;</description><link>http://www.hexagonalalien.es/2016/03/selectores-de-css.html</link><author>noreply@blogger.com (LuisFran)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-1578855004376969913</guid><pubDate>Sat, 27 Feb 2016 15:35:00 +0000</pubDate><atom:updated>2016-04-13T21:27:23.198+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">HTML5</category><title>Jugando con el tiempo: el elemento time</title><description>&lt;figure class=&quot;post-img&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7vV7Jhgoc9_CBsjQvC27z5fBI9-LJmhtpZ8JIgymFXfxLr3E1Me7k_7SkuzzepxrPLij-1uJo4_OUo3-mR6e_gMnFR7D4UAENubCO-7mhW5lwATGNfgo971t8JOmGbeygc_fchP6_H0o/s1600/reloj.jpg&quot; alt=&quot;time: la importancia del tiempo y la fecha&quot; /&gt;
&lt;figcaption&gt;Imagen de &lt;a href=&quot;https://www.flickr.com/photos/16210667@N02/&quot;&gt;Craig Sunter&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Hay múltiples motivos por los que en alguna ocasión es necesario añadir fechas a nuestra página web. Desde la típica fecha para indicar la creación o modificación de un post o artículo, pasando por la fecha de un comentario o para indicar el comienzo de un evento o acontecimiento. En todos estos casos lo lógico es usar una fecha lo más legible posible de cara al usuario, ¿pero qué pasa con las máquinas?.&lt;/p&gt;

&lt;p&gt;Si tenemos en cuenta los buscadores u otros tipos de programas que también pueden valerse de estas fechas, tenemos un serio problema, y es que los formatos que generalmente usamos de cara al usuario no son válidos para máquinas. Para ellas se crearon diez tipos de formatos de fechas diferentes, todas ellas en su mayoría numéricas y nada amigables de cara al usuario. Siendo así, ¿por quién nos decantamos, por la máquina o por el usuario?.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;p&gt;Para mí la respuesta es bien sencilla, siempre hay que decantarse por el usuario, a fin de cuentas escribimos para él. Pero para evitarnos rompederos de cabeza HTML5 nos da la etiqueta &lt;code class=&quot;html-code&quot;&gt;time&lt;/code&gt; que viene a solucionar este y otros embrollos con los formatos de las fechas.&lt;/p&gt;

&lt;section&gt;&lt;h2&gt;El elemento time&lt;/h2&gt;

&lt;p&gt;El elemento &lt;code class=&quot;html-code&quot;&gt;time&lt;/code&gt; fue introducido por primera vez en la especificación de HTML5 en 2009, sin embargo fue eliminado en favor de &lt;code class=&quot;html-code&quot;&gt;data&lt;/code&gt; en 2011. Nuevamente volvió a ser reintroducido, pero en esta ocasión mejorado para permitir mas formatos de fecha/hora.&lt;/p&gt;

&lt;p&gt;El elemento &lt;code class=&quot;html-code&quot;&gt;time&lt;/code&gt; es un elemento en linea, como bien puede ser &lt;code class=&quot;html-code&quot;&gt;span&lt;/code&gt; o &lt;code class=&quot;html-code&quot;&gt;img&lt;/code&gt; y al igual que estos dos tiene etiqueta de cierre. Representa una fecha y/u hora en el &lt;a href=&quot;https://es.wikipedia.org/wiki/Calendario_gregoriano&quot;&gt;calendario Gregoriano&lt;/a&gt; y cuando se usa en su forma simple el contenido de este elemento debe ser un &lt;b&gt;formato válido de fecha y/u hora&lt;/b&gt;. Es además uno de los nuevos elementos semánticos de HTML5. Aquí debajo te dejo un ejemplo:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;!-- 27 de Febrero de 2016 --!&amp;gt;
&amp;lt;time&amp;gt;2016-02-27&amp;lt;/time&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;El atributo datetime&lt;/h2&gt;

&lt;p&gt;Cuando usamos fechas de cara al usuario es evidente que el formato que usamos en el ejemplo anterior no es el más apropiado (sin obviar que cada cultura o región escribe las fechas de forma diferente), sin embargo y según la &lt;a href=&quot;https://www.w3.org/TR/html5/text-level-semantics.html#the-time-element&quot;&gt;especificación de la W3C&lt;/a&gt;, si usamos la forma simple debe ser uno de estos formatos válidos para máquina el que necesariamente usemos, salvo que incluyamos el atributo &lt;code&gt;datetime&lt;/code&gt; y pasemos a una forma más compleja.&lt;/p&gt;

&lt;p&gt;El atributo &lt;code&gt;datetime&lt;/code&gt; (que es opcional) viene a solucionarnos este problema, ya que es él quien contendrá la información en formato legible para la máquina, mientras que el elemento &lt;code class=&quot;html-code&quot;&gt;time&lt;/code&gt; contendrá la fecha y/u hora en formato legible para el usuario. Si usamos el ejemplo anterior nos quedaría de la siguiente forma:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;!-- 27 de Febrero de 2016 --!&amp;gt;
&amp;lt;time datetime=&amp;quot;2016-02-27&amp;quot;&amp;gt;27 de Febrero de 2016&amp;lt;/time&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Formatos de fecha/hora para máquina&lt;/h2&gt;

&lt;p&gt;Bien cuando usamos la forma abreviada o cuando usamos la forma compleja con &lt;code&gt;datetime&lt;/code&gt;, necesitamos usar alguno de los diez formatos válidos que la especificación permite para el elemento &lt;code class=&quot;html-code&quot;&gt;time&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;Año y mes&lt;/h3&gt;

&lt;pre&gt;
2016-02
&lt;/pre&gt;

&lt;p&gt;Muy sencillo, primero el año y después el mes&lt;/p&gt;

&lt;h3&gt;Fecha&lt;/h3&gt;

&lt;pre&gt;
2016-02-27
&lt;/pre&gt;

&lt;p&gt;Parecido al anterior, también muy simple. Primero el año, luego el mes y por último el día&lt;/p&gt;

&lt;h3&gt;Fecha sin año&lt;/h3&gt;

&lt;pre&gt;
02-27
&lt;/pre&gt;

&lt;p&gt;El mes primero que el día&lt;/p&gt;

&lt;h3&gt;Sólo la hora&lt;/h3&gt;

&lt;pre&gt;
14:52:37.257
&lt;/pre&gt;

&lt;p&gt;Horas, minutos y segundos. Los segundos son opcionales y se pueden usar hasta tres dígitos para representar las fracciones de segundo.&lt;/p&gt;

&lt;h3&gt;Fecha y hora&lt;/h3&gt;

&lt;pre&gt;
2016-02-27T14:52:37
&lt;/pre&gt;

&lt;p&gt;Combinación de fecha y hora, separadas por una T siempre mayúscula.&lt;/p&gt;

&lt;h3&gt;Zona horaria&lt;/h3&gt;

&lt;pre&gt;
+01:00
&lt;/pre&gt;

&lt;p&gt;Comienza con un signo más o un signo menos. Los dos puntos (:) son opcionales. Si la zona horaria a representar es +00:00 se puede cambiar por una Z mayúscula.&lt;/p&gt;

&lt;h3&gt;Fecha y hora local&lt;/h3&gt;

&lt;pre&gt;
2016-02-27T14:52:37+01:00
&lt;/pre&gt;

&lt;p&gt;Igual que el formato fecha y hora pero añadiéndole la zona horaria.&lt;/p&gt;

&lt;h3&gt;Para representar una semana&lt;/h3&gt;

&lt;pre&gt;
2016-W09
&lt;/pre&gt;

&lt;p&gt;Primero el año seguido de una W en mayúscula y el número de semana correspondiente.&lt;/p&gt;

&lt;h3&gt;Para representar una duración&lt;/h3&gt;

&lt;pre&gt;
P3DT4H5M34.035S
3d 4h 5m 34.035s
&lt;/pre&gt;

&lt;p&gt;En esta caso hay dos formatos posibles. En el primero comenzamos con una P mayúscula seguido de un valor para el día, que es opcional, y seguido de una T, también mayúscula. A continuación van los valores opcionales de horas, minutos y segundos. Todas las letras deben de ir en mayúscula.&lt;/p&gt;

&lt;p&gt;El segundo formato es más sencillo. Horas, minutos y segundos. Las letras pueden ir tanto en mayúsculas como en minúsculas y los espacios son opcionales. También podemos usar semanas, con la correspondiente letra w.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Ventajas de usar time&lt;/h2&gt;

&lt;p&gt;A estas alturas creo que son bastante visibles las ventajas de usar este elemento semántico de HTML5. El tener la posibilidad de dar la fecha en dos formatos, uno para máquina y otro para el usuario, es una gran ventaja, por ejemplo para un evento global donde queremos que la fecha de cara al usuario se muestre según en la región en que se encuentre, posibilitando que la fecha sea más legible.&lt;/p&gt;

&lt;p&gt;El hecho de dar una fecha válida en formato para máquina, ayuda a los buscadores a posicionar noticias muy sensibles en cuanto a la fecha, para no dar resultados que puedan dar lugar a equivocaciones, como noticias sobre terremotos, huracanes o alertas de carácter sensible a la población civil.&lt;/p&gt;&lt;/section&gt;</description><link>http://www.hexagonalalien.es/2016/02/etiqueta-semantica-time-html5.html</link><author>noreply@blogger.com (LuisFran)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7vV7Jhgoc9_CBsjQvC27z5fBI9-LJmhtpZ8JIgymFXfxLr3E1Me7k_7SkuzzepxrPLij-1uJo4_OUo3-mR6e_gMnFR7D4UAENubCO-7mhW5lwATGNfgo971t8JOmGbeygc_fchP6_H0o/s72-c/reloj.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-7580880201421102844</guid><pubDate>Sun, 14 Feb 2016 15:34:00 +0000</pubDate><atom:updated>2016-03-08T17:35:52.924+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CSS</category><title>Cómo hacer un div clickable con CSS</title><description>&lt;figure class=&quot;post-img&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3EzVXtYsQgFl67aIHTMfB_hBgumM29B0HbkNmGMBRvfMFRjHgQCYhIkBdceKlTW4-5mWm6KUnAc5OgIIe2VR1zevC8AHWPGTAyYw7XEtINUe2K4yjsCJdDyfARoP1vhqa3uNBPGU-ee4/s1600/cadena.jpg&quot; alt=&quot;Eslabones enlazados&quot; /&gt;
&lt;figcaption&gt;Imagen de &lt;a href=&quot;https://www.flickr.com/photos/mwschaff/&quot;&gt;Mike Schaffner&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Es cierto que con HTML5 se ha ido avanzando y solucionado algunos de los problemas que se han presentando en el diseño web. El paso hacia la validación de formularios es un claro ejemplo de ese avance, sin embargo el supuesto avance en cuanto a los llamados enlaces de bloque (block-level links) no lo es tanto.&lt;/p&gt;

&lt;p&gt;Hasta la implantación de HTML5 no era posible enlazar elementos de bloque, siendo un enlace un elemento en línea, únicamente era posible enlazar otro elemento en línea. Con HTML5 esto cambia, y ahora es posible enlazar por ejemplo, un div, algo muy práctico para conseguir que una región de una web sea enteramente clickable. El problema es que no todo lo que reluce es oro y hay pequeñas lagunas e inconvenientes que aconsejan no realizar este tipo de prácticas.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;p&gt;Empecé a jugar con la posibilidad de enlazar un div, que HTML5 ahora permite, cuando me dio por retocar el aspecto del blog, sobre todo en su index, e intenté hacer que cada resumen que aparece en la página principal fuese enteramente clickable. El resultado, un fracaso mayúsculo.&lt;/p&gt;

&lt;p&gt;Al principio no entendí muy bien que estaba ocurriendo, hasta que rebuscando por la red (no hay nada que no se pueda encontrar) di con el problema. En HTML hay una regla fundamental que no se debe romper, los enlaces no se pueden anidar. Ese era el gran problema, como mis resúmenes contenían enlaces, al enlazar el resumen completo se producía un error en el HTML (cierto que podría haberlo obviado) y algo aún más importante, el enlace se cerraba antes de lo esperado, justamente cuando se encontraba con el primer enlace del resumen.&lt;/p&gt;

&lt;p&gt;Podría haber pensado en retocar los resúmenes para que no tuviesen ningún tipo de enlace, y evidentemente hubiese funcionado. Sin embargo, me pareció demasiado restrictivo. En la mayoría de los CMS el resumen se genera a partir de un número x de caracteres del post o en caso de blogger (como es mi caso) a partir de donde se haya colocado &quot;el salto&quot;. ¿Por qué ceñirme a escribir de una forma tan concreta?. Es más, lo normal es que un resumen lleve alguna imagen para ilustrarlo, y en múltiples ocasiones esta también va enlazada hacia una versión mas pesada de esa misma imagen, con lo cual el problema persiste.&lt;/p&gt;

&lt;p&gt;Además de todo esto, hay un problema más, y es que Google aconseja no usar los enlaces de bloque, ya que a fin de cuentas el texto de anclaje del enlace es el que determina el significado del propio enlace. Es un texto descriptivo que nos dice de que va el enlace y lo que podemos encontrarnos si hacemos click, además que los buscadores lo tienen muy en cuenta (de ahí el consejo de Google) y por lo general este debe ser un texto corto y descriptivo. Por contra si enlazamos un resumen de un post, el número de palabras que llevará ese texto puede ser de unas 150 palabras (un resumen nada extenso), cosa que hace muy difícil a un buscador determinar la naturaleza del enlace, demasiada información nunca es buena.&lt;/p&gt;

&lt;p&gt;Así que como yo seguía emperrado en conseguir que mis resúmenes fuesen áreas enteramente clickables cuando me pica el niki no hay quien me pare), no tuve más remedio que recurrir a una solución CSS. Al final no fue tan complicado: una posición absoluta, ajustar el enlace al tamaño del div y poco más. El código, el que sigue:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;div id=&amp;quot;resumen&amp;quot;&amp;gt;
  &amp;lt;a href=&amp;quot;#&amp;quot; id=&amp;quot;enlace&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;
  &amp;lt;img src=&amp;quot;#&amp;quot; alt=&amp;quot;una imagen&amp;quot;&amp;gt;
  &amp;lt;p&amp;gt;texto&amp;lt;/p&amp;gt;
  &amp;lt;p&amp;gt;más texto&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
#resumen {
  position: relative;
}

#enlace {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 10;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Como puedes ver sólo hay una condición indispensable, y es que la región que queremos que sea clickable debe contener el enlace, que puede tener o no texto de anclaje, en este caso no se lo he puesto. El resto consiste en ajustar el enlace al tamaño de su contenedor. Para ello posicionamos el contenedor (la región clickable) de forma relativa y el enlace de forma absoluta, así conseguimos que el enlace se salga del flujo pero quede posicionado dentro del contenedor. Luego lo posicionamos y le damos el tamaño de su contenedor, height y width al 100%. Por último le damos un z-index para asegurarnos que esté por encima del resto de elementos. Con esto ya tenemos nuestra región 100% clickable.&lt;/p&gt;</description><link>http://www.hexagonalalien.es/2016/02/div-clickable-css.html</link><author>noreply@blogger.com (LuisFran)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3EzVXtYsQgFl67aIHTMfB_hBgumM29B0HbkNmGMBRvfMFRjHgQCYhIkBdceKlTW4-5mWm6KUnAc5OgIIe2VR1zevC8AHWPGTAyYw7XEtINUe2K4yjsCJdDyfARoP1vhqa3uNBPGU-ee4/s72-c/cadena.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-2319398124693443252</guid><pubDate>Sat, 06 Feb 2016 17:43:00 +0000</pubDate><atom:updated>2016-04-25T10:46:25.062+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CSS</category><title>Cómo conseguir columnas de igual altura con CSS</title><description>&lt;figure class=&quot;post-img&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs6N96yCl-9gSpHHfdmSCqC5vRajh7MZ1o_mEA-gs7b63M3dSMViQbGeKkYhSgV5vr_XZJ-GYELsq0BlP4ORBhuIsMcETPPFooXHUkIaP9hr9bnsuOCdZkNHczpaGMSqt1cgFPgOCnIx0/s1600/columnas.jpg&quot; alt=&quot;Columnas de igual altura&quot; /&gt;
&lt;figcaption&gt;Imagen de &lt;a href=&quot;https://www.flickr.com/photos/81134048@N02/&quot;&gt;Christian Hoppe&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;En la maquetación con CSS siempre ha habido dos problemas principales. Uno de ellos es como no el centrado, una cuestión que a priori parece de lo más sencilla, puede volverse una pesadilla si no tenemos claro como funciona el modelo de caja con el que trabajamos. El otro es conseguir que varios elementos tengan la misma altura, siendo su contenido completamente desigual.&lt;/p&gt;

&lt;p&gt;En esto post no voy a tratar todas las formas de conseguir tal efecto, ya que muchas de ellas a día de hoy no son nada recomendables. Por supuesto en su día fueron un gran paso para conseguir un buen layout, como por ejemplo el conocido método de Dan Cederholm &lt;a href=&quot;http://alistapart.com/article/fauxcolumns&quot;&gt;Faux Columns&lt;/a&gt;, que consiste en usar un contenedor general, que contendrá a las columnas, con una imagen de fondo que se repite verticalmente y que simula las columnas que deseamos (hay una versión más moderna de &lt;a href=&quot;http://dougneiner.com/&quot;&gt;Doug Neiner&lt;/a&gt; que usa gradientes en vez de una imagen de fondo), el problema es que Faux Columns está pensado para diseños rígidos y no para diseños fluidos.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;p&gt;Otro de los grandes métodos es el de &lt;a href=&quot;http://matthewjamestaylor.com/blog/equal-height-columns-cross-browser-css-no-hacks&quot;&gt;Matthew James Taylor&lt;/a&gt;, que queda a medio camino entre las Faux Columns de Dan Cederholm y el método de Doug Neiner. Consiste en anidar tantos contenedores como columnas vayamos a usar, y la última de ellas contendrá las columnas. Cada contenedor tendrá un color de fondo, y los flotaremos y posicionaremos relativamente con la intención de moverlos para conseguir visualmente las columnas. También haremos lo propio con las columnas, que también las flotaremos y posicionaremos relativamente para posteriormente moverlas. El problema es que a mi gusto se usa demasiado marcado HTMl, un contenedor por cada columna.&lt;/p&gt;

&lt;section&gt;&lt;h2&gt;A vueltas con las tablas&lt;/h2&gt;

&lt;p&gt;A día de hoy las cosas son un tanto diferentes, y no es necesario realizar un gran marcado HTML o usar imágenes de fondo para conseguir igualar la altura de las columnas. Hay que tener en cuenta que no siempre hemos necesitado de estos métodos, ya que cuando creábamos los layouts con tablas (cosa que nunca debe de hacerse) el propio comportamiento de la tabla nos daba la solución sin más. Claro que fijándonos en esta propiedad sólo debemos recurrir a cambiar nuestro modelo de caja por &lt;code&gt;display:table&lt;/code&gt; para conseguir exactamente lo mismo.&lt;/p&gt;

&lt;p&gt;Hay que tener en cuenta el problema que a día de hoy tiene Firefox con la imágenes responsive para la cuales usamos &lt;code&gt;max-width&lt;/code&gt;, ya que dentro de un contenedor con &lt;code&gt;display:table&lt;/code&gt; no funciona esta propiedad (da igual que la imagen sea hijo directo o no). Aunque para todo hay una solución, como la que di en el artículo pasado &lt;a href=&quot;http://www.hexagonalalien.es/2016/01/imagenes-responsive-max-width.html&quot;&gt;Imágenes en diseño responsive: El problema de max-width&lt;/a&gt;.

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;div id=&amp;quot;contenedor&amp;quot;&amp;gt;
    &amp;lt;div id=&amp;quot;columna1&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div id=&amp;quot;columna2&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div id=&amp;quot;columna3&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
#contenedor {
    display:table;
}

#columna1, #columna2, #columna3 {
    display:table-cell;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Jugando con los márgenes&lt;/h2&gt;

&lt;p&gt;Este método usa &lt;code&gt;margin&lt;/code&gt;, &lt;code&gt;padding&lt;/code&gt; y &lt;code&gt;overflow&lt;/code&gt; para conseguir igualar las columnas en altura. El truco consiste en dar un &lt;code&gt;padding&lt;/code&gt; inferior lo suficientemente grande a cada columna y luego corregirlo con un &lt;code&gt;margin&lt;/code&gt; negativo inferior de igual valor. Para que todo se vea bien ocultaremos el sobrante mediante &lt;code&gt;overflow&lt;/code&gt; en el contenedor padre.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;div id=&amp;quot;contenedor&amp;quot;&amp;gt;
    &amp;lt;div id=&amp;quot;columna1&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div id=&amp;quot;columna2&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div id=&amp;quot;columna3&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
#contenedor {
    overflow: hidden;
}

#columna1, #columna2, #columna3 {
    padding-bottom: 9999px;
    margin-bottom: -9999px;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;Las maravillas de flexbox&lt;/h2&gt;

&lt;p&gt;Flexbox o la caja flexible se ha vuelto la piedra angular de CSS3, más aún cuando es soportado por todos los navegadores en su última versión. Se puede hacer casi de todo y simplifica muchos casos en los que usábamos trucos y maquetaciones imposibles para conseguir, lo que a priori, CSS no nos ofrecía. Para el caso de igualar la altura de las columnas, también hay solución con flexbox.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;div id=&amp;quot;contenedor&amp;quot;&amp;gt;
    &amp;lt;div id=&amp;quot;columna1&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div id=&amp;quot;columna2&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div id=&amp;quot;columna3&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
#contenedor {
   display: -webkit-flex;
   display: flex;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Sí, parece demasiado sencillo, y así es. Cuando definimos y contenedor con &lt;code&gt;display:flex&lt;/code&gt;, todos sus hijos pasan a ser elementos flexibles y pueden beneficiarse del funcionamiento de la caja flexible. Por defecto en un contenedor definido con &lt;code&gt;display:flex&lt;/code&gt;, la propiedad &lt;code&gt;align-items&lt;/code&gt; toma el valor &lt;code&gt;strech&lt;/code&gt;, lo hace que todos sus hijos tenga la misma altura, siempre que no modifiquemos el main-axis. Si te interesa saber como funciona esta &quot;propiedad&quot; más a fondo el artículo &lt;a href=&quot;https://css-tricks.com/snippets/css/a-guide-to-flexbox/&quot;&gt;A Complete Guide to Flexbox&lt;/a&gt; de CSS-Tricks es la guía que necesitas.&lt;/p&gt;&lt;/section&gt;</description><link>http://www.hexagonalalien.es/2016/02/columnas-de-igual-altura-css.html</link><author>noreply@blogger.com (LuisFran)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs6N96yCl-9gSpHHfdmSCqC5vRajh7MZ1o_mEA-gs7b63M3dSMViQbGeKkYhSgV5vr_XZJ-GYELsq0BlP4ORBhuIsMcETPPFooXHUkIaP9hr9bnsuOCdZkNHczpaGMSqt1cgFPgOCnIx0/s72-c/columnas.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-8352719026736214818</guid><pubDate>Sat, 30 Jan 2016 16:05:00 +0000</pubDate><atom:updated>2016-04-25T10:45:27.577+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CSS</category><title>Imágenes en diseño responsive: El problema de max-width</title><description>&lt;p&gt;En principio este venía a ser un artículo para solucionar el aparente problema con &lt;code&gt;max-width&lt;/code&gt; cuando tratamos con imágenes en Firefox. Tras leer un montonazo de artículos y posts la conclusión es que no existe tal problema, al menos no al 100%. Suele funcionar bien, salvo cuanto tratamos con una tabla o definimos un &lt;code class=&quot;html-code&quot;&gt;div&lt;/code&gt; con &lt;code&gt;display:table&lt;/code&gt;, este es el problema real, sin embargo hay montones de artículos pululando por la red que aseguran que &lt;code&gt;max-width&lt;/code&gt; no funciona correctamente en Firefox. No es cierto, salvo al menos en los dos casos anteriores.&lt;/p&gt;

&lt;p&gt;Así que como uno no es manco, voy a retomar el artículo desde otro punto. Vamos a ver como &lt;b&gt;dar fluidez a las imágenes para un diseño responsive&lt;/b&gt;, y además abordaré el tema de &lt;b&gt;&lt;code&gt;max-width&lt;/code&gt; y sus problemas en Firefox&lt;/b&gt; dando una solución, que al menos a mi me funciona.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;p&gt;Lo primero de todo es tener claro que es un diseño responsive, que no es ni más ni menos que una evolución lógica del diseño líquido que se usaba hace algunos años, aunque mejorado con la incorporación de las media queries. En el diseño responsive trabajamos con medidas relativas, nada de medidas absolutas, y es ahí donde viene el problema con las imágenes, porque al fin y al cabo una imagen tiene unas medidas concretas.&lt;/p&gt;

&lt;p&gt;La primera aproximación a una imagen fluida sería la siguiente:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
img {
    width:100%;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Con esto conseguimos una imagen que se adapta al contenedor en el que se encuentra. Funciona muy bien si el contenedor es de igual o menor tamaño que la imagen, sin embargo cuando este es más grande la imagen se adapta a él y salvo que esta se un archivo SVG (gráficos vectoriales) se rompe, un efecto evidentemente nada deseable.&lt;/p&gt;

&lt;p&gt;Por eso una de las reglas básicas para trabajar con imágenes en diseño responsive es usar la propiedad &lt;code&gt;max-width&lt;/code&gt;, ya que nos fija el ancho máximo que tendrá el elemento sobre el que se aplique. Si por ejemplo tenemos una imagen de 400x250px, y aplicamos esta propiedad al 100%, como máximo la imagen tendrá el 100% de su ancho, osea 400px, con lo cual evitaremos que se rompa. Por contra si su contenedor es más pequeño, la imagen se adaptará a él y su ancho será el del propio contenedor. Para esta regla es aconsejable asignar el valor auto al alto de la imagen:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
img {
   max-width:100%;
   height: auto;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Todo sería muy sencillo sino fuese por los bugs de algunos navegadores, en este caso no es IE como cabría esperar, sino Firefox, y es que el equipo de Mozilla lleva nada menos que desde el 2004 peleándose con la propiedad &lt;code&gt;max-width&lt;/code&gt;, se han arreglado muchas cosas, pero su funcionamiento cuando tratamos con imágenes en tablas o con &lt;code&gt;display:table&lt;/code&gt; no es el esperado.&lt;/p&gt;

&lt;p&gt;La solución ha este problema, que puede no ser la más correcta, se me apareció, como suele ser habitual, de la forma más inesperada (podría haber sido una fórmula para acertar la primitiva, ¡pero no!). Los problemas con las imágenes comenzaron a producirse en este blog con la implantación del nuevo &lt;a href=&quot;http://www.hexagonalalien.es/2016/01/css-menu-off-canvas.html&quot;&gt;menú off-canvas&lt;/a&gt;, ya que para que el menú se adapte en alto al contenido usé la técnica para igualar columnas basada en &lt;code&gt;diplay:table&lt;/code&gt; y &lt;code&gt;display:table-cell&lt;/code&gt;, y ahí comenzaron las idas y venidas con Firefox.&lt;/p&gt;

&lt;p&gt;Lo curioso es que la solución al problema sea usar las misma propiedad que lo causa para arreglarlo, sí has acertado &lt;code&gt;display:table&lt;/code&gt;. De forma general las imágenes se suelen colocar desperdigadas por un post de una manera más o menos ordenada, en mi caso la cosa fue, por suerte, diferente. Para dar autoría a la foto uso un elemento &lt;code class=&quot;html-code&quot;&gt;figure&lt;/code&gt;, y dentro de él la imagen y un &lt;code class=&quot;html-code&quot;&gt;figcaption&lt;/code&gt;, de esta forma semánticamente la imagen y el elemento &lt;code class=&quot;html-code&quot;&gt;figcaption&lt;/code&gt; quedan directamente relacionados. El hecho de estar la imagen dentro de un contenedor padre de forma directa fue lo que me dio la idea al pensar en como funcionan las tablas, y por tanto los elementos con &lt;code&gt;display:table&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Una tabla o un elemento definido con &lt;code&gt;display:table&lt;/code&gt;, siempre que no se la asignen valores a &lt;code&gt;width&lt;/code&gt; y &lt;code&gt;height&lt;/code&gt;, se adapta a su contenido, ya que por defecto estos valores son auto. Eso sí, siempre y cuando le sea posible, ya que si su contenedor tiene un tamaño menor, entonces de adaptará a éste y no a su contenido. Con esta peculiar forma de comportamiento, conseguimos imitar el funcionamiento de &lt;code&gt;max-width&lt;/code&gt;. Vemos un ejemplo y luego te explico:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;figure&amp;gt;
    &amp;lt;img src=&amp;quot;#&amp;quot; alt=&amp;quot;&amp;quot;&amp;gt;
    &amp;lt;figcaption&amp;gt;texto asociado a la imagen&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
figure {
    display:table;
}

img {
    width:100%;
    height:auto;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;La imitación al comportamiento de &lt;code&gt;max-width&lt;/code&gt; se consigue a causa de la imposibilidad de determinar el valor del tamaño de la imagen con un &lt;code&gt;width&lt;/code&gt; del 100%, ya que el elemento &lt;code class=&quot;html-code&quot;&gt;figure&lt;/code&gt; toma su valor a partir del tamaño de la propia imagen, y la imagen a partir del tamaño de su contenedor y claro (la pescadilla que se muerde la cola) ¿cuál es el 100% de un valor indeterminado?. La cosa es, por contra, bien sencilla: &lt;code class=&quot;html-code&quot;&gt;figure&lt;/code&gt; toma el valor de su ancho en función al ancho de su contenido, como la imagen en este primer paso no tiene un valor aún definido, toma como valor su tamaño original, según el ejemplo que estamos usando 400x250px, así que el elemento &lt;code class=&quot;html-code&quot;&gt;figure&lt;/code&gt; tomará como ancho el valor de 400px. En el siguiente paso la imagen tomará el valor 100% de su contenedor, en este caso 400px, con lo que independientemente de donde esté contenido el elemento &lt;code class=&quot;html-code&quot;&gt;figure&lt;/code&gt; nunca sobrepasará el valor original de la imagen, evitando que esta se rompa.&lt;/p&gt;

&lt;p&gt;Si el contenedor del elemento &lt;code class=&quot;html-code&quot;&gt;figure&lt;/code&gt; es menor que el tamaño original de la imagen, no hay problema, recuerda como funciona un elemento al que se le aplica la propiedad &lt;code&gt;display:table&lt;/code&gt;. En este caso &lt;code class=&quot;html-code&quot;&gt;figure&lt;/code&gt; tomará el valor de su contenedor padre, y por tanto la imagen hará lo mismo, una perfecta imitación de la propiedad &lt;code&gt;max-width&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Es una solución como otra cualquiera a un viejo problema, y no, no creo haber inventado la rueda (no tengo tanto ego), aunque por otra parte, nunca he visto esta forma de imitar la propiedad &lt;code&gt;max-width&lt;/code&gt; y de paso solucionar el problemilla de Firefox con las imágenes en diseño responsive. Eso sí, nadie me puede quitar el cosquilleo que se siente al solucionar un problema sin mirar el examen del compañero de al lado :-).&lt;/p&gt;</description><link>http://www.hexagonalalien.es/2016/01/imagenes-responsive-max-width.html</link><author>noreply@blogger.com (LuisFran)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-3226428219406897458</guid><pubDate>Sat, 23 Jan 2016 08:28:00 +0000</pubDate><atom:updated>2016-04-25T10:44:57.570+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">HTML5</category><title>Uso de varios elementos H1: Con HTML5 se puede</title><description>&lt;p&gt;Las etiquetas H son desde hace mucho una de las piedras angulares del SEO. Evidentemente el SEO abarca mucho más, pero son pocos los artículos que podemos encontramos sobre esta materia que en algún punto no mencionen el uso correcto de estas etiquetas. Por desgracia la inmensa mayoría de estos posts son pre-HTML5 y por tanto se guían por el gran dogma de la etiquetas H, &quot;no puede haber más de un &lt;code class=&quot;html-code&quot;&gt;H1&lt;/code&gt; por página o documento&quot;.&lt;/p&gt;

&lt;p&gt;Sin embargo, y con la llegada de HTML5, hasta esto ha cambiado. Como no podía ser de otra manera el uso de varias etiquetas H1 debe de hacerse de forma lógica y controlada (nuestro documento no puede convertirse en una amalgama de etiquetas &lt;code class=&quot;html-code&quot;&gt;H1&lt;/code&gt;), y siguiendo rigurosamente las reglas que la W3C nos da para que nuestro documento sea correcto, al menos en cuanto a semántica se refiere. Hay que tener en cuenta que no todo el mundo está de acuerdo con esta práctica (siendo en HTML5 del todo correcta) y los expertos en SEO suelen ser bastante recelosos, aunque como verás en este artículo su uso es una cuestión 100% lógica.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;section&gt;&lt;h2&gt;¿Qué es y qué no es una etiqueta H?&lt;/h2&gt;

&lt;p&gt;Confundir conceptos es lo que generalmente nos lleva al mal uso de las etiquetas H. Por experiencia se que hay una tendencia generalizada a usar estas etiquetas como marcadores de título, y no, una etiqueta H no es una etiqueta de título, es una etiqueta de encabezado.&lt;/p&gt;

&lt;p&gt;Cierto que un encabezamiento es a fin de cuentas un título, pero un título no es necesariamente un encabezamiento. Un encabezamiento lleva implícito la creación de una nueva sección de contenido y un título puede ir por ejemplo sobre un sidebar (que no necesariamente tiene contenido), un widget del tipo predicción meteorológica o un calendario (que evidentemente no son contenido) o una simple lista de enlaces cualquiera (que a mi ver tampoco es contenido). ¡Si lo que queremos es resaltar un título para eso tenemos CSS!. Según la W3C los elementos h1-h6 no deben ser usados para marcar subencabezados, subsecciones, títulos alternativos o eslogans.&lt;/p&gt;

&lt;p&gt;Lo básico para un buen uso es determinar que títulos de nuestra web son o no son encabezados, y a partir de ahí distribuir nuestras etiquetas H de una forma lógica y ordenada, recuerda que al fin y al cabo son etiquetas estructurales. No tiene mucho sentido crear una sección con un &lt;code class=&quot;html-code&quot;&gt;H2&lt;/code&gt; y que esta nueva sección que hemos creado en su interior contenga una etiqueta &lt;code class=&quot;html-code&quot;&gt;H1&lt;/code&gt; (¿por qué iba a ser más importante una subsección que la propia sección principal?), aunque es correcto no es una buena práctica.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;El porqué del uso de varios elementos H1&lt;/h2&gt;

&lt;p&gt;El problema semántico que genera el uso de una única etiqueta &lt;code class=&quot;html-code&quot;&gt;H1&lt;/code&gt; en un documento no es nuevo, es mas, este se agrava cuando pensamos en la estructura de un sitio al completo. Para que veas de lo que estoy hablando voy a hacer un marcado general de un blog. Con su página principal (o índice) y una página de un post será más que suficiente:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;!DOCTYPE HTML PUBLIC &amp;quot;-//W3C//DTD HTML 4.01//EN&amp;quot; &amp;quot;http://www.w3.org/TR/html4/strict.dtd&amp;quot;&amp;gt;
&amp;lt;html&amp;gt;
   &amp;lt;head&amp;gt;
      &amp;lt;title&amp;gt;El batiburrillo&amp;lt;/title&amp;gt;
   &amp;lt;/head&amp;gt;
   &amp;lt;body&amp;gt;
      &amp;lt;div&amp;gt;
         &amp;lt;h1&amp;gt;El batiburrillo&amp;lt;/h1&amp;gt;
         &amp;lt;p&amp;gt;Un blog para hablar de todo un poco.&amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div&amp;gt;
         &amp;lt;h2&amp;gt;Una manzana al día ...&amp;lt;/h2&amp;gt;
         &amp;lt;p&amp;gt;Contenido del artículo.&amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div&amp;gt;
         &amp;lt;h2&amp;gt;El nuevo iphone&amp;lt;/h2&amp;gt;
         &amp;lt;p&amp;gt;Contenido del artículo.&amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
   &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;!DOCTYPE HTML PUBLIC &amp;quot;-//W3C//DTD HTML 4.01//EN&amp;quot; &amp;quot;http://www.w3.org/TR/html4/strict.dtd&amp;quot;&amp;gt;
&amp;lt;html&amp;gt;
   &amp;lt;head&amp;gt;
      &amp;lt;title&amp;gt;El batiburrillo&amp;lt;/title&amp;gt;
   &amp;lt;/head&amp;gt;
   &amp;lt;body&amp;gt;
      &amp;lt;div&amp;gt;
         &amp;lt;p&amp;gt;El batiburrillo&amp;lt;/p&amp;gt;
         &amp;lt;p&amp;gt;Un blog para hablar de todo un poco.&amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div&amp;gt;
         &amp;lt;h1&amp;gt;Una manzana al día ...&amp;lt;/h1&amp;gt;
         &amp;lt;p&amp;gt;Contenido del artículo.&amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
   &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Este es el marcado general de cualquier blog pre-HTML5. Vemos que en el índice damos mucha importancia al nombre del blog, que a fin de cuentas es su marca, pasando los artículos que aparecen (que puede ser o no resumidos) a un segundo plano. ¿Acaso no tienen la misma importancia?.&lt;/p&gt;

&lt;p&gt;En un blog como en el del ejemplo, donde se habla de todo, es muy difícil que un buscador puede interpretar el asunto de la página, teniendo en cuenta que el contenido de la única etiqueta &lt;code class=&quot;html-code&quot;&gt;H1&lt;/code&gt; en un marcado pre-HTML5 denota también la temática del documento. Una marca, el título de un blog, o el nombre de una empresa no tienen porqué dar ninguna pista sobre la temática del documento, sin embargo es lógico etiquetarlo así para darle importancia, para una empresa su nombre o marca está por encima de todo.&lt;/p&gt;

&lt;p&gt;También hay que tener en cuenta los esquemas o resúmenes que se generan a partir de cualquier documento (son como una tabla de contenido del sitio web), y que hasta la llegada de HTML5 se hacían a partir de las etiquetas de encabezado, haciendo difícil distinguir entre los dos artículos del ejemplo (de temática dispar), que a efectos prácticos son igual de importantes y que sin embargo pasan a ser parte de un único contenido, el marcado por el &lt;code class=&quot;html-code&quot;&gt;H1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Cuando pasamos al artículo, la cosa cambia. Ahora damos más importancia al título del artículo, ya que el documento va a tratar enteramente sobre ello. ¿Acaso ahora no es importante el título de nuestro blog?. Piensa ahora en que pasaría si fuese el nombre de una gran empresa, ¿sería capaz de diluir su marca en favor de un artículo?. Ten en cuenta también, que además de un cambio en el marcado HTML, supone además un cambio en nuestra hoja de estilos para que a ojos del usuario nada cambie.&lt;/p&gt;&lt;/section&gt;

&lt;section&gt;&lt;h2&gt;La solución: las nuevas etiquetas de HTML5&lt;/h2&gt;

&lt;p&gt;Las etiquetas semánticas, de las que empecé hablando en &lt;a href=&quot;http://www.hexagonalalien.es/2015/08/semantica-en-html5-i-header.html&quot;&gt;Semántica en HTML5 (I): Header&lt;/a&gt;, son la solución a este problema, ellas y el nuevo algoritmo de esquema de HTML5, que ya no se apoya únicamente en las etiquetas de encabezado para su generación.&lt;/p&gt;

&lt;p&gt;De todas estas nuevas etiquetas tan sólo cuatro de ellas son etiquetas seccionadoras: &lt;a href=&quot;http://www.hexagonalalien.es/2015/10/semantica-en-html5-iii-article-y-section.html&quot;&gt;section&lt;/a&gt;, &lt;a href=&quot;http://www.hexagonalalien.es/2015/10/semantica-en-html5-iii-article-y-section.html&quot;&gt;article&lt;/a&gt;, &lt;a href=&quot;http://www.hexagonalalien.es/2015/12/semantica-en-html5-v-nav-y-main.html&quot;&gt;nav&lt;/a&gt; y &lt;a href=&quot;http://www.hexagonalalien.es/2015/11/semantica-en-html5-iv-aside.html&quot;&gt;aside&lt;/a&gt;, y siempre que abramos una nueva sección con una de estas etiquetas es posible usar un H1. En sendos artículos de la W3C sobre los &lt;a href=&quot;https://www.w3.org/TR/html5/sections.html#the-h1,-h2,-h3,-h4,-h5,-and-h6-elements&quot;&gt;elementos h1-h6&lt;/a&gt; y &lt;a href=&quot;https://www.w3.org/TR/html5/sections.html#headings-and-sections&quot;&gt;encabezados y secciones&lt;/a&gt; podemos ver ejemplos sobre su uso. Siguiendo las directrices de la W3C nuestro blog de ejemplo quedaría de esta forma:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;!DOCTYPE HTML&amp;gt;
&amp;lt;html&amp;gt;
   &amp;lt;head&amp;gt;
      &amp;lt;title&amp;gt;El batiburrillo&amp;lt;/title&amp;gt;
   &amp;lt;/head&amp;gt;
   &amp;lt;body&amp;gt;
      &amp;lt;div&amp;gt;
         &amp;lt;h1&amp;gt;El batiburrillo&amp;lt;/h1&amp;gt;
         &amp;lt;p&amp;gt;Un blog para hablar de todo un poco.&amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;article&amp;gt;
         &amp;lt;h1&amp;gt;Una manzana al día ...&amp;lt;/h1&amp;gt;
         &amp;lt;p&amp;gt;Contenido del artículo.&amp;lt;/p&amp;gt;
      &amp;lt;/article&amp;gt;
      &amp;lt;article&amp;gt;
         &amp;lt;h1&amp;gt;El nuevo iphone&amp;lt;/h1&amp;gt;
         &amp;lt;p&amp;gt;Contenido del artículo.&amp;lt;/p&amp;gt;
      &amp;lt;/article&amp;gt;
   &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;!DOCTYPE HTML&amp;gt;
&amp;lt;html&amp;gt;
   &amp;lt;head&amp;gt;
      &amp;lt;title&amp;gt;El batiburrillo&amp;lt;/title&amp;gt;
   &amp;lt;/head&amp;gt;
   &amp;lt;body&amp;gt;
      &amp;lt;div&amp;gt;
         &amp;lt;h1&amp;gt;El batiburrillo&amp;lt;/h1&amp;gt;
         &amp;lt;p&amp;gt;Un blog para hablar de todo un poco.&amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;article&amp;gt;
         &amp;lt;h1&amp;gt;Una manzana al día ...&amp;lt;/h1&amp;gt;
         &amp;lt;p&amp;gt;Contenido del artículo.&amp;lt;/p&amp;gt;
      &amp;lt;/article&amp;gt;
   &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/section&gt;

&lt;p&gt;El uso de varias etiquetas &lt;code class=&quot;html-code&quot;&gt;H1&lt;/code&gt; está aprobado por la W3C, es a fin de cuentas una solución a una serie de problemas y a todas luces genera un documento 100% correcto, si no me crees compruébalo en el &lt;a href=&quot;https://validator.w3.org/&quot;&gt;validador de la W3C&lt;/a&gt;. El único problema es una advertencia en cuanto a accesibilidad desde un screenreader, aunque como en todo lo nuevo es cuestión de que estas tecnología también se actualicen.&lt;/p&gt;

&lt;p&gt;En cuanto al SEO no debe haber ningún tipo de problema. La norma del uso de un único &lt;code class=&quot;html-code&quot;&gt;H1&lt;/code&gt; para todo el documento ya no existe en HTML5, así que es de esperar que los motores de búsqueda se hayan adaptado a ello, al menos Bing y Google sí. Si quieres un artículo más completo o aún no te he atraído al lado oscuro de la fuerza, léete este post de &lt;a href=&quot;http://webdesign.tutsplus.com/articles/the-truth-about-multiple-h1-tags-in-the-html5-era--webdesign-16824&quot;&gt;Kezz Bracey&lt;/a&gt;, a mi me convenció.&lt;/p&gt;</description><link>http://www.hexagonalalien.es/2016/01/varias-etiquetas-h1-html5.html</link><author>noreply@blogger.com (LuisFran)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-2392645067076199585</guid><pubDate>Sat, 09 Jan 2016 15:18:00 +0000</pubDate><atom:updated>2016-04-25T10:43:05.309+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CSS</category><title>Cómo hacer un menú off canvas en CSS puro</title><description>&lt;p&gt;Ahora que ya han pasado las fiestas y hemos dejado atrás las comilonas, las cenas familiares y con amigos, y las resacas de champán, cava y otras bebidas espiritosas, es momento de dar el siguiente paso tras crear el típico botón estilo hamburguesa y ponernos manos a la obra para darle uso, y que mejor forma que hacerlo con un &lt;b&gt;menú off canvas&lt;/b&gt; (menú oculto).&lt;/p&gt;

&lt;p&gt;Para ello vamos a hacerlo al estilo Hexagonal Alien (a pelo), usando únicamente CSS, apoyándonos en el uso de una checkbox al igual que hicimos en el post anterior cuando creamos el &lt;a href=&quot;http://www.hexagonalalien.es/2015/12/icono-animado-hamburguesa-css.html&quot;&gt;icono estilo hamburguesa&lt;/a&gt;. El menú va ha ser muy sencillito, además voy a explicarlo paso a paso, así que menos cháchara y al lío.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;p&gt;Lo primero de todo es hacernos una idea general de lo que queremos conseguir, ya que un menú off canvas puede hacerse de varias formas. Nosotros vamos a hacerlo moviendo todo el contenido, así que necesitaremos una caja de carácter general donde meterlo todo (luego explicaré el porqué). También otra caja que contendrá el contenido de la web, otra para el menú y como no, la dichosa checkbox.&lt;/p&gt;

&lt;p&gt;Como vamos a aprovechar el botón que creamos en el post anterior, tendremos que hacer una pequeña modificación, ya que únicamente necesitamos una checkbox y la del botón no nos sirve donde está colocada. Podemos aprovechar toda la maquetación que hicimos para el botón, pero la checkbox la sacaremos al contenedor de carácter general, e irá justo antes que el contenedor para el contenido y que el menú (también te explicaré el porqué). Dentro del contenedor para el contenido pondremos nuestro icono estilo hamburguesa encargado de hacer que todo se mueva. Con todo esto el HTML nos queda así de sencillo:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;div id=&amp;quot;wrapper&amp;quot;&amp;gt;
  &amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;button-flag&amp;quot; value=&amp;quot;flag&amp;quot; id=&amp;quot;flag&amp;quot;&amp;gt;
  &amp;lt;div id=&amp;quot;content-wrapper&amp;quot;&amp;gt;
    &amp;lt;label id=&amp;quot;hamburger&amp;quot; for=&amp;quot;flag&amp;quot;&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;/label&amp;gt;
    &amp;lt;p&amp;gt;Contenido&amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div id=&amp;quot;menu&amp;quot;&amp;gt;
    &amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Enlace1&amp;lt;/a&amp;gt;
    &amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Enlace2&amp;lt;/a&amp;gt;
    &amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Enlace3&amp;lt;/a&amp;gt;
    &amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Enlace4&amp;lt;/a&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ahora vamos con las explicaciones: En primer lugar hemos creado un contenedor de carácter general, su misión es muy sencilla, nos va a ocultar el sobrante cuando movamos el menú y el contenido, mediante la propiedad &lt;code&gt;overflow&lt;/code&gt; de CSS, ya que sino se nos creará una barra de desplazamiento inferior.&lt;/p&gt;

&lt;p&gt;En segundo lugar hemos creado otro contenedor para el contenido de la página, exceptuando el menú y la checkbox, con la única finalidad de poder desplazar este contenido, un menú que vamos a colocar off canvas poniéndolo en posición absoluta y la checkbox, que como puedes ver va antes que el contenido y el menú.&lt;/p&gt;

&lt;p&gt;La explicación para colocar la checkbox de esta forma es bien sencilla, los selectores de CSS funcionan en un único sentido (al igual que CSS), de arriba a abajo y de fuera a dentro, con lo cual necesitamos que esté antes que los elementos con los que vamos a interactuar: menú, contenido y botón.&lt;/p&gt;

&lt;p&gt;Lo siguiente es darle forma a los contenedores, y posicionar el menú en función al ancho que vayamos a darle. También daremos estilo a la checkbox (únicamente vamos a hacer que desaparezca) e igualaremos la altura del menú a la del contenido (usando &lt;code&gt;display:table&lt;/code&gt; y &lt;code&gt;display:table-cell&lt;/code&gt;):&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
#wrapper {
    position: relative;
    display: table;
    overflow: hidden;
}

#content-wrapper {
    position: relative;
}

#menu {
    position: absolute;
    top: 0;
    left: -18em;
    display: table-cell;
    width: 18em;
    height: 100%;
    background: #314d67;
}

#flag {
    display: none;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;El siguiente paso es animar el menú, para lo cual hay que tener en cuenta el ancho del mismo, que es la distancia que vamos a mover tanto el menú como el contenido:&lt;/p&gt;


&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
#content-wrapper {
    transition: all .25s;
    -webkit-transform: translateX(0);
            transform: translateX(0);
}

#menu {
    transition: all .25s;
    -webkit-transform: translateX(0);
            transform: translateX(0);
}

#flag:checked + #content-wrapper,
#flag:checked ~ #menu {
    -webkit-transform: translateX(18em);
            transform: translateX(18em);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;La animación es bien sencilla, únicamente movemos el contenido y el menú sobre el eje X cuando tenemos marcada la checkbox y volvemos a la posición inicial cuando está desmarcada. A continuación vamos a maquetar el menú, no es necesario para su funcionamiento, pero ya que estamos vamos a dejarlo presentable:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
#menu a:hover {
    transition: background .25s;
    background: #1e3a54;
}

#menu a:before {
    position: absolute;
    top: 0;
    left: 0;
    width: .8em;
    height: 100%;
    content: &#39;&#39;;
    transition: -webkit-transform .25s;
    transition: transform .25s;
    -webkit-transform: translateX(-3em);
            transform: translateX(-3em);
    background: #2e6b55;
}

#menu a:hover:before {
    -webkit-transform: translateX(0em);
            transform: translateX(0em);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Por último, y esto tampoco es necesario, vamos a cambiar el aspecto del botón que creamos en el post anterior para que no desentone con el aspecto del menú. Además hay que cambiar los selectores, acuérdate que la principio del post cambiamos la checkbox de sitio, quedando el código de esta manera:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
#hamburger {
    position: relative;
    display: block;
    width: 3em;
    height: 3em;
    cursor: pointer;
    background: #1e3a54;
}

#hamburger span {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    width: 2em;
    height: .3em;
    margin: auto;
    transition: background 0s .5s;
    background: #fff;
}

#hamburger span:before,
#hamburger span:after {
    position: absolute;
    width: inherit;
    height: inherit;
    content: &#39;&#39;;
    transition-delay: .5s, .25s;
    transition-duration: .25s, .25s;
    background: #fff;
}

#hamburger span:before {
    top: -.7em;
    transition-property: top, -webkit-transform;
    transition-property: top, transform;
}

#hamburger span:after {
    bottom: -.7em;
    transition-property: bottom, -webkit-transform;
    transition-property: bottom, transform;
}

#flag:checked + #content-wrapper #hamburger span {
    background: none;
}

#flag:checked + #content-wrapper #hamburger span:before {
    top: 0;
    -webkit-transform: rotate(45deg);
            transform: rotate(45deg);
}

#flag:checked + #content-wrapper #hamburger span:after {
    bottom: 0;
    -webkit-transform: rotate(-45deg);
            transform: rotate(-45deg);
}

#flag:checked + #content-wrapper #hamburger span:before,
#flag:checked + #content-wrapper #hamburger span:after {
    transition-delay: .25s, .5s;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Como en el post anterior he creado un pen para que veas como funciona y puedas trastear con él todo lo que quieras: arriba, abajo, a la izquierda, a la derecha, pero nunca adelante ni atrás en el tiempo (eso me lo guardo xD):&lt;/p&gt;

&lt;p data-height=&quot;268&quot; data-theme-id=&quot;0&quot; data-slug-hash=&quot;mVROZx&quot; data-default-tab=&quot;result&quot; data-user=&quot;amram1977&quot; class=&#39;codepen&#39;&gt;See the Pen &lt;a href=&#39;http://codepen.io/amram1977/pen/mVROZx/&#39;&gt;mVROZx&lt;/a&gt; by amram (&lt;a href=&#39;http://codepen.io/amram1977&#39;&gt;@amram1977&lt;/a&gt;) on &lt;a href=&#39;http://codepen.io&#39;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;
&lt;script async src=&quot;//assets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;</description><link>http://www.hexagonalalien.es/2016/01/css-menu-off-canvas.html</link><author>noreply@blogger.com (LuisFran)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-4919214023405595727</guid><pubDate>Thu, 31 Dec 2015 08:31:00 +0000</pubDate><atom:updated>2016-03-08T17:38:08.013+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CSS</category><title>Icono animado estilo hamburguesa sólo con CSS</title><description>&lt;figure class=&quot;post-img&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKPrPmt-Xo4GtoVQGyZklx_KJorygaoMnKDCIzcj6fCzT3BV5ZCw-MHLY46KDO0YJYkK0UnITqrZsYSHV41HlHNtz0ZkypRqnoD9U3tN22zSDc5iJwIJtFdyT7MBh90oPspOOcBOd_k9s/s1600/bus-burger.jpg&quot; alt=&quot;Hamburguesa publicitada en autobús&quot; /&gt;
&lt;figcaption&gt;Imagen de &lt;a href=&quot;https://www.flickr.com/photos/gazeronly/&quot;&gt;torbakhopper&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;En plenas fechas navideñas y después de días y días de comilonas, turrones y mazapanes, brindis y más brindis, creo que es un buen momento para parar, centrar la cabeza (y también el estómago), hacer balance y aprovechar para publicar el último post del año, para inevitablemente volver a la rueda de brindis y más brindis.&lt;/p&gt;

&lt;p&gt;Como queda bien poco para Fin de Año, hoy voy a abordar uno de esos posts de los que realmente me gustan, un post que sirva para algo más que llenar páginas, un post útil (o al menos eso voy a intentar). Vamos a crear un &lt;b&gt;botón estilo hamburgesa&lt;/b&gt;, el típico botón para un menú oculto, que además será animado, y para ello &lt;b&gt;sólo vamos a usar CSS&lt;/b&gt;. ¡Ahí es na!&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;p&gt;El botón que vamos a crear tendrá dos posiciones, una será una hamburguesa y la otra una X, dos posiciones bien reconocibles para mostrar u ocultar un menú. Cuando nos encontramos con un caso así lo primero que echamos en falta en CSS es la posibilidad de memorizar un estado, por ello en la mayoría de las ocasiones se termina recurriendo a una solución Javascript o similar. Sin embargo en CSS hay casi de todo, y las etiquetas de CSS se pueden usar de otras formas para las que inicialmente no fueron concebidas.&lt;/p&gt;

&lt;p&gt;Para memorizar el estado en el que se encuentra nuestro botón vamos a usar una checkbox. Sí, a fin de cuentas una checkbox tiene dos estados, seleccionada y deseleccionada, así que valiéndonos de esta propiedad y apoyándonos en una simple etiqueta &lt;code class=&quot;html-code&quot;&gt;label&lt;/code&gt; podemos pasar por alto el uso de un lenguaje de programación web. El marcado inicial en HTML es, como verás, bien sencillo:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;label id=&amp;quot;hamburger&amp;quot;&amp;gt;
  &amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;button-flag&amp;quot; value=&amp;quot;flag&amp;quot; id=&amp;quot;flag&amp;quot;&amp;gt;
  &amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/label&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;La etiqueta &lt;code class=&quot;html-code&quot;&gt;label&lt;/code&gt; tiene una peculiaridad que nos viene muy bien, y es la de activar o desactivar una checkbox cuando esta es hija suya o si está asociada a ella. En nuestro caso la etiqueta &lt;code class=&quot;html-code&quot;&gt;input&lt;/code&gt; es hija de la etiqueta &lt;code class=&quot;html-code&quot;&gt;label&lt;/code&gt;, con la cual ya la tenemos asociada. Ahora lo que vamos a hacer es convertir la etiqueta &lt;code class=&quot;html-code&quot;&gt;label&lt;/code&gt; en nuestro botón y dibujar la hamburguesa valiéndonos de la etiqueta &lt;code class=&quot;html-code&quot;&gt;span&lt;/code&gt; (también hija de la etiqueta &lt;code class=&quot;html-code&quot;&gt;label&lt;/code&gt;) y los pseudoelementos &lt;code&gt;before&lt;/code&gt; y &lt;code&gt;after&lt;/code&gt;. Evidentemente ocultaremos la checkbox, ya que sólo nos es útil como memoria binaria:&lt;/p&gt;


&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
#flag {
    display: none;
}

#hamburger {
    position: relative;
    display: block;
    width: 4em;
    height: 4em;
    cursor: pointer;
    background: #ff9700;
}

#hamburger span {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    width: 3em;
    height: .4em;
    margin: auto;
    background: #fff;
}

#hamburger span:before,
#hamburger span:after {
    position: absolute;
    width: inherit;
    height: inherit;
    content: &#39;&#39;;
    background: #fff;
}

#hamburger span:before {
    top: -1em;
}

#hamburger span:after {
    bottom: -1em;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ahora lo que nos queda es animarla. La animación consta de dos partes: primero juntamos las líneas que forman la hamburgesa y ocultamos la línea central justo en el momento en que se juntan. En segundo lugar giramos las dos líneas restantes 45 y -45 grados para dibujar una X. Para ello tenemos que tener en cuenta el tiempo que queremos que dure cada animación y hacer que se vayan concatenado en secuencia. Para volver al estado inicial (pasar de X a hamburguesa) sólo tenemos que invertir la animación. Para todo ello nos apoyaremos en la checkbox para saber el estado en el que estamos, suena complicado, pero no lo es tanto:&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Css&quot;&gt;
#hamburger span {
    transition: background 0s .25s;
}

#hamburger span:before,
#hamburger span:after {
    transition-delay: .25s, 0s;
    transition-duration: .25s, .25s;
}

#hamburger span:before {
    transition-property: top, -webkit-transform;
    transition-property: top, transform;
}

#hamburger span:after {
    transition-property: bottom, -webkit-transform;
    transition-property: bottom, transform;
}

#flag:checked + span {
    background: none;
}

#flag:checked + span:before {
    top: 0;
    -webkit-transform: rotate(45deg);
            transform: rotate(45deg);
}

#flag:checked + span:after {
    bottom: 0;
    -webkit-transform: rotate(-45deg);
            transform: rotate(-45deg);
}

#flag:checked + span:before,
#flag:checked + span:after {
    transition-delay: 0s, .25s;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Con esto ya tenemos creado nuestro icono hamburgesa y tan sólo hemos usado CSS. Para este minitutorial he creado también un Pen para que veas el resultado que da el código y además puedas trastear con él todo lo que quieras, pues personalmente creo que es la mejor forma de aprender y ver como funcionan realmente las cosas:&lt;/p&gt;

&lt;p data-height=&quot;268&quot; data-theme-id=&quot;0&quot; data-slug-hash=&quot;dGprye&quot; data-default-tab=&quot;result&quot; data-user=&quot;amram1977&quot; class=&#39;codepen&#39;&gt;See the Pen &lt;a href=&#39;http://codepen.io/amram1977/pen/dGprye/&#39;&gt;Pure CSS animated hamburger button&lt;/a&gt; by amram (&lt;a href=&#39;http://codepen.io/amram1977&#39;&gt;@amram1977&lt;/a&gt;) on &lt;a href=&#39;http://codepen.io&#39;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;
&lt;script async src=&quot;//assets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Espero que al menos el tutorial te haya sido útil, que en esencia era la base para hacerlo, y por si nadie te lo ha dicho (cosa que dudo horrores), ¡feliz Navidad y próspero 2016!&lt;/p&gt;</description><link>http://www.hexagonalalien.es/2015/12/icono-animado-hamburguesa-css.html</link><author>noreply@blogger.com (LuisFran)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKPrPmt-Xo4GtoVQGyZklx_KJorygaoMnKDCIzcj6fCzT3BV5ZCw-MHLY46KDO0YJYkK0UnITqrZsYSHV41HlHNtz0ZkypRqnoD9U3tN22zSDc5iJwIJtFdyT7MBh90oPspOOcBOd_k9s/s72-c/bus-burger.jpg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-9062857839648306280.post-1116054526516545150</guid><pubDate>Fri, 18 Dec 2015 15:27:00 +0000</pubDate><atom:updated>2017-04-19T15:29:56.042+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">HTML5</category><title>Semántica en HTML5 (V): nav y main</title><description>&lt;p&gt;Tras unos cuantos días sin publicar nada, muchos más de los que me hubiese gustado, he decidido dar carpetazo a la serie de artículos sobre la semántica en HTML5 aunando dos etiquetas que nada tienen que ver en un único artículo. Con estas dos nuevas etiquetas finalizaré una estructura básica que puede ser usada para construir cualquier web y que además será 100% semántica, que es a fin de cuentas lo que buscaba con esta serie de artículos.&lt;/p&gt;

&lt;p&gt;Por supuesto la semántica en HTML5 es mucho más amplia, y voy a obviar etiquetas como &lt;code class=&quot;html-code&quot;&gt;address&lt;/code&gt; o &lt;code class=&quot;html-code&quot;&gt;time&lt;/code&gt; (al menos de momento), porque son menos generales y no suelen conformar la estructura básica de una web. Además también queda pendiente el tema de los datos estructurados mediante los esquemas de &lt;a href=&quot;https://schema.org/&quot;&gt;Schema.org&lt;/a&gt;, un punto también muy importante cuando se habla sobre la semántica de una web y que en algún momento tocaré en un futuro artículo (promesa de año nuevo xD). Así que sin más vueltas, vamos a ensuciarnos las manos como buenos alienígenas que somos.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;p&gt;Vamos a comenzar por una de las etiquetas más básicas, que a buen seguro no te costará para nada entender (y más si te has leído los capítulos anteriores de esta entrega), que es la etiqueta nav. Según la información que nos proporciona la &lt;a href=&quot;http://dev.w3.org/html5/spec-preview/the-nav-element.html&quot;&gt;W3C&lt;/a&gt;, &lt;code class=&quot;html-code&quot;&gt;nav&lt;/code&gt; representa una sección de una web que enlaza otras páginas o partes de la página, o lo que viene a ser lo mismo, un menú de navegación. Sólo hay que tener en cuenta que el fin de la etiqueta &lt;code class=&quot;html-code&quot;&gt;nav&lt;/code&gt; no es la de etiquetar cualquier enlace, sino únicamente aquellos que conformen una navegación principal.&lt;/p&gt;

&lt;p&gt;Con esta definición creo que queda bastante claro que sólo usaremos &lt;code class=&quot;html-code&quot;&gt;nav&lt;/code&gt; para el típico menú principal de navegación que suele tener cualquier web, los típicos enlaces de navegación &quot;prev next&quot; de Blogger o quizás también una nube de etiquetas, porque todos ellos nos llevan a partes importantes de nuestra web y forman parte de las opciones de navegación que ofrecemos a nuestros usuarios, evidentemente nunca debe de usarse para un blogroll.&lt;/p&gt;


&lt;p&gt;La otra etiqueta que vamos a tratar y que posteriormente nos ayudará a construir una web semántica, es la etiqueta &lt;code class=&quot;html-code&quot;&gt;main&lt;/code&gt;. El elemento &lt;code class=&quot;html-code&quot;&gt;main&lt;/code&gt; es el más nuevo de todos los que hemos tratado hasta ahora, de hecho comenzó siendo una extensión de HTML y se fue desarrollando de forma separada, aunque en estos momentos ya está integrada en la especificación de HTML.&lt;/p&gt;

&lt;p&gt;Aunando el &lt;a href=&quot;https://www.w3.org/wiki/HTML/Elements/main&quot;&gt;wiki de la W3C&lt;/a&gt; y la &lt;a href=&quot;http://www.w3.org/TR/html-main-element/&quot;&gt;extensión de la especificación para HTML5 de main&lt;/a&gt;, tambień de la W3C, podemos sacar como conclusión que &lt;code class=&quot;html-code&quot;&gt;main&lt;/code&gt; viene a sustituir la sección del contenido que generalmente se suele etiquetar con una id main o content y que su finalidad es la de englobar el contenido principal de un documento o aplicación. Sólo un apunte, únicamente puede haber un &lt;code class=&quot;html-code&quot;&gt;main&lt;/code&gt; por documento, ya que a fin de cuentas no es una etiqueta para seccionar contenido, para eso tenemos &lt;code class=&quot;html-code&quot;&gt;section&lt;/code&gt; o &lt;code class=&quot;html-code&quot;&gt;article&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Llegados a esto punto es cuando por fín vamos a ensuciarnos las manos. Voy a echar mano de la última plantilla que usamos en &lt;a href=&quot;http://www.hexagonalalien.es/2015/10/semantica-en-html5-iii-article-y-section.html&quot;&gt;Semántica en HTML5 (III): article y section&lt;/a&gt; y a darle el toque final para obtener una &lt;b&gt;plantilla base semántica en HTML5&lt;/b&gt;. Omitiré la inclusión de la etiqueta &lt;code class=&quot;html-code&quot;&gt;aside&lt;/code&gt;, por ser poco generalista, ya que como vimos en &lt;a href=&quot;http://www.hexagonalalien.es/2015/11/semantica-en-html5-iv-aside.html&quot;&gt;Semántica en HTML5 (IV): aside&lt;/a&gt; es una etiqueta con unos requisitos para su uso un poco más especiales y a mi gusto no se adapta muy bien a una plantilla base, así nos evitaremos que a alguno le de por enmarcar su sidebar con este etiqueta.&lt;/p&gt;

&lt;pre&gt;&lt;code data-code=&quot;Html&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
 ...
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
 &amp;lt;header id=&amp;quot;cadecera&amp;quot;&amp;gt;
  &amp;lt;nav id=&amp;quot;menu&amp;quot;&amp;gt;Menú de navegación&amp;lt;/nav&amp;gt;
  &amp;lt;img src=&amp;quot;logo.gif&amp;quot;&amp;gt;
  &amp;lt;p&amp;gt;título del blog&amp;lt;/p&amp;gt;
  &amp;lt;form id=&amp;quot;busqueda&amp;quot;&amp;gt;formulario de búsqueda&amp;lt;/form&amp;gt;
 &amp;lt;/header&amp;gt;
 &amp;lt;main id=&amp;quot;contenido&amp;quot;&amp;gt;
  &amp;lt;article class=&amp;quot;post&amp;quot;&amp;gt; 
   &amp;lt;header class=&amp;quot;encabezado-post&amp;quot;&amp;gt;
    &amp;lt;h1&amp;gt;Título del post&amp;lt;/h1&amp;gt;
    &amp;lt;time&amp;gt;Fecha de publicación&amp;lt;/time&amp;gt;
    &amp;lt;p&amp;gt;Autor del post&amp;lt;/p&amp;gt;
   &amp;lt;/header&amp;gt;
   &amp;lt;div class=&amp;quot;contenido-post&amp;quot;&amp;gt;
    ...
   &amp;lt;/div&amp;gt;
   &amp;lt;footer class=&amp;quot;post-footer&amp;quot;&amp;gt;
    nº de comentarios, tags
   &amp;lt;/footer&amp;gt;
  &amp;lt;/article&amp;gt;
 &amp;lt;/main&amp;gt;
 &amp;lt;footer id=&amp;quot;footer&amp;quot;&amp;gt;
  copyright, condiciones de uso, etc.
 &amp;lt;/footer&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;</description><link>http://www.hexagonalalien.es/2015/12/semantica-en-html5-v-nav-y-main.html</link><author>noreply@blogger.com (LuisFran)</author></item></channel></rss>