Skip to content

Guía práctica de layouts y posicionamiento en CSS ​

Esta nota sirve como referencia rápida para organizar elementos HTML, alinearlos, distribuir espacios, crear columnas, superponer elementos y adaptar interfaces a distintos tamaños de pantalla.

1. ¿Qué herramienta debo utilizar? ​

NecesidadHerramienta recomendada
Alinear elementos en una filadisplay: flex
Alinear elementos en una columnadisplay: flex; flex-direction: column
Crear filas y columnas al mismo tiempodisplay: grid
Colocar un elemento respecto a su contenedorposition: absolute
Desplazar un elemento conservando su espacio originalposition: relative
Fijar un elemento a la ventana del navegadorposition: fixed
Mantener un elemento visible al desplazarseposition: sticky
Ocultar elementosdisplay: none o visibility: hidden
Centrar horizontal y verticalmenteFlexbox o Grid
Crear diseños que se adapten a la pantallaFlexbox, Grid y media queries
Superponer elementosposition y z-index

Regla general: utiliza Flexbox para distribuir elementos en una dimensión, Grid para organizar filas y columnas, y position cuando necesites controlar la ubicación de un elemento respecto a su contexto.


2. Flexbox: distribuir y alinear elementos ​

Flexbox organiza los elementos en una dimensión: una fila o una columna.

Para activarlo, se utiliza display: flex en el contenedor padre.

css
.contenedor {
    display: flex;
}

Dirección: flex-direction ​

PropiedadComportamiento
rowElementos en una fila. Es el valor predeterminado.
columnElementos en una columna.
row-reverseFila en orden inverso.
column-reverseColumna en orden inverso.
css
.contenedor {
    display: flex;
    flex-direction: row;
}

Alineación: justify-content ​

Distribuye los elementos a lo largo del eje principal.

ValorResultado
flex-startAl principio.
flex-endAl final.
centerEn el centro.
space-betweenEspacio entre los elementos, sin espacio extra en los extremos.
space-aroundEspacio alrededor de cada elemento.
space-evenlyEspacios iguales entre elementos y extremos.
css
.contenedor {
    display: flex;
    justify-content: space-between;
}

Alineación: align-items ​

Alinea los elementos en el eje transversal.

ValorResultado
stretchEstira los elementos cuando corresponde. Es el valor predeterminado.
flex-startAl principio del eje transversal.
flex-endAl final del eje transversal.
centerCentrado en el eje transversal.
baselineAlinea las líneas base del texto.
css
.contenedor {
    display: flex;
    align-items: center;
}

Importante: los ejes dependen de flex-direction. Con row, el eje principal es horizontal; con column, es vertical.

Separación: gap ​

Define el espacio entre los elementos sin necesitar márgenes individuales.

css
.contenedor {
    display: flex;
    gap: 16px;
}

También puedes definir separaciones diferentes:

css
.contenedor {
    display: flex;
    row-gap: 10px;
    column-gap: 20px;
}

Permitir saltos de línea: flex-wrap ​

css
.contenedor {
    display: flex;
    flex-wrap: wrap;
    gap: 16px;
}
  • nowrap: mantiene los elementos en una sola línea.
  • wrap: permite que pasen a otra línea.
  • wrap-reverse: permite saltos invirtiendo la dirección de las líneas.

Propiedades de los elementos hijos ​

PropiedadPara qué sirve
flex-growControla cuánto puede crecer un elemento para ocupar espacio libre.
flex-shrinkControla cuánto puede reducirse un elemento.
flex-basisDefine su tamaño base antes de distribuir el espacio disponible.
flexAtajo para configurar crecimiento, reducción y tamaño base.
align-selfSobrescribe la alineación transversal de un elemento individual.
css
.elemento {
    flex: 1;
}

flex: 1 es una forma común de permitir que varios elementos compartan el espacio disponible. Si necesitas un ancho base concreto, puedes usar flex: 0 0 200px.

Ejemplos frecuentes de Flexbox ​

Centrar un elemento horizontal y verticalmente:

css
.contenedor {
    display: flex;
    justify-content: center;
    align-items: center;
}

Distribuir elementos a los extremos:

css
.encabezado {
    display: flex;
    justify-content: space-between;
    align-items: center;
}

Colocar un elemento debajo de otro:

css
.formulario {
    display: flex;
    flex-direction: column;
    gap: 12px;
}

Crear tarjetas que ocupen varias filas cuando sea necesario:

css
.tarjetas {
    display: flex;
    flex-wrap: wrap;
    gap: 20px;
}

.tarjeta {
    flex: 1 1 250px;
}

3. CSS Grid: organizar filas y columnas ​

Grid permite construir layouts bidimensionales. Es especialmente útil para paneles administrativos, galerías, dashboards y cuadrículas de tarjetas.

css
.contenedor {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 20px;
}

Definir columnas: grid-template-columns ​

css
.contenedor {
    display: grid;
    grid-template-columns: 200px 1fr;
}

Esto crea una primera columna de 200px y una segunda que ocupa el espacio restante.

ValorSignificado
200px 300pxDos columnas de tamaños fijos.
1fr 1frDos columnas que comparten el espacio disponible.
1fr 2frLa segunda columna recibe el doble de la fracción disponible.
repeat(3, 1fr)Tres columnas iguales.
repeat(4, 200px)Cuatro columnas de 200 px.
minmax(200px, 1fr)Columna con un mínimo de 200 px y posibilidad de crecer.

Definir filas: grid-template-rows ​

css
.contenedor {
    display: grid;
    grid-template-rows: 80px 1fr;
    min-height: 100vh;
}

En este ejemplo, la primera fila tiene 80px y la segunda puede ocupar el espacio restante de la altura disponible.

Crear una cuadrícula adaptable ​

css
.tarjetas {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
    gap: 20px;
}

Esta combinación permite que las tarjetas se distribuyan automáticamente en tantas columnas como quepan, con un ancho mínimo aproximado de 240px.

  • auto-fit: ajusta la cuadrícula al espacio disponible y puede expandir las columnas restantes.
  • auto-fill: conserva las pistas disponibles aunque queden espacios para columnas vacías.
  • minmax(): define un tamaño mínimo y máximo.
  • fr: representa una fracción del espacio disponible en Grid.

Posicionar elementos dentro de Grid ​

css
.contenedor {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 12px;
}

.destacado {
    grid-column: span 2;
}

.alto {
    grid-row: span 2;
}
  • grid-column: span 2: el elemento ocupa dos columnas.
  • grid-row: span 2: el elemento ocupa dos filas.

También puedes definir líneas explícitas:

css
.destacado {
    grid-column: 1 / 3;
}

Esto coloca el elemento desde la línea de columna 1 hasta la línea 3, ocupando dos columnas.

Alinear elementos en Grid ​

css
.contenedor {
    display: grid;
    place-items: center;
}

place-items: center centra los elementos en ambos ejes dentro de sus celdas.

Para controlar la distribución de las pistas en el contenedor, puedes utilizar justify-content, align-content o el atajo place-content.


4. position: controlar la ubicación de elementos ​

La propiedad position define cómo se posiciona un elemento. Los valores más utilizados son static, relative, absolute, fixed y sticky.

position: static ​

Es el comportamiento normal de los elementos y el valor predeterminado.

css
.elemento {
    position: static;
}

Las propiedades top, right, bottom y left no desplazan un elemento estático.

position: relative ​

Mantiene el elemento dentro del flujo normal, pero permite desplazarlo desde su posición original.

css
.elemento {
    position: relative;
    top: 10px;
    left: 20px;
}

El elemento se desplaza visualmente, pero conserva el espacio que ocupaba originalmente.

También se utiliza con frecuencia para crear un contexto de referencia para elementos absolute.

position: absolute ​

Saca el elemento del flujo normal y lo posiciona respecto a su ancestro posicionado más cercano. Si no existe uno, normalmente se toma el bloque contenedor inicial.

css
.tarjeta {
    position: relative;
}

.etiqueta {
    position: absolute;
    top: 10px;
    right: 10px;
}

La etiqueta queda en la esquina superior derecha de la tarjeta.

Regla práctica: cuando necesites colocar un icono, una insignia o un botón encima de una tarjeta, normalmente el contenedor lleva position: relative y el elemento superpuesto lleva position: absolute.

position: fixed ​

Posiciona el elemento respecto al viewport, normalmente la ventana visible del navegador. No conserva su espacio en el flujo normal.

css
.boton-flotante {
    position: fixed;
    right: 20px;
    bottom: 20px;
}

Útil para botones flotantes, accesos rápidos o controles que deben permanecer visibles durante el desplazamiento.

Ten en cuenta que ciertas propiedades de los ancestros, como transform, pueden cambiar el bloque contenedor de un elemento fixed.

position: sticky ​

Permite que un elemento se comporte normalmente hasta alcanzar un umbral de desplazamiento, a partir del cual queda adherido dentro de su contenedor de desplazamiento.

css
.encabezado {
    position: sticky;
    top: 0;
    z-index: 10;
}

Es útil para encabezados o barras de navegación que deben mantenerse visibles al desplazarse.

Para que funcione como esperas, debes definir un umbral como top: 0 y revisar si algún ancestro limita el desplazamiento mediante overflow.

Comparación rápida ​

PropiedadConserva espacio originalReferencia habitual
staticSíFlujo normal
relativeSíPosición original del elemento
absoluteNoAncestro posicionado más cercano
fixedNoViewport, salvo cambios en el bloque contenedor
stickySíContenedor de desplazamiento y umbral

5. top, right, bottom y left ​

Estas propiedades determinan el desplazamiento de elementos posicionados.

css
.elemento {
    position: absolute;
    top: 0;
    right: 0;
}

El elemento se sitúa en la esquina superior derecha de su bloque contenedor.

css
.elemento {
    position: absolute;
    inset: 0;
}

inset: 0 equivale a establecer top, right, bottom y left en cero. Si el elemento no tiene un tamaño fijo que lo impida, puede extenderse para cubrir el área disponible de su bloque contenedor.

También puedes usar valores parciales:

css
.elemento {
    position: absolute;
    inset: 10px 20px;
}

Esto establece top y bottom en 10px, y left y right en 20px.


6. z-index: controlar qué elemento aparece encima ​

z-index determina el orden de apilamiento de los elementos dentro de su contexto de apilamiento.

css
.modal {
    position: fixed;
    z-index: 1000;
}

.menu {
    position: relative;
    z-index: 10;
}

Cuando los elementos participan en el mismo contexto de apilamiento, un valor mayor suele colocar el elemento por encima de otro con un valor menor.

Importante: un z-index muy alto no siempre permite superar otro elemento. Los contextos de apilamiento creados por propiedades como transform, opacity y otras pueden limitar la comparación entre elementos.


7. Tamaños y dimensiones ​

PropiedadFunción
widthAncho.
heightAlto.
min-widthAncho mínimo.
max-widthAncho máximo.
min-heightAlto mínimo.
max-heightAlto máximo.
box-sizingDefine cómo se calculan las dimensiones.

Evitar que el padding aumente inesperadamente el tamaño ​

css
* {
    box-sizing: border-box;
}

Con border-box, el ancho y alto definidos incluyen el contenido, el padding y el borde.

Centrar un contenedor con ancho máximo ​

css
.contenedor {
    width: 100%;
    max-width: 1200px;
    margin-inline: auto;
    padding: 0 20px;
}

Esto permite que el contenido ocupe todo el ancho disponible en pantallas pequeñas, sin superar 1200px y manteniéndose centrado en pantallas grandes.


8. display: comportamiento de los elementos ​

ValorComportamiento
blockOcupa una nueva línea y puede ocupar todo el ancho disponible.
inlineSe integra en el texto; width y height normalmente no controlan sus dimensiones.
inline-blockSe mantiene en línea, pero permite definir dimensiones.
flexCrea un contenedor Flexbox.
gridCrea un contenedor Grid.
noneEl elemento no se muestra y no ocupa espacio en el layout.
css
.oculto {
    display: none;
}

.visible {
    display: block;
}

visibility: hidden oculta el elemento, pero normalmente conserva el espacio que ocupaba.


9. Márgenes, padding y separación ​

  • margin: espacio exterior al borde del elemento.
  • padding: espacio interior entre el contenido y el borde.
  • gap: separación entre elementos de Flexbox o Grid.
css
.tarjeta {
    margin: 20px;
    padding: 16px;
}

.contenedor {
    display: flex;
    gap: 12px;
}

Puedes establecer lados específicos:

css
.elemento {
    margin-top: 10px;
    padding-inline: 20px;
    padding-block: 12px;
}

padding-inline controla los lados de inicio y fin de la dimensión horizontal en idiomas con escritura horizontal; padding-block controla los lados de inicio y fin de la dimensión vertical.


10. Unidades comunes de CSS ​

UnidadUso típico
pxTamaños fijos en píxeles CSS.
%Porcentaje relativo a la referencia definida por la propiedad.
remRelativo al tamaño de fuente del elemento raíz.
emRelativo al tamaño de fuente del elemento actual o al contexto aplicable.
vwPorcentaje del ancho del viewport.
vhPorcentaje del alto del viewport.
frFracción del espacio disponible en Grid.
css
.contenedor {
    width: 80%;
    max-width: 1200px;
    padding: 1rem;
}

.titulo {
    font-size: 2rem;
}

Para interfaces adaptables, suele ser útil combinar unidades relativas con límites mediante min-width, max-width, min(), max() o clamp().

css
.titulo {
    font-size: clamp(1.5rem, 3vw, 2.5rem);
}

clamp() establece un tamaño mínimo, uno preferido y uno máximo.


11. Diseño responsive con media queries ​

Las media queries permiten cambiar el diseño según las características de la pantalla.

css
.contenedor {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 20px;
}

@media (max-width: 768px) {
    .contenedor {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media (max-width: 480px) {
    .contenedor {
        grid-template-columns: 1fr;
    }
}

En este ejemplo:

  • En pantallas mayores de 768px, se muestran tres columnas.
  • Hasta 768px, se muestran dos columnas.
  • Hasta 480px, se muestra una columna.

Los puntos de quiebre deben elegirse según cuándo el contenido deja de verse bien, no solamente por el modelo de dispositivo.


12. Patrones listos para reutilizar ​

A. Encabezado con contenido a ambos extremos ​

css
.encabezado {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 16px;
}

B. Tarjeta con insignia en una esquina ​

css
.tarjeta {
    position: relative;
    padding: 20px;
}

.tarjeta__insignia {
    position: absolute;
    top: 10px;
    right: 10px;
}

C. Layout con barra lateral y contenido ​

css
.layout {
    display: grid;
    grid-template-columns: 250px minmax(0, 1fr);
    gap: 24px;
}

@media (max-width: 768px) {
    .layout {
        grid-template-columns: 1fr;
    }
}

minmax(0, 1fr) ayuda a permitir que la columna principal se reduzca en lugar de desbordarse por contenido ancho.

D. Centrar un modal ​

css
.fondo-modal {
    position: fixed;
    inset: 0;
    display: grid;
    place-items: center;
    padding: 20px;
}

.modal {
    width: min(100%, 500px);
}

El fondo ocupa el viewport y el modal se centra dentro de él.

E. Barra superior que permanece visible ​

css
.barra {
    position: sticky;
    top: 0;
    z-index: 100;
}

F. Galería de tarjetas adaptable ​

css
.galeria {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(min(100%, 220px), 1fr));
    gap: 16px;
}

G. Imagen que no desborda su contenedor ​

css
img {
    max-width: 100%;
    height: auto;
}

Para imágenes dentro de tarjetas con dimensiones fijas:

css
.imagen-tarjeta {
    width: 100%;
    height: 200px;
    object-fit: cover;
}

object-fit: cover llena el espacio definido sin deformar la imagen, aunque puede recortar partes de ella.


13. Errores frecuentes ​

  1. Usar justify-content esperando alinear en el eje vertical: depende de flex-direction; revisa cuál es el eje principal.
  2. Usar position: absolute sin entender el contenedor de referencia: comprueba qué ancestro determina la posición.
  3. Usar z-index sin revisar los contextos de apilamiento: el valor por sí solo no resuelve todos los problemas.
  4. Usar height: 100% sin una altura definida en el contexto correspondiente: el resultado puede no ser el esperado.
  5. Olvidar flex-wrap: los elementos pueden comprimirse o desbordarse en lugar de saltar a otra línea.
  6. Crear columnas fijas para móviles: considera minmax(), fracciones y media queries.
  7. Usar márgenes para separar todos los elementos: gap suele ser más sencillo en Flexbox y Grid.
  8. Confundir display: none con visibility: hidden: el primero elimina el espacio del layout; el segundo normalmente lo conserva.

14. Referencias oficiales ​