Selectores CSS

Tienes una página llena de elementos y un conjunto de estilos que quieres aplicar, pero un color o una fuente no sirven de nada hasta que puedas decir a qué elementos pertenecen. Un selector es cómo apuntas a los correctos: este párrafo, cada botón, solo los enlaces dentro del nav. Familiarízate con los selectores y el resto de CSS se convierte en una cuestión de elegir qué cambiar, porque ya sabes cómo alcanzarlo.
Selectores de tipo, clase e id
Una regla CSS tiene dos partes: un selector que elige qué elementos estilizar, y un bloque de declaraciones que dice cómo. El selector más simple es el nombre del elemento, llamado selector de tipo. Escribe p y cada párrafo en la página tendrá ese estilo.
Eso a menudo es demasiado amplio. Rara vez quieres que todos los párrafos se vean igual. Entonces das a los elementos una etiqueta llamada clase, usando el atributo HTML class, y apuntas a esa etiqueta desde CSS con un punto adelante. Piensa en una clase como una etiqueta de nombre: pegas la misma etiqueta en cada elemento que quieres tratar como grupo, y luego estilizas la etiqueta una sola vez.
<button class="btn-primary">Registrarse</button>
<button class="btn-primary">Comprar ahora</button>/* selector de tipo: cada botón en la página */
button {
font-family: inherit;
}
/* selector de clase: solo elementos etiquetados btn-primary */
.btn-primary {
background: rebeccapurple;
color: white;
}Ambos botones recogen el estilo .btn-primary de una regla, porque comparten la clase. Ese reuso es la razón completa por la que las clases son la herramienta que usas. Esto se construye directamente sobre cómo funciona CSS, donde cada regla empareja un selector con un conjunto de declaraciones.
p golpea cada elemento de ese tipo, que es usualmente más de lo que quieres. Una clase es una etiqueta de nombre que pegas en los elementos que te importan y estilizas con un punto, como .btn-primary. Comienza con clases para casi todo y no irás muy lejos. Combinadores: seleccionar por relación
A veces quieres estilizar un elemento solo cuando se sienta dentro de otro. Los enlaces en tu navegación deberían verse diferentes de enlaces en un párrafo, aunque ambos sean elementos <a>. Describes esa relación con un combinador: pon dos selectores uno al lado del otro con un espacio, y CSS lo lee como "el segundo, pero solo dentro del primero".
Entonces .nav a significa "cualquier enlace dentro de un elemento con la clase nav". El espacio está haciendo trabajo real aquí. No es decoración, es la instrucción para mirar dentro.
/* descendiente: cualquier enlace dentro del nav */
.nav a {
text-decoration: none;
}
/* hijo: solo elementos de lista que son hijos directos de .menu */
.menu > li {
display: inline-block;
}La primera regla alcanza cada enlace anidado dentro del nav; la segunda alcanza solo los elementos de nivel superior del menú y deja cualquier lista anidada en paz. Elegir entre ellas es elegir qué tan lejos abajo quieres que viaje la regla.
.nav a estiliza enlaces que se sientan dentro del nav. Ese espacio es una instrucción, no espaciado por apariencia, así que no lo elimines por accidente. Este patrón cubre mucho de la estilización cotidiana. Pseudo-clases: estilizar por estado
Los elementos pueden estar en diferentes estados. Un enlace puede estar quieto o tener el mouse pasando sobre él. Una pseudo-clase te permite estilizar un elemento basado en su estado, y la escribes con dos puntos después del selector.
La que usarás primero es :hover. Escribe .btn-primary:hover y esos estilos se aplican solo mientras el puntero está sobre el botón, que es cómo los botones y enlaces dan esa pequeña respuesta visual cuando apuntas a ellos.
.btn-primary:hover {
background: purple;
}
/* los usuarios de teclado necesitan un indicador de enfoque visible */
.btn-primary:focus-visible {
outline: 2px solid rebeccapurple;
outline-offset: 2px;
}La primera regla se dispara mientras el puntero está sobre el botón; la segunda dibuja un anillo claro cuando el botón está seleccionado por teclado, que es lo que mantiene la página usable sin un mouse. Las elecciones de color y contorno aquí se conectan a cómo funciona CSS y los valores que estableces en cualquier propiedad.
:hover para cuando el puntero está sobre él. Ahí es de dónde viene el efecto hover de un botón. Lo atas directamente al selector, sin espacio en medio. Pseudo-elementos: estilizar una parte de un elemento
Una pseudo-clase estiliza un elemento completo en un cierto estado. Un pseudo-elemento es diferente: te permite estilizar una parte de un elemento, o agregar un pequeño pedazo de contenido que ni siquiera está en tu HTML.
Los dos que encontrarás primero son ::before y ::after. Insertan contenido al inicio o final de un elemento, y les dices qué insertar con la propiedad content. Observa los dos puntos: ese doble punto es cómo CSS marca un pseudo-elemento aparte de una pseudo-clase.
/* agregue una flecha decorativa después de cada enlace del nav */
.nav a::after {
content: " →";
color: rebeccapurple;
}
/* estilizar el texto de pista dentro de una caja de búsqueda */
.search-input::placeholder {
color: grey;
font-style: italic;
}La regla ::after inserta una flecha que vive solo en la estilización, no en el HTML, mientras que ::placeholder llega dentro de la entrada para estilizar el texto que el navegador dibuja para ti. Ambos estilizan algo que de otro modo no podrías alcanzar con un selector simple. Si estás estilizando texto de pista y etiquetas, el capítulo de tipografía profundiza en el lado del texto.
::before y ::after. Esos dos necesitan una propiedad content para mostrarse. El doble punto es la forma rápida de diferenciar un pseudo-elemento de una pseudo-clase. Especificidad: qué regla gana
Tarde o temprano dos reglas intentarán estilizar el mismo elemento de diferentes maneras. Una dice que el texto es azul, otra dice que es rojo. El navegador tiene que elegir una, y la forma en que decide se llama especificidad: el selector más específico gana.
La versión corta es un orden de fortaleza. Un selector de id vence a un selector de clase, y un selector de clase vence a un selector de tipo. Así que si #header y .title ambos establecen un color en el mismo elemento, el id gana. Cuando dos reglas son igualmente específicas, la escrita después en el archivo gana.
/* selector de tipo, especificidad (0, 0, 1) */
p {
color: grey;
}
/* selector de clase, especificidad (0, 1, 0): este gana */
.intro {
color: black;
}<p class="intro">Este párrafo es negro, porque la regla de clase supera la regla de tipo.</p>Ambas reglas apuntan al párrafo y ambas establecen color, pero el selector de clase es más específico que el selector de tipo, así que el párrafo es negro. Mover un selector hacia arriba o hacia abajo en la escalera de especificidad a menudo es todo lo que se necesita para resolver un conflicto sin recurrir a herramientas más pesadas. El capítulo del modelo de caja se encuentra con la misma cascada cuando las reglas de espaciado chocan.

