Tengo un montón de elementos con un nombre de clase red
, pero parece que no puedo seleccionar el primer elemento class="red"
usando la siguiente regla CSS:
.red:first-child {
border: 5px solid red;
}
<p class="red"></p>
<div class="red"></div>
¿Qué hay de malo en este selector y cómo lo corrijo?
Gracias a los comentarios, descubrí que el elemento tiene que ser el primer hijo de su padre para ser seleccionado, que no es el caso que tengo. Tengo la siguiente estructura, y esta regla falla como se menciona en los comentarios:
.home .red:first-child {
border: 1px solid red;
}
<div class="home">
<span>blah</span>
<p class="red">first</p>
<p class="red">second</p>
<p class="red">third</p>
<p class="red">fourth</p>
</div>
¿Cómo puedo apuntar al primer niño con clase red
?
css
css-selectors
Rajat
fuente
fuente
:first-of-type
lo hace el trabajo.Respuestas:
Este es uno de los ejemplos más conocidos de autores que no entienden cómo
:first-child
funciona. Introducido en CSS2 , la:first-child
pseudoclase representa el primer hijo de su padre . Eso es. Existe una idea errónea muy común de que recoge cualquier elemento hijo que sea el primero en coincidir con las condiciones especificadas por el resto del selector compuesto. Debido a la forma en que funcionan los selectores (ver aquí una explicación), eso simplemente no es cierto.El nivel 3 de selectores introduce una
:first-of-type
pseudoclase , que representa el primer elemento entre hermanos de su tipo de elemento. Esta respuesta explica, con ilustraciones, la diferencia entre:first-child
y:first-of-type
. Sin embargo, al igual que con:first-child
, no considera otras condiciones o atributos. En HTML, el tipo de elemento está representado por el nombre de la etiqueta. En la pregunta, ese tipo esp
.Desafortunadamente, no hay una
:first-of-class
pseudoclase similar para hacer coincidir el primer elemento hijo de una clase dada. Una solución que Lea Verou y yo se nos ocurrió para esto (aunque de forma totalmente independiente) es aplicar primero los estilos deseados a todos sus elementos con esa clase:... luego "deshacer" los estilos para los elementos con la clase que viene después de la primera , usando el combinador general de hermanos
~
en una regla primordial:Ahora solo el primer elemento con
class="red"
tendrá un borde.Aquí hay una ilustración de cómo se aplican las reglas:
No se aplican reglas; No se representa ningún borde.
Este elemento no tiene la clase
red
, por lo que se omite.Solo se aplica la primera regla; se representa un borde rojo.
Este elemento tiene la clase
red
, pero no está precedido por ningún elemento con la clasered
en su elemento primario. Por lo tanto, la segunda regla no se aplica, solo la primera, y el elemento mantiene su borde.Ambas reglas se aplican; No se representa ningún borde.
Este elemento tiene la clase
red
. También está precedido por al menos otro elemento con la clasered
. Por lo tanto, se aplican ambas reglas, y la segundaborder
declaración anula la primera, "deshaciéndola", por así decirlo.Como beneficio adicional, aunque se introdujo en Selectores 3, el combinador de hermanos general está bastante bien soportado por IE7 y más reciente, a diferencia
:first-of-type
y:nth-of-type()
solo soportado por IE9 en adelante. Si necesita un buen soporte para el navegador, tiene suerte.De hecho, el hecho de que el combinador de hermanos es el único componente importante en esta técnica, y tiene un soporte de navegador tan sorprendente, hace que esta técnica sea muy versátil: puede adaptarlo para filtrar elementos por otras cosas, además de los selectores de clase:
Puede usar esto para evitar
:first-of-type
en IE7 e IE8, simplemente proporcionando un selector de tipo en lugar de un selector de clase (nuevamente, más sobre su uso incorrecto aquí en una sección posterior):Puedes filtrar por selectores de atributos o cualquier otro selector simple en lugar de clases.
También puede combinar esta técnica primordial con pseudoelementos aunque los pseudoelementos técnicamente no son simples selectores.
Tenga en cuenta que para que esto funcione, necesitará saber de antemano cuáles serán los estilos predeterminados para sus otros elementos hermanos para poder anular la primera regla. Además, dado que esto implica anular reglas en CSS, no puede lograr lo mismo con un solo selector para usar con la API de selectores o Selenium los localizadores CSS de .
Vale la pena mencionar que Selectores 4 introduce una extensión de la
:nth-child()
notación (originalmente una pseudoclase completamente nueva llamada:nth-match()
), que le permitirá usar algo como:nth-child(1 of .red)
en lugar de una hipótesis.red:first-of-class
. Al ser una propuesta relativamente reciente, todavía no hay suficientes implementaciones interoperables para que pueda utilizarse en los sitios de producción. Esperemos que esto cambie pronto. Mientras tanto, la solución alternativa que he sugerido debería funcionar para la mayoría de los casos.Tenga en cuenta que esta respuesta supone que la pregunta busca cada primer elemento secundario que tenga una clase determinada. No hay una pseudoclase ni una solución genérica de CSS para la enésima combinación de un selector complejo en todo el documento : si existe una solución depende en gran medida de la estructura del documento. jQuery proporciona
:eq()
,:first
,:last
y más para este propósito, pero de nuevo nota que funcionan de manera muy diferente a partir de:nth-child()
et al . Usando la API de selectores, puede usardocument.querySelector()
para obtener la primera coincidencia:O use
document.querySelectorAll()
con un indexador para elegir una coincidencia específica:Aunque la
.red:nth-of-type(1)
solución en la respuesta original aceptada por Philip Daubmeier funciona (que fue originalmente escrita por Martyn pero eliminada desde entonces), no se comporta de la manera que esperarías.Por ejemplo, si solo deseaba seleccionar el
p
en su marcado original:... entonces no puede usar
.red:first-of-type
(equivalente a.red:nth-of-type(1)
), porque cada elemento es el primero (y único) de su tipo (p
ydiv
respectivamente), por lo que ambos lo que el selector hará coincidir .Cuando el primer elemento de una determinada clase es también el primero de su tipo , la pseudoclase funcionará, pero esto solo sucede por coincidencia . Este comportamiento se demuestra en la respuesta de Philip. En el momento en que pegue un elemento del mismo tipo antes de este elemento, el selector fallará. Tomando el marcado actualizado:
Aplicar una regla con
.red:first-of-type
funcionará, pero una vez que agregue otrap
sin la clase:... el selector fallará inmediatamente, porque el primer
.red
elemento ahora es el segundop
elemento.fuente
:last-of-class
? Seleccione el último elemento de una clase.general sibling selector ~
funciona como un:not(:first-of-*)
para un tipo específico, supongo que debe aplicar la regla a cada elemento coincidente, pero se aplica solo para la primera coincidencia, incluso cuando hay 3 o más coincidencias posibles.:nth-child(1 of .foo)
extensión ya se ha implementado en Safari 9.1+. (No he comprobado sin embargo)El
:first-child
selector está destinado, como su nombre lo indica, para seleccionar el primer elemento secundario de una etiqueta principal. Los hijos deben estar incrustados en la misma etiqueta principal. Su ejemplo exacto funcionará (solo lo probé aquí ):¿Quizás haya anidado sus etiquetas en diferentes etiquetas principales? ¿Son sus etiquetas de clase
red
realmente las primeras etiquetas debajo del padre?Tenga en cuenta también que esto no solo se aplica a la primera etiqueta de este tipo en todo el documento, pero cada vez que se envuelve un nuevo padre, como:
first
ythird
será rojo entonces.Actualizar:
No sé por qué Martin eliminó su respuesta, pero tenía la solución, el
:nth-of-type
selector:Créditos a Martyn . Más información, por ejemplo, aquí . Tenga en cuenta que este es un selector CSS 3, por lo tanto, no todos los navegadores lo reconocerán (por ejemplo, IE8 o anterior).
fuente
:nth-of-type
el pequeño problema de no funcionar en ninguna versión actual de IE..red:nth-of-type(1)
seleccionará cualquier elemento que (a) sea el primer hijo de su tipo de elemento, y (b) tenga la clase "rojo". Entonces, si en el ejemplo, el primer <p> no tuviera la clase "rojo", no se seleccionaría. Alternativamente, si el <span> y el primer <p> ambos tenían la clase "rojo", ambos serían seleccionados. jsfiddle.net/fvAxn:first-of-type
es equivalente a:nth-of-type(1)
, por lo que, por supuesto, también funciona. También puede fallar, de la misma manera, por la misma razón establecida en mi respuesta.:nth-of-type
significa "elemento / etiqueta" cuando dice "tipo". Por lo tanto, solo considera el elemento, no cosas como las clases.La respuesta correcta es:
Parte I: Si el elemento es primero a su padre y tiene la clase "rojo", obtendrá un borde.
Parte II: Si el elemento ".red" no es el primero de su padre, sino que sigue inmediatamente a un elemento sin la clase ".red", también merece el honor de dicho borde.
Violín o no sucedió.
La respuesta de Philip Daubmeier, aunque aceptada, no es correcta; vea el violín adjunto.
La respuesta de BoltClock funcionaría, pero define y sobrescribe estilos innecesariamente
(particularmente un problema donde de lo contrario heredaría un borde diferente; no desea declarar otro al borde: ninguno)
EDITAR: en el caso de que tenga "rojo" después de no rojo varias veces, cada "primero" rojo obtendrá el borde. Para evitar eso, uno necesitaría usar la respuesta de BoltClock. Ver violín
fuente
.red
Sigue a un:not(.red)
no siempre lo hace el primero.red
entre sus hermanos. Y si el borde necesita ser heredado, es simplemente una cuestión de declarar enborder: inherit
lugar deborder: none
en la regla de anulación.first-child
alast-child
, pero veo después de probar que esto no siempre funciona.podrías usar
first-of-type
onth-of-type(1)
fuente
<p></p>
intermedio entrespan
y su primerp
elemento conred
clase. Mira este JSFiddle .Las respuestas anteriores son demasiado complejas.
Esto seleccionará el primer tipo de clase. Fuente MDN
fuente
first-type
se ha cambiado el nombre afirst-of-type
<span>
, y algunos tienen la clasehighlight
. El.highlight:first-of-type
selector seleccionará la primera instancia del "tipo" con la clase seleccionada, en este ejemplo la primera<span>
, y no la primera instancia de la clasehighlight
. Solo si esa primera instancia de span también tiene el resaltado de clase, se implementará el estilo. ( codepen.io/andrewRmillar/pen/poJKJdJ )Para que coincida con su selector, el elemento debe tener un nombre de clase
red
y debe ser el primer hijo de su padre.fuente
Como las otras respuestas cubren lo que está mal , intentaré la otra mitad, cómo solucionarlo. Desafortunadamente, no sé si tienes una solución de CSS aquí, al menos no que se me ocurra . Sin embargo, hay otras opciones ...
Asigne una
first
clase al elemento cuando lo genere, así:CSS:
Este CSS solo coincide con elementos con ambos
first
yred
clases.Alternativamente, haga lo mismo en JavaScript, por ejemplo, esto es lo que jQuery usaría para hacer esto, usando el mismo CSS que el anterior:
fuente
:first-of-class
, también sugeriría agregar una clase adicional al primer elemento. Parece la solución más fácil por ahora.Tengo este en mi proyecto.
fuente
De acuerdo a su problema actualizado
qué tal si
Esto seleccionará la clase de inicio , luego el elemento span y finalmente todos los elementos .red que se colocan inmediatamente después de los elementos span.
Referencia: http://www.w3schools.com/cssref/css_selectors.asp
fuente
Puede usar nth-of-type (1) pero asegúrese de que el sitio no necesite admitir IE7, etc., si este es el caso, use jQuery para agregar la clase de cuerpo, luego encuentre el elemento a través de la clase de cuerpo de IE7 y luego el nombre del elemento, luego agregue en el enésimo estilo infantil.
fuente
Puede cambiar su código a algo como esto para que funcione
Esto hace el trabajo por ti
Aquí hay una referencia CSS de SnoopCode sobre eso.
fuente
Estoy usando CSS a continuación para tener una imagen de fondo para la lista ul li
fuente
Prueba esto :
fuente
Por alguna razón, ninguna de las respuestas anteriores parecía abordar el caso del primer y único primer hijo del padre.
Todas las respuestas anteriores fallarán si desea aplicar el estilo solo al hijo de primera clase dentro de este código.
fuente
:first-child
pseudoclase es engañoso, ya que agregarlo.class_name
antes de que no cambie la forma en que funciona y simplemente lo hace actuar como un filtro. Si tiene un div antes,<div class="class_name">First content that need to be styled</div>
entonces su selector no coincidiría, ya que no es el primer hijo real.Prueba esto simple y efectivo
fuente
Creo que usando el selector relativo
+
para seleccionar elementos colocados inmediatamente después, funciona mejor aquí (como pocos sugirieron antes).También es posible para este caso usar este selector
pero este es el selector de elementos, no el de clase uno.
Aquí tiene una buena lista de selectores CSS: https://kolosek.com/css-selectors/
fuente
Prueba esta solución:
Enlace CodePen
fuente