CSS3

CSS

Tutorial CSS: Selectores básicos

CSS selectores: tipos y ejemplos. Aprende a usar diferentes tipos de selectores en CSS con ejemplos prácticos y detallados.

¿Qué es un selector en CSS y para qué sirve y cómo se utiliza?

Un selector en CSS es una estructura que asocia una regla de estilo con los elementos (o grupos de elementos) específicos de un documento HTML. Los selectores permiten aplicar estilos de manera precisa y eficiente, controlando el diseño y la apariencia de las páginas web. Los selectores son componentes esenciales de cualquier hoja de estilo CSS.

El propósito de un selector es identificar uno o más elementos en un documento HTML para aplicarles estilos definidos en las reglas CSS. Estas reglas consisten en propiedades y valores que modifican la apariencia de los elementos seleccionados.

Un selector está compuesto generalmente por un patrón que coincide con elementos del árbol del DOM (Document Object Model) en un documento HTML. Dependiendo del tipo de selector utilizado, se pueden alcanzar diferentes niveles de especificidad para diseñar la estructura del contenido.

Ejemplo básico de selector

A continuación se muestra una regla CSS que utiliza un selector de tipo para aplicar un color de texto rojo a todos los elementos <p> de una página web:

p {
  color: red;
}

En este ejemplo, p es el selector que identifica todos los párrafos (<p>) en el documento y les aplica la propiedad color con el valor red.

Sintaxis de un selector

La sintaxis básica de una regla CSS consiste en un selector seguido de un bloque de declaración. Este bloque está contenido entre llaves ({}) y contiene una o más declaraciones separadas por punto y coma (;).

Cada declaración dentro del bloque se compone de una propiedad y su valor, separados por dos puntos (:). La sintaxis canónica de una regla de estilo es la siguiente:

selector {
  propiedad: valor;
  propiedad: valor;
}

Por ejemplo, para cambiar la fuente y el tamaño de texto de los elementos <h1>, se aplicaría la siguiente regla:

h1 {
  font-family: Arial, sans-serif;
  font-size: 24px;
}

Utilización de selectores

Los selectores se utilizan en las hojas de estilo para definir claramente qué elementos se ven afectados por las reglas CSS. Esto mejora la mantenibilidad del código, facilita la actualización de estilos y mejora la separación de la estructura del contenido (HTML) y su presentación (CSS). Al usar selectores específicos y combinarlos sabiamente, se puede mantener un alto nivel de coherencia y eficiencia en el diseño de las páginas web.

Existen diversos tipos de selectores, cada uno con un propósito y uso específico, como los selectores de tipo, clase, ID, atributo, descendientes, hijos, adyacentes y de hermano general. Cada tipo de selector ofrece un nivel diferente de especificidad y flexibilidad para definir y aplicar estilos a los documentos HTML.

Selectores de tipo

Los selectores de tipo en CSS permiten aplicar estilos a todos los elementos de un tipo específico en el documento HTML. Un selector de tipo coincide con el nombre del elemento HTML, y cualquier instancia de este elemento recibirá los estilos definidos en la regla CSS correspondiente.

Para seleccionar todos los elementos <p> y cambiar su color de texto a un color especificado, usaríamos el siguiente código:

p {
  color: #333;
}

En este ejemplo, p es el selector de tipo que identifica todos los elementos de párrafo <p> y el color de texto se establece en #333 (un tono de gris oscuro).

Aplicaciones comunes de los selectores de tipo

Estilización de encabezados: Seleccionando todos los elementos de encabezado (<h1>, <h2>, <h3>, etc.) para agregarles un estilo uniforme.

h1 {
  font-size: 2em;
  color: #0066cc;
}
h2 {
  font-size: 1.5em;
  color: #003399;
}

Formato de textos: Definición de estilos base para elementos de texto como párrafos (<p>) y listas (<ul>, <ol>, <li>).

ul {
  list-style-type: disc;
  padding-left: 20px;
}
p {
  line-height: 1.6;
  margin-bottom: 1em;
}

Diseño de formularios: Aplicación de estilos a elementos de formulario como campos de entrada (<input>), áreas de texto (<textarea>) y botones (<button>).

input, textarea {
  border: 1px solid #ccc;
  padding: 8px;
}
button {
  background-color: #4CAF50;
  color: white;
  padding: 10px 20px;
}

Beneficios y limitaciones

Beneficios:

  • Simplicidad: Los selectores de tipo son fáciles de entender y usar, perfectos para aplicar estilos básicos rápidamente.
  • Consistencia: Permite la aplicación de un estilo consistente a todos los elementos de un mismo tipo en una página.

Limitaciones:

  • Especificidad baja: Tienen menor especificidad en comparación con otros selectores como los de clase o ID, por lo que pueden ser fácilmente sobrescritos por otros estilos.
  • Escalabilidad: En diseños más complejos, los selectores de tipo pueden no ser suficientes para distinguir entre diferentes usos del mismo tipo de elemento en una página.

Ejemplo avanzado: Combinación con pseudo-clases

Los selectores de tipo pueden combinarse con pseudo-clases para aplicar estilos basados en el estado o posición de los elementos. Por ejemplo, cambiar el color del texto de un enlace (<a>) al pasar el ratón sobre él:

a {
  color: #1a0dab;
  text-decoration: none;
}

a:hover {
  color: #d1495b;
}

En este ejemplo, a es el selector de tipo que selecciona todos los enlaces y a:hover aplica un color diferente cuando el ratón pasa sobre el enlace, utilizando la pseudo-clase :hover.

Los selectores de tipo son una herramienta fundamental en CSS para aplicar estilos básicos y consistentes a elementos HTML, aunque en proyectos grandes pueden complementar con otros selectores para mantener una mayor especificidad y control sobre el diseño.

Selectores de clase

Los selectores de clase en CSS permiten aplicar estilos a uno o más elementos HTML que comparten una misma clase. Esto se logra utilizando el atributo class en los elementos HTML. Un selector de clase se define con un punto (.) seguido del nombre de la clase. Esta técnica ofrece flexibilidad al permitir seleccionar múltiples elementos que deben compartir un estilo en común, independientemente de su tipo o ubicación en el DOM.

Sintaxis de los selectores de clase

La sintaxis básica de un selector de clase en CSS es:

.nombre-de-clase {
  propiedad: valor;
}

En HTML, se asigna una clase a un elemento mediante el atributo class:

<div class="nombre-de-clase">Contenido</div>

Un mismo elemento puede tener múltiples clases separadas por espacios:

<div class="clase1 clase2">Contenido</div>

Ejemplo básico de selectores de clase

Supongamos que queremos aplicar un fondo amarillo a todos los elementos con la clase resaltado. La regla CSS sería:

.resaltado {
  background-color: yellow;
}

Y en el HTML:

<p class="resaltado">Este párrafo tiene un fondo amarillo.</p>
<div class="resaltado">Este div también tiene un fondo amarillo.</div>

Especificidad de los selectores de clase

Los selectores de clase tienen mayor especificidad que los selectores de tipo, pero menor que los selectores de ID. Esto significa que, en caso de conflicto, las reglas definidas con selectores de clase prevalecerán sobre las definidas con selectores de tipo, pero pueden ser anuladas por reglas con selectores de ID.

Ejemplos avanzados con selectores de clase

Selección combinada: Podemos combinar selectores de clase con otros selectores como los de tipo o los descendientes para lograr una mayor especificidad y control:

p.resaltado {
  font-weight: bold;
  color: red;
}

Esto aplicará estilos específicos sólo a los elementos <p> que tienen la clase resaltado.

Múltiples clases: Los selectores de clase se pueden usar para aplicar estilos cuando un elemento tiene varias clases:

.clase1.clase2 {
  color: blue;
}

Esto sólo afectará a los elementos que tienen tanto clase1 como clase2.

Uso de selectores de clase con pseudo-clases

Los selectores de clase se pueden combinar con pseudo-clases para estilizar elementos en base a su estado dinámico. Por ejemplo:

.boton:hover {
  background-color: blue;
  color: white;
}

Este ejemplo estiliza un elemento con la clase boton para cambiar su color de fondo y texto cuando el puntero del mouse pasa sobre él.

Beneficios y limitaciones

Beneficios:

  • Reutilización: Permite reutilizar el mismo estilo en múltiples elementos, lo que facilita la coherencia en el diseño.
  • Flexibilidad: Se puede aplicar a cualquier tipo de elemento, sin importar su lugar en el DOM.
  • Especificidad adecuada: Un nivel de especificidad intermedio que ofrece buen control, sin ser tan restrictivo como los selectores de ID.

Limitaciones:

  • Complejidad de mantenimiento: En proyectos grandes, un uso excesivo de clases puede hacer que el código CSS sea difícil de mantener y comprender.
  • Sobrescritura de estilos: Dado que tienen especificidad media, pueden ser fácilmente sobrescritos por selectores más específicos o inline styles.

Buenas prácticas

Nombres de clase claros y semánticos: Utilizar nombres de clase que describan el propósito del estilo, no su apariencia.

.boton-envio { /* Correcto: Describe el propósito */
  background-color: green;
}
.verde { /* Incorrecto: Describe la apariencia */
  background-color: green;
}

Evitar el uso excesivo de clases: No abusar de la combinación de múltiples clases; en su lugar, considerar la creación de clases utilitarias para estilos comunes.

Agrupación de clases reutilizables: Crear clases reutilizables pequeñas y combinarlas para lograr estilos más complejos, siguiendo principios de Atomic design.

.margen-pequeno {
  margin: 5px;
}
.color-primario {
  color: blue;
}

Los selectores de clase ofrecen un equilibrio perfecto entre especificidad y flexibilidad al diseñar páginas web, permitiendo estilos reutilizables y coherentes con una buena práctica de nombres y organización.

Selectores de id

Los selectores de ID en CSS se utilizan para aplicar estilos exclusivos a un único elemento del documento HTML. A diferencia de los selectores de clase que pueden reutilizarse en múltiples elementos, cada ID debe ser único dentro del documento. Los selectores de ID tienen una alta especificidad, lo que significa que sus reglas de estilo prevalecen sobre las reglas definidas por selectores de tipo o clase en caso de conflicto.

Sintaxis de los selectores de id

La sintaxis básica de un selector de ID en CSS es un hash (#) seguido del nombre del ID.

#nombre-de-id {
  propiedad: valor;
}

En HTML, se asigna un ID a un elemento mediante el atributo id:

<div id="nombre-de-id">Contenido</div>

Ejemplo básico de selectores de id

Supongamos que queremos aplicar un fondo azul y un color de texto blanco a un elemento con el ID header. La regla CSS sería:

#header {
  background-color: blue;
  color: white;
}

Y en el HTML:

<div id="header">Este es el encabezado</div>

Especificidad de los selectores de id

Los selectores de ID tienen una especificidad mucho mayor que los selectores de tipo y clase. En concreto, la especificidad de un selector de ID es de 0, 1, 0, 0, lo que significa que, en caso de conflicto, las reglas CSS definidas con selectores de ID sobrescribirán las definidas con selectores de tipo (0, 0, 0, 1) y de clase (0, 0, 1, 0).

Ejemplos avanzados con selectores de id

Combinación con selectores de clase y tipo: Un selector de ID puede combinarse con otros selectores para lograr una mayor especificidad:

div#header .titulo {
  font-size: 24px;
  color: red;
}

Este selector afecta a los elementos con la clase titulo dentro del elemento con el ID header.

Estilización de formularios: Podemos utilizar selectores de ID para aplicar estilos específicos a elementos de formulario:

#formulario-registro {
  border: 2px solid #ccc;
  padding: 20px;
}

#formulario-registro input[type="text"] {
  border: 1px solid #000;
  padding: 10px;
}

En este ejemplo, se aplica un estilo específico al formulario con el ID formulario-registro y a los campos de texto (<input type="text">) dentro de este formulario.

Beneficios y limitaciones

Beneficios:

  • Alta especificidad: Los estilos aplicados con selectores de ID prevalecerán sobre otros selectores, haciendo más sencillo asegurar que se apliquen.
  • Unicidad: Al ser únicos, los IDs garantizan que un estilo específico se aplique a un solo elemento, evitando ambigüedades.

Limitaciones:

  • Reutilización limitada: Dado que los IDs deben ser únicos dentro del documento, no es posible reutilizar el mismo estilo en múltiples elementos, lo que puede limitar la flexibilidad de diseño.
  • Mantenibilidad: Un abuso de selectores de ID puede perjudicar la mantenibilidad del CSS al crear una mayor rigidez en el estilo y dificultar su sobrescritura.

Buenas prácticas

Reservar IDs para elementos únicos: Utilizar IDs para elementos que requieren estilos únicos e irrepetibles en la página, como encabezados principales, contenedores de menús, o formularios específicos.

<header id="main-header">...</header>

Evitar la dependencia excesiva de IDs: En la medida de lo posible, utilizar selectores de clase para los estilos compartidos y reservar los selectores de ID para estilos que deben ser únicos.

Nombres semánticos y descriptivos: Usar nombres de ID que describan claramente su propósito.

/* Correcto */
#navegacion-principal {
  /* Estilos */
}

/* Incorrecto */
#np {
  /* Estilos */
}

Cuidado con la especificidad excesiva: Evitar el uso excesivo de selectores de ID combinados con otros selectores, ya que esto puede llevar a una especificidad excesiva que sea difícil de sobrescribir.

/* Mejor evitar esto */
div#contenido-articulo {
  /* Estilos */
}

Los selectores de ID son útiles para aplicar estilos altamente específicos a elementos únicos en un documento, pero deben utilizarse con moderación para evitar problemas de mantenibilidad y sobrescritura de estilos.

Selectores universales

El selector universal en CSS (*) es un tipo de selector que coincide con todos los elementos del documento, siendo útil para aplicar estilos globales sin especificar cada tipo de elemento por separado. Se considera uno de los selectores más genéricos y tiene la especificidad más baja, lo que le permite ser sobrescrito fácilmente por otros selectores más específicos.

Sintaxis del selector universal

La sintaxis del selector universal es simplemente un asterisco (*):

* {
  propiedad: valor;
}

Ejemplo básico

A continuación, se muestra cómo usar el selector universal para aplicar un margen y padding de cero a todos los elementos en el documento:

* {
  margin: 0;
  padding: 0;
}

Aplicaciones comunes

Reset de estilos: Utilizar el selector universal para resetear los márgenes y el padding de todos los elementos es una práctica común para evitar inconsistencias entre navegadores.

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

Estilos de tipografía global: Aplicar una fuente o un color de texto común a todos los elementos del documento.

* {
  font-family: Arial, sans-serif;
  color: #333;
}

Aplicación de borde a todos los elementos: Puede ser útil en situaciones específicas de diseño para depuración.

* {
  border: 1px solid red;
}

Limitaciones y consideraciones

Rendimiento: Aunque el selector universal es muy potente y fácil de usar, debe emplearse con cautela, ya que puede impactar negativamente en el rendimiento, especialmente en documentos HTML grandes o complejos. Esto se debe a que el navegador tiene que aplicar el estilo a cada elemento del DOM.

Especificidad: El selector universal tiene la especificidad más baja, por lo que cualquier otro selector (tipo, clases, IDs, etc.) lo sobrescribirá fácilmente. Esto puede ser tanto una ventaja como una desventaja, dependiendo del contexto de uso.

Selectors combinados: Aunque el selector universal puede utilizarse solo, también puede combinarse con otros selectores para aplicar estilos más específicos. Por ejemplo:

/* Aplica un color de fondo a todos los elementos dentro de un div con la clase "contenedor" */
.contenedor * {
  background-color: #f0f0f0;
}

Uso avanzado: Reinicios condicionales

En combinación con otros selectores, el selector universal puede ayudar a restablecer estilos dentro de un contexto más específico, lo cual es útil para evitar conflictos de estilos en componentes aislados.

.contenedor * {
  all: unset; /* Reseteo de todos los estilos heredados */
}

Este ejemplo resetea todos los estilos heredados de los elementos contenidos dentro de .contenedor, proporcionando una tabla rasa para aplicar nuevos estilos específicos.

Buenas prácticas

Uso moderado: Emplear el selector universal sólo cuando sea realmente necesario, prefiriendo restablecimientos más específicos de elementos o utilizando frameworks de CSS que ya tienen restablecimientos predefinidos como Normalize.css o Reset CSS. Evitar sobrecargas de rendimiento: Intentar no usar el selector universal en hojas de estilo grandes o documentos altamente anidados. Contextualización: Asegurarse de que el uso del selector universal no cause efectos secundarios no deseados, especialmente en grandes proyectos o cuando se trabaja con terceros componentes.

El selector universal es una herramienta útil en CSS, útil para aplicar estilos globales de manera rápida y efectiva, pero debe usarse con cuidado debido a su impacto en el rendimiento y la especificidad.

Selectores de atributo

Los selectores de atributo en CSS seleccionan elementos en un documento HTML basándose en la presencia de atributos específicos, valores de atributos o incluso partes de esos valores. Estos selectores son grandes herramientas que permiten un control más fino y adaptable en la aplicación de estilos, especialmente en casos donde los atributos de HTML son utilizados para contener datos adicionales o definir estados de componentes.

Sintaxis de los selectores de atributo

Selector de atributo básico: Selecciona elementos que tienen un atributo específico, independientemente de su valor.

[atributo] {
  propiedad: valor;
}
<input type="text" placeholder="Nombre">
<input type="password">
/* Selecciona todos los elementos que tengan el atributo 'type' */
[type] {
  border: 1px solid #000;
}

Selector de atributo con valor exacto: Selecciona elementos cuyo atributo tiene un valor exacto.

[atributo="valor"] {
  propiedad: valor;
}
<input type="text">
<input type="password">
/* Selecciona los inputs cuyo tipo sea 'password' */
[type="password"] {
  background-color: lightgrey;
}

Selector de atributo con valor parcial: Se usan para seleccionar elementos con valores de atributos que contienen una cadena específica.

  • Selector de valor prefijo: Selecciona elementos cuyos atributos empiezan con una cadena especificada.
[atributo^="inicio-de-cadena"] {
  propiedad: valor;
}
<a href="https://example.com">Enlace seguro</a>
<a href="http://example.com">Enlace inseguro</a>
/* Selecciona enlaces cuyo 'href' empiece con 'https' */
[href^="https"] {
  color: green;
}
  • Selector de valor sufijo: Selecciona elementos cuyos atributos terminan en una cadena especificada.
[atributo$="fin-de-cadena"] {
  propiedad: valor;
}
<img src="imagen.png">
<img src="icono.svg">
/* Selecciona las imágenes cuyo 'src' termine en '.png' */
[src$=".png"] {
  border: 2px solid blue;
}
  • Selector de valor contenedor: Selecciona elementos cuyos atributos contienen una cadena específica en cualquier posición.
[atributo*="cadena"] {
  propiedad: valor;
}
<div class="alerta-error">Error crítico</div>
<div class="alerta-aviso">Aviso importante</div>
/* Selecciona divs con 'class' que contienen 'alerta' */
[class*="alerta"] {
  font-weight: bold;
}

Selector de valor por palabra: Selecciona elementos cuyo atributo contiene una palabra específica, delimitada por espacios.

[atributo~="palabra"] {
  propiedad: valor;
}
<div class="etiqueta importante">Noticia</div>
<div class="etiqueta secundaria">Actualización</div>
/* Selecciona divs con la clase 'importante' */
[class~="importante"] {
  color: red;
}

Selector de valor en lista: Selecciona elementos cuyo atributo contiene un valor específico en una lista delimitada por espacios.

[atributo|="valor"] {
  propiedad: valor;
}
<div lang="es-ES">Texto en español</div>
<div lang="es">Texto en otro español</div>
<div lang="fr">Texto en francés</div>
/* Selecciona elementos cuyo 'lang' es 'es' o 'es-ES' */
[lang|="es"] {
  font-style: italic;
}

Beneficios y aplicaciones de los selectores de atributo

  • Flexibilidad: Permiten seleccionar elementos basados en datos específicos en atributos de HTML, lo cual es muy útil para componentes dinámicos y basados en datos.
  • Especificidad: Ofrecen una especificidad mayor que los selectores de tipo, pero menor que los selectores de clase e ID, haciendo más fácil la integración y sobrescritura de estilos.
  • Adaptabilidad: Ideal para hacer hojas de estilo más adaptativas, respondiendo a cambios en los atributos que pueden representar estados o tipos de datos (por ejemplo, disabled, aria-*).

Buenas prácticas

Evitar el abuso del selector universal: En lugar de usar [atributo*="valor"] genéricamente, combinarlo cuando sea posible con otros selectores más específicos para mejorar rendimiento.

/* Más eficiente */
input[type="text"][placeholder*="nombre"] {
  border: 1px solid green;
}

Utilización semántica de atributos: Asegurarse de que los atributos seleccionados sean semánticos y estén destinados a contener los datos que se van a utilizar para aplicar estilos.

Uso en componentes: Elegir atributos que se mantengan constantes y representen estados relevantes del componente (por ejemplo, aria-* para accesibilidad) para mejorar la cohesión y la mantenibilidad del código CSS.

Los selectores de atributo son herramientas eficaces para aplicar estilos basados en atributos de elementos HTML de manera precisa y adaptable, lo que los hace indispensables en el diseño moderno y la implementación de interfaces web dinámicas y accesibles.

Selectores descendientes

Los selectores descendientes en CSS se utilizan para seleccionar elementos que son descendientes directos o indirectos de otro elemento especificado. Este tipo de selectores permite aplicar estilos a elementos en base a su relación jerárquica en el DOM (Document Object Model).

La sintaxis de un selector descendiente es simple, consiste en un selector inicial seguido de uno o más selectores adicionales, separados por un espacio. El selector inicial identifica el elemento ancestro, y los selectores adicionales identifican los elementos descendientes.

ancestro descendiente {
  propiedad: valor;
}

Ejemplo básico

Para aplicar un estilo a los elementos <p> que son descendientes de un <div>, podemos usar el siguiente código CSS:

div p {
  color: blue;
}

En este ejemplo, div es el selector del elemento ancestro, y p es el selector del descendiente. La regla CSS aplica un color de texto azul a todos los elementos <p> que se encuentren dentro de un <div>.

Selectores combinados y especificidad

Es importante notar que los selectores descendientes pueden combinarse con otros tipos de selectores (de tipo, clase, ID, etc.) para aumentar la especificidad y aplicar estilos más granulares. La especificidad de un selector descendiente es la suma de las especificidades individuales de cada componente del selector.

Por ejemplo, si queremos aplicar un estilo a los párrafos con la clase .importante dentro de un contenedor con ID #contenido:

#contenido p.importante {
  font-weight: bold;
  color: red;
}

En este caso, #contenido es el selector del ancestro (con una especificidad de 0, 1, 0, 0), y p.importante es el selector del descendiente (con una especificidad de 0, 0, 1, 1), resultando en un selector compuesto con una especificidad de 0, 1, 1, 1.

Aplicaciones avanzadas

Formateo de listas anidadas

Podemos utilizar selectores descendientes para aplicar estilos específicos a listas anidadas:

ul.menu ul {
  margin-left: 20px;
  list-style-type: circle;
}

En este caso, la regla CSS aplica un margen izquierdo y un tipo de marcador diferente a las listas <ul> que están anidadas dentro de otra lista <ul> con la clase .menu.

Diseño de formularios

Para aplicar estilos a los elementos de un formulario que están dentro de una sección específica, se puede hacer lo siguiente:

form.special input[type="text"] {
  border: 2px solid #333;
  padding: 5px;
}

Aquí, form.special selecciona el formulario con la clase special, y input[type="text"] selecciona los campos de texto dentro de ese formulario, aplicando un borde y un relleno específicos.

Beneficios y limitaciones

Beneficios:

  • Flexibilidad y precisión: Permiten atacar elementos basados en su jerarquía, ofreciendo un control detallado sobre el estilo de los componentes.
  • Reusabilidad: Facilitan la aplicación de estilos coherentes en componentes reutilizables y estructurados en la jerarquía DOM.

Limitaciones:

  • Rendimiento: Los selectores descendientes pueden impactar en el rendimiento, especialmente en documentos grandes y complejos, ya que el navegador tiene que recorrer la jerarquía completa del DOM para aplicar los estilos.
  • Mantenibilidad: Un uso excesivo puede llevar a hojas de estilo difíciles de mantener y comprender, especialmente en proyectos grandes.

Buenas prácticas

Evitar una excesiva especificidad: Limitar la longitud de la cadena de selectores descendientes para prevenir problemas de rendimiento y mantenibilidad.

/* Menos eficiente */
#contenido .seccion .articulo p.texto span.enfasis {
  color: red;
}

/* Más eficiente */
.articulo .enfasis {
  color: red;
}

Uso contextualizado: Emplear selectores descendientes preferentemente en componentes específicos o áreas delimitadas del documento para minimizar el impacto en el rendimiento.

Nombres semánticos: Asignar nombres de clase y ID que sean semánticos y reflejen la estructura lógica del contenido, facilitando así la comprensión y mantenimiento del código CSS.

Los selectores descendientes son una herramienta eficaz para aplicar estilos en base a la jerarquía del DOM, proporcionando flexibilidad y precisión en la gestión del diseño de interfaces web.

Selectores de hijo

Los selectores de hijo en CSS permiten aplicar estilos a los elementos que son hijos directos de un elemento específico. A diferencia de los selectores descendientes, que aplican estilos a todos los descendientes independientemente de su nivel de anidamiento, los selectores de hijo sólo afectan a los hijos inmediatos (directos) de un elemento padre.

La sintaxis de un selector de hijo es:

padre > hijo {
  propiedad: valor;
}

En esta sintaxis, padre selecciona el elemento ancestro, > indica que el siguiente elemento debe ser hijo directo del ancestro, y hijo es el selector del elemento hijo.

Ejemplo básico

Para aplicar un estilo a los elementos <p> que son hijos directos de un <div>, se puede utilizar el siguiente código CSS:

div > p {
  color: blue;
}

En este ejemplo, la regla CSS aplica un color de texto azul a todos los elementos <p> que son hijos directos de cualquier <div>.

Selectores combinados y especificidad

Los selectores de hijo pueden combinarse con otros tipos de selectores para aumentar la especificidad y aplicar estilos más precisos. La especificidad del selector de hijo es la suma de las especificidades de cada componente del selector.

Por ejemplo, para aplicar un estilo a los párrafos con la clase .importante que son hijos directos de un contenedor con ID #contenido:

#contenido > p.importante {
  font-weight: bold;
  color: red;
}

En este caso, #contenido es el selector del elemento padre (con especificidad 0, 1, 0, 0), y p.importante es el selector del elemento hijo (con especificidad 0, 0, 1, 1), resultando en un selector compuesto con una especificidad de 0, 1, 1, 1.

Aplicaciones avanzadas

Estructura de navegación

Utilizando selectores de hijo, se pueden aplicar estilos específicos a los elementos de una lista de navegación para diferenciar entre los elementos principales y los elementos anidados:

nav > ul > li {
  font-size: 18px;
  font-weight: bold;
}

nav > ul > li > ul > li {
  font-size: 16px;
  font-weight: normal;
}

En este ejemplo, los estilos aplicados a los elementos <li> hijos directos del primer nivel de la <ul> dentro del <nav> tendrán un estilo diferente a los <li> anidados.

Diseño de tarjetas

Para diseñar tarjetas informativas y aplicar estilos a los elementos título y contenido que son hijos directos de un contenedor de tarjeta:

.tarjeta > .titulo {
  font-size: 20px;
  color: #333;
}

.tarjeta > .contenido {
  padding: 10px;
  background-color: #f9f9f9;
}

Este código aplica estilos específicos a los elementos .titulo y .contenido que son hijos directos de un elemento .tarjeta.

Beneficios y limitaciones

Beneficios:

  • Precisión: Permiten aplicar estilos sólo a los hijos directos de un elemento, evitando estilos no deseados en descendientes más profundos.
  • Claridad: Ofrecen una claridad adicional al definir relaciones directas en la jerarquía DOM, lo que facilita la comprensión y mantenimiento del CSS.

Limitaciones:

  • Selectividad estricta: La aplicación estricta puede no ser adecuada en todos los casos, especialmente en estructuras HTML complejas donde la relación padre-hijo puede variar dinámicamente.
  • Compatibilidad: En ocasiones, la anidación específica puede ser afectada por cambios en la estructura HTML, lo que requiere revisiones o ajustes en las reglas CSS.

Buenas prácticas

Uso adecuado de especificidad: Combinar selectores de hijo con selectores de clase o ID para aumentar la especificidad solo cuando sea necesario, evitando cadenas de selectores demasiado largas que puedan dificultar el mantenimiento del CSS.

/* Más eficiente */
#menu > li {
  /* Estilos */
}

Organización y claridad: Utilizar nombres de clase semánticos y organizar el CSS de manera que la jerarquía y relaciones entre elementos sea clara.

Evitar dependencias excesivas: Limitar el uso de selectores de hijo en estructuras HTML que puedan cambiar frecuentemente, favoreciendo un diseño más modular y adaptable.

Documentación y comentarios: Agregar comentarios en el CSS para explicar el propósito y alcance de reglas específicas con selectores de hijo, especialmente en proyectos colaborativos o de gran escala.

/* Estilos para los elementos <li> principales del menú de navegación */
nav > ul > li {
  /* Estilos */
}

Los selectores de hijo son una herramienta útil para aplicar estilos con precisión y claridad a elementos que mantienen una relación directa padre-hijo en el DOM, altamente efectivos en estructuras HTML bien definidas y mantenibles.

Selectores de adyacente

Los selectores de adyacente en CSS se utilizan para aplicar estilos a un elemento que se encuentra inmediatamente después de otro elemento específico. Este tipo de selector, representado por el símbolo +, selecciona el primer elemento hermano que sigue inmediatamente al elemento anterior en el árbol del DOM.

La sintaxis de un selector de adyacente es:

elemento1 + elemento2 {
  propiedad: valor;
}

Ejemplo básico

Para ilustrar un uso básico de los selectores adyacentes, vamos a aplicar un estilo a los elementos <p> que son inmediatamente precedidos por un elemento <h1>:

h1 + p {
  color: green;
}

En este ejemplo, la regla CSS aplicará un color de texto verde a cualquier elemento <p> que se encuentre justo después de un <h1>.

<h1>Encabezado</h1>
<p>Párrafo inmediatamente después del encabezado.</p>
<p>Otro párrafo (no afectado).</p>

Selectores combinados y especificidad

Los selectores de adyacentes pueden combinarse con selectores de tipo, clase, ID y otros para aumentar la especificidad y controlar más finamente los estilos aplicados. La especificidad del selector adyacente es la suma de las especificidades de los selectores que lo componen.

Por ejemplo, para aplicar estilos a un <p> con la clase .intro que sigue inmediatamente a un <h2> con el ID #subtitulo:

#subtitulo + p.intro {
  font-size: 16px;
  margin-top: 10px;
}

En este caso, #subtitulo es el selector del primer elemento con una especificidad de 0, 1, 0, 0, y p.intro es el selector del elemento adyacente con una especificidad de 0, 0, 1, 1. El selector compuesto tiene una especificidad de 0, 1, 1, 1.

Aplicaciones avanzadas

Estilización condicional

Podemos utilizar selectores de adyacentes para aplicar estilos condicionales a elementos en base a su proximidad a otros elementos específicos. Por ejemplo, para aplicar un estilo a los elementos de lista (<li>) que siguen inmediatamente a un elemento de lista con la clase .especial:

li.especial + li {
  font-weight: bold;
  color: red;
}

En este caso, cualquier <li> que sigue inmediatamente a un <li> con la clase .especial tendrá un texto en negrita y color rojo.

Formularios

Podemos aplicar estilos específicos a los campos de entrada (<input>) que siguen a etiquetas (<label>):

label + input {
  margin-top: 5px;
  display: block;
}

Aquí, todos los elementos <input> que estén inmediatamente después de un <label> tendrán un margen superior de 5px y se mostrarán como bloques.

Beneficios y limitaciones

Beneficios:

  • Precisión: Permiten aplicar estilos de manera precisa a elementos basados en su proximidad directa a otros elementos.
  • Control contextual: Útil para diseños adaptativos y estilización condicional en respuestas de formularios y componentes dinámicos.

Limitaciones:

  • Dependencia altos en la estructura: Requiere que los elementos sigan un orden específico en el HTML, lo que puede limitara flexibilidad del diseño.
  • Especificidad limitada: Solo afecta al elemento adyacente inmediato, no puede aplicar estilos condicionales más profundos en la jerarquía del DOM.

Buenas prácticas

Uso deliberado: Emplear selectores de adyacente cuando la relación directa entre elementos es intencional y necesaria para el diseño. Evitar su uso excesivo para evitar dependencias rígidas en la estructura del HTML.

Combinar con otros selectores: Aumentar la especificidad de los selectores de adyacente combinándolos con selectores de clase, ID, y otros para aplicar estilos más precisos y controlados.

/* Más específico */
.seccion h1 + p.informacion {
  /* Estilos */
}

Documentar el contexto: Comentar en el CSS los casos de uso específicos para selectores de adyacente, explicando por qué se utilizan y cómo afectan la disposición visual.

/* Estilización de párrafos informativos que siguen a encabezados dentro de secciones */
.seccion h1 + p.informacion {
  /* Estilos */
}

Los selectores de adyacente son una herramienta precisa en CSS para aplicar estilos basados en la proximidad directa entre elementos, permitiendo diseños más adaptativos y condicionales con un control detallado sobre la disposición visual.

Selectores de hermano general

Los selectores de hermano general en CSS permiten aplicar estilos a elementos hermanos que comparten el mismo elemento padre. A diferencia de los selectores de adyacente, cuyo alcance se limita al elemento inmediatamente siguiente, los selectores de hermano general (~) abarcan todos los elementos hermanos que siguen al elemento especificado.

La sintaxis de un selector de hermano general es:

elemento1 ~ elemento2 {
  propiedad: valor;
}

En esta sintaxis, elemento1 selecciona el primer elemento, y ~ elemento2 selecciona todos los elementos hermanos que siguen a elemento1 dentro del mismo padre.

Ejemplo básico

Para aplicar un estilo a todos los elementos <p> que son hermanos de un <h2>, podemos usar el siguiente código CSS:

h2 ~ p {
  color: blue;
}

En este ejemplo, la regla CSS aplicará un color de texto azul a cualquier <p> que siga a un <h2> como su hermano.

<h2>Subtítulo</h2>
<p>Párrafo inmediatamente después del subtítulo.</p>
<p>Otro párrafo después del subtítulo.</p>
<div>Este div no será afectado.</div>

Selectores combinados y especificidad

Los selectores de hermano general pueden combinarse con otros selectores para aumentar la especificidad y controlar más finamente los estilos aplicados. La especificidad del selector de hermano general es la suma de las especificidades de los selectores que lo componen.

Por ejemplo, para aplicar estilos a todos los párrafos con la clase .detalle que siguen a un encabezado <h3> con la clase .subtitulo:

h3.subtitulo ~ p.detalle {
  font-size: 14px;
  color: grey;
}

En este caso, h3.subtitulo es el selector del primer hermano con una especificidad de 0, 0, 1, 1, y p.detalle es el selector de los hermanos subsiguientes con una especificidad de 0, 0, 1, 1. El selector compuesto tiene una especificidad de 0, 0, 2, 2.

Aplicaciones avanzadas

Estilos en listas complejas

Podemos utilizar selectores de hermano general para aplicar estilos a elementos de lista que siguen a un elemento específico:

ul.lista-base ~ li {
  font-weight: bold;
  color: green;
}

En este caso, cualquier <li> que siga a un elemento con la clase .lista-base dentro de la misma lista <ul> recibirá el estilo especificado.

Formularios y etiquetas

Podemos aplicar estilos específicos a campos de formulario (<input>) que siguen a un campo de selección (<select>):

select ~ input {
  margin-top: 10px;
  border: 1px solid #ccc;
}

Aquí, todos los elementos <input> que siguen a un <select> obtendrán un margen superior y un borde específico.

Beneficios y limitaciones

Beneficios:

  • Flexibilidad: Permiten aplicar estilos a todos los elementos hermanos subsiguientes de un elemento especificado, ofreciendo flexibilidad para diseños complejos.
  • Menor dependencia de la estructura: Comparados con los selectores de adyacente, los selectores de hermano general son menos rígidos en cuanto a la dependencia de la estructura específica del HTML.

Limitaciones:

  • Rendimiento: En documentos grandes, el uso intensivo de selectores de hermano general puede impactar negativamente en el rendimiento, ya que el navegador debe evaluar múltiples relaciones entre los elementos hermanos.
  • Selectividad limitada: Afectan a todos los hermanos siguientes, lo que puede no ser adecuado en todos los escenarios donde se requiere una mayor especificidad.

Buenas prácticas

Uso contextualizado: Emplear selectores de hermano general en contextos específicos donde la relación entre elementos hermanos es explícita y necesaria para el diseño.

/* Correct usage */
.menu-item.selected ~ .menu-item {
  font-weight: normal;
}

Combinación con otros selectores: Aumentar la especificidad y control combinando selectores de hermano general con selectores de tipo, clase, o ID para aplicar estilos más precisos.

/* Más específico */
.contenedor h3 + p.info ~ div.detalle {
  color: navy;
}

Documentación clara: Añadir comentarios en el CSS para explicar el propósito y alcance de las reglas de estilo que utilizan selectores de hermano general, especialmente en proyectos colaborativos.

/* Estilos para párrafos informativos que siguen a encabezados dentro de contenedores */
.contenedor h3 + p.info ~ div.detalle {
  /* Estilos */
}

Los selectores de hermano general son herramientas útiles en CSS que permiten aplicar estilos a elementos hermanos subsiguientes dentro del mismo padre, ofreciendo flexibilidad en el diseño y control detallado sobre la disposición visual.

Combinar selectores

Combinar selectores en CSS permite aplicar estilos de manera más precisa y controlada mediante la creación de selectores compuestos. Estos combinan varios selectores simples para dirigirse a elementos específicos en el DOM. A continuación, se describen las combinaciones más comunes de selectores y sus aplicaciones avanzadas.

Selectores de tipo y clase combinados

Combinar selectores de tipo y clase permite aplicar estilos a elementos de un tipo específico que también presentan una determinada clase. Por ejemplo, aplicar un fondo amarillo solo a los párrafos con la clase .importante:

p.importante {
  background-color: yellow;
}

Este selector afecta exclusivamente a los elementos <p> que poseen la clase importante.

Selectores de tipo y ID combinados

Combinar un selector de tipo con un ID permite aplicar estilos de manera específica a un único elemento de un tipo concreto. Por ejemplo, estilizar solo el encabezado principal de una página:

h1#principal {
  font-size: 36px;
  color: #336699;
}

En este caso, h1#principal se aplica exclusivamente al elemento <h1> con el ID principal.

Selectores de clase múltiples

Es posible combinar varias clases en un mismo selector, aplicando estilos a elementos que posean todas las clases especificadas. Por ejemplo, resaltando elementos que tienen tanto la clase .alerta como .critica:

.alerta.critica {
  color: red;
  font-weight: bold;
}

Este selector solo afecta a los elementos que tienen ambas clases.

Selectores de atributo combinados

Los selectores de atributo pueden combinarse con otros selectores para aplicar estilos a elementos que coinciden con varios criterios simultáneamente. Por ejemplo, estilizar los campos de entrada de texto en un formulario específico:

form.registro input[type="text"] {
  border: 2px solid #666;
}

Este selector se dirige a los campos de entrada de texto (<input type="text">) dentro de formularios con la clase registro.

Selectores compuestos (descendientes y clases)

Se pueden combinar selectores descendientes con selectores de clase para aplicar estilos a elementos en base a su jerarquía. Por ejemplo, estilizar los enlaces (<a>) dentro de un contenedor con la clase .menu:

.menu a {
  text-decoration: none;
  color: #0056b3;
}

Este selector afecta a todos los enlaces que son descendientes de un elemento con la clase menu.

Agrupación de selectores

La agrupación de selectores permite aplicar el mismo conjunto de reglas a varios selectores diferentes. Esto se logra separando múltiples selectores con una coma. Por ejemplo, aplicar el mismo fondo a diferentes tipos de encabezados:

h1, h2, h3 {
  background-color: #f0f0f0;
  padding: 10px;
}

Este código aplica las mismas propiedades a los elementos <h1>, <h2> y <h3>.

Selectores de pseudo-clase combinados

Combinar selectores con pseudo-clases permite estilizar elementos en función de su estado. Por ejemplo, cambiar el color de los enlaces cuando se pasa el ratón sobre ellos:

a:hover {
  color: #ff6600;
}

Este selector aplica un color diferente a los enlaces (<a>) cuando el usuario coloca el cursor sobre ellos.

Buenas prácticas y consideraciones

Al combinar selectores, es esencial mantener en mente la especificidad y el rendimiento. Los selectores más específicos tendrán prioridad en la aplicación de estilos. Sin embargo, utilizar selectores excesivamente largos y específicos puede dificultar el mantenimiento del CSS:

  • Evitar selectores excesivamente especificativos que puedan complicar la sobrescritura de estilos más adelante.
  • Usar nombres de clase y ID semánticos para reflejar la función o el propósito del elemento, no solo su apariencia.
  • Documentar y comentar las combinaciones de selectores complejas para facilitar la comprensión y el mantenimiento por parte de otros desarrolladores.

Combinar selectores de manera efectiva permite aplicar estilos de forma precisa, lo que es esencial para el control detallado en el diseño de interfaces web complejas y responsivas.

Certifícate en CSS con CertiDevs PLUS

Ejercicios de esta lección Selectores básicos

Evalúa tus conocimientos de esta lección Selectores básicos con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Todas las lecciones de CSS

Accede a todas las lecciones de CSS y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción A Css

CSS3

Introducción Y Entorno

Sintaxis

CSS3

Sintaxis De Selectores Y Propiedades

Selectores Básicos

CSS3

Sintaxis De Selectores Y Propiedades

Herencia Y Cascada

CSS3

Sintaxis De Selectores Y Propiedades

Pseudo-clases Y Pseudo-elementos

CSS3

Sintaxis De Selectores Y Propiedades

Estilos De Fuente

CSS3

Estilización De Texto Y Fondo

Propiedades De Texto

CSS3

Estilización De Texto Y Fondo

Sombras En Texto Y Cajas

CSS3

Estilización De Texto Y Fondo

Propiedades De Fondo

CSS3

Estilización De Texto Y Fondo

Modelo De Caja

CSS3

Modelo Caja Y Posicionamiento

Propiedades De Posicionamiento

CSS3

Modelo Caja Y Posicionamiento

Propiedad 'Display'

CSS3

Modelo Caja Y Posicionamiento

Elementos 'Float' Y 'Clear'

CSS3

Modelo Caja Y Posicionamiento

Flexbox Para Crear Layouts Y Estructuras

CSS3

Flexbox Y Grid

Css Grid Para Crear Layouts Y Estructuras

CSS3

Flexbox Y Grid

Animaciones Y Transiciones

CSS3

Técnicas Modernas Y Metodologías

Variables En Css

CSS3

Técnicas Modernas Y Metodologías

Diseño Responsive Con Media Queries

CSS3

Técnicas Modernas Y Metodologías

Metodologías De Escritura En Css

CSS3

Técnicas Modernas Y Metodologías

Introducción A Tailwind Css

Tailwind CSS

Introducción Y Entorno

Instalación De Tailwind Css

Tailwind CSS

Introducción Y Entorno

Fundamentos Del Sistema De Utility-first En Tailwind Css

Tailwind CSS

Fundamentos

Fundamentos Del Diseño Responsive En Tailwind Css

Tailwind CSS

Fundamentos

Tipografía Y Fuentes En Tailwind Css

Tailwind CSS

Clases De Utilidad

Clases De Tamaño De Tailwind Css

Tailwind CSS

Clases De Utilidad

Utilidades De Espaciado Y Alineación De Tailwind Css

Tailwind CSS

Clases De Utilidad

Clases De Colores Y Fondo De Tailwind Css

Tailwind CSS

Clases De Utilidad

Clases De Bordes De Tailwind Css

Tailwind CSS

Clases De Utilidad

Hover, Focus Y Estado De Tailwind Css

Tailwind CSS

Clases De Utilidad

Transiciones Y Animaciones De Tailwind Css

Tailwind CSS

Clases De Utilidad

Contenedores Y Columnas En Tailwind Css

Tailwind CSS

Layout

Flexbox En Tailwind Css

Tailwind CSS

Layout

Grid En Tailwind Css

Tailwind CSS

Layout

Conocimiento General De Tailwind Css - Evaluación Multirespuesta

Tailwind CSS

Evaluación

Conocimiento General De Tailwind Css - Evaluación Código

Tailwind CSS

Evaluación

Certificados de superación de CSS

Supera todos los ejercicios de programación del curso de CSS y obtén certificados de superación para mejorar tu currículum y tu empleabilidad.

En esta lección

Objetivos de aprendizaje de esta lección

  • Comprender qué es un selector en CSS y su utilidad.
  • Aplicar selectores de tipo, clase, ID, atributo y universales.
  • Utilizar selectores descendientes, de hijo, adyacente y de hermano general.
  • Combinar selectores para lograr estilos más específicos y granulares.
  • Identificar beneficios y limitaciones de cada tipo de selector.