El signo más ( +
) es para el próximo hermano.
¿Hay un equivalente para el hermano anterior?
css
css-selectors
Jourkey
fuente
fuente
Respuestas:
No, no hay un selector de "hermano anterior".
En una nota relacionada,
~
es para el hermano sucesor general (lo que significa que el elemento viene después de este, pero no necesariamente inmediatamente después) y es un selector CSS3.+
es para el próximo hermano y es CSS2.1.Consulte Combinador de hermanos adyacentes de los selectores Nivel 3 y 5.7 Selectores de hermanos adyacentes de la Especificación de revisión de nivel 2 de hojas de estilo en cascada 2 (CSS 2.1) .
fuente
Encontré una forma de diseñar todos los hermanos anteriores (opuestos a
~
) que pueden funcionar dependiendo de lo que necesites.Supongamos que tiene una lista de enlaces y al pasar el mouse sobre uno, todos los anteriores deberían volverse rojos. Puedes hacerlo así:
fuente
float:right
). Sí requirió un colapso de espacio en blanco entre unidades / palabras y relleno en lugar de márgenes, ¡pero funciona perfectamente de lo contrario!Se presenta el selector de nivel 4
:has()
(anteriormente el indicador de sujeto!
) que le permitirá seleccionar un hermano anterior con:... pero al momento de escribir, está a cierta distancia más allá del límite de la compatibilidad con el navegador.
fuente
:has()
pseudoclase.Considere la
order
propiedad de los diseños flex y grid.Me centraré en flexbox en los ejemplos a continuación, pero los mismos conceptos se aplican a Grid.
Con flexbox, se puede simular un selector de hermanos anterior.
En particular, la
order
propiedad flex puede mover elementos alrededor de la pantalla.Aquí hay un ejemplo:
PASOS
Haz
ul
un contenedor flexible.Invierta el orden de los hermanos en el marcado.
Use un selector de hermanos para seleccionar el Elemento A (
~
o+
lo hará).Use la
order
propiedad flex para restaurar el orden de los hermanos en la pantalla visual....¡y voilá! Nace un selector de hermanos anterior (o al menos simulado).
Aquí está el código completo:
De la especificación flexbox:
El
order
valor inicial para todos los elementos flexibles es 0.Ver también
order
en la especificación de diseño de cuadrícula CSS .Ejemplos de "selectores hermanos anteriores" creados con la
order
propiedad flex .jsFiddle
Una nota al margen - Dos creencias obsoletas sobre CSS
Flexbox está destruyendo creencias arraigadas sobre CSS.
Una de esas creencias es que un selector de hermano anterior no es posible en CSS .
Decir que esta creencia es generalizada sería un eufemismo. Aquí hay una muestra de preguntas relacionadas con Stack Overflow solo:
Como se describió anteriormente, esta creencia no es del todo cierta. Un selector de hermanos anterior se puede simular en CSS utilizando la
order
propiedad flex .El
z-index
mitoOtra creencia de larga data ha sido que
z-index
solo funciona en elementos posicionados.De hecho, la versión más actual de la especificación, el Borrador del Editor del W3C , aún afirma que esto es cierto:
En realidad, sin embargo, esta información es obsoleta e inexacta.
Los elementos que son elementos flexibles o elementos de cuadrícula pueden crear contextos de apilamiento incluso cuando
position
es asístatic
.Aquí hay una demostración de cómo
z-index
trabajar en elementos flexibles no posicionados: https://jsfiddle.net/m0wddwxs/fuente
order
propiedad no es una solución, ya que está destinada únicamente a cambiar el orden visual , por lo que no restaura el orden semántico original que se ve obligado a cambiar en HTML para que funcione esta solución alternativa.z-index
funcionará, incluso cuando "¡Dios mío, no seposition
especifica!", La especificación menciona el concepto de contexto de apilamiento , que se explica muy bien en este artículo sobre MDNfloat: right
(o cualquier otro medio para revertir el orden, de los cualesflex/order
tiene pocos (¿menos?) Efectos secundarios). Batió dos violines: demostrando elfloat: right
enfoque y demostrandodirection: rtl
Tenía la misma pregunta, pero luego tuve un "duh" momento. En lugar de escribir
escribir
Obviamente, esto coincide con "x" en lugar de "y", pero responde "¿hay una coincidencia?" pregunta, y el simple recorrido del DOM puede llevarlo al elemento correcto de manera más eficiente que hacer un bucle en JavaScript.
Me doy cuenta de que la pregunta original era una pregunta de CSS, por lo que esta respuesta probablemente sea completamente irrelevante, pero otros usuarios de Javascript pueden tropezar con la pregunta a través de la búsqueda como lo hice yo.
fuente
y ~ x
podría resolver mi problemay ~ x
no responde "¿hay una coincidencia?" pregunta, porque los dos selectores dados aquí significan cosas completamente diferentes. No hay forma de quey ~ x
pueda producir una coincidencia dado el subárbol,<root><x/><y/></root>
por ejemplo. Si la pregunta es "¿existe y?" entonces el selector es simplementey
. Si la pregunta es "¿existe y dado un hermano x en alguna posición arbitraria?" entonces necesitarías ambos selectores. (Aunque tal vez solo estoyDos trucos . Básicamente, invierte el orden HTML de tus elementos deseados en HTML y usa el operador
~
Hermanos siguientes :float-right
+ invertir el orden de los elementos HTMLPadre con
direction: rtl;
+ invertir el orden de los elementos internosfuente
Puede usar los dos selectores de hacha :
!
y?
Hay 2 selectores hermanos posteriores en CSS convencional:
+
es el selector de hermano posterior inmediato~
es la de cualquier selector de hermanos subsecuenteEn CSS convencional, no hay un selector de hermanos anterior .
Sin embargo, en la biblioteca de postprocesador CSS de ax , hay 2 selectores hermanos anteriores :
?
es el selector de hermano anterior inmediato (opuesto a+
)!
es el cualquier selector hermano anterior (opuesto~
)Ejemplo de trabajo
En el siguiente ejemplo:
.any-subsequent:hover ~ div
selecciona cualquier posteriordiv
.immediate-subsequent:hover + div
selecciona el subsiguiente inmediatodiv
.any-previous:hover ! div
selecciona cualquier anteriordiv
.immediate-previous:hover ? div
selecciona el previo inmediatodiv
fuente
Otra solución flexbox
Puede usar el orden inverso de los elementos en HTML. Luego, además de usar
order
como en la respuesta de Michael_B, puede usarflex-direction: row-reverse;
oflex-direction: column-reverse;
según su diseño.Muestra de trabajo:
fuente
No hay una forma oficial de hacerlo en este momento, ¡pero puedes usar un pequeño truco para lograrlo! Recuerde que es experimental y tiene algunas limitaciones ... (consulte este enlace si le preocupa la compatibilidad del navegador)
Lo que puedes hacer es usar un selector CSS3: la pseudoclase llamada
nth-child()
Limitaciones
fuente
:nth-child(-n+4)
es una pseudo clase que debe aplicarse a un selector para que funcione correctamente. Si no está convencido, intente experimentarlo con un tenedor de mi violín y verá que no funciona*
selector, pero es una práctica desagradable.li#someListItem
y quería los nodos justo antes (que es como interpreto "anterior"). No veo cómo la información que proporcionó puede ayudarme a expresar eso a través de CSS. Solo estás seleccionando los primeros n hermanos, y supones que sé el n. Según esta lógica, cualquier selector puede hacer el truco y seleccionar los elementos que necesito (como: not ()).Si conoce la posición exacta, funcionaría una
:nth-child()
exclusión basada en todos los siguientes hermanos.Que seleccionaría todas las
li
s antes de la 3ra (por ejemplo, 1ra y 2da). Pero, en mi opinión, esto se ve feo y tiene un caso de uso muy estricto.También puede seleccionar el enésimo hijo de derecha a izquierda:
Que hace lo mismo.
fuente
No. No es posible a través de CSS. Lleva la "Cascada" al corazón ;-).
Sin embargo, si puede agregar JavaScript a su página, un poco de jQuery podría llevarlo a su objetivo final.
Puede usar jQuery's
find
para realizar una "anticipación" en su elemento / clase / id de destino, luego retroceder para seleccionar su objetivo.Luego usa jQuery para reescribir el DOM (CSS) para su elemento.
Según esta respuesta de Mike Brant , el siguiente fragmento de jQuery podría ayudar.
Esto primero selecciona todos los correos
<ul>
electrónicos que siguen inmediatamente a<p>
.Luego "retrocede" para seleccionar todos los
<p>
s anteriores de ese conjunto de<ul>
s.Efectivamente, se ha seleccionado "hermano anterior" a través de jQuery.
Ahora, use la
.css
función para pasar sus nuevos valores CSS para ese elemento.En mi caso, estaba buscando encontrar una manera de seleccionar un DIV con la identificación
#full-width
, pero SOLO si tenía un DIV descendiente (indirecto) con la clase de.companies
.Tenía el control de todo el HTML debajo
.companies
, pero no pude alterar ninguno de los HTML anteriores.Y la cascada solo va en 1 dirección: hacia abajo.
Por lo tanto, podría seleccionar TODOS
#full-width
s.O podría seleccionar
.companies
que solo siguiera a#full-width
.Pero podría no seleccionar sólo
#full-width
de que procedieron.companies
.Y, de nuevo, no pude agregar
.companies
más arriba en el HTML. Esa parte del HTML se escribió externamente y envolvió nuestro código.Pero con jQuery, puedo seleccionar los
#full-width
s requeridos y luego asignar el estilo apropiado:Esto encuentra todo
#full-width .companies
y selecciona solo esos.companies
, de forma similar a cómo se usan los selectores para apuntar a elementos específicos en estándar en CSS.Luego se usa
.parents
para "retroceder" y seleccionar TODOS los padres de.companies
,pero filtra esos resultados para mantener solo
#fill-width
elementos, de modo que al final,solo selecciona un
#full-width
elemento si tiene un.companies
descendiente de clase.Finalmente, asigna un nuevo
width
valor CSS ( ) al elemento resultante.Documentos de referencia de jQuery:
$ () o jQuery () : elemento DOM.
. find : obtiene los descendientes de cada elemento en el conjunto actual de elementos coincidentes, filtrados por un selector, un objeto jQuery o un elemento.
. padres : Obtenga el hermano inmediatamente anterior de cada elemento en el conjunto de elementos coincidentes. Si se proporciona un selector, recupera el hermano anterior solo si coincide con ese selector (filtra los resultados para incluir solo los elementos / selectores enumerados).
. css : establece una o más propiedades CSS para el conjunto de elementos coincidentes.
fuente
previousElementSibling
).previousElementSibling()
para aquellos más familiarizados con las funciones nativas de JS DOM podrían proporcionar otra ruta hacia adelante que no sea CSS.+
selector (inexistente) que el OP solicitó específicamente. Considera esta respuesta como un "hack" de JS. Está aquí para ahorrarle a alguien el tiempo que pasé para encontrar una solución.No hay ningún selector "anterior" hermanos por desgracia, pero se puede , posiblemente, aún así obtener el mismo efecto mediante el uso de posicionamiento (por ejemplo el derecho de flotación). Depende de lo que estés tratando de hacer.
En mi caso, quería un sistema de calificación de 5 estrellas CSS principalmente. Necesitaría colorear (o intercambiar el ícono) de las estrellas anteriores. Al flotar cada elemento a la derecha, esencialmente obtengo el mismo efecto (por lo tanto, el html para las estrellas debe escribirse 'al revés').
Estoy usando FontAwesome en este ejemplo y cambio entre los unicodes de fa-star-o y fa-star http://fortawesome.github.io/Font-Awesome/
CSS:
HTML: (40)
JSFiddle: http://jsfiddle.net/andrewleyva/88j0105g/
fuente
+
o los~
selectores me parecen el trabajo más limpio.Dependiendo de su objetivo exacto, hay una manera de lograr la utilidad de un selector principal sin usar uno (incluso si existiera uno) ...
Digamos que tenemos:
¿Qué podemos hacer para que el bloque Socks (incluidos los colores de los calcetines) se destaque visualmente usando el espaciado?
Lo que sería bueno pero no existe:
¿Qué existe?
Esto establece que todos los enlaces de anclaje tengan un margen de 15 píxeles en la parte superior y lo restablece a 0 para aquellos sin elementos UL (u otras etiquetas) dentro de las LI.
fuente
Necesitaba una solución para seleccionar el hermano anterior tr. Se me ocurrió esta solución usando React y Styled-components. Esta no es mi solución exacta (esto es de memoria, horas después). Sé que hay una falla en la función setHighlighterRow.
OnMouseOver una fila establecerá el índice de fila en estado y volverá a procesar la fila anterior con un nuevo color de fondo
fuente
No hay y hay .
Si debe colocar la etiqueta antes de la entrada, en su lugar, coloque la etiqueta después de la entrada, mantenga la etiqueta y la entrada dentro de un div, y estilice el div de la siguiente manera:
Ahora puede aplicar las siguientes opciones de estilo estándar para hermanos disponibles en css, y parecerá que está utilizando un estilo de hermano anterior.
fuente
Tuve un problema similar y descubrí que todos los problemas de esta naturaleza se pueden resolver de la siguiente manera:
y de esta manera podrá diseñar sus elementos anteriores actuales (todos los elementos anulados con los elementos actuales y siguientes) y sus elementos siguientes.
ejemplo:
Espero que ayude a alguien.
fuente