03 Tutorial de CSS3 Desde Cero
03 Tutorial de CSS3 Desde Cero
Este documento está pensado para que pueda ser desarrollado por una persona que
conoce solo HTML. El objetivo es poder aprender CSS de forma sencilla viendo un
concepto teórico, luego algunos ejercicios resueltos y por último y lo más importante
efectuar una serie de ejercicios.
<!DOCTYPE html>
<html>
<head>
<title>Título de la página</title>
<meta charset="UTF-8">
</head>
<body>
<h1 style="color:#ff0000;background-color:#ffff00">
Este mensaje es de color rojo sobre fondo amarillo.
</h1>
</body>
</html>
Por defecto, todo navegador tiene un estilo definido para cada elemento HTML, lo
que hacemos con la propiedad style es redefinir el estilo por defecto. En este
problema definimos que el elemento h1 defina como color de texto el rojo y como
color de fondo el amarillo:
<h1 style="color:#ff0000;background-color:#ffff00">
Este mensaje es de color rojo sobre fondo amarillo.
</h1>
Veremos más adelante que hay muchas propiedades en CSS. En este primer
ejemplo inicializamos las propiedades color (define el color del texto) y background-
color (define el color de fondo del texto).
Cada vez que inicializamos una propiedad debemos separarla de la siguiente por
punto y coma.
Cuando definimos estilos directamente en el elemento HTML, tenemos que tener en
cuenta que el estilo se aplica únicamente a dicho elemento donde inicializamos la
propiedad style, es decir, si tenemos dos secciones h1, deberemos definir la
propiedad style para cada elemento:
<h1 style="color:#ff0000;background-color:#ffff00">
Primer título
</h1>
<h1 style="color:#ff0000;background-color:#ffff00">
Segundo título
</h1>
Como podemos observar, más allá que los dos estilos son exactamente iguales,
estamos obligados a definirlos para cada elemento HTML.
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<style>
h1 {color:#ff0000;background-color:#ffff00}
</style>
</head>
<body>
<h1>Primer título</h1>
<h1>Segundo título</h1>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<style>
h1 {color:#ff0000}
h2 {color:#00ff00}
h3 {color:#0000ff}
</style>
</head>
<body>
<h1>rojo</h1>
<h2>verde</h2>
<h3>azul</h3>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<style>
h1 {
font-family:times new roman;
font-size:30px;
font-style:italic;
font-weight:bold;
}
h2 {
font-family:verdana;
font-size:20px;
}
</style>
</head>
<body>
<h1>Titulo de nivel 1</h1>
<h2>Titulo de nivel 2</h2>
</body>
</html>
Como podemos observar, hemos definido dos reglas de estilos para los elementos
h1 y h2, eso significa que el navegador utilizará esas reglas de fuentes para todas
las partes de la página que se utilicen dichos elementos HTML.
La primera regla definida para el elemento h1 es:
h1 {
font-family:times new roman;
font-size:30px;
font-style:italic;
font-weight:bold;
}
Recordemos que para definir la regla de estilo debemos indicar el nombre del
elemento HTML a la que definiremos el estilo (en este caso h1) y luego, entre llaves,
todas las propiedades y sus valores separados por punto y coma.
La primera propiedad inicializada es font-family, algunas de las fuentes más
comunes que puede acceder el navegador son:
Arial, Arial Black, Arial Narrow, Courier New, Georgia, Impact, Tahoma, Times New
Roman, Verdana, etc.
En caso que la fuente no esté disponible el navegador selecciona el estilo por
defecto para ese elemento HTML.
Podemos definir varias fuentes por si acaso alguna no se encuentra disponible para
el navegador, esto lo hacemos separando por coma todas las fuentes (se eligen de
izquierda a derecha):
font-family: verdana, arial, georgia;
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<style>
h1,h2,h3 {
font-family:verdana;
color:#0000ff;
}
</style>
</head>
<body>
<h1>Título de nivel 1</h1>
<h2>Título de nivel 2</h2>
<h3>Título de nivel 3</h3>
</body>
</html>
Es decir, separamos por coma todos los elementos a los que se aplicará la misma
regla de estilo:
h1,h2,h3 {
font-family:verdana;
color:#0000ff;
}
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<style>
h1,h2,h3,h4,h5,h6 {
font-family:Verdana;
}
h1 {
font-size:40px;
}
h2 {
font-size:30px;
}
h3 {
font-size:25px;
}
h4 {
font-size:20px;
}
h5 {
font-size:15px;
}
h6 {
font-size:10px;
}
</style>
</head>
<body>
<h1>Título de nivel 1</h1>
<h2>Título de nivel 2</h2>
<h3>Título de nivel 3</h3>
<h4>Título de nivel 4</h4>
<h5>Título de nivel 5</h5>
<h6>Título de nivel 6</h6>
</body>
</html>
“color” nos permite definir el color del texto, lo podemos indicar por medio de tres
valores hexadecimales que indican la mezcla de rojo, verde y azul. Por ejemplo si
queremos rojo puro debemos indicar:
color:#ff0000;
Si queremos verde puro:
color:#00ff00
Si queremos azul puro:
color:#0000ff
Luego si queremos amarillo debemos mezclar el rojo y el verde:
color:#ffff00
Hay muchos programas que nos permiten seleccionar un color y nos descomponen
dicho valor en las proporciones de rojo, verde y azul.
Otra forma de indicar el color, si tenemos los valores en decimal, es por medio de la
siguiente sintaxis:
color:rgb(255,0,0);
Es decir, por medio de la función rgb(red,green,blue), indicamos la cantidad de
rojo, verde y azul en formato decimal.
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<style>
h1 {
color:#ff0000;
text-align:left;
text-decoration:underline;
}
h2 {
color:#dd0000;
text-align:center;
text-decoration:underline;
}
h3 {
color:#aa0000;
text-align:right;
text-decoration:underline;
}
</style>
</head>
<body>
<h1>Título de nivel 1.<h1>
<h2>Título de nivel 2.<h2>
<h3>Título de nivel 3.<h3>
</body>
</html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<style>
body {
color:#0000ff;
font-family:verdana;
}
</style>
</head>
<body>
<h1>Este es un título de nivel 1 y con el elemento 'em' la palabra:
<em>Hola</em></h1>
<p>Todo este párrafo debe ser de color azul ya que lo hereda del
elemento body.</p>
</body>
</html>
em {
color:#008800;
}
p {
color:#999999;
}
</style>
</head>
<body>
</body>
<h1>Este es un título de nivel 1 y con el elemento 'em' la palabra:
<em>Hola</em></h1>
<p>Todo este párrafo debe ser de color gris ya que lo redefine la
marca p y no lo hereda de la marca body.</p>
</html>
Ahora hemos definido tres reglas, la primera igual que el problema anterior, define la
propiedad color en azul y la fuente de tipo verdana para el elemento body:
body {
color:#0000ff;
font-family:verdana;
}
La segunda regla define la propiedad color en verde para el elemento em, con esto
no heredará el color azul del elemento body (que es el elemento padre):
em {
color:#008800;
}
Algo similar hacemos con el elemento p para indicar que sea de color gris:
p {
color:#999999;
}
Pero podemos ver que todos los elementos heredan la fuente verdana ya que
ninguna lo sobrescribe.
10. Definición de un estilo en función del contexto
Otro recurso que provee las hojas de estilo en cascada (CSS) es la definición de un
estilo para un elemento HTML siempre y cuando la misma esté contenida por otro
elemento determinado. Sólo en ese caso el estilo para dicho elemento se activará.
Supongamos que queremos que cuando disponemos un texto encerrado por el
elemento strong dentro de un párrafo el color del mismo sea verde. Pero si el
elemento strong está contenida por el elemento h1 el color debe ser rojo, luego la
sintaxis del problema es:
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<style>
p strong{
color:#0000ff;
}
h1 strong{
color:#ff0000;
}
</style>
</head>
<body>
<h1>Aquí tenemos un título de nivel uno, luego un bloque con
el elemento strong debe aparecer <strong>así</strong></h1>
<p>
Luego si escribimos un párrafo y encerramos un bloque con el
elemento strong
debe aparecer <strong>así</strong>
</p>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<style>
div h1 em {
color:#ff0000;
}
</style>
</head>
<body>
<div>
<h1>Este es un titulo de nivel 1 dentro de un <em>div</em></h1>
</div>
<h1>Este es un titulo de nivel 1 fuera de un <em>div</em></h1>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<h1>Definición de hojas de estilo en un archivo externo.</h1>
<p>
Hasta ahora hemos visto la definición de estilos a nivel de elemento
HTML
y la definición de estilos a nivel de página. Dijimos que la primera
forma es muy poco recomendable y la segunda es utilizada cuando
queremos definir estilos que serán empleados solo por esa página.
Ahora veremos que la metodología más empleada es la definición
de una hoja de estilo en un archivo separado que deberá tener la
extensión
css.
</p>
</body>
</html>
body {
background-color:#eafadd;
}
h1 {
color:#0000cc;
font-family:times new roman;
font-size:25px;
text-align:center;
text-decoration:underline;
}
p {
color:#555555;
font-family:verdana;
text-align:justify;
}
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<h1 class="resaltado">Titulo de nivel 1</h1>
<p>
Este párrafo muestra el resultado de aplicar la clase .resaltado en
la última
<span class="resaltado">palabra.</span>
</p>
</body>
</html>
body {
background-
color:#eeeeee;
}
.resaltado{
color:#000000;
background-color:#ffff00;
font-style:italic;
}
La sintaxis para definir una clase aplicable a cualquier elemento HTML es:
.resaltado{
color:#000000;
background-color:#ffff00;
font-style:italic;
}
Es decir, la inicializamos con el carácter punto y seguidamente un nombre de clase.
Dentro definimos las reglas de estilo como hemos venido trabajando normalmente.
El nombre de la clase no puede comenzar con un número.
Luego, para indicar que un elemento sea afectado por esta regla:
<h1 class="resaltado">Titulo de nivel 1</h1>
Es decir, agregamos la propiedad class y le asignamos el nombre de la clase (sin el
punto).
Podemos inicializar tantos elementos HTML con esta regla como necesitemos:
<p>
Este parrafo muestra el resultado de aplicar la clase. resaltado en
la última <span class="resaltado">palabra.</span>
</p>
Aquí definimos la propiedad class al elemento span y le asignamos la misma clase
aplicada anteriormente al elemento h1.
13. Definición de estilos por medio de id
La diferencia fundamental en la definición de un estilo por medio de id con respecto
a las clases, es que sólo podremos aplicar dicho estilo a un solo elemento HTML
dentro de la página, ya que todos los id que se definen en una página HTML deben
tener nombres distintos.
La sintaxis para definir un estilo por medio de id es:
#cabecera {
font-family:Times New Roman;
font-size:30px;
text-align:center;
color:#0000ff;
background-color:#bbbbbb;
}
Es decir, utilizamos el carácter numeral (#) para indicar que se trata de un estilo de
tipo id.
Luego, sólo un elemento HTML dentro de una página puede definir un estilo de este
tipo:
<div id="cabecera">
Hay que subrayar que sólo un elemento HTML puede definir la propiedad id con el
valor de cabecera.
Los dos archivos completos del ejemplo entonces quedan (pagina.html):
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div id="cabecera">
<h1>Título de la cabecera</h1>
</div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<p class="pregunta">¿Quién descubrió América
y en que año fue?</p>
<p class="respuesta">Colón en 1492</p>
</body>
</html>
.pregunta {
background-
color:#ffff00;
border-width:1px;
border-style:solid;
border-color:#000000;
}
.respuesta {
border-width:1px;
border-style:dashed;
border-color:#000000;
}
Como podemos ver, hemos definido dos clases ".pregunta" que inicializa el color de
fondo en amarillo y luego define el ancho del borde en un pixel, el estilo es sólido y
el color de la línea de borde es negro.
Luego recordar que para indicar que un elemento tenga este estilo debemos
inicializar la propiedad class del elemento HTML respectivo:
<p class="pregunta">Quién descubrió América y en que año fue?</p> Al
segundo estilo definido lo hemos hecho con la clase ".respuesta"
.respuesta {
border-width:1px;
border-style:dashed;
border-color:#000000;
}
En ésta hemos cambiado el estilo de borde por el valor dashed.
Disponemos de los siguientes estilos de borde:
none, hidden, dotted, dashed, solid, double, groove, ridge, inset, y outset.
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<h1 class="titulopagina">Tutorial de CSS desde cero</h1>
</body>
</html>
y el archivo de estilos:
.titulopagina {
background-color:#ffffcc;
text-align:center;
font-family:verdana;
font-size:40px;
border-top-width:1px;
border-right-width:3px;
border-bottom-width:3px;
border-left-width:1px;
border-top-style:dotted;
border-right-style:solid;
border-bottom-style:solid;
border-left-style:dotted;
border-top-color:#ffaa00;
border-right-color:#ff0000;
border-bottom-color:#ff0000;
border-left-color:#ffaa00;
}
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<pre class="codigofuente">
public class Rectangulo{
//atributos
int alto;
int ancho;
boolean relleno;
//métodos
public int devolverArea(){
return alto*ancho;
}
public void rellenar(boolean r){
relleno=r;
}
public void cambiarTamano(int an, int al){
ancho=an;
alto=al;
}
public Rectangulo() {// constructor
alto=20;
ancho=10;
relleno=false;
}
}//fin clase Rectangulo
</pre>
</body>
</html>
.codigofuente {
font-size:12px;
background-color:#ffffcc;
border-width:1px;
border-style:dotted;
border-color:#ffaa00;
padding:20px;
}
La hoja de estilo:
p {
background-color:#ffffaa;
margin:0px;
border-width:1px;
border-style:solid;
border-color:#ff0000;
}
Hay que tener en cuenta que cuando dos elementos HTML uno debajo del otro hay
especificado márgenes el resultado final del margen inferior de uno y el superior de
otro no se suman. Por ejemplo si un elemento tiene margen inferior de 10 y el
elemento que se encuentra debajo de este tiene margen de 20px luego el margen
total entre estos dos elementos es de 20px (es el mayor de los dos márgenes y no
30px que es la suma)
Pruebe modificar el valor para la propiedad margin y vea el resultado de la página.
El modelo final de caja se puede resumir con esta imagen:
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<ul class="vacio">
<li>Brasil</li>
<li>Uruguay</li>
<li>Argentina</li>
</ul>
<ul class="circulorelleno">
<li>Brasil</li>
<li>Uruguay</li>
<li>Argentina</li>
</ul>
<ul class="circulovacio">
<li>Brasil</li>
<li>Uruguay</li>
<li>Argentina</li>
</ul>
<ul class="cuadrado">
<li>Brasil</li>
<li>Uruguay</li>
<li>Argentina</li>
</ul>
<ul class="decimal">
<li>Brasil</li>
<li>Uruguay</li>
<li>Argentina</li>
</ul>
<ul class="romanominuscula">
<li>Brasil</li>
<li>Uruguay</li>
<li>Argentina</li>
</ul>
<ul class="romanomayuscula">
<li>Brasil</li>
<li>Uruguay</li>
<li>Argentina</li>
</ul>
<ul class="letrasminusculas">
<li>Brasil</li>
<li>Uruguay</li>
<li>Argentina</li>
</ul>
<ul class="letrasmayusculas">
<li>Brasil</li>
<li>Uruguay</li>
<li>Argentina</li>
</ul>
</body>
</html>
.vacio{
list-style-type:none;
}
.circulorelleno{
list-style-type:disc;
}
.decimal{
list-style-type:decimal;
}
.romanominuscula{
list-style-type:lower-roman;
}
.romanomayuscula{
list-style-type:upper-roman;
}
.circulovacio{
list-style-type:circle;
}
.cuadrado{
list-style-type:square;
}
.letrasminusculas{
list-style-type:lower-alpha;
}
.letrasmayusculas{
list-style-type:upper-alpha;
}
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
</body>
</html>
body {
background-image:url(fondo.jpg);
}
La única propiedad que hemos inicializado es background-image indicando el
nombre del archivo de imagen a mostrar.
La imagen se repite en 𝑿 e 𝒀 hasta llenar la página por completo, ya que por defecto
background-repeat está inicializada con el valor repeat, podemos probar a
modificar el estilo primero con:
body {
background-image:url(fondo.jpg);
background-repeat:repeat-x;
}
Luego con:
body {
background-image:url(fondo.jpg);
background-repeat:repeat-y;
}
Y por último:
body {
background-image:url(fondo.jpg);
background-repeat:no-repeat;
}
Tener en cuenta que podemos aplicar una imagen a otros elementos de HTML (h1,
h2, h3, p, etc.)
Con la última propiedad background-position podemos indicar la posición de la
imagen según los siguientes valores:
top left, top center, top right, center left, center center, center right, bottom left,
bottom center, bottom right, x-% y-% y x-pos y-pos.
Para que tenga sentido esta propiedad debemos inicializar la propiedad
background-repeat con el valor no-repeat.
Por ejemplo:
body {
background-image:url(fondo.jpg);
background-repeat:no-repeat;
background-position:20% 50%;
}
Dispone la imagen 20% avanzando desde la izquierda y 50% avanzando desde
arriba.
La siguiente regla:
body {
background-image:url(fondo.jpg);
background-repeat:no-repeat;
background-position:400px 10px;
}
Dispone la imagen 400 pixeles desde la derecha y 10 píxeles desde arriba.
La regla:
body {
background-image:url(fondo.jpg);
background-repeat:no-repeat;
background-position:top right;
}
Dispone la imagen en la parte superior a la derecha.
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<h1>Título de nivel 1</h1>
<h2>Título de nivel 2</h2>
<p>Esto esta dentro de un párrafo</p>
</body>
</html>
Esto significa que todos los elementos se imprimen de color azul con cero píxeles de
margin y padding, salvo que otra regla lo cambie, Imaginemos si definimos
h1 { color:#ff0000} significa que tiene prioridad esta regla.
En realidad, en forma tácita lo hemos estado utilizando, cuando definimos una clase
sin indicar el tipo de elemento HTML donde actuará:
.pregunta {
background-color:#ffff00;
border-width:1px;
border-style:solid;
border-color:#000000;
}
Podemos expresar la regla anterior perfectamente como:
*.pregunta {
background-color:#ffff00;
border-width:1px;
border-style:solid;
border-color:#000000;
}
Es decir que podemos asignar esta regla a cualquier elemento HTML.
Esto nos permite comprender, cuando definimos una regla que sólo se puede utilizar
en un sólo tipo de elemento HTML:
p.pregunta {
background-color:#ffff00;
border-width:1px;
border-style:solid;
border-color:#000000;
}
Esta regla sólo se puede utilizar dentro de elementos de tipo párrafo.
21. Pseudoclases
Las pseudoclases son unas clases especiales, que se refieren a algunos estados del
elemento HTML, las que se utilizan fundamentalmente son las que se aplican al
elemento <a> (enlace).
La sintaxis varía con respecto al concepto de clase visto anteriormente ya que se
tratan de pseudoclases predefinidas:
a:pseudoclase {
propiedad: valor;
}
Es decir, separamos el nombre del elemento HTML con dos puntos.
Para el elemento HTML <a> tenemos cuatro pseudoclases fundamentales:
- link. Enlace sin ingresar.
- visited. Enlace presionado.
- hover. Enlace que tiene la flecha del mouse encima.
- active. Es la que tiene foco en ese momento (prueba a tocar la tecla tab)
Es importante hacer notar que el orden en que definimos las pseudoclases es
fundamental para su funcionamiento (debe respetarse el orden: link-visited-hover-
active)
Este ejemplo es muy sencillo para ver el paso en los distintos estados que puede
tener un enlace:
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset=”UTF-8”>
<link rel=”StyleSheet” href=”estilos.css” type=”text/css”>
</head>
<body>
<a href=”http://www.google.com”>Google</a>
<a href=”http://www.yahoo.com”>Yahoo</a>
<a href=”http://www.bing.com”>Bing</a>
</body>
</html>
a:link{
background-color:#00ff00;
color:#ff0000;
}
a:visited{
background-color:#000000;
color:#ffffff;
}
a:hover{
background-color:#ff00ff;
color:#fffff;
}
a:active{
background-color:#ff0000;
color:#ffff00;
}
Apenas ejecutes la página los tres enlaces deben aparecer de color rojo con fondo
verde:
a:link{
background-color:#00ff00;
color:#ff0000;
}
Si presionamos la tecla tab podremos ver que el enlace que tiene foco aparece de
color amarillo con fondo rojo:
a:active{
background-color:#ff0000;
color:#ffff00;
}
Si pasamos la flecha del mouse sobre algún enlace veremos que aparece de color
blanco con fondo lila:
a:hover{
background-color:#ff00ff;
color:#fffff;
}
Por último todos los enlaces que hayamos hecho clic deberán aparecer de color
blanco con fondo negro:
a:visited{
background-color:#000000;
color:#ffffff;
}
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<a href="http://www.google.com">Google</a>
<a href="http://www.yahoo.com">Yahoo</a>
<a href="http://www.bing.com">Bing</a>
</body>
</html>
La hoja de estilo es:
a:link {
text-decoration: none;
}
a:visited {
text-decoration: none;
}
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div id="menu">
<p><a href="http://www.google.com">Google</a></p>
<p><a href="http://www.yahoo.com">Yahoo</a></p>
<p><a href="http://www.bing.com">Bing</a></p>
<p><a href="http://www.ask.com">ASK</a></p>
</div>
</body>
</html>
#menu p {
margin:0px;
padding:0px;
}
#menu a {
display: block;
padding: 3px;
width: 160px;
background-color: #f7f8e8;
border-bottom: 1px solid #eeeeee;
text-align:center;
}
#menu a:hover {
background-color: #336699;
color: #ffffff;
}
Podemos decir que definimos un estilo por medio de un Id llamado “menu”. La regla
para este Id:
#menu {
font-family: Arial;
}
La segunda regla aparece el concepto de selectores descendientes (ocurre cuando
un elemento HTML se encuentra contenido en otro) en este caso se seleccionan
todos los párrafos que se encuentren dentro del div que define el id #menu (con esto
logramos que si hay otros párrafos en el documento HTML no se le apliquen esta
regla):
#menu p {
margin:0px;
padding:0px;
}
Estamos indicando que todos los párrafos contenidos en #menu deben tener cero en
margin y padding.
Luego las anclas "a" dentro de #menu definen las siguientes propiedades (si hay
otros enlaces dentro de la página no se le aplica este estilo ya que solo se aplican a
las "a" que descienden de #menu):
#menu a {
display: block;
padding: 3px;
width: 160px;
background-color: #f7f8e8;
border-bottom: 1px solid #eeeeee;
text-align:center;
}
El valor block para la propiedad display permite que el ancla ocupe todo el espacio
del párrafo, indistintamente del largo del hipervínculo.
Otra propiedad nueva es width, esta fija el tamaño máximo que puede tener el
hipervínculo antes de provocar un salto de línea.
Por último inicializamos las pseudoclases:
#menu a:link, #menu a:visited {
color: #ff0000;
text-decoration: none;
}
#menu a:hover {
background-color: #336699;
color: #ffffff;
}
Estamos definiendo el mismo color de texto para los vínculos seleccionados como
aquellos que no han sido seleccionados:
#menu a:link, #menu a:visited {
color: #ff0000;
Por último cambiamos el color de fondo de la opción cuando se tiene la flecha del
mouse encima:
#menu a:hover {
background-color: #336699;
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<ul id="menuhorizontal">
<li><a href="http://www.google.com">Google</a></li>
<li><a href="http://www.yahoo.com">Yahoo</a></li>
<li><a href="http://www.bing.com">Bing</a></li>
<li><a href="http://www.ask.com">Ask</a></li>
</ul>
</body>
</html>
#menuhorizontal {
margin:0;
padding:0;
list-style-type:none;
}
#menuhorizontal a {
width:100px;
text-decoration:none;
text-align:center;
color:#ff0000;
background-color:#f7f8e8;
padding:3px 5px;
border-right:1px solid blue;
display:block;
}
#menuhorizontal li {
float:left;
}
#menuhorizontal a:hover {
background-color:#336699;
}
Inicializamos el margin y padding con cero y el estilo de la lista con none para que
no aparezcan los círculos de cada ítem:
#menuhorizontal {
margin:0;
padding:0;
list-style-type:none;
}
En los enlaces del menú inicializamos la propiedad display con el valor block para
que el enlace tenga efecto en todo el rectángulo:
#menuhorizontal a {
width:100px;
text-decoration:none;
text-align:center;
color:#ff0000;
background-color:#f7f8e8;
padding:3px 5px;
border-right:1px solid blue;
display:block;
}
Para que los enlaces aparezcan uno al lado de otro inicializamos la propiedad float
con el valor left:
#menuhorizontal li {
float:left;
}
Finalmente la pseudoclase para indicar el color de fondo del enlace cuando la flecha
del mouse pasa por encima es:
#menuhorizontal a:hover {
background-color:#336699;
}
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div id="cabecera">
Blog del Programador
</div>
</body>
</html>
#cabecera {
width:100%;
height:100px;
background-color:#ffee00;
color:#0000aa;
text-align:center;
font-family:Times New Roman;
font-size:50px;
font-weight:bold;
}
La propiedad width la inicializamos con el valor 100%, lo que significa que ocupará
todo el ancho de la página (podemos inicializarlo en pixeles si lo necesitamos).
Luego a la propiedad height la inicializamos en 100 píxeles.
El resto de propiedades son las ya vistas en conceptos anteriores.
Es decir que las propiedades width y height nos permiten dar una dimensión al
elemento HTML ya sea con valores absolutos indicados en pixeles o relativos
indicados por porcentajes.
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<h1>Título nivel 1</h1>
<h2>Título nivel 2</h2>
<h3>Título nivel 3</h3>
<h4>Título nivel 4</h4>
<h5>Título nivel 5</h5>
<h6>Título nivel 6</h6>
</body>
</html>
html {
font-size: 10px;
}
h1 {
font-size: 2.5rem;
}
h2 {
font-size: 2rem;
}
h3 {
font-size: 1.75rem;
}
h4 {
font-size: 1.5rem;
}
h5 {
font-size: 1.25rem;
}
h6 {
font-size: 1.05rem;
}
Para entender las medidas de los elementos h1, h2, h3 etc. debemos hacer la
siguiente operación, como el elemento "html" tiene una medida de 10px luego el
elemento "h1" se calcula multiplicando 10px por 2.5 (es decir que los elementos h1
tienen una medida de 25px)
La medida definida en el elemento raíz que es "html" afecta a todos los elementos
que utilizan la medida "rem".
Probemos a modificar la medida font-size del elemento "html" por el valor 20px y
veremos que se ha afectado a todos los elementos que utilizan "rem".
Podemos, después borrar la regla que definimos para el elemento "html":
html {
font-size: 20px;
}
En dicho caso el navegador define un valor por defecto para la propiedad font-size.
Utilizando la función rgb pasando como parámetro la cantidad de rojo, verde y azul
en formato decimal (un valor entre 0 y 255).
También con la función rgb podemos indicar un porcentaje entre 0% y 100% para
cada componente:
background-color:rgb(100%,0%,0%)
Por último en algunas situaciones podemos utilizar una sintaxis reducida para ciertos
valores:
background-color:#ffaaff;
Es decir, si cada valor hexadecimal está formado por el mismo carácter o número
podemos utilizar esta sintaxis simplificada indicando un carácter o número
solamente. Es decir, a este color no lo podemos representar con la sintaxis indicada:
background-color:#ffaafa
Ya que los últimos dos caracteres, fa, son distintos.
Confeccionemos una página y creemos distintas clases utilizando distintos formatos
de asignación de color:
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<p class="fondo1">Primer párrafo</p>
<p class="fondo2">Segundo párrafo</p>
<p class="fondo3">Tercer párrafo</p>
</body>
</html>
El archivo de estilos.css
.fondo1 {
background-color:rgb(255,0,0);
}
.fondo2 {
background-color:rgb(100%,50%,50%);
}
.fondo3 {
background-color:#fab;
}
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<p>Este texto tiene por mostrar las anclas con un cursor distinto al que
está definido por defecto:</p>
<a href="http://www.google.com">google.com</a><br>
<a href="http://www.yahoo.com">yahoo.com</a><br>
<a href="http://www.bing.com">bing.com</a>
</body>
</html>
a{
cursor:help;
}
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div id="contenedorform">
<form method="post" action="#">
<label>Ingrese nombre:</label>
<input type="text" name="nombre" size="30">
<br>
<label>Ingrese mail:</label>
<input type="text" name="mail" size="45">
<br>
<label>Comentarios:</label>
<textarea name="comentarios" cols="30" rows="5"></textarea>
<br>
<input class="botonsubmit" type="submit" value="confirmar">
</form>
</div>
</body>
</html>
#contenedorform {
width:500px;
margin-left:20px;
margin-top:10px;
background-color:#ffe;
border:1px solid #CCC;
padding:10px 0 10px 0;
}
Si le asignamos el valor collapse une las líneas de los border de las celdas (con esto
queda en muchas situaciones mejor estéticamente).
Veamos con un ejemplo como podemos afectar una tabla HTML con CSS.
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<table>
<caption>
cantidad de lluvia caida en mm.
</caption>
<thead>
<tr>
<th>Provincia</th><th>Enero</th><th>Febrero</th><th>Marzo</th>
</tr>
</thead>
<tbody>
<tr>
<th>Córdoba</th>
<td>210</td><td>170</td><td>120</td>
</tr>
<tr>
<th>Málaga</th>
<td>250</td><td>190</td><td>140</td>
</tr>
<tr>
<th>Sevilla</th>
<td>175</td><td>140</td><td>120</td>
</tr>
</tbody>
</table>
</body>
</html>
caption
{
font-family:arial;
font-size:15px;
text-align: center;
margin: 0px;
font-weight: bold;
padding:10px;
}
table
{
border-collapse: collapse;
}
th
{
border-right: 1px solid #fff;
border-bottom: 1px solid #fff;
padding: 0.5em;
background-color:#6495ed;;
}
thead th
{
background-color:
#6495ed;
color: #fff;
}
tbody th
{
font-family:arial;
font-weight: normal;
background-color: #6495ed;
color:#ff0;
}
td {
border: 1px solid #000;
padding: .5em;
background-color:#ed8f63;
width:100px;
text-align:center;
El elemento caption dentro de una tabla es el título que debe aparecer arriba.
Como vimos la propiedad border-collapse puede tomar dos valores: collapse o
separate. Separate deja las celdas con unos pixeles de separación, no así collapse.
El resto es la definición de una serie de reglas para los elementos th, th dentro del
elemento tbody, th dentro del elemento thead y por último td.
28. Posicionamiento
28.1. Posicionamiento relativo, position: relative
La propiedad position determina el punto de referencia donde se debe localizar cada
elemento HTML. Por defecto esta propiedad se inicializa con el valor static.
Con el valor por defecto static, cada elemento HTML se localiza de izquierda a
derecha y de arriba hacia abajo.
El segundo valor posible para esta propiedad es relative. En caso de fijar la
propiedad position con el valor relative, podemos modificar la posición por defecto
del elemento HTML modificando los valores left y top (con valores positivos o
inclusive negativos)
El posicionamiento relativo mueve un elemento (div, h1, p etc.) en relación a donde
se dispondría en el flujo normal. Es decir, deja espacio libre.
Veamos un ejemplo con tres div, de los cuales el segundo lo desplazamos 20
pixeles a nivel de columna y 5 pixeles a nivel de fila:
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div id="caja1">
<p>Esta es la primer caja.</p>
<p>No se desplaza.</p>
</div>
<div id="caja2">
<p>Esta es la segunda caja.</p>
<p>Se desplaza 15 píxeles a la derecha y 5 hacia abajo de su
posición
por defecto.</p>
</div>
<div id="caja3">
<p>Esta es la tercer caja.</p>
<p>No se desplaza.</p>
</div>
</body>
</html>
#caja1,#caja2,#caja3 {
background-color:#f99;
font-family:verdana;
font-size:1.3rem;
}
#caja2 {
position:relative;
left:15px;
top:5px;
}
Repasemos un poquito,
recordemos que cuando un conjunto de elementos tiene los mismos valores para
una serie de propiedades los podemos agrupar separándolos por coma, esto sucede
para los tres Id #caja1, #caja2 y #caja3 que tienen los mismos valores para las
propiedades background-color, font-family y font-size:
#caja1,#caja2,#caja3 {
background-color:#f99;
font-family:verdana;
font-size:1.3rem;
}
Luego como debemos inicializar la propiedad position sólo para el Id #caja2 lo
hacemos en forma separada:
#caja2 {
position:relative;
left:15px;
top:5px;
}
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div id="caja1">
<p>Esta es la primera caja.</p>
<p>No se desplaza.</p>
</div>
<div id="caja2">
<p>Esta es la segunda caja.</p>
<p>Se desplaza a la coordenada de pantalla 40 en columna y 30 en
fila (en
píxeles).</p>
</div>
<div id="caja3">
<p>Esta es la tercera caja.</p>
<p>No se desplaza.</p>
</div>
</body>
</html>
La hoja de estilo definida:
#caja1,#caja3 {
background-color:#f99;
font-family:verdana;
font-size:1.3rem;
}
#caja2 {
background-color:#ff0;
font-size:1.3rem;
position:absolute;
left:40px;
top:30px;
}
Como vemos inicializamos la propiedad position con el valor absolute y fijamos como
coordenada para la caja la columna 40 y la fila 30 (en píxeles).
Ahora veamos que pasa si disponemos una serie de elementos con posición
absoluta y se superponen. En esta situación debemos inicializar la propiedad z-
index con un valor entero, el mismo indica cual tiene prioridad para visualizarse. El
valor más grande indica cual tiene prioridad para visualizarse. Es decir que el
navegador imprime los elementos con posición absoluta del valor más bajo al más
alto.
Por ejemplo, si queremos mostrar tres div de color rojo, verde y azul con posiciones
absolutas e indicando coordenadas que se superpongan. Inicializar la propiedad z-
index de cada elemento de tal manera que quede más al frente el div de color verde,
luego el azul y finalmente el rojo.
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div id="caja1">
<p>Esta es la primera caja.</p>
</div>
<div id="caja2">
<p>Esta es la segunda caja.</p>
</div>
<div id="caja3">
<p>Esta es la tercera caja.</p>
</div>
</body>
</html>
#caja1{
position:absolute;
background-color:red;
left:10px;
top:10px;
width:200px;
height:200px;
z-index:1;
}
#caja2{
position:absolute;
background-color:green;
left:50px;
top:50px;
width:200px;
height:200px;
z-index:3;
}
#caja3{
position:absolute;
background-color:blue;
left:30px;
top:30px;
width:200px;
height:200px;
z-index:2;
}
Hemos definido los tres div con la propiedad position con el valor absolute. Luego
vemos que aquel que tiene color verde (green) le asignamos a la propiedad z-index
un valor 3 (el número puede ser cualquiera siempre y cuando sea el mayor de los z-
index asignado a los otros dos div).
Por ejemplo, si se pide disponer dos div con posicionamiento fijo, uno en la parte
superior y otro a la izquierda de la ventana.
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div id="barrasuperior">
Div superior
</div>
<div id="barralateral">
Div lateral
</div>
<div id="contenido">
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
Aquí el contenido - Aquí el contenido -
</div>
</body>
</html>
La hoja de estilo a aplicar a esta página es:
* {
margin:0;
padding:0;
}
#barrasuperior{
position:fixed;
left:0px;
width:100%;
height:50px;
background-color:black;
color:white;
}
#barralateral{
position:fixed;
left:0px;
top:50px;
width:200px;
height:100%;
background-color:#eee;
}
#contenido{
padding-top:70px;
padding-left:220px;
}
Hemos definido tanto para la barra superior como para la barra lateral el valor fixed
para la propiedad position: position:fixed;
La barra superior comienza en la columna cero a nivel de píxeles y tiene un ancho
de 100 por ciento (es decir ocupa siempre todo el ancho del navegador y una altura
de 50px):
left:0px;
width:100%;
height:50px;
La barra lateral definimos los siguientes valores:
left:0px;
top:50px;
width:200px;
height:100%;
Hay que tener en cuenta que el elemento HTML con la propiedad fixed sale del flujo
normal de los elementos de la página (igual como ocurre con el valor absolute),
luego por eso definimos para el Div de contenido un padding para la parte superior e
izquierdo donde se encuentran los div fixed:
padding-top:70px;
padding-left:220px;
28.5. Disposición de 2 columnas (position: absolute)
Empezaremos a ver como componer una página sin utilizar las tablas HTML (un
medio muy utilizado hasta hace muy poco, ya que es ampliamente soportado por
navegadores antiguos).
Una solución para crear una página con dos columnas es utilizar el posicionamiento
absoluto:
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div id="columna1">
Aquí va el contenido de la columna 1. Aquí va el contenido
de la columna 1. Aquí va el contenido de la columna 1.
Aquí va el contenido de la columna 1. Aquí va el contenido de
la columna 1.
...
Aquí va el contenido de la columna 1. Aquí va el contenido de
la columna 1.
</div>
<div id="columna2">
Aquí va el contenido de la columna 2. Aquí va el contenido de la
columna 2.
Aquí va el contenido de la columna 2. Aquí va el contenido de la
columna 2.
...
Aquí va el contenido de la columna 2. Aquí va el contenido de la
columna 2.
</div>
</body>
</html>
* {
margin:0;
padding:0;
}
#columna1 {
position:absolute;
top:0px;
left:0px;
width:200px;
margin-top:10px;
background-
color:#ffff55;
}
#columna2 {
margin-left:220px;
margin-right:20px;
margin-top:10px;
background-color:#ffffbb;
}
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
<link
</head>
<body>
<img src="imagen1.png">
<p>
El texto envuelve a la imagen.El texto envuelve a la imagen
El texto envuelve a la imagen.El texto envuelve a la imagen
El texto envuelve a la imagen.El texto envuelve a la imagen
El texto envuelve a la imagen.El texto envuelve a la imagen
El texto envuelve a la imagen.El texto envuelve a la imagen
El texto envuelve a la imagen.El texto envuelve a la imagen
El texto envuelve a la imagen.El texto envuelve a la imagen
El texto envuelve a la imagen.El texto envuelve a la imagen
El texto envuelve a la imagen.El texto envuelve a la imagen
El texto envuelve a la imagen.El texto envuelve a la imagen
El texto envuelve a la imagen.El texto envuelve a la imagen
El texto envuelve a la imagen.El texto envuelve a la imagen
El texto envuelve a la imagen.El texto envuelve a la imagen
El texto envuelve a la imagen.El texto envuelve a la imagen
El texto envuelve a la imagen.El texto envuelve a la imagen
El texto envuelve a la imagen.El texto envuelve a la imagen
El texto envuelve a la imagen.El texto envuelve a la imagen
</p>
</body>
</html>
La hoja de estilo:
img {
float:right;
}
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css"
type="text/css">
</head>
<body>
</body>
</html>
.letra {
float:left;
font-size:3rem;
}
Definimos la clase letra e inicializamos la propiedad float con el valor left y definimos
el tamaño de fuente con 3 rem (es decir tres veces más grande que el valor de la
fuente definida en el elemento raíz "html".
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div id="caja1">
<p>caja1 caja1 caja1 caja1 caja1 caja1 caja1 caja1 caja1 caja1
caja1 caja1 caja1 caja1 caja1 caja1 caja1 caja1 caja1 caja1
caja1 caja1 caja1 caja1 caja1 caja1 caja1 caja1 caja1 caja1
...
caja1 caja1 caja1 caja1 caja1 caja1 caja1 caja1 caja1 caja1
</p>
</div>
<div id="caja2">
<p>
caja2 caja2 caja2 caja2 caja2 caja2 caja2 caja2 caja2 caja2
caja2 caja2 caja2 caja2 caja2 caja2 caja2 caja2 caja2 caja2
...
caja2 caja2 caja2 caja2 caja2 caja2 caja2 caja2 caja2 caja2
</p>
</div>
<div id="caja3">
<p>
caja3 caja3 caja3 caja3 caja3 caja3 caja3 caja3 caja3 caja3
...
caja3 caja3 caja3 caja3 caja3 caja3 caja3 caja3 caja3 caja3
</p>
</div>
<div id="caja4">
<p>
caja4 caja4 caja4 caja4 caja4 caja4 caja4 caja4 caja4 caja4
...
caja4 caja4 caja4 caja4 caja4 caja4 caja4 caja4 caja4 caja4
</p>
</div>
</body>
</html>
#caja1 {
float:left;
width:250px;
background-color:#ffc;
margin:10px;
}
#caja2 {
float:left;
width:250px;
background-color:#ffc;
margin:10px;
}
#caja3 {
float:left;
width:250px;
background-color:#ffc;
margin:10px;
}
#caja4 {
float:left;
width:250px;
background-color:#ffc;
margin:10px;
}
Como vemos cuando el div debe disponerse más abajo busca el primer espacio libre
de derecha a izquierda.
Supongamos que queremos mostrarlo lo más a la izquierda posible, es decir que
comience una nueva fila en pantalla. Para ello cuando definimos el estilo para la
caja4 aparece la propiedad clear:
#caja4 {
float:left;
clear:left;
width:250px;
background-color:#ffc;
margin:10px;
}
Con este cambio ahora el resultado en pantalla es el siguiente:
31. Disposición
31.1. Disposición de 2 columnas (propiedad float)
Una segunda forma de implementar una página con dos columnas es utilizar la
propiedad float. Disponemos dos div. Al primero lo flotamos hacia la izquierda con un
width fijo y el segundo se acomoda inmediatamente a la derecha.
#columna1 {
float:left;
width:200px;
}
#columna2 {
margin-left:210px;
}
La columna1 tiene un ancho de 200 pixeles. Luego para evitar que la columna dos
envuelva a la columna uno en caso de ser más larga inicializamos margin-left con
200 pixeles.
Veamos un ejemplo:
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div id="columna1">
Aquí el contenido de la columna 1.
...
Aquí el contenido de la columna 1.
</div>
<div id="columna2">
Aquí el contenido de la columna 2.
...
Aquí el contenido de la columna 2.
</div>
</body>
</html>
La hoja de estilo:
* {
margin:0;
padding:0;
}
#columna1 {
float:left;
width:200px;
background-color:#ff5;
border:1px solid #555;
}
#columna2 {
margin-left:210px;
background-color:#ffb;
border:1px solid #555;
}
Hay que tener cuidado con este formato de página ya que no es "responsive" o
adaptativo. No importa el ancho en píxeles del dispositivo siempre estarán visibles
las dos columnas.
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div id="contenedor">
<div id="cabecera">
<h1>Aquí el título de la página</h1>
</div>
<div id="columna1">
<p>columna1. columna1. columna1.</p>
</div>
<div id="columna2">
<h2>Título de la columna</h2>
<p>Contenido de la columna2. </p>
</div>
<div id="pie">
Pie de página.
</div>
</div>
</body>
</html>
* {
margin:0;
padding:0;
}
#contenedor
{
width:100%;
border:1px solid #000;
line-height:130%;
background-color:#f2f2f2;
}
#cabecera
{
padding:10px;
color:#fff;
background-color:#becdfe;
clear:left;
}
#columna1
{
float:left;
width:200px;
margin:0;
padding:1rem;
}
#columna2
{
margin-left:210px;
border-left:1px solid #aaa;
padding:1rem;
}
#pie {
padding:10px;
color:#fff;
background-color:#becdfe;
clear:left;
}
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div id="cabecera">
<ul>
<li><a href="">Opcion 1</a></li>
<li><a href="">Opcion 2</a></li>
<li><a href="">Opcion 3</a></li>
</ul>
</div>
<div class="columna1">
<p>
columna1 columna1 columna1 columna1 columna1 columna1
...
columna1 columna1 columna1 columna1 columna1 columna1
</p>
</div>
<div class="columna2">
<p>
columna2 columna2 columna2 columna2 columna2 columna2
...
columna2 columna2 columna2 columna2 columna2 columna2
</p>
</div>
<div class="columna3">
<p>
columna3 columna3 columna3 columna3 columna3 columna3
...
columna3 columna3 columna3 columna3 columna3 columna3
</p>
</div>
<div id="pie">
<p>Copyright</p>
</div>
</body>
* {
margin:0;
padding:0;
}
body {
width: 960px;
margin: 0 auto;
}
#cabecera{
background-color: #eee;
padding: 10px;
margin: 10px;
}
#pie {
background-color: #eee;
padding: 10px;
margin: 10px;
clear:both;
}
li {
display: inline;
padding: 5px;
}
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div id="cabecera">
<ul>
<li><a href="">Opcion 1</a></li>
<li><a href="">Opcion 2</a></li>
<li><a href="">Opcion 3</a></li>
</ul>
</div>
<div class="columna1">
<p>
columna1 columna1 columna1 columna1 columna1 columna1
...
columna1 columna1 columna1 columna1 columna1 columna1
</p>
</div>
<div class="columna2">
<p>
columna2 columna2 columna2 columna2 columna2 columna2
...
columna2 columna2 columna2 columna2 columna2 columna2
</p>
</div>
<div class="columna3">
<p>
columna3 columna3 columna3 columna3 columna3 columna3
...
columna3 columna3 columna3 columna3 columna3 columna3
</p>
</div>
<div id="pie">
<p>Copyright</p>
</div>
</body>
* {
margin:0;
padding:0;
}
body {
width: 90%;
margin: 0 auto;
}
#cabecera{
background-color: #eee;
padding: 10px;
margin: 10px;
}
#pie {
background-color: #eee;
padding: 10px;
margin: 10px;
clear:both;
}
li {
display: inline;
padding: 5px;
}
33. Selectores
33.1. Selector de hijos
Los selectores nos permiten aplicar estilos a un elemento o conjunto de elementos
de una página web. Repasemos un poco los selectores vistos hasta este momento:
h1.principal {
font-family:Arial;
}
Se aplica el tipo de fuente Arial a todos los elementos h1 que tienen definida la clase
"principal"
h1#titulo1 {
font-family:Arial;
}
Se aplica el tipo de fuente Arial al elemento h1 que tiene definida la propiedad id con
el valor "titulo1".
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<h1>Esto es una <em>prueba</em>.</h1>
<ul>
<li>Opción 1 (es la más <em>fácil</em>)</li>
<li>Opción 2 (es de dificultad <em>media<em>)</li>
<li>Opción 2 (muy <em>compleja</em>)</li>
</ul>
</body>
</html>
El archivo .css:
li em{
color:#f00;
}
En este ejemplo las palabra fácil, media y compleja aparecen de color rojo. Esto
debido que están encerradas entre las marcas "em" y están contenidas en un "ul".
Por otro lado la palabra "prueba" no aparece de color rojo ya aunque está encerrada
con el elemento "em" dicho elemento no está contenido en una lista no ordenada
"ul".
Ahora sí, veamos para aplicar "Selector de hijos". La sintaxis es similar a los
selectores descendientes con la diferencia de que remplazamos el espacio en
blanco por el carácter >
h1>em {
color:#0f0;
}
Aquí solo se aplica el color #0f0 si em es un elemento hijo directo de h1.
Para ver esto más detenidamente, se propone como ejemplo plantear una página
que contenga en un div dos párrafos y una lista desordenada. Dentro de la lista
definir tres ítems con un párrafo cada uno. Luego definir un selector para que pinte
de color azul solo los párrafos que dependen directamente del div.
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div>
<p>Primer párrafo</p>
<p>Segundo párrafo</p>
<ul>
<li><p>opcion 1</p></li>
<li><p>opcion 2</p></li>
<li><p>opcion 3</p></li>
</ul>
</div>
</body>
</html>
div>p{
color:#00f;
}
Los dos párrafos: "Primer párrafo" y "Segundo párrafo" aparecen de color azul ya
que son hijos directos del elemento HTML div, en cambio los tres párrafos
contenidos en la lista no se les aplica el estilo definido ya que no son hijos directos
del div.
33.2. Selector de hermano adyacente y hermano general
El "selector de hermano adyacente" permite seleccionar un elemento HTML que
viene inmediatamente después de otro elemento HTML. Los dos elementos deben
tener el mismo elemento padre. Por ejemplo:
<body>
<h1>Titulo 1</h1>
<p>Esto es el primer párrafo.</p>
<p>Esto es el segundo párrafo.</p>
<p>Esto es el tercer párrafo.</p>
</body>
Mediante la regla de estilo:
h1+p{
color:#f00;
}
Seleccionamos el primer párrafo que le sigue al elemento h1. Luego el primer
párrafo se pinta de rojo.
Si aplicamos este otro estilo al mismo bloque HTML:
p+p{
color:#f00;
}
Se pintan de rojo el segundo y tercer párrafo ya que a cada uno de estos párrafos le
antecede otro párrafo (no se pinta el primer párrafo porque no le antecede un párrafo
sino un "h1")
Ahora el "selector de hermano general" permite seleccionar todos los hermanos a
diferencia del selector de hermano adyacente que selecciona el primero.
Si tenemos el siguiente fragmento:
<body>
<h1>Titulo 1</h1>
<p>Esto es el primer párrafo.</p>
<p>Esto es el segundo párrafo.</p>
<p>Esto es el tercer párrafo.</p>
</body>
Y le aplicamos la regla:
h1~p{
color:#f00;
}
Como resultado se aplica el color rojo a todos los párrafos adyacentes que tienen
como hermano el elemento "h1".
Una página completa que muestra el empleo de estos dos selectores:
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<h1>Titulo 1</h1>
<p>Esto es el primer párrafo.</p>
<p>Esto es el segundo párrafo.</p>
<p>Esto es el tercer párrafo.</p>
<h2>Titulo 2</h2>
<p>Esto es el primer párrafo.</p>
<p>Esto es el segundo párrafo.</p>
<p>Esto es el tercer párrafo.</p>
</body>
</body>
</html>
h1+p{
color:#f00;
}
h2~p{
color:#f00;
}
Recordemos que un elemento HTML está normalmente constituido por una marca
de comienzo, un valor, la marca de cierre y sus atributos:
En este ejemplo el elemento "a" tiene definido dos atributos: href y target.
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<h1>Enlaces a buscadores.</h1>
<ol>
<li>
<a href="http://www.google.com">Ir a google</a>
</li>
<li>
<a href="http://www.bing.com">Ir a bing</a>
</li>
<li>
<a href="http://www.yahoo.com" target="_blank">Ir a yahoo</a>
</li>
</ol>
</body>
</html>
a[target]{
color:#f00;
}
Esta regla se aplica a todos los elementos de tipo "a" que tienen definida la
propiedad llamada "target". Es decir, el tercer enlace de la página aparece de color
rojo ya que tiene definida dicha propiedad. Los dos primeros enlaces no se le aplica
esta regla de CSS porque no tienen definida la propiedad target.
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<h1>Enlaces a buscadores.</h1>
<ol>
<li>
<a href="http://www.google.com">Ir a google</a>
</li>
<li>
<a href="#">Ir a bing</a>
</li>
<li>
<a href="#" target="_blank">Ir a yahoo</a>
</li>
</ol>
</body>
</html>
a[href="#"]{
text-decoration:line-through;
}
Como podemos ver entre los corchetes no solo hacemos referencia al nombre de la
propiedad, sino que disponemos el carácter = y la cadena con la que estamos
comparando el contenido del atributo.
En nuestro ejemplo tenemos dos enlaces que tienen almacenados en la propiedad
href la cadena "#" por lo que dichos enlaces, al cumplir la regla del selector se aplica
a text-decoration el valor line-trough.
3. Podemos también controlar si el valor de la propiedad comienza, finaliza o tiene
en su interior una determinada cadena de caracteres. Veamos la sintaxis con un
ejemplo:
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<h1>Enlaces a buscadores.</h1>
<ol>
<li>
<a href="http://www.google.com">Ir a google</a>
</li>
<li>
<a href="www.bing.com.ar">Ir a bing</a>
</li>
<li>
<a href="www.yahoo.com">Ir a yahoo</a>
</li>
</ol>
</body>
</html>
a[href^="http"] {
color:#f00;
}
a[href$=".ar"] {
color:#0f0;
}
a[href*="yahoo"] {
color:#00f;
}
Hay que tener en cuenta que utilizamos la sintaxis ^= para controlar si el atributo
comienza con la cadena que le indicamos entre comillas (es decir el primer enlace
cumple la regla ya que la propiedad href comienza con esos cuatro caracteres):
a[href^="http"] {
color:#f00;
}
La sintaxis $= sirve para controlar si el valor del atributo finaliza con la cadena de
caracteres indicada (el segundo enlace cumple esta regla de estilo):
a[href$=".ar"] {
color:#0f0;
}
Por último, con la sintaxis *= controlamos si el atributo contiene en alguna parte la
cadena indicada (en nuestro ejemplo el tercer enlace contiene en su interior la
cadena "yahoo"):
a[href*="yahoo"] {
color:#00f;
}
34. Pseudo-clases
34.1. Pseudo-clases: first-child y last-child
En los próximos conceptos veremos otras formas de seleccionar elementos HTML
de una página para aplicarle estilos.
La pseudoclase fist-child nos permite seleccionar el primer elemento hijo de otro
elemento padre y de manera similar la pseudoclase last-child selecciona el último
elemento hijo.
Para confeccionar una página web en la que se pide disponer una lista ordenada de
4 elementos, fijar con color verde el primer elemento y color rojo el último elemento
de la lista.
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<ol>
<li>Primer opción.</li>
<li>Segunda opción.</li>
<li>Tercer opción.</li>
<li>Cuarta opción.</li>
</ol>
</body>
</html>
ol li:first-child {
color:green;
}
ol li:last-child {
color:red;
}
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<table>
<tr>
<td>fila 1</td><td>fila 1</td>
</tr>
<tr>
<td>fila 2</td><td>fila 2</td>
</tr>
<tr>
<td>fila 3</td><td>fila 3</td>
</tr>
<tr>
<td>fila 4</td><td>fila 4</td>
</tr>
</table>
</body>
</html>
tr:nth-child(odd) {
background-color:red;
}
tr:nth-child(even) {
background-color:green;
}
table {
border-collapse: collapse;
width:80%;
margin:0 auto;
}
td {
border: 1px solid #000;
text-align:center;
padding:0.5rem;
}
- Pseudo-clase: nth-last-child:
El objetivo de esta pseudo-clase es igual a nth-child pero invierte el orden de los
elementos HTML, es decir el primero es el último, el segundo es el anteúltimo y así
sucesivamente.
Veamos con un ejemplo su funcionamiento, imprimamos de color rojo la última fila
de una tabla, luego las dos anteriores dejarlas sin cambios, pintar la anterior a estas
dos de rojo y así sucesivamente hasta el comienzo de la tabla.
Como podemos observar en este problema no sabemos cuantas filas tiene la tabla y
queremos que siempre la última sea roja indistintamente la cantidad de filas de la
misma. La pseudo-clase nth-child no nos sirve pero si tiene sentido nth-last-child:
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<table>
<tr>
<td>fila 1</td><td>fila 1</td>
</tr>
<tr>
<td>fila 2</td><td>fila 2</td>
</tr>
<tr>
<td>fila 3</td><td>fila 3</td>
</tr>
<tr>
<td>fila 4</td><td>fila 4</td>
</tr>
<tr>
<td>fila 5</td><td>fila 5</td>
</tr>
<tr>
<td>fila 6</td><td>fila 6</td>
</tr>
<tr>
<td>fila 7</td><td>fila 7</td>
</tr>
<tr>
<td>fila 8</td><td>fila 8</td>
</tr>
</table>
</body>
</html>
tr:nth-last-child(3n+1) {
background-color:red;
}
table {
border-collapse:
collapse;
width:80%;
margin:0 auto;
}
td {
border: 1px solid #000;
text-align:center;
padding:0.5rem;
}
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div id="contenido">
<h1>Título</h1>
<p>Párrafo 1</p>
<p>Párrafo 2</p>
<p>Párrafo 3</p>
</div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<h1>Fecha de inicio.</h1>
<ul id="fechainicio">
<li>10/10/2023</li>
</ul>
<h1>Fechas finales.</h1>
<ul id="fechafin">
<li>10/12/2023</li>
<li>24/12/2023</li>
</ul>
<div id="equipo1">
<h1>Participantes</h1>
<p>Pablo Picasso.</p>
</div>
<div id="equipo2">
<h1>Participantes</h1>
<p>Ana De Armas.</p>
<p>Pedro Duque.</p>
</div>
</body>
</html>
#fechainicio li:only-child {
color:blue;
}
#fechafin li:only-child {
color:blue;
}
#equipo1 p:only-of-type {
color:red;
}
#equipo2 p:only-of-type {
color:red;
}
La pseudo-clase empty permite definir una regla css a un elemento html que no
tenga elementos hijos y tampoco texto.
Por ejemplo:
<p></p>
Para probar esta pseudo-clase confeccionaremos una página que muestre un
rectángulo amarillo cuando el div esté vacío. En caso que el div contenga datos no
se mostrará el rectángulo amarillo.
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div></div>
<p>Esto es una prueba de la pseudo-clase empty.</p>
</body>
</html>
div:empty {
width:80%;
margin:0 auto;
height:50px;
background-color:yellow;
}
Este estilo se aplica a todos los div vacíos de la página. Tenemos como resultado:
Si probamos agregar algún elemento HTML o texto dentro del div vemos que no
cumple la regla de estilo y tenemos como resultado que no aparece el rectángulo
amarillo:
Hay que tener cuidado con los elementos HTML que parecen vacíos como por
ejemplo:
<div>
</div>
Parece vacío el div pero en realidad tiene el salto de línea (estamos en presencia de
texto en el div y por lo tanto no se verifica la regla empty)
Para que se aplique la regla de estilo con la pseudo-clase empty el div debe estar
escrito en el archivo HTML:
<div></div>
35. Pseudo-elementos
35.1. Pseudo-elementos: first-letter y first-line
Los pseudo-elementos a diferencia de las pseudo-clases afectan a parte de un
elemento HTML y no al elemento completo.
Los primeros dos pseudo-elementos que veremos son first-letter y first-line.
El pseudo-elemento first-letter permite seleccionar la primera letra del contenido de
un elemento HTML y aplicarle un estilo. Veamos por ejemplo si queremos que la
primera letra de un párrafo aparezca con un tamaño de fuente mayor y otro color:
<p>Esto es la prueba del pseudo-elemento first-letter.</p>
Definimos:
p::first-letter {
font-size:1.5rem;
color:red;
}
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<p>El pseudo-elemento first-line permite aplicar
un estilo a la primera línea del contenido de un
elemento HTML. Tengamos en cuenta que la cantidad
de datos a mostrar en la primera línea depende del
ancho de la ventana del navegador.</p>
</body>
</html>
p::first-line {
text-decoration:underline;
}
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<p>SQL, Structure Query Language (Lenguaje de Consulta
Estructurado) es un lenguaje de programacion para
trabajar con base de datos relacionales como
<strong>MySQL</strong>, Oracle, etc.</p>
<p><strong>MySQL</strong> es un interpretador
de SQL, es un servidor de base de datos.</p>
strong::before {
content:"¡";
}
strong::after {
content:"!";
}
Podemos agregar cualquier contenido pero no elementos HTML (h1, h2, p, table
etc.).
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div class="container">
<h1>Título</h1>
<p>Datos del contenedor</p>
</div>
</body>
</html>
.container {
width:100%;
margin:0 auto;
height:200px;
background-color:#eee;
}
Una media query se define con la palabra clave "media" antecedida por el carácter
@. Luego entre paréntesis indicamos la condición que debe cumplir una propiedad
de la hoja de estilos. En caso que se verifique verdadero el valor de la propiedad se
ejecuta todo el bloque encerrado entre las llaves:
@media (min-width: 576px) {
.container {
max-width: 540px;
background-color:#ddd;
}
}
Por ejemplo, si abrimos el navegador y lo redimensionamos a una medida inferior a
576 píxeles aparece algo similar a esto:
Acotaciones
Podemos definir un media query para un determinado dispositivo, por ejemplo para
una impresora:
@media print and (min-width:1000px) {
...
}
Cuando no disponemos el medio por defecto es para todos, el ejercicio anterior
podíamos haberlo codificado como:
@media all and (min-width: 576px) {
.container {
max-width: 540px;
background-color:#ddd;
}
}
Es decir que si el media query se aplica a todos los medios podemos obviar la parte
"all and".
Si analizamos el código fuente del framework Bootstrap veremos que hace un uso
muy importante de los media queries para implementar el concepto de las páginas
adaptables.
37. Flexbox
Flexbox nos permite implementar interfaces de usuario y maquetación de páginas
web en forma más sencilla de como las veníamos haciendo del 2000 al 2014.
La mayoría de los navegadores ya implementan la funcionalidad de Flexbox o en
castellano "Cajas flexibles".
Si queremos conocer su especificación técnica podemos hacerla en el sitio del World
Wide Web Consortium (W3C), de todos modos no es un buen lugar para aprender
de su funcionamiento.
Gran cantidad de diseñadores están empleando la funcionalidad de Flexbox y las
nuevas versiones de framework de CSS como Bootstrap 4 también lo incorporan
para su funcionamiento.
Flexbox nos facilita la maquetación del sitio web y todos sus componentes. También
facilita la adaptación de la página a distintos tamaños de pantalla
Un Flexbox o caja flexible consiste en un elemento contenedor y en su interior una
serie de ítems:
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div id="contenedor1">
<div>"Lorem ipsum dolor sit amet, consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est laborum."</div>
<div>"Lorem ipsum dolor sit amet, consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
pariatur."</div>
<div>"Lorem ipsum dolor sit amet, consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est laborum."</div>
</div>
</body>
</html>
#contenedor1 {
display: flex;
background-color:
#ddd;
}
#contenedor1 div {
border:1px solid
black;
padding:1rem;
}
Cuando la propiedad flow-direction almacena el valor "row" los ítems se ubican uno
al lado del otro es decir en forma horizontal y se respetan el orden de los ítems
(valor por defecto):
Tenemos la posibilidad que los ítems se muestren al revés, es decir el último sea
primero, el ante anteúltimo sea segundo y así sucesivamente:
Podemos probar que sucede visualmente con cada uno de estos cuatro valores de
la propiedad flex-direction mediante este programa en Javascript :
El espacio en negro pertenece al contenedor pero las cajas flexibles no lo requieren
debido a su poco contenido. Si agregamos en alguna de las cajas más contenido
veremos que el espacio en negro disminuye o inclusive desaparece.
La página y su hoja de estilo para obtener dicho resultado es:
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div id="contenedor1">
<div id="item1">Caja 1</div>
<div id="item2">Caja 2</div>
<div id="item3">Caja 3</div>
</div>
</body>
</html>
#contenedor1{
display: flex;
flex-direction: column;
background-color: #000;
height: 300px;
color:white;
font-size:2rem;
}
#item1 {
background-color: #0078A6;
}
#item2 {
background-color: #0084B6;
}
#item3 {
background-color: #008CC1;
}
Si queremos que la caja flexible sea vertical es necesario asignar a la propiedad flex-
direction el valor "column". Cuando es horizontal no es necesario asignar el valor
"row" ya que es el valor por defecto que se inicia la propiedad.
Como vemos en el ejemplo superior tenemos 7 cajas y las mismas si bien tienen un
ancho de 100 píxeles, Flexbox se encarga de darles otro ancho para que sigan
entrando en la misma fila debido a que la propiedad "flex-wrap" almacena "nowrap".
Probemos de modificar la propiedad "flex-wrap" con el valor "wrap" y podremos
comprobar que cuando no entran más ítems en una línea continúan en la siguiente.
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div id="contenedor1">
<div class="item">Caja 1</div>
<div class="item">Caja 2</div>
<div class="item">Caja 3</div>
<div class="item">Caja 4</div>
<div class="item">Caja 5</div>
<div class="item">Caja 6</div>
<div class="item">Caja 7</div>
</div>
</body>
</html>
#contenedor1{
display: flex;
flex-flow: row wrap;
background-color:
#000;
height: 400px;
color:white;
font-size:2rem;
}
.item {
background-color: #0078A6;
width:150px;
height:150px;
}
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div id="contenedor1">
<div id="item1">Caja 1</div>
<div id="item2">Caja 2</div>
<div id="item3">Caja 3</div>
</div>
</body>
</html>
#contenedor1{
display: flex;
background-color: #000;
height: 300px;
color:white;
font-size:2rem;
}
#item1 {
background-color: #0078A6;
}
#item2 {
flex-grow: 1;
background-color: #0084B6;
}
#item3 {
background-color: #008CC1;
}
Ahora vamos a definir, como ejemplo, un Flexbox con tres ítems. Hacer que el
segundo ítem no pueda encogerse empleando la propiedad "flex-shrink".
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div id="contenedor1">
<div id="item1">Caja 1<br>Esto es una prueba de la propiedad
flex-shrink</div>
<div id="item2">Caja 2<br>Esto es una prueba de la propiedad
flex-shrink</div>
<div id="item3">Caja 3<br>Esto es una prueba de la propiedad
flex-shrink</div>
</div>
</body>
</html>
#contenedor1{
display: flex;
background-color: #000;
height: 300px;
color:white;
font-size:2rem;
}
#item1 {
background-color: #0078A6;
}
#item2 {
flex-shrink: 0;
background-color: #0084B6;
}
#item3 {
background-color: #008CC1;
}
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div id="contenedor1">
<div id="item1">Caja 1</div>
<div id="item2">Caja 2</div>
<div id="item3">Caja 3</div>
</div>
</body>
</html>
#contenedor1{
display: flex;
background-color: #000;
height: 300px;
color:white;
font-size:2rem;
}
#item1 {
flex-basis: 20%;
background-color: #0078A6;
}
#item2 {
flex-basis: 60%;
background-color: #0084B6;
}
#item3 {
flex-basis: 20%;
background-color: #008CC1;
}
37.10. Flexbox - (flex aplicada a los ítems)
La propiedad flex es el formato resumido de las propiedades "flex-grow", "flex-shrink"
y "flex-basis".
El orden de valores en caso que indiquemos los tres debe ser:
flex: valor del flex-grow valor del flex-shrink valor del flex-
basis;
Ejemplos:
flex: 1 0 60%;
Estamos cargando un 1 en la propiedad flex-grow, un 0 en la propiedad flex-shrink y
un 60% en flex-basis.
Probar distintos valores y ver como responden las cajas flexibles:
Hay posibilidades de inicializar la propiedad flex con menos de tres valores y que los
otros queden con valores por defecto:
flex: 1 2; /* flex-basis queda con su valor por defecto */
flex: 1 20%; /* flex-shrink queda con su valor por defecto */
flex: none; /* se almacenan los valores 0 0 auto*/
flex: auto; /* Especificamos los valores por defecto de cada propiedad */
Ahora, un ejemplo: Definir un Flexbox con tres ítems. Inicializar la propiedad flex de
cada item.
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div id="contenedor1">
<div id="item1">Caja 1</div>
<div id="item2">Caja 2</div>
<div id="item3">Caja 3</div>
</div>
</body>
</html>
#contenedor1{
display: flex;
background-color: #000;
height: 300px;
color:white;
font-size:2rem;
}
#item1 {
flex: 1 1 20%;
background-color: #0078A6;
}
#item2 {
flex: 0 0 60%;
background-color: #0084B6;
}
#item3 {
flex: 0 1 20%;
background-color: #008CC1;
}
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div id="contenedor1">
<div id="item1">Caja 1</div>
<div id="item2">Caja 2</div>
<div id="item3">Caja 3</div>
</div>
</body>
</html>
#contenedor1{
display: flex;
background-color: #000;
height: 300px;
color:white;
font-size:2rem;
}
#item1 {
order: 2;
background-color: #0078A6;
}
#item2 {
order: 1;
background-color: #0084B6;
}
#item3 {
order: 0;
background-color: #008CC1;
}
37.12. Flexbox - (align-self aplicada a los ítems)
La propiedad align-self de un ítem nos permite especificar la alineación dentro del
contenedor flexible respecto al eje transversal.
Los valores que podemos asignarle a la propiedad "align-self" son:
- auto
- flex-start
- flex-end
- center
- stretch
- baseline
La propiedad "align-self" almacena por defecto el valor "auto".
Probemos a cambiar a los distintos valores posibles a la propiedad "align-self":
Como ejemplo vamos a definir un Flexbox con 6 ítems. Especificar un valor distinto
para cada uno de los ítems en la propiedad "align-self"
<!DOCTYPE html>
<html>
<head>
<title>Problema</title>
<meta charset="UTF-8">
<link rel="StyleSheet" href="estilos.css" type="text/css">
</head>
<body>
<div id="contenedor1">
<div id="item1">Caja 1</div>
<div id="item2">Caja 2</div>
<div id="item3">Caja 3</div>
<div id="item4">Caja 4</div>
<div id="item5">Caja 5</div>
<div id="item6">Caja 6</div>
</div>
</body>
</html>
#contenedor1{
display: flex;
background-color: #000;
height: 300px;
color:white;
font-size:2rem;
}
#item1 {
align-self: auto;
background-color: #0078A6;
}
#item2 {
align-self: flex-start;
background-color: #0084B6;
}
#item3 {
align-self: flex-end;
background-color: #008CC1;
}
#item4 {
align-self: center;
background-color: #0078A6;
}
#item5 {
align-self: stretch;
background-color: #0084B6;
}
#item6 {
align-self: baseline;
background-color: #008CC1;
}