Guía educativa de selectores de enlaces, acciones y foco
Estados reales, contexto y privacidad
Distingue qué depende del historial, del dispositivo de entrada, del foco o de la URL.
Modelo mental
Estos selectores observan estado del navegador; no conviene simularlo como un valor persistente.
LVHAOrden de reglas de enlace
Con igual especificidad, declara :link, :visited, :hover y :active en ese orden para que la cascada preserve el estado esperado.
:focus-visibleFoco y modalidad de entrada
:focus indica foco; :focus-visible aplica la heurística del navegador para mostrar un indicador, especialmente al navegar con teclado.
:visitedEl historial no es una API
:visited restringe propiedades y oculta sus coincidencias a JavaScript para impedir inferir el historial.
Enlaces
Compara enlaces con href, destinos no visitados y el estado privado del historial.
:any-link
Enlaces que tienen href, sin distinguir historial.
Especificidad(0, 1, 0)
:any-link
Comportamiento
- Equivale al conjunto de :link y :visited.
- En HTML se aplica a a y area con href.
Ejemplos
a:any-linkCoincide: <a href="/docs">Docs</a>
<a>Placeholder</a>Errores frecuentes
- Un elemento a sin href no es un hipervínculo.
- No revela si el destino fue visitado.
:link
Enlaces todavía no visitados según el navegador.
Especificidad(0, 1, 0)
:link
Comportamiento
- Es excluyente con :visited.
- Participa en la cascada normal.
Ejemplos
a:linkCoincide: <a href="/new">New page</a>
<a>Placeholder</a>Errores frecuentes
- No significa cualquier etiqueta a.
- El resultado depende del perfil del navegador.
:visited
Enlaces visitados según el historial privado.
Especificidad(0, 1, 0)
:visited
Comportamiento
- Solo admite cambios visuales limitados, principalmente colores.
- Las APIs devuelven valores como si el enlace no estuviera visitado.
Ejemplos
a:visitedCoincide: <a href="/seen">Seen page</a>
<a href="/new">New page</a>Errores frecuentes
- No intentes contar coincidencias con JavaScript.
- No lo uses para comunicar información esencial.
Acciones y foco
Prueba puntero, pulsación y navegación por teclado sobre controles nativos.
:hover
Elementos señalados por un dispositivo apuntador.
Especificidad(0, 1, 0)
:hover
Comportamiento
- El estado cambia con el puntero real.
- En pantallas táctiles puede ser breve, ausente o persistente.
Ejemplos
button:hoverCoincide: <button>Save</button>Errores frecuentes
- No ocultes contenido esencial hasta hover.
- No equivale a foco.
:active
Elementos durante su activación.
Especificidad(0, 1, 0)
:active
Comportamiento
- Suele durar mientras se mantiene la pulsación.
- Puede aplicarse a botones y enlaces.
Ejemplos
button:activeCoincide: <button>Save</button>Errores frecuentes
- No significa la página actual.
- Su posición en la cascada importa.
:focus
El elemento que tiene foco.
Especificidad(0, 1, 0)
:focus
Comportamiento
- Puede originarse mediante puntero, teclado o script.
- Solo un elemento del documento suele tener foco a la vez.
Ejemplos
input:focusCoincide: <input aria-label="Search" />Errores frecuentes
- No elimines el indicador sin reemplazo visible.
- No selecciona automáticamente al contenedor.
:focus-visible
El elemento enfocado cuando el navegador decide mostrar indicación.
Especificidad(0, 1, 0)
:focus-visible
Comportamiento
- La modalidad de teclado suele activar la indicación.
- La heurística pertenece al navegador.
Ejemplos
button:focus-visibleCoincide: <button>Continue</button>Errores frecuentes
- No es simplemente focus tras pulsar Tab.
- No fuerces una simulación que contradiga la heurística.
Soporte y compatibilidad
Consulta el estado Baseline específico de :focus-visible.
:focus-within
Un elemento si él o un descendiente tiene foco.
Especificidad(0, 1, 0)
:focus-within
Comportamiento
- Permite resaltar grupos completos.
- Incluye descendientes en árboles shadow según la definición.
Ejemplos
label:focus-withinCoincide: <label>Search
<input />
</label>Errores frecuentes
- El sujeto es el contenedor, no el control.
- No sustituye el estilo de foco del control.
Soporte y compatibilidad
Consulta el estado Baseline específico de :focus-within.
URL y ámbito
Relaciona el fragmento activo y la raíz desde la que se evalúa una consulta.
:target
El elemento cuyo id coincide con el fragmento de la URL.
Especificidad(0, 1, 0)
:target
Comportamiento
- Cambia cuando cambia el hash.
- Puede no haber ningún destino.
Ejemplos
#details:target<a href="#details">Open</a>
Coincide: <section id="details">Details</section>Errores frecuentes
- No es un estado elegido libremente por CSS.
- El fragmento también afecta a navegación y scroll.
:scope
La raíz contextual de una consulta o regla con ámbito.
Especificidad(0, 1, 0)
:scope
Comportamiento
- En querySelector() representa el elemento desde el que se consulta.
- Permite exigir hijos directos de esa raíz.
Ejemplos
:scope > article<section><!-- query root -->
Coincide: <article>Direct</article>
<div><article>Nested</article></div>
</section>Errores frecuentes
- No equivale siempre a :root.
- Su sujeto depende del contexto de evaluación.
Soporte y compatibilidad
Consulta el estado Baseline de :scope en APIs de selectores.