Componentes de interfaz con CSS

En diseño de interfaces no se diseña página a página, sino con componentes: piezas reutilizables (tarjeta, botón, menú, pie) que se combinan.

Diseña en componentes: bloque de HTML + clase + estilos independientes.

BEM (bloque__elemento--modificador) ayuda a nombrar sin conflictos.

Botón, tarjeta, cabecera con menú y pie resuelven la mayoría de webs.

Todo componente debe ser adaptable y accesible con teclado.

  • En diseño de interfaces no se diseña página a página, sino con componentes: piezas reutilizables (tarjeta, botón, menú, pie) que se combinan. En CSS se construyen igual: un bloque de HTML con una clase y sus estilos, pensados para funcionar en cualquier sitio de la web. Esta lección junta lo que llevas de CSS en cuatro componentes que casi toda web necesita.
  • Una convención sencilla y muy usada es BEM (bloque, elemento, modificador):
  • <article class="tarjeta tarjeta--destacada"> <img class="tarjeta__imagen" src="img/cartel.webp" alt="Cartel del Festival de Otoño"> <div class="tarjeta__cuerpo"> <p class="tarjeta__categoria">Cartelismo</p> <h3 class="tarjeta__titulo">Festival de Otoño</h3> </div> </article>
  • Bloque: el componente (tarjeta). Elemento: una parte suya, con dos guiones bajos (tarjeta__titulo). Modificador: una variante, con dos guiones (tarjeta--destacada).
  • Así cada clase dice a qué componente pertenece y los estilos no se pisan entre sí.

Introducción

En diseño de interfaces no se diseña página a página, sino con componentes: piezas reutilizables (tarjeta, botón, menú, pie) que se combinan. En CSS se construyen igual: un bloque de HTML con una clase y sus estilos, pensados para funcionar en cualquier sitio de la web. Esta lección junta lo que llevas de CSS en cuatro componentes que casi toda web necesita.

Cómo nombrar las clases de un componente

Una convención sencilla y muy usada es BEM (bloque, elemento, modificador):

<article class="tarjeta tarjeta--destacada"> <img class="tarjeta__imagen" src="img/cartel.webp" alt="Cartel del Festival de Otoño"> <div class="tarjeta__cuerpo"> <p class="tarjeta__categoria">Cartelismo</p> <h3 class="tarjeta__titulo">Festival de Otoño</h3> </div> </article>

Bloque: el componente (tarjeta). Elemento: una parte suya, con dos guiones bajos (tarjeta__titulo). Modificador: una variante, con dos guiones (tarjeta--destacada).

Así cada clase dice a qué componente pertenece y los estilos no se pisan entre sí.

Botón

.boton { display: inline-flex; align-items: center; gap: .5rem; padding: .75rem 1.25rem; border: 2px solid var(--color-acento); border-radius: 999px; background: var(--color-acento); color: white; font: inherit; font-weight: 600; text-decoration: none; cursor: pointer; transition: background .2s, transform .2s; } .boton:hover { background: color-mix(in oklch, var(--color-acento), black 15%); } .boton:active { transform: translateY(1px); } .boton:focus-visible { outline: 3px solid var(--color-texto); outline-offset: 3px; } .boton--secundario { background: transparent; color: var(--color-acento); }

Usa <a class="boton"> si lleva a otra página y <button class="boton"> si hace algo en la misma página.

Tarjeta

Cabecera con menú adaptable

La solución más robusta sin JavaScript: en móvil, el logo arriba y el menú debajo, con los enlaces en fila que saltan de línea si no caben; en escritorio, todo en una fila.

<header class="cabecera"> <a class="cabecera__logo" href="index.html">Estudio Norte</a> <nav aria-label="Principal"> <ul class="menu"> <li><a href="trabajos.html">Trabajos</a></li> <li><a href="estudio.html">Estudio</a></li> <li><a href="contacto.html">Contacto</a></li> </ul> </nav> </header>

.cabecera { display: flex; flex-direction: column; gap: .75rem; padding: 1rem; } .menu { display: flex; flex-wrap: wrap; gap: .5rem 1.25rem; list-style: none; margin: 0; padding: 0; } .menu a { display: inline-block; padding: .5rem 0; } /* zona de toque cómoda */ @media (min-width: 768px) { .cabecera { flex-direction: row; justify-content: space-between; align-items: center; } }

📌 Nota. El típico menú hamburguesa (un botón que abre y cierra el menú en móvil) necesita JavaScript para ser accesible: un <button> con aria-expanded que cambia al pulsarlo. Lo verás en la lección Eventos. Desconfía de los "trucos" solo con CSS que usan casillas ocultas: suelen fallar con teclado y lector de pantalla.

Pie de página

.pie { display: grid; gap: 1.5rem; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); padding: 3rem 1rem; background: var(--color-texto); color: var(--color-fondo); } .pie a { color: inherit; }

repeat(auto-fit, minmax(200px, 1fr)) crea tantas columnas como quepan de al menos 200 px: el pie se adapta solo, sin media queries.

Practica

Monta una página componentes.html con tu mini sistema de diseño:

Variables de color, tipografía y espacio en :root. El botón en dos variantes (principal y secundario), con :hover y :focus-visible. Tres tarjetas de proyecto en una retícula que pase de 1 a 3 columnas. La cabecera con menú y el pie. Revisa con el teclado (tecla Tab) que todo es alcanzable y el foco se ve.

Errores frecuentes

Estilar por etiqueta (article h3 { … }) en lugar de con clases del componente: al reutilizarlo en otro sitio, se rompe. Dar medidas fijas en píxeles a los componentes: deben adaptarse a su contenedor. <div> con aspecto de botón: no funciona con teclado ni lector de pantalla. Olvidar los estados: :hover, :focus-visible, :active y deshabilitado.

CSS
87

Componentes de interfaz con CSS

En diseño de interfaces no se diseña página a página, sino con componentes: piezas reutilizables (tarjeta, botón, menú, pie) que se combinan.

Código del tema: .tarjeta__titulo

📘 Teoría

Introducción

En diseño de interfaces no se diseña página a página, sino con componentes: piezas reutilizables (tarjeta, botón, menú, pie) que se combinan. En CSS se construyen igual: un bloque de HTML con una clase y sus estilos, pensados para funcionar en cualquier sitio de la web. Esta lección junta lo que llevas de CSS en cuatro componentes que casi toda web necesita.

Cómo nombrar las clases de un componente

Una convención sencilla y muy usada es BEM (bloque, elemento, modificador):

<article class="tarjeta tarjeta--destacada">
  <img class="tarjeta__imagen" src="img/cartel.webp" alt="Cartel del Festival de Otoño">
  <div class="tarjeta__cuerpo">
    <p class="tarjeta__categoria">Cartelismo</p>
    <h3 class="tarjeta__titulo">Festival de Otoño</h3>
  </div>
</article>
  • Bloque: el componente (tarjeta).
  • Elemento: una parte suya, con dos guiones bajos (tarjeta__titulo).
  • Modificador: una variante, con dos guiones (tarjeta--destacada).

Así cada clase dice a qué componente pertenece y los estilos no se pisan entre sí.

Botón

.boton {
  display: inline-flex; align-items: center; gap: .5rem;
  padding: .75rem 1.25rem;
  border: 2px solid var(--color-acento);
  border-radius: 999px;
  background: var(--color-acento); color: white;
  font: inherit; font-weight: 600; text-decoration: none;
  cursor: pointer;
  transition: background .2s, transform .2s;
}
.boton:hover { background: color-mix(in oklch, var(--color-acento), black 15%); }
.boton:active { transform: translateY(1px); }
.boton:focus-visible { outline: 3px solid var(--color-texto); outline-offset: 3px; }
.boton--secundario { background: transparent; color: var(--color-acento); }

Usa <a class="boton"> si lleva a otra página y <button class="boton"> si hace algo en la misma página.

Tarjeta

Cabecera con menú adaptable

La solución más robusta sin JavaScript: en móvil, el logo arriba y el menú debajo, con los enlaces en fila que saltan de línea si no caben; en escritorio, todo en una fila.

<header class="cabecera">
  <a class="cabecera__logo" href="index.html">Estudio Norte</a>
  <nav aria-label="Principal">
    <ul class="menu">
      <li><a href="trabajos.html">Trabajos</a></li>
      <li><a href="estudio.html">Estudio</a></li>
      <li><a href="contacto.html">Contacto</a></li>
    </ul>
  </nav>
</header>
.cabecera { display: flex; flex-direction: column; gap: .75rem; padding: 1rem; }
.menu { display: flex; flex-wrap: wrap; gap: .5rem 1.25rem; list-style: none; margin: 0; padding: 0; }
.menu a { display: inline-block; padding: .5rem 0; }   /* zona de toque cómoda */

@media (min-width: 768px) {
  .cabecera { flex-direction: row; justify-content: space-between; align-items: center; }
}

📌 Nota. El típico menú hamburguesa (un botón que abre y cierra el menú en móvil) necesita JavaScript para ser accesible: un <button> con aria-expanded que cambia al pulsarlo. Lo verás en la lección Eventos. Desconfía de los "trucos" solo con CSS que usan casillas ocultas: suelen fallar con teclado y lector de pantalla.

Pie de página

.pie {
  display: grid; gap: 1.5rem;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  padding: 3rem 1rem; background: var(--color-texto); color: var(--color-fondo);
}
.pie a { color: inherit; }

repeat(auto-fit, minmax(200px, 1fr)) crea tantas columnas como quepan de al menos 200 px: el pie se adapta solo, sin media queries.

Practica

Monta una página componentes.html con tu mini sistema de diseño:

  1. Variables de color, tipografía y espacio en :root.
  2. El botón en dos variantes (principal y secundario), con :hover y :focus-visible.
  3. Tres tarjetas de proyecto en una retícula que pase de 1 a 3 columnas.
  4. La cabecera con menú y el pie.
  5. Revisa con el teclado (tecla Tab) que todo es alcanzable y el foco se ve.

Errores frecuentes

  • Estilar por etiqueta (article h3 { … }) en lugar de con clases del componente: al reutilizarlo en otro sitio, se rompe.
  • Dar medidas fijas en píxeles a los componentes: deben adaptarse a su contenedor.
  • <div> con aspecto de botón: no funciona con teclado ni lector de pantalla.
  • Olvidar los estados: :hover, :focus-visible, :active y deshabilitado.

¿Qué es esto?

Soy Cristian Eslava y a veces hago webs para procrastinar yo y vosotros. culTest

La hice en febrero de 2026 para facilitar el aprendizaje de mis alumnos. La idea es aprender desarrollo web practicando y que el proyecto siga creciendo con nuevos temas, tests y retos.

Está inspirada en MDN, W3Schools, CodePen, Manz y muchos otros sitios de documentación sobre desarrollo web. Quería combinar teoría útil, ejemplos ejecutables, retos y el sistema de tests que ya tenía en culTest. culTest

Si te gustó, si no te gustó o si quieres escribirme, puedes hacerlo en cristianeslava@gmail.com