PARTE 2: Clases en CSS
1. Diferencia entre clases e identificadores
Clases: Se pueden reutilizar en múltiples elementos. Se usan con punto (.clase)
IDs: Deben ser únicos en la página. Se usan con almohadilla (#id). Tienen mayor especificidad
/* Clase - reutilizable */
.boton {
padding: 10px;
background: blue;
}
/* ID - único */
#encabezado-principal {
font-size: 24px;
}
<!-- Múltiples elementos con la misma clase -->
<button class="boton">Aceptar</button>
<button class="boton">Cancelar</button>
<!-- Solo un elemento con este ID -->
<header id="encabezado-principal">...</header>
2. Sintaxis
En CSS: Se escribe con un punto seguido del nombre (.nombre-clase)
En HTML: Se usa el atributo class="nombre-clase"
/* Declaración en CSS */
.mi-clase {
color: red;
}
<!-- Aplicación en HTML -->
<p class="mi-clase">Este texto será rojo</p>
3. Aplicación a elementos HTML: clases únicas y múltiples
Clase única: Un elemento con una sola clase
Múltiples clases: Un elemento puede tener varias clases separadas por espacios
<!-- Clase única -->
<div class="contenedor">...</div>
<!-- Múltiples clases -->
<button class="boton boton-grande boton-primario">Enviar</button>
.boton {
padding: 10px;
border: none;
}
.boton-grande {
font-size: 18px;
}
.boton-primario {
background: blue;
color: white;
}
4. Selectores de clase
Qué es: Formas de seleccionar elementos usando sus clases
/* Clase simple */
.tarjeta {
border: 1px solid gray;
}
/* Elemento con clase específica */
div.tarjeta {
padding: 20px;
}
/* Descendientes con clase */
.contenedor .tarjeta {
margin: 10px;
}
5. Combinación de selectores de clase
Sin espacio (.clase1.clase2): Elemento que tiene AMBAS clases
Con espacio (.clase1 .clase2): Elemento con clase2 que es descendiente de elemento con clase1
/* Elemento con AMBAS clases */
.boton.activo {
background: green;
}
<!-- Se aplica a este -->
<button class="boton activo">Click</button>
<!-- NO se aplica a estos -->
<button class="boton">Click</button>
<button class="activo">Click</button>
/* Descendiente con clase */
.menu .item {
display: block;
}
<!-- Se aplica al .item dentro de .menu -->
<nav class="menu">
<a class="item">Inicio</a>
</nav>
6. Pseudo-clases aplicadas a clases
Qué son: Combinación de selectores de clase con pseudo-clases para aplicar estilos en estados específicos
/* Hover sobre elemento con clase */
.boton:hover {
background: darkblue;
}
/* Focus en inputs con clase */
.campo-texto:focus {
border-color: blue;
}
/* Primer elemento con clase */
.item:first-child {
margin-top: 0;
}
/* Elementos pares con clase */
.fila:nth-child(even) {
background: lightgray;
}
7. Convenciones de nombre
BEM: Block Element Modifier (.bloque__elemento--modificador)
kebab-case: Palabras separadas por guiones (.mi-clase-ejemplo)
camelCase: Primera palabra minúscula, resto capitalizadas (.miClaseEjemplo)
/* BEM (Block Element Modifier) */
.tarjeta { } /* Bloque */
.tarjeta__titulo { } /* Elemento */
.tarjeta__boton { } /* Elemento */
.tarjeta--destacada { } /* Modificador */
<!-- Uso en HTML -->
<div class="tarjeta tarjeta--destacada">
<h2 class="tarjeta__titulo">Título</h2>
<button class="tarjeta__boton">Leer más</button>
</div>
/* kebab-case (recomendado en CSS) */
.boton-principal { }
.menu-navegacion { }
.contenedor-principal { }
/* camelCase (menos común en CSS) */
.botonPrincipal { }
.menuNavegacion { }
.contenedorPrincipal { }
8. Clases reutilizables
Qué son: Clases diseñadas para aplicarse a múltiples elementos diferentes, promoviendo la reutilización de código
/* Clases reutilizables para espaciado */
.margen-arriba {
margin-top: 20px;
}
.padding-grande {
padding: 30px;
}
/* Clases reutilizables para texto */
.texto-centrado {
text-align: center;
}
.texto-grande {
font-size: 24px;
}
<!-- Reutilizadas en diferentes elementos -->
<h1 class="texto-centrado texto-grande">Título</h1>
<p class="texto-centrado">Párrafo</p>
<div class="margen-arriba padding-grande">Contenido</div>
9. Utility classes vs Semantic classes
Utility classes: Clases de una sola función (hacen una cosa específica)
Semantic classes: Clases que describen el propósito o significado del elemento
/* UTILITY CLASSES - función específica */
.texto-rojo {
color: red;
}
.flex {
display: flex;
}
.oculto {
display: none;
}
/* SEMANTIC CLASSES - significado/propósito */
.mensaje-error {
color: red;
border: 1px solid red;
padding: 10px;
}
.boton-enviar {
background: green;
color: white;
padding: 12px 24px;
}
<!-- Utility: describe el estilo -->
<p class="texto-rojo">Mal uso</p>
<!-- Semantic: describe el propósito -->
<p class="mensaje-error">Mejor uso</p>
<!-- Combinación (común en frameworks modernos) -->
<div class="mensaje-error flex texto-centrado">Error</div>
10. Interacción con JavaScript
Qué es: Las clases son la forma recomendada de manipular estilos con JavaScript, usando classList
/* CSS */
.activo {
background: blue;
color: white;
}
.oculto {
display: none;
}
// JavaScript - Añadir clase
elemento.classList.add('activo');
// Quitar clase
elemento.classList.remove('activo');
// Alternar clase (toggle)
elemento.classList.toggle('oculto');
// Verificar si tiene clase
if (elemento.classList.contains('activo')) {
console.log('Está activo');
}
<!-- Prefijo .js- para clases usadas solo por JavaScript -->
<button class="boton js-abrir-modal">Abrir</button>
// JavaScript
document.querySelector('.js-abrir-modal').addEventListener('click', ...);
11. Buenas y malas prácticas
Buenas prácticas: Usar nombres descriptivos, evitar sobre-especificación, preferir clases sobre IDs para estilos
Malas prácticas: Nombres genéricos, clases basadas en estilos, sobre-especificación innecesaria
/* MAL - Nombres genéricos */
.texto { }
.boton { }
/* BIEN - Nombres específicos */
.descripcion-producto { }
.boton-enviar-formulario { }
/* MAL - Basado en estilos */
.texto-rojo {
color: red;
}
/* BIEN - Basado en propósito */
.mensaje-error {
color: red;
}
/* MAL - Sobre-especificación */
div.contenedor#principal .tarjeta {
padding: 20px;
}
/* BIEN - Solo lo necesario */
.tarjeta {
padding: 20px;
}
/* MAL - IDs para estilos (alta especificidad) */
#boton-enviar {
background: blue;
}
/* BIEN - Clases para estilos (reutilizable) */
.boton-enviar {
background: blue;
}