10 secretos de CSS3 que tal vez no conocias

palabras / Facebook / Twitter / Enlace / Comentar

Este artículo fue originalmente publicado en Cristalab, un portal dónde colaboro ocasionalmente.

Lea Verou (@LeaVerou) es una popular desarrolladora web con varios años de experiencia. En su conferencia "10 cosas de CSS3 que tal vez no conocías" nos explica el uso de algunas propiedades, efectos, transiciones y animaciones en CSS3, así como también un moderado uso de javascript y su respectiva compatibilidad en diferentes navegadores. Esta conferencia la dió en Pathé Tuschinski en Amsterdam el 7 de Octubre 2011 la cual me he encargado de recopilar y traducir.

Lea Verou

Bouncing transitions

Seguramente conocerás diversas maneras de realizar animaciones con la propiedad transition de CSS3. La manera regular de hacerlo es utilizando ease-out, ease-in, etc. Pero ¿Qué tan bien conoces cubic-bezier?Cubic-Bezier es, por así decirlo, la propiedad madre de los efectos de transición de los estilos antes mencionados. Es totalmente personalizable y se es capaz de marcar tiempos para la animación que queramos.Se utiliza de la siguiente manera:

transition Ts cubic-bezier(x, y, z, w)
transition 1.5s cubic-bezier(.17, .87, .50, 1.2)

Lea Verou es tan cool que nos regala un sistema de modificación de este tipo de animación de manera gráfica con un excelente diseño y tiene el mejor dominio: Cubic-Bezier.com

Ejemplo con hover

Ver código de ejemplo
#cubic-bezier {
  width: 700px;
  height: 100px;
  border: 1px solid gray;
  position: relative;
}
#cubic-bezier div {
  width:100px;
  height:100px;
  background: silver;
  position: absolute;
  -webkit-transition: all 1000ms cubic-bezier(0.665, 1.305, 0.415, -0.300); 
     -moz-transition: all 1000ms cubic-bezier(0.665, 1.305, 0.415, -0.300); 
      -ms-transition: all 1000ms cubic-bezier(0.665, 1.305, 0.415, -0.300); 
       -o-transition: all 1000ms cubic-bezier(0.665, 1.305, 0.415, -0.300); 
          transition: all 1000ms cubic-bezier(0.665, 1.305, 0.415, -0.300);
}
#cubic-bezier:hover div {
  left: 600px;
}

Flexible ellipses

La manera en la que generalmente hacemos un border-radius es con medidas fijas, pero ¿Qué pasa si nuestro es contenido dinámico? Se distorsiona.

border-radius: 150px / 300px;

Para que esto no suceda se recomienda utilizar porcentajes para realizar el mismo efecto pero sin llegar a una distorción.

border-radius: 50%;

Con esto siempre se mantendrá la forma de un elipse.

Ejemplo

Ver código de ejemplo
#elipse {
  -webkit-border-radius: 100%;
     -moz-border-radius: 100%;
          border-radius: 100%;
  width:200px;
  height:100px;
  background: silver;
  margin: 0 auto;
}

Multiple outlines

Existen maneras complicadas de realizar el efecto de tener varios bordes en un contenedor, pero existe una manera mucho más fácil.

box-shadow: 0 0 0 5px black, 0 0 0 10px red;

Los primeros 3 ceros dentro de las propiedades de nuestro box-shadow indican que no tendrá ningún tipo de posición en x o y, igualmente ningún blur. El cuarto elemento define el spread o el ancho de nuestro box-shadow, esto nos ayudará a generar el efecto.

box-shadow: x y blur spread color;

Con esto, simplemente vamos haciendo un borde más grande que otro dándonos el efecto de múltiples bordes.

Ver código de ejemplo
#outlines {
  box-shadow: 0 0 0 5px green,
              0 0 0 10px yellow,
              0 0 0 15px red,
              0 0 0 20px black,
              0 0 0 25px gray;
  -webkit-box-shadow: 0 0 0 5px green,
              0 0 0 10px yellow,
              0 0 0 15px red,
              0 0 0 20px black,
              0 0 0 25px gray;
  -moz-box-shadow: 0 0 0 5px green,
              0 0 0 10px yellow,
              0 0 0 15px red,
              0 0 0 20px black,
              0 0 0 25px gray;
  width: 100px;
  height: 100px;
  margin: 30px auto;
  background: white;
}

Bonus: One Side Shadow

Siguiendo las reglas de box-shadow es bastante fácil realizar una sombra de un sólo lado de algún elemento.

box-shadow: 0 11px 5px -5px black;

Ver código de ejemplo
#sombra {
  -webkit-box-shadow: 0 11px 5px -5px black;
    -moz-box-shadow: 0 11px 5px -5px black;
         box-shadow: 0 11px 5px -5px black;
  width: 100px;
  height: 100px;
  margin: 0 auto;
  background: silver;
}

Make pointer events pass through

Si tenemos un elemento encima de otro modificado con z-index y queremos realizar un clic en el elemento que está debajo, esta acción nos resulta imposible. Para poder habilitar un "click through" o un "clic a través" es necesario agregar la siguiente propiedad a nuestro elemento superior.

pointer-events: none;
Esto igual es util para hacer select-menus personalizados.

Detección

Está es la manera recomendada de detectar si existe la propiedad pointer-events.

var supportsPointerEvents = (function(){
  var dummy = document.createElement('_');
  if(!('pointerEvents' in dummy.style)) return false;
  dummy.style.pointerEvents = 'auto';
  dummy.style.pointerEvents = 'x';
  document.body.appendChild(dummy);
  var r = getComputedStyle(dummy).pointerEvents === 'auto';
  document.body.removeChild(dummy);
  return r;
})();

Y un workaround en javascript es el siguiente.

function noPointerEvents (element) {
   $(element).bind('click mouseover', function (evt) {
      this.style.display = 'none';
      var x = evt.pageX, y = evt.pageY,
          under = document.elementFromPoint(x, y);
      this.style.display = '';
      evt.stopPropagation();
      evt.preventDefault();
      $(under).trigger(evt.type);
   });
}

Clic aquí

Ver código de ejemplo
#pointer {
  width: 200px;
  height: 100px;
  border: 1px solid silver;
  margin: 0 auto;
  position: relative;
}
#pointer .overlay {
  pointer-events: none;
  width: 100%;
  height: 100%;
  position: absolute;
  z-index: 2;
  background-color: gray;
  -ms-filter:"progid:DXImageTransform.Microsoft.Alpha"(Opacity=40);
  -moz-opacity: 0.40;
       opacity: 0.40;
}
#pointer p {
  margin: 0; padding: 0;
  text-align: center;
  line-height: 100px;
  z-index: 1;
}

Adjusting tab size

Si quieres modificar el tamaño de la sangría o el tamaño del tab en un texto, la propiedad tab-size te ayudará bastante.

tab-size: 4;

Styling based on sibling count

Eso de estar seleccionando cada elemento de un menú, de una lista, de una galería, etc, para asignarle una propiedad diferente es una lata. Resulta que existen unas propiedades llamadas first-child, only-child, nth-child y nth-last-child, que nos ayudarán bastante para realizar una serie de efectos interesantes.

:first-child

Se selecciona unicamente el primer elemento dentro de un parent (ya se del body, algún contenedor o de una lista).

#elemento:first-child {
   propiedad: unica;
}

:only-child

Se selecciona únicamente un elementro que esté sólo dentro de un parent.

#elemento:only-child {
   propiedad: unica;
}

:nth-child

Esta es la que más me gusta. Con esta propiedad podremos seleccionar varios elementos cada determinado numero de elementos.

#elemento:nth-child(3n+1) {
   propiedad: unica;
}

Con esto se seleccionarán el primer elemento y a partir de ahí, cada tres elementos se le aplicará nuestra propiedad.

:nth-last-child

Si queremos hacerlo al revés, es decir, contar desde el último al primero lo podemos hacer con esta propiedad.

#elemento:nth-last-child(3n+1) {
   propiedad: unica;
}

Bonus

Lea Verou nos regala las siguientes propiedades para facilitarnos la vida.

:first-child:nth-last-child(12)

Se selecciona el primer elemento si sólo son 12 en total.

:first-child:nth-last-child(12), :first-child:nth-last-child(12) ~ b

Se seleccionan todos los elementos si son solo 12 en total.

:first-child:nth-last-child(n+6), :first-child:nth-last-child(n+6) ~ b

Se seleccionan todos los elementos a partir de 6 en total.

Ejemplos de pseudo-selectores

Custom checkboxes & radio buttons

La idea principal es atribuída a Ryan Seddon, con esto podremos tener checkboxes y radio buttons personalizados.Primero escondemos nuestro elemento.

:root input#custom-checkbox {
   position:absolute; clip: rect(0,0,0,0);
}

Después personalizamos nuestro nuevo elemento, agregándole contenido personalizado:

:root input#custom-checkbox + label:before {
   content: '\20E0';
   padding-right: .3em; color: red;
}

Y por último personalizamos y retocamos el efecto de nuestro elemento:

:root input#custom-checkbox:focus + label:before {
   color: white;
}
:root input#custom-checkbox:checked + label:before {
   color: red;
}

More cursors for better UX

Seguramente sabes que con CSS2 se pueden asignar diferentes cursores, aquí una lista de nuestras opciones nuevas en CSS3 y las viejas de CSS2. Quizás tu explorador no lo soporte. Pasa el mouse por cada nombre para ver el ejemplo.

Se utiliza de la siguiente manera:

cursor: opcion;

Background patterns with pure CSS

Si quieres ser original y realizar tus propios patrones en CSS3, puedes comenzar por aprender como funciona el sistema de linear-gradient.

background: linear-gradient(70deg, black 20%, gray 80%)

Nuestro fondo de pantalla tendrá un degradado con un ángulo de 70°, 20% negro y 80% gris. Fácil, ¿no?

Algo que probablemente no sabías es que se pueden incluir varias opciones dentro del linear-gradient, para realizar un patrón inclinado podemos utilizar lo siguiente:

background: linear-gradient(45deg,
silver 25%, gray 25%, gray 50%,
silver 50%, silver 75%, gray 75%, gray);
background-size: 200px 200px;

Ajustando el background-size se puede hacer magia. Con esto ajustamos el tamaño de nuestro patrón, para así realizar un bonito efecto.Se puede realizar el mismo efecto con la propiedad repeating-linear-gradient, nos dará el mismo efecto anterior. Se están utilizando ahora, en lugar de porcentajes, medidas fijas. Con esto podremos personalizar aún más nuestro efecto a desear.

background: repeating-linear-gradient(45deg,
silver, silver 30px, gray 30px, gray 60px);

Ver código de ejemplo
#bgcolor {
  background: -webkit-repeating-linear-gradient(45deg,
  silver, silver 30px, gray 30px, gray 60px);
  background: -moz-repeating-linear-gradient(45deg,
  silver, silver 30px, gray 30px, gray 60px);
  background: repeating-linear-gradient(45deg,
  silver, silver 30px, gray 30px, gray 60px);
  width: 200px;
  height: 100px;
  margin: 0 auto;
}

Background positioning tricks

¿Cuántas veces has querido darle padding a un background dentro de un contenedor en una locación específica? Como sabrás lo siguiente no funciona.

padding:40px;
background: url(imagen.png) no-repeat;
background-position: bottom right;

Para poder lograr el padding se puede utilizar la siguiente forma:

background-position: bottom 100px right 100px;

Lamentablemente, esta extensión de propiedad aún no está soportada por (increíblemente) Webkit.

Ver código de ejemplo
#bgpos {
  width: 250px;
  height: 250px;
  margin: 0 auto;
  border: 1px solid silver;
  background: url('monkey.png') no-repeat;
  background-position: bottom 10px right 20px;
}


Workaround para Firefox y Webkit

Para realizar el efecto, que increíblemente únicamente funciona en IE (si, IE) y Opera, podemos utilizar lo siguiente:

padding: 100px;
backgroun-position: bottom right;
background-origin: content-box;

La propiedad background-origin es compatible en todos los navegadores.Y con esto finaliza la genial presentación de Lea Verou.En lo personal aprendí bastante, pero sobretodo, aprendí que hay que innovar, pensar out of the box afuera de la caja y sacarle el mayor provecho a las tecnologías actuales. No hay que ser perezosos.

Video de la presentación | Slides de la presentación | Framework de Lea Verou para hacer la presentación


Comentarios

Copyright © 2012-2013 AbarcaRodriguez.com