Scroll to top

Spanish (Español) translation by Jorge Montoya (you can also view the original English article)

Claro, todos estamos familiarizados con los bordes. ¿Hay algo nuevo que pueda ser introducido? ¡Bueno, apuesto a que hay un par de cosas en este artículo acerca de las que usted aún no sabía!

No sólo CSS3 se puede utilizar para crear esquinas redondeadas, sino que el simple y común CSS también se puede forzar para la visualización de formas personalizadas. Es correcto, en el pasado, antes de que se descubrieran estas técnicas, podríamos haber recurrido a usar imágenes de fondo absolutamente posicionadas para mostrar círculos o flechas. Afortunadamente - mientras alegremente damos un paso más lejos de Photoshop - este ya no es el caso.


Las Bases

Es probable que esté familiarizado con el uso más básico de los bordes.

1
border: 1px solid black;

El código anterior aplicará un borde 1px a un elemento. Así de simple; pero también podemos modificar la sintaxis un poco.

1
border-width: thick;
2
border-style: solid;
3
border-color: black;

Además de pasar un valor específico a border-width, alternativamente pueden usarse tres palabras clave: thin, medium y thick.

imageimageimage

Si bien inicialmente puede parecer innecesario utilizar el método código-completo, hay un puñado de casos cuando esto tiene sus ventajas, como cuando necesita actualizar algún aspecto de un borde al ocurrir un evento designado.

Tal vez usted necesita para cambiar el color de un borde cuando el usuario pasa el cursor sobre un elemento específico. Utilizando la forma abreviada requeriría que repita los valores de píxeles.

1
.box {
2
    border: 1px solid red;   
3
}
4
5
.box:hover {
6
    border: 1px solid green;
7
}

Un enfoque más elegante y DRY sería actualizar específicamente la propiedad border-color.

1
.box {
2
    border: 1px solid red;   
3
}
4
5
.box:hover {
6
    border-color: green;
7
}

Adicionalmente, como veremos en breve, esta técnica no-abreviada es útil cuando se crean formas personalizadas con CSS.


Border-Radius

border-radius es el hijo dorado de CSS3 - la primera nueva propiedad que obtuvo un uso generalizado en la comunidad. Lo que quiere decir es que con exclusión de Internet Explorer 8 e inferiores, todos los navegadores pueden mostrar esquinas redondeadas.

Anteriormente, era necesario usar prefijos de proveedor tanto para Webkit como para Mozilla para que el estilo se aplicara correctamente.

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

En estos días sin embargo, podemos quitar los perfijos de proveedor sin preocupaciones y simplemente seguir con la forma oficial: border-radius.

image

Como es de esperar, también podemos especificar valores personalizados para cada lado de una caja.

imageimageimage
1
border-top-left-radius: 20px;
2
border-top-right-radius: 0;
3
border-bottom-right-radius: 30px;
4
border-bottom-left-radius: 0;

En el código anterior, establecer border-top-right-radius y border-bottom-left-radius a cero sería superfluo, a menos que el elemento esté heredando valores que necesiten ser reseteados.

De la misma manera que margin o padding, estos ajustes se pueden condensar en una sola propiedad si es necesario.

1
/* top left, top right, bottom right, bottom left */
2
border-radius: 20px 0 30px 0;

Como ejemplo (y como lo hacen los diseñadores web con tanta frecuencia), la forma de un limón se puede reproducir con CSS y la propiedad border-radius así:

1
.lemon {
2
   width: 200px; height: 200px; 
3
4
   background: #F5F240;
5
   border: 1px solid #F0D900;      
6
   border-radius: 10px 150px 30px 150px;
7
}
imageimageimage

Mas Allá de las Bases

Muchos diseñadores se adhieren felizmente al conocimientos expuesto hasta ahora en este capítulo; sin embargo ¡existen algunas maneras en que podemos potenciarlo aún más!


Bordes Múltiples

Existe una variedad de técnicas a las que podemos referirnos, cuando nos encargamos de aplicar múltiples bordes a un elemento.

Border-Style

Si bien solid, dashed y dotted son los valores más frecuentes para la propiedad border-style, también hay algunas otras de las que podemos hacer uso, incluyendo groove y ridge.

1
border: 20px groove #e3e3e3;

O con la forma no-abreviada:

1
border-color: #e3e3e3;
2
border-width: 20px;
3
border-style: groove;
imageimageimage

Mientras que esto es ciertamente de ayuda, un efecto ridge o groove no se refiere precisamente a bordes múltiples.

Contorno

La técnica más popular para crear dos bordes es aprovechar la propiedad outline.

1
.box {
2
   border: 5px solid #292929;
3
   outline: 5px solid #e3e3e3;
4
}
imageimageimage

Este método funciona maravillosamente, sin embargo está limitado a dos bordes. Si usted necesita crear un efecto de capa degradada, será necesario un enfoque diferente.

Pseudo Elementos

Cuando la técnica de outline no es suficiente, un enfoque alternativo es aprovechar los pseudo elementos :before y :after y aplicar los bordes adicionales necesarios al contenido generado.

1
.box {
2
  width: 200px; height: 200px;
3
  background: #e3e3e3;
4
  position: relative;
5
6
  border: 10px solid green;  
7
}
8
9
/* Create two boxes with the same width of the container */
10
.box:after, .box:before {
11
  content: '';
12
  position: absolute;
13
  top: 0; left: 0; bottom: 0; right: 0;
14
}
15
16
.box:after {
17
  border: 5px solid red;
18
  outline: 5px solid yellow;
19
}
20
21
.box:before {
22
  border: 10px solid blue;
23
}
imageimageimage

Este quizás no es el enfoque más elegante, pero sin duda hace el trabajo. Una desventaja es que es fácil confundir el orden en que se aplicarán los colores del borde. Un cierto nivel de "adivinar y comprobar" a menudo se requiere para aplicar la secuencia correcta.

Sombra de Caja

La manera que utilizan los chicos cool para crear un número infinito de bordes es aprovechar el parámetro spread en la propiedad CSS3 box-shadow.

1
.box {
2
    border: 5px solid red;
3
     box-shadow: 
4
       0 0 0 5px green, 
5
       0 0 0 10px yellow,
6
       0 0 0 15px orange;
7
}
imageimageimage

En este caso, estamos siendo inteligentes y estamos usando la box-shadow de una manera que no necesariamente pudo haber sido la intención original cuando la especificación se escribió.

Al establecer los componentes x, y y blur en 0, podemos usar el valor spread para crear bordes sólidos en las ubicaciones deseadas. Debido a que las box-shadows se pueden apilar mediante el uso de una coma, el número de niveles posibles es infinito.

Esta técnica degrada graciosamente muy bien. En los navegadores más antiguos, los cuales no reconocen la propiedad box-shadow, esto simplemente renderizará el único borde rojo de 5px.

Recuerde: los diseños no necesitan ser idénticos en todos los navegadores. Escriba su CSS para el más moderno de los navegadores, y luego proporcione respaldos adecuados de acuerdo a la situación.


Modificando Ángulos

Además de pasar un valor único a border-radius, podemos alternativamente proporcionar dos valores - separados por un / - para especificar valores únicos para los radios horizontal y vertical.

Por ejemplo…

1
border-radius: 50px / 100px; /* horizontal radius, vertical radius */

…es equivalente a:

1
border-top-left-radius: 50px 100px;
2
border-top-right-radius: 50px 100px;
3
border-bottom-right-radius: 50px 100px;
4
border-bottom-left-radius: 50px 100px;

Esta técnica es particularmente útil cuando se necesita imitar una curva sutil y larga, en vez de una esquina redondeada genérica. Por ejemplo, el siguiente código nos permite separarnos ligeramente de una forma cuadrada, resultando en efecto más curvado, similar al papel.

1
.box {
2
    width: 200px; height: 200px;
3
    background: #666;
4
5
    border-top-left-radius: 15em 1em;
6
    border-bottom-right-radius: 15em 1em;
7
8
}
imageimageimage

Formas CSS

Quizás el mejor uso de los bordes es cuando se aplican inteligentemente a los elementos que tienen un ancho y una altura cero. ¿Confuso verdad? Veamos una demostración.

Para todos los ejemplos a continuación, asuma el siguiente marcado...

1
<div class="box"></div>

...y el siguiente estilo base:

1
.box {
2
   width: 200px;
3
   height: 200px;
4
   background: black;
5
}

El ejemplo referenciado con más frecuencia, al demostrar cómo se pueden utilizar las formas CSS en un proyecto, consiste en crear la flecha obligatoria.

La clave para entender cómo se puede formar una flecha con CSS es establecer un border-color único a cada lado y, a continuación, reducir los valores de width y height del contenedor a 0.

Asumiendo un div con una clase de arrow como el contenedor:

1
.arrow {
2
  width: 0; height: 0;
3
4
  border-top: 100px solid red;
5
  border-right: 100px solid green;
6
  border-bottom: 100px solid blue;
7
  border-left: 100px solid yellow;  
8
}

Como se demostró al principio de este capítulo, una sintaxis más limpia sería el no usar la versión abreviada que abarca todo:

1
.arrow {
2
  width: 0; height: 0;
3
4
  border: 100px solid;  
5
  border-top-color: red;
6
  border-right-color: green;
7
  border-bottom-color: blue;
8
  border-left-color: yellow;
9
}

Incluso podemos reducir esto aún más, agrupando los valores de color.

1
.arrow {
2
  width: 0; height: 0;
3
4
  border: 100px solid;
5
  border-color: red green blue yellow;
6
}
imageimageimage

¿Interesante, verdad? Sin embargo, tiene mucho sentido si damos un paso atrás. Esa es la única forma posible en que los colores podrían alinearse, asumiendo una propiedad width y una propiedad height de cero para el contenedor. Ahora, ¿qué pasa si ponemos todos los colores de borde a transparente, excepto para el lado azul?

1
.arrow {
2
  width: 0; height: 0;
3
4
  border: 100px solid;
5
  border-bottom-color: blue;
6
}
imageimageimage

¡Excelente! Pero no parece demasiado semántico para crear un div de .arrow, todo con el propósito de agregar una flecha a la página. En su lugar, se pueden utilizar pseudo elementos para aplicar la flecha después o antes del elemento asociado.

Creand una Burbuja de Texto

Para crear una burbuja de texto de 100% CSS, comenzamos con el marcado.

1
<div class="speech-bubble">Hi there!</div>

A continuación, se debe aplicar un estilo base.

1
.speech-bubble {
2
    position: relative;
3
    background-color: #292929;
4
5
    width: 200px;
6
    height: 150px;
7
    line-height: 150px; /* vertically center */
8
9
    color: white;
10
    text-align: center;
11
}
imageimageimage

La flecha se aplicará con el pseudo elemento after.

1
.speech-bubble:after {
2
    content: '';    
3
}

Los pseudo elementos :before y :after se pueden utilizar para insertar el contenido generado bien sea antes o después del contenido de un elemento.

En este punto, es simplemente una cuestión de reproducir la flecha y posicionarla en la ubicación correcta. Empezaremos por posicionar absolutamente el contenido, restableciendo width y height y aplicando los colores de borde.

1
.speech-bubble:after {
2
  content: '';
3
  position: absolute;
4
5
  width: 0;
6
  height: 0;
7
8
  border: 10px solid;
9
  border-color: red green blue yellow;
10
}
imageimageimage

Debido a que sabemos que queremos que la flecha apunte hacia abajo, la imagen anterior demuestra que todos excepto el borde rojo (o superior) deben omitirse o establecerse en transparente.

1
.speech-bubble:after {
2
  content: '';
3
  position: absolute;
4
5
  width: 0;
6
  height: 0;
7
8
  border: 10px solid;
9
  border-top-color: red;
10
}
imageimageimage

Al crear formas CSS, como no podemos usar la propiedad width para especificar que tan ancha debería ser la flecha, debería entonces utilizarse la propiedad border-width. En este caso, la flecha debe ser ligeramente más grande; Por lo que border-width puede aumentarse a 15px. También colocaremos la flecha en la parte inferior y en el centro del contenedor, usando las propiedades top y left respectivamente.

1
.speech-bubble:after {
2
  content: '';
3
  position: absolute;
4
5
  width: 0;
6
  height: 0;
7
8
  border: 15px solid;
9
  border-top-color: red;
10
11
  top: 100%;
12
  left: 50%;
13
}
imageimageimage

Ya casi estamos allá; el paso final es actualizar el color de la flecha para que sea el mismo que el del fondo del contenedor. El posicionamiento también necesita ser modificado para tener en cuenta el ancho de los bordes (15px). Mientras estamos aquí, también aplicaremos un sutil border-radius para hacer que el contenedor sea más parecido a una burbuja.

1
.speech-bubble { 
2
   /* … other styles */
3
   border-radius: 10px;
4
}
5
6
.speech-bubble:after {
7
  content: '';
8
  position: absolute;
9
10
  width: 0;
11
  height: 0;
12
13
  border: 15px solid;
14
  border-top-color: #292929;
15
16
  top: 100%;
17
  left: 50%;
18
  margin-left: -15px; /* adjust for border width */
19
}
imageimageimage

¿Nada mal, verdad? Aparte este código para unas cuantas clases reutilizables, y ya está listo para todos los proyectos futuros.

1
/* 

2
   Speech Bubbles

3
   Usage: Apply a class of .speech-bubble and .speech-bubble-DIRECTION

4
   <div class="speech-bubble speech-bubble-top">Hi there</div>

5
*/
6
7
.speech-bubble {
8
  position: relative;
9
  background-color: #292929;
10
11
  width: 200px;
12
  height: 150px;
13
  line-height: 150px; /* vertically center */
14
15
  color: white;
16
  text-align: center;
17
  border-radius: 10px;
18
19
  font-family: sans-serif;
20
}
21
22
.speech-bubble:after {
23
  content: '';
24
  position: absolute;
25
26
  width: 0;
27
  height: 0;
28
29
  border: 15px solid;
30
}
31
32
33
/* Position the Arrow */
34
35
.speech-bubble-top:after {
36
  border-bottom-color: #292929;
37
38
  left: 50%;
39
  bottom: 100%;
40
  margin-left: -15px;   
41
}
42
.speech-bubble-right:after {
43
  border-left-color: #292929;
44
45
  left: 100%;
46
  top: 50%;
47
  margin-top: -15px;    
48
}
49
50
.speech-bubble-bottom:after {
51
  border-top-color: #292929;
52
53
  top: 100%;
54
  left: 50%;
55
  margin-left: -15px;   
56
}
57
58
.speech-bubble-left:after {
59
  border-right-color: #292929;
60
61
  top: 50%;
62
  right: 100%;
63
  margin-top: -15px;    
64
}
image

Bono: Mejor Centrado Vertical

Una desventaja al usar line-height para centrar verticalmente el texto es que usted está limitado a una sola línea. Si el texto requiere dos o más líneas, cada altura de línea será demasiado grande. Una solución inteligente es establecer un display de table para la burbuja de texto y un display de table-cell al párrafo que envuelve el texto. Esto nos permite alinear el texto al centro de manera consecuente.

1
<div class="speech-bubble speech-bubble-top">
2
    <p>Text goes here.</p>
3
</div>

A continuación, el CSS modificado.

1
.speech-bubble {
2
 /* other styles */
3
4
  display: table;
5
}
6
7
.speech-bubble p {
8
  display: table-cell;
9
  vertical-align: middle;
10
}
imageimageimage

Si las referencias a display: table traen de vuelta terribles recuerdos de diseños pasados de moda basados en tablas, no se preocupe. Estas propiedades se refieren simplemente al estilo en el que un elemento debe mostrarse.

No estamos limitados a triángulos; CSS es capaz de producir todo tipo de formas - ¡incluso corazones y signos de riesgo biológico!

imageimageimage
1
.biohazard {
2
  width: 0; height: 0;
3
4
  border: 60px solid;
5
  border-radius: 50%;
6
7
  border-top-color: black;
8
  border-bottom-color: black;
9
  border-left-color: yellow;
10
  border-right-color: yellow;
11
}

Resumen

Aunque es cierto que la simple sintaxis de propiedad border: 1px solid black nos hace recorrer un largo camino, si somos inteligentes, podemos crear una variedad de útiles efectos, íconos y formas. ¿Quién habría pensado que los bordes podrían ser tan poderosos? La clave es recordar que el estilo para formas comunes o burbujas de texto sólo se debe crear una vez y luego ser abstraído a clases utilitarias para su uso futuro.