Estoy hecho con CSS.
Cada control modifica una propiedad de esta tarjeta.
Revisa cada concepto, cambia sus valores y observa el resultado directamente en la página.
Este experimento resume la forma de trabajar con CSS: selecciona un elemento, modifica propiedades y observa cómo el navegador lo vuelve a dibujar. Los controles de abajo están conectados con variables CSS reales.
Cada control modifica una propiedad de esta tarjeta.
HTML nació para organizar documentos: títulos, párrafos y enlaces. Cuando la web empezó a crecer, mezclar el contenido con instrucciones visuales hacía las páginas difíciles de mantener. CSS apareció para separar esas dos responsabilidades.
Mientras trabajaba en CERN, Håkon Wium Lie planteó un lenguaje de hojas de estilo para controlar la presentación de los documentos web sin perder su estructura HTML.
/* Una idea decisiva */
contenido HTML + reglas de estilo separadas
<font color="red" size="6">
Título
</font>
Cambiar cien títulos podía significar editar cien etiquetas.
h1 {
color: red;
font-size: 3rem;
}
La estructura permanece en HTML y la apariencia se administra desde CSS.
Abre una pregunta y mira la regla principal.
La pseudoclase :hover activa estilos mientras el
puntero permanece sobre un elemento.
.boton:hover {
transform: translateY(-3px);
}
transition indica qué propiedad cambia, cuánto
tarda y qué curva de velocidad utiliza.
.boton {
transition: transform 200ms ease;
}
Un degradado radial sigue dos variables actualizadas con la
posición del mouse. filter suaviza sus bordes.
.luz {
background: radial-gradient(circle, #2563eb55, transparent 70%);
filter: blur(18px);
}
CSS significa Cascading Style Sheets: hojas de estilo en cascada. Seleccionas un elemento y declaras cómo debe verse.
Separa estructura y presentación en archivos reutilizables.
<link rel="stylesheet" href="styles.css?v=2">
Una etiqueta <style> dentro del documento,
normalmente en el <head>.
<style> p { color: lime; } </style>
El atributo style afecta únicamente a ese elemento.
<p style="color: lime;">Hola</p>
Entre declaraciones normales del autor, en la misma capa, la mayor especificidad gana. Si empatan, gana la última.
La cascada también considera origen, importancia y capas. La herencia transmite algunas propiedades, como color y fuente, a los descendientes.
¿Quién tiene la última palabra?
Gana .mensaje · especificidad 0-1-0p { color: #c5f568; }
.mensaje { color: #bca7ff; }
CSS necesita saber a quién debe aplicarle un estilo. El selector es la palabra que aparece antes de las llaves y funciona como una dirección para encontrar elementos HTML.
El docente puede llamar a todos los estudiantes, a un grupo o
a una sola persona. CSS hace lo mismo: p llama a
todos los párrafos, .especial llama al grupo con
esa clase y #unico llama a un solo elemento por su
identificación.
<p>Mensaje normal</p>
<p class="aviso">Mensaje importante</p>
.aviso {
color: red;
}
El punto significa: «busca un elemento que tenga
class="aviso"».
Mensaje normal
Mensaje importante
Solo cambia el segundo porque es el único con esa clase.pEtiqueta
Busca todos los elementos que se llaman p.
.especialClase
Busca todos los elementos del grupo especial.
#unicoID
Busca el único elemento identificado como unico.
Empieza con estos tres. Pulsa uno y mira qué tarjetas dicen «CSS se aplica».
01Texto 1<p>CSS se aplica
<span class="especial">No coincide
03Texto 3<p class="especial">CSS se aplica
<div id="unico">No coincide
<span data-tipo="demo">No coincide
06Texto 6<p>CSS se aplica
La letra p busca todos los elementos cuya etiqueta es <p>. Por eso cambia Texto 1, Texto 3 y Texto 6.
p { outline: 2px solid var(--accent); }
Coinciden: 01, 03 y 06.
.caja pDentro de
Cualquier párrafo que esté dentro de .caja.
.caja > pHijo directo
Un párrafo ubicado exactamente un nivel debajo de la caja.
p + spanJusto después
Un span colocado inmediatamente después de un párrafo.
h2 ~ pDespués de
Los párrafos que aparecen después de un título h2.
Contenido, relleno, borde y margen. Cuatro capas que explican el tamaño y la separación de cada elemento.
↳ Con box-sizing: border-box, el padding y
el borde quedan incluidos en el ancho declarado. El margen siempre
queda fuera.
#c5f568RGB rgb(197 245 104)HSL hsl(80 88% 68%)
px
Unidad absoluta de referencia.
rem / em
Relativas a tamaños de fuente.
% / vw / vh
Proporción del contexto o viewport.
clamp()
Un tamaño fluido con límites.
Flexbox organiza en un eje principal. Grid controla filas y columnas. Cambia las reglas y compara el resultado.
↳ display: block ocupa el ancho
disponible; inline fluye con el texto;
inline-block permite dimensiones sin crear un bloque
completo. display: none retira el elemento del layout.
El orden de apilamiento se resuelve dentro de cada contexto de apilamiento; un z-index enorme no permite escapar de él.
fixed suele fijarse al viewport.
sticky se pega al alcanzar un umbral dentro de su
contenedor de desplazamiento, como la barra superior de este
laboratorio.
Prueba también con Tab: el foco visible permite orientarse usando el teclado.
button:hover { translate: 0 -4px; }
button:active { scale: .96; }
button:focus-visible {
outline: 3px solid #bca7ff;
}
Este interruptor cambia su tarjeta únicamente con CSS, gracias a
:has(input:checked).
.panel:has(input:checked) {
border-color: var(--accent);
}
Las comillas son pseudoelementos decorativos. Selecciona este texto y observa su color.
.cita::before { content: "«"; }
::selection {
background: #c5f568;
color: #141613;
}
:focus, :valid y
:invalid responden al estado del campo.
Una transición interpola un cambio de estado. Una animación con
@keyframes define su propia secuencia.
↳ Pasa el cursor o enfoca las piezas. Las animaciones
respetan prefers-reduced-motion y se pueden pausar
desde la barra superior.
Las media queries consultan el viewport. Las container queries permiten que un componente responda al ancho de su propio contenedor.
Cuando mi contenedor mide 460 px o menos, cambio de dos columnas a una.
@container en acción.contenedor { container-type: inline-size; }
.tarjeta { display: grid; grid-template-columns: 140px 1fr; }
@container (max-width: 460px) {
.tarjeta { grid-template-columns: 1fr; }
}
/* Para el viewport: @media (max-width: 700px) { … } */
min() / max() / clamp()
Dimensiones fluidas y límites legibles.
object-fit: cover
Imágenes que llenan su caja sin deformarse.
overflow: auto
Desplazamiento cuando el contenido no cabe.
backdrop-filter filtra lo que hay detrás de una
superficie translúcida.
background: rgb(255 255 255 / .08);
backdrop-filter: blur(12px);
clip-path delimita qué parte del elemento se
muestra.
clip-path: polygon(50% 0%, 100% 50%,
50% 100%, 0% 50%);
filter: hue-rotate(0deg);
box-shadow / text-shadow
Profundidad en cajas y texto.
mix-blend-mode
Mezcla un elemento con su fondo.
mask-image
Oculta gradualmente con una máscara.
Un recorrido amplio por las herramientas esenciales y actuales. CSS es un lenguaje vivo: siempre hay nuevas propiedades que explorar.
Centraliza decisiones y calcula dimensiones. El botón «Paleta»
de esta página cambia variables en :root.
:root { --accent: #c5f568; }
.pieza {
color: var(--accent, lime);
width: calc(100% - 2rem);
}
Organiza la prioridad antes de comparar especificidad. En declaraciones normales, una capa posterior gana a una anterior; las reglas sin capa ganan a las que tienen capa. Con !important se invierte ese orden.
@layer base, componentes, utilidades;
@layer base { button { color: white; } }
@layer utilidades { button { color: lime; } }
Agrupa los estados junto a su componente. El símbolo & hace referencia al selector padre.
.tarjeta {
padding: 1rem;
&:hover { border-color: lime; }
& h3 { font-size: 2rem; }
}
Usa los ejes del modo de escritura en lugar de izquierda y derecha: facilita adaptar interfaces a distintos idiomas.
.contenido {
padding-inline: 2rem;
margin-block: 1rem;
border-inline-start: 3px solid lime;
}
Ofrece una base funcional y activa una mejora cuando el navegador soporta una declaración.
.panel { background: #222; }
@supports (backdrop-filter: blur(12px)) {
.panel {
background: rgb(34 34 34 / .6);
backdrop-filter: blur(12px);
}
}
color-mix() mezcla colores;
subgrid comparte pistas con la cuadrícula padre;
las animaciones ligadas al scroll usan el desplazamiento como
línea de tiempo.
color: color-mix(in oklab, lime 60%, white);
grid-template-columns: subgrid;
animation-timeline: scroll();
La compatibilidad varía por función y navegador. Consulta documentación y ofrece alternativas.
Combina lo aprendido. Diseña esta tarjeta y observa cómo se traduce cada decisión a CSS.
Una idea. Unas reglas.
Tu propia forma de verlo.
CSS sí entiende nombres como red, pero un código
permite elegir tonos exactos y reproducirlos. Escoge un color,
compáralo y llévate su declaración.
color: #24341B · fondo: #C5F568
Cinco variaciones para fondos, bordes, estados y acentos. Haz clic para convertir cualquiera en el color actual.
.elemento {
color: #24341B;
background-color: #C5F568;
}
#C5F568
Mezcla rojo, verde y azul con pares hexadecimales.
rgb(197 245 104)
Cantidad de rojo, verde y azul, de 0 a 255.
hsl(80 88% 68%)
Matiz, saturación y luminosidad: suele ser intuitivo al crear variaciones.
rgb(197 245 104 / .5)
Una barra inclinada añade transparencia sin cambiar el tono.
Tu espacio para practicar: escribe HTML y CSS en los paneles de la derecha y mira el resultado a la izquierda. Cada cambio se convierte en una página real.
↳ Ctrl + Enter (o ⌘ + Enter) ejecuta el ejercicio. Tab recorre los controles. Puedes escribir un fragmento HTML o un documento completo.
El navegador interpreta tu código; las declaraciones CSS que no reconoce se ignoran. La vista previa está aislada: no ejecuta JavaScript ni carga archivos externos. El modo descanso también pausa sus animaciones; el HTML descargado conserva las que hayas escrito.