1. Web Design
  2. HTML/CSS
  3. CSS

10 Propiedades de CSS3 con las que Necesitas estar Familizarizado

Ya cubrimos los treinta selectores de CSS que todos deberíamos memorizar; pero qué hay con las nuevas propiedades de CSS3? A pesar de que la mayoría de ellas necesitan un prefijo específico del vendor, ya las puedes empezar a utilizar en tus proyectos. De hecho, es alentado!
Scroll to top
This post is part of a series called CSS3 Mastery.
Getting to Work with CSS3 Power Tools

Spanish (Español) translation by Óscar Salas Fernández (you can also view the original English article)

Ya cubrimos los treinta selectores de CSS que todos deberíamos memorizar; pero qué hay con las nuevas propiedades de CSS3? A pesar de que la mayoría de ellas necesitan un prefijo específico del vendor, ya las puedes empezar a utilizar en tus proyectos. De hecho, es alentado!

La clave es determinar primero si estás de acuerdo con una pequeña diferencia de presentación de browser a browser. Estás de acuerdo, digamos, con IE mostrando las esquinas a 90 grados en lugar de redondeadas? Es tu decisión. De todas maneras, siempre recuerda que los sitios web no necesitan verse igual en cada navegador. En la conclusión de este artículo, vamos a trabajar en un proyecto final divertido.

border-radius

Border-radius

Ver la demo

Fácilmente la propiedad CSS3 más popular en el grupo, border-radius fue una especie de propiedad insignia de CSS3. Mientras que muchos diseñadores seguían aterrorizados con la idea de que una interfase podría ser mostrada de diferente manera de browser a browser, un pequeño paso, como esquinas redondeadas, fue una manera fácil de atraerlos!

La ironía es que estamos perfectamente bien con la idea de proveer una visualización alternativa para los browsers móviles. Extrañamente, sin embargo, algunos no sienten lo mismo cuando se trata de browsers de escritorio.

1
-webkit-border-radius: 4px;
2
-moz-border-radius: 4px;
3
border-radius: 4px;

Nota que tanto Safari 5 como IE9 implementan la sintaxis oficial de 'border-radius'.

Círculos

Algunos lectores quizás no estén al tanto de que pueden crear círculos con esta propiedad.

1
-moz-border-radius: 50px;
2
-webkit-border-radius: 50px;
3
 border-radius: 50px;
Circles

Ver Demo

...Y, si queremos pasarlo bien, también podemos aprovechar el Modelo de Caja Flexible (detallado en #8) para centrar el texto dentro del círculo tanto vertical como horizontalmente. Requiere un poco de código, pero sólo debido a la necesidad de compensar a varios proveedores.

1
display: -moz-box;
2
display: -webkit-box;
3
display: box;
4
5
-moz-box-orient: horizontal; /* the default, so not really necessary here */
6
-webkit-box-orient: horizontal;
7
box-orient: horizontal;
8
9
-moz-box-pack: center;
10
-moz-box-align: center;
11
12
-webkit-box-pack: center;
13
-webkit-box-align: center;
14
15
box-pack: center;
16
box-align: center;

2. Box-Shadow

Box-ShadowBox-ShadowBox-Shadow

Ver Demo

A continuación, tenemos al ubicuo box-shadow, el cual te permite aplicar profundidad a tus elementos inmediatamente. ¡No seas demasiado insufrible con los valores que establezcas!

1
-webkit-box-shadow: 1px 1px 3px #292929;
2
-moz-box-shadow: 1px 1px 3px #292929;
3
box-shadow: 1px 1px 3px #292929;

box-shadow reconoce cuatro parámetros:

  • desplazar-x
  • desplazar-y
  • difuminado
  • color de la sombra

Ahora, de lo que muchos no se dan cuenta es de que puedes aplicar varios box-shadows a la vez. Esto puede llevar a algunos efectos realmente interesantes. En la siguiente captura de pantalla, uso una sombra azul y verde para magnificar cada sombra.

Multiple box shadowsMultiple box shadowsMultiple box shadows

Ver Demo
1
-webkit-box-shadow: 1px 1px 3px green, -1px -1px blue;
2
-moz-box-shadow: 1px 1px 3px green,-1px -1px blue;
3
box-shadow: 1px 1px 3px green, -1px -1px blue;

Sombras Inteligentes

Aplicando sombras a las pseudo-clases ::before y ::after, podemos crear algunas perspectivas realmente interesantes. Aquí hay una para que comiences:

El HTML

1
<div class="box">
2
   <img src="tuts.jpg" alt="Tuts" />
3
</div>

El CSS

1
.box:after {
2
   content: '';
3
   position: absolute;
4
5
   z-index: -1; /* hide shadow behind image */
6
7
   /* The Shadow */
8
   -webkit-box-shadow: 0 15px 20px rgba(0, 0, 0, 0.3);
9
   -moz-box-shadow: 0 15px 20px rgba(0, 0, 0, 0.3);
10
   -box-shadow: 0 15px 20px rgba(0, 0, 0, 0.3);                
11
12
   width: 70%; 
13
   left: 15%; /* one half of the remaining 30% (see width above) */
14
15
   height: 100px;
16
   bottom:  0;
17
}
Cool ShadowsCool ShadowsCool Shadows

Ver Demo

¿Quieres más efectos geniales? Consulta este tutorial en Nettuts+.

3. text-shadow

Text-shadowText-shadowText-shadow

 Ver Demo

text-shadow es una de las pocas propiedades de CSS3 en la que podemos omitir el uso del prefijo del proveedor. Bastante similar a box-shadow, debe ser aplicado al texto, y admite los mismos cuatro parámetros:

  • offset-x
  • offset-y
  • difuminado
  • color de la sombra
1
 h1 {
2
    text-shadow: 0 1px 0 white;
3
    color: #292929;
4
 }

Text-Outline

De nuevo, al igual que su hermano, box-shadow, podemos aplicar múltiples sombras, utilizando una coma como separador. Por ejemplo, digamos que queremos crear un efecto de borrador para el texto. Aunque webkit ofrece un efecto stroke, podemos llegar a más navegadores utilizando el siguiente método (aunque no tan bonito):

1
body { background: white; }
2
3
h1 {
4
   text-shadow: 0 1px 0 black, 0 -1px 0 black, 1px 0 0 black, -1px 0 0 black;
5
   color: white;
6
}
Text OutlineText OutlineText Outline
Ver Demo

4. Text-Stroke

Text-StrokeText-StrokeText-Stroke

Ver Demo

Ten cuidado con este método. Sólo webkit, durante los últimos años, lo admite (Safari, Chrome, iPhone). De hecho, aunque podría estar equivocado, `text-stroke` aún no es parte de la especificación CSS3. En este caso, con texto en blanco, Firefox mostrará una página aparentemente en blanco. Puedes o utilizar la detección de funciones JavaScript para evitar esto o asegurarte de que el color del texto base no es el mismo que el del fondo del cuerpo.

1
h1 {
2
   -webkit-text-stroke: 3px black;
3
   color: white;
4
}

Detectar Funcionalidades

¿Cómo podemos proporcionar un lote de estilo para, por ejemplo, Firefox, y otro lote para Safari o Chrome? Una solución es usar detectar funcionalidades.

Con detectar funcionalidades, podemos usar JavaScript para comprobar si cierta propiedad está disponible. Si no lo está, preparamos un fallback.

Vamos a consultar atrás en el punto de text-stroke. Vamos a establecer un fallback de color negro para los navegadores que no admiten esta propiedad (todos menos webkit de momento).

1
var h1 = document.createElement('h1');
2
if ( !( 'webkitTextStroke' in h1.style ) ) {
3
   var heading = document.getElementsByTagName('h1')[0];
4
   heading.style.color = 'black';
5
}

Primero, creamos un elemento h1 simulado . Después, realizamos una búsqueda completa para determinar si la propiedad -webkit-text-stroke está disponible para ese elemento, a través del atributo style. Si no lo está, cogeremos el encabezado Hello Readers, y establecemos su color de blanco a negro.

Por favor date cuenta de que estamos siendo genéricos aquí. Si necesitas reemplazar varias etiquetas h1 en la página, necesitarás usar una sentencia while para filtar a través de cada encabezado, y actualizar el estilo o el nombre de la clase, debidamente.

Además estamos probando sólo para webkit, cuando es posible que otros navegadores con el tiempo admitan la propiedad text-stroke también. Recuerda eso.

Si quieres una solución detectar-funcionalidad más completa, consulta Modernizr.

5. Múltiples Fondos

Multiple Background ImagesMultiple Background ImagesMultiple Background Images

Ver Demo

La propiedad background ha sido ajustada para permitir múltiples fondos en CSS3.

Vamos a crear un ejemplo tonto, simplemente como una prueba de concepto. Debido a la falta de imágenes adecuadas cerca, voy a utilizar dos imágenes tutoriales como nuestros fondos. Por supuesto, en una aplicación del mundo real, puede que  utilices una textura y, tal vez, un degradado para tus fondos.

1
.box {
2
background: url(image/path.jpg) 0 0 no-repeat,
3
 url(image2/path.jpg) 100% 0 no-repeat;
4
}

Arriba, usando una coma como separador, estamos haciendo referencia a dos imágenes de fondo distintas. Observa cómo, en el primer caso, se coloca en la posición superior izquierda (0 0), y, en el segundo, en la posición superior derecha (100% 0).

Asegúrate de proporcionar un fallback a los navegadores que no ofrecen soporte para varios fondos. Se saltarán la propiedad por completo, dejando tu fondo en blanco.

Compensación para Navegadores Antiguos

Para agregar una sola imagen de fondo para los navegadores antiguos, como IE7, declarar la propiedad de background dos veces: primero para los navegadores antiguos, y segundo como una anulación. Alternativamente, podrías, de nuevo, usar Modernizr.

1
.box {
2
/* fallback */
3
background: url(image/path.jpg) no-repeat;
4
5
/* modern browsers */
6
background: url(image/path.jpg) 0 0 no-repeat,
7
 url(image2/path.jpg) 100% 0 no-repeat;
8
}

6. background-size

Hasta hace poco tiempo, nos vimos obligados a usar técnicas solapadas para permitir imágenes de fondo redimensionables.

1
background: url(path/to/image.jpg) no-repeat;
2
background-size: 100% 100%;

El código anterior dirigirá la imagen de fondo para ocupar todo el espacio disponible. Como ejemplo, ¿y si queremos que una imagen en particular ocupe todo el fondo del elemento del cuerpo, independientemente del ancho de la ventana del navegador?

1
body, html { height: 100%; }
2
3
body {
4
 background: url(path/to/image.jpg) no-repeat;
5
 background-size: 100% 100%;
6
}

Eso es todo al respecto. La propiedad background-size admitirá dos parámetros: las anchuras x e y, respectivamente.

Aunque las versiones más recientes de Chrome y Safari admiten background-size de forma nativa, todavía necesitamos usar prefijos de proveedor para los navegadores antiguos.

1
body {
2
 background: url(path/to/image.jpg) no-repeat;
3
 -moz-background-size: 100% 100%;
4
 -o-background-size: 100% 100%;
5
 -webkit-background-size: 100% 100%;
6
 background-size: 100% 100%;
7
}

Ver Demo

7. text-overflow

Originalmente desarrollada por Internet Explorer, la propiedad text-overflow puede aceptar dos valores:

  • abreviar
  • elipsis

Esta propiedad se puede utilizar para cortar el texto que exceda su contenedor, mientras que todavía proporciona un poco de retroinformación para el usuario, como una elipsis.

Text-OverflowText-OverflowText-Overflow

Ver Demo

¿Sabías? ¿Internet Explorer ha proporcionado soporte para esta propiedad desde IE6? ¡Ellos lo crearon!

1
.box {
2
   -o-text-overflow: ellipsis;
3
   text-overflow:ellipsis;
4
5
   overflow:hidden;
6
   white-space:nowrap;
7
8
   border: 1px solid black;
9
   width: 400px;
10
   padding: 20px;
11
12
   cursor: pointer;
13
}

En este punto, puedes considerar mostrar la totalidad del texto cuando un usuario se sitúa sobre el cuadro.

1
#box:hover {
2
  white-space: normal;
3
  color: rgba(0,0,0,1);
4
  background: #e3e3e3;
5
  border: 1px solid #666;
6
}

Un poco extraño (a menos que me equivoque), no parece ser una manera de restablecer la propiedad text-overflow, o de "apagarla". Para imitar esta funcionalidad "off", en :hover, podemos configurar la propiedad white-space de nuevo a normal. Esto funciona, porque text-overflow depende de esto para funcionar correctamente.

¿Sabías? También puedes especificar tu propia cadena, que debería usarse en lugar de la elipsis. Haciendo eso se renderizará la cadena para representar el texto recortado.

8. Modelo de Caja Flexible

El Modelo de Caja Flexible, nos permitirá finalmente alejarnos de esos desagradables flotadores. Aunque se necesita un poco de trabajo para hacerte en tu cabeza con las nuevas propiedades, una vez que lo hagas, todo debería tener sentido.

Vamos a construir una rápida demo, y a crear un sencillo formato a dos columnas.

1
<div id="container">
2
3
 <div id="main"> Main content here </div>
4
 <aside> Aside content here </aside>
5
6
</div>

Ahora para el CSS: primero necesitamos dar instrucciones al contenedor para ser tratado como una caja. Además aplicaré una anchura y altura genérica, puesto que no tenemos ningún contenido real en juego.

1
 #container {
2
    width: 960px;
3
    height: 500px; /* just for demo */
4
5
    background: #e3e3e3;
6
    margin: auto;
7
8
    display: -moz-box;
9
    display: -webkit-box;
10
    display: box;

A continuación, vamos a aplicar, para la demo, colores de fondo únicos al #main div, y al aside.

1
#main { 
2
   background: yellow;
3
}   
4
5
aside {
6
   background: red;
7
}

En este punto, no hay mucho que ver.

Flexible Box ModelFlexible Box ModelFlexible Box Model

Una cosa que vale la pena notar, sin embargo, es que, cuando se establece para mostrar: modo de cuadro, los elementos secundarios ocuparán todo el espacio vertical; Este es el valor predeterminado de alineación de cuadro: estiramiento.

Observa lo que ocurre cuando establecemos específicamente una anchura en el área de contenido #main.

1
#main {
2
  background: yellow;
3
  width: 800px;
4
}
Flexbox Example 2Flexbox Example 2Flexbox Example 2

Bueno, eso está un poco mejor, pero todavía tenemos este problema donde el aside no está ocupando todo el espacio restante. Podemos arreglar esto usando la nueva propiedad box-flex.

box-flex da instrucciones al elemento para que ocupe todo el espacio disponible.

1
 aside { 
2
    display: block; /* cause is HTML5 element */
3
    background: red;
4
5
   /* take up all available space */
6
    -moz-box-flex: 1; 
7
    -webkit-box-flex: 1;
8
    box-flex: 1; 
9
 }

Con esta propiedad en su lugar, independientemente del ancho del área de contenido #main, el aside consumirá todas las especificaciones de espacio disponible. Incluso mejor, no tienes que preocuparte de los problemas de esos fastidiosos flotadores, como los elementos que caen por debajo del área de contenido principal.

Example 3 of Flexible Box ModelExample 3 of Flexible Box ModelExample 3 of Flexible Box Model

Ver Demo

Aquí sólo hemos rascado la superficie. Consulta el excelente artículo de Paul Irish para más información. Además, ten cuidado cuando uses este método, ya que no está totalmente admitido, por supuesto, en los navegadores antiguos. En esos casos, puedes usar detección de funcionalidades o Modernizr para detectar soporte, y proporcionar los fallbacks necesarios.

9. Resize

Sólo disponible, a partir de Firefox 4 y Safari 3, la propiedad resize -- parte del módulo CSS3 UI -- te permite especificar cómo redimensionar una zona de texto.

1
<textarea name="elem" id="elem" rows="5" cols="50"></textarea>

Observa que, por defecto, los navegadores webkit y Firefox 4 permiten a las zonas de texto ser redimensionadas, tanto vertical como horizontalmente.

1
textarea {
2
   -moz-resize: vertical;
3
   -webkit-resize: vertical;
4
   resize: vertical;
5
}

Valores Posibles

  • ambos: Redimensionar vertical y horizontalmente.
  • horizontal: Limita el redimensionado horizontalmente.
  • vertical: Limita el redimensionado verticalmente.
  • ninguno: Deshabilita el redimensionado
ResizeResizeResize

Ver Demo

10. Transición

Quizás la incorporación más excitante de CSS3 es la capacidad de aplicar animaciones a elementos, sin el uso de JavaScript.

Aunque parece que el condenado IE9 no admitirá transiciones CSS, eso sin duda no significa que no deberías usarlas. La clave es mejorar.

Vamos a imitar el efecto común, donde, una vez que coloques un enlace en una barra lateral, el texto se deslizará hacia la derecha siempre tan ligeramente.

El HTML

1
<ul>
2
   <li>
3
      <a href="#"> Hover Over Me </a>
4
   </li>
5
   <li>
6
      <a href="#"> Hover Over Me </a>
7
   </li>
8
   <li>
9
      <a href="#"> Hover Over Me </a>
10
   </li>
11
   <li>
12
      <a href="#"> Hover Over Me </a>
13
   </li>
14
</ul>

El CSS

1
 ul a {
2
    -webkit-transition: padding .4s; 
3
    -moz-transition: padding .4s;
4
    -o-transition: padding .4s;
5
    transition: padding .4s;
6
 }
7
8
 a:hover { 
9
    padding-left: 6px;  
10
 }

transición reconocerá tres parámetros:

  • La propiedad de transición (Establece este valor en todo si fuera necesario)
  • La duración
  • El tipo de flexibilización

La razón por la que no aplicamos directamente la transición al estado hover de la etiqueta de anclaje es porque, si lo hicieramos, la animación sólo tendría efecto al pasar el ratón por encima. Al quitar el ratón, el elemento volvería inmediatamente a su estado inical.

Ver Demo

Puesto que sólo hemos mejorado el efecto, no hemos hecho absolutamente ningún daño a los navegadores más antiguos.

Proyecto Final

Vamos a combinar la mayor parte de las técnicas que hemos aprendido en este artículo, y a crear un efecto nítido. Primero revisa el efecto final (se ve mejor en navegadores Webkit).

Paso 1. El Marcado

Lo haremos simple; Dentro de nuestro contenedor .box, vamos a añadir dos divs: uno para el tamaño frontal, y el otro para atrás.

1
<body>
2
3
   <div class="box">
4
      <div>Hello</div>
5
      <div> World </div>
6
   </div>
7
8
</body>

Paso 2. Centrado Horizontal y Verticalmente

A continuación, necesito que nuestra tarjeta esté perfectamente centrada en la pantalla. Para hacer eso, aprovecharemos el Modelo de Caja Flexible. Sólo asegúrate de, más tarde, usar Modernizr para proporcionar un fallback para IE.

Como nuestra página sólo contendra esta tarjeta, podemos usar eficazmente el elemento del cuerpo como nuestro envoltorio.

1
body, html { height: 100%; width: 100%; } 
2
3
body {
4
  display: -moz-box;
5
	display: -webkit-box;
6
	display: box;
7
	
8
	-moz-box-orient: horizontal; 
9
	-webkit-box-orient: horizontal;
10
	box-orient: horizontal;
11
	
12
	-moz-box-pack: center;
13
	-moz-box-align: center;
14
	
15
	-webkit-box-pack: center;
16
	-webkit-box-align: center;
17
	
18
	box-pack: center;
19
	box-align: center;
20
}
centered

Paso 3. Diseñar la Caja

Ahora diseñaremos nuestra "tarjeta".

1
 .box {
2
    background: #e3e3e3;
3
    border: 1px dashed #666;
4
    margin: auto;
5
    width: 400px;
6
    height: 200px;
7
    cursor: pointer;
8
    position: relative;
9
10
    -webkit-transition: all 1s;	
11
    -moz-transition: all 1s;
12
    transition: all 1s;	
13
 }

Observa que además hemos dado instrucciones a este elemento para que preste atención a cualquier cambio en el estado del elemento. Cuando sucedan, convertiremos los cambios (si es posible) en el transcurso de un segundo (transition: all 1s).

styling the boxstyling the boxstyling the box

Paso 4 Una sombra eficiente

A continuación, como aprendimos anteriormente en este artículo, aplicaremos una sombra genial utilizando la pseudo clase :: after.

1
 .box::after {
2
    content: '';
3
    position: absolute;
4
5
    width: 70%;
6
    height: 10px;
7
    bottom: 0;
8
    left: 15%;
9
10
    z-index: -1;
11
12
    -webkit-box-shadow: 0 9px 20px rgba(0,0,0,.4);
13
    -moz-box-shadow: 0 9px 20px rgba(0,0,0,.4);
14
    box-shadow: 0 9px 20px rgba(0,0,0,.4);
15
}
effective shadowseffective shadowseffective shadows

Paso 5. Diseñar los Divs Secundarios

En este momento, los divs secundarios están todavía justo encima de cada uno. Vamos a posicionarlos totalmente, y a darles instrucciones de que ocupen todo el espacio disponible.

1
 .box > div {
2
    background: #e3e3e3;
3
     
4
    position: absolute;
5
    width: 100%; height: 100%;
6
    top: 0; left: 0;
7
    
8
9
    font: 45px/200px bold helvetica, arial, sans-serif;
10
    text-align: center;
11
    
12
    -webkit-transition: all .5s ease-in-out;
13
    -moz-transition: all .5s ease-in-out;
14
    transition: all .5s ease-in-out;
15
 }
styling the children divsstyling the children divsstyling the children divs

Paso 6. Arreglar el "Frente"

Consulta la imagen de arriba; ¿te das cuenta de como la parte trasera de nuestra tarjeta se está mostrando por defecto? Esto se debe a que, debido al hecho de que el elemento se produce más bajo en el marcado, en consecuencia, recibe un índice-z más alto. Vamos a arreglar eso.

1
 /* Make sure we see the front side first */
2
 .box > div:first-child {
3
    position: relative;
4
    z-index: 2;
5
 }
fixing the front-sidefixing the front-sidefixing the front-side

Paso 7. Girar la Tarjeta

Ahora viene la parte divertida; Cuando volvemos sobre la tarjeta, debe dar la vuelta, y mostrar la "parte trasera" de la tarjeta (al menos la ilusión de la "parte trasera"). Para lograr este efecto, utilizamos transformaciones y la función rotateY.

1
 .box:hover {
2
    -webkit-transform: rotateY(180deg);
3
    -moz-transform: rotateY(180deg);
4
    transform: rotateY(180deg);   	   	
5
 }
rotating the cardrotating the cardrotating the card

Paso 8. Texto reflejado

¿No parece increíble? Pero, ahora, el texto parece estar reflejado. Esto, por supuesto, es porque transformamos el contenedor. Vamos a desplazar esto girando el div secundario 180º también.

1
/* Hide the front-side when hovered */
2
 .box:hover > div:first-child {
3
    opacity: 0;
4
 }
5
6
 .box:hover div:last-child {
7
    -webkit-transform: rotateY(180deg);
8
    -moz-transform: rotateY(180deg);
9
    transform: rotateY(180deg);
10
 }

¡Y con ese último fragmento de código, hemos logrado nuestro efecto nítido!

Final productFinal productFinal product

Revisa el efecto final (se ve mejor en navegadores Webkit)

Conclusión

¡Muchísimas gracias por leerlo y espero que aprendieras un poco!