Le signe plus ( +
) est pour le prochain frère.
Y a-t-il un équivalent pour le frère précédent?
css
css-selectors
Jourkey
la source
la source
Réponses:
Non, il n'y a pas de sélecteur "frère précédent".
Sur une note connexe,
~
est pour le frère successeur général (ce qui signifie que l'élément vient après celui-ci, mais pas nécessairement immédiatement après) et est un sélecteur CSS3.+
est pour le prochain frère et est CSS2.1.Voir Combinateur frère adjacent des sélecteurs de niveau 3 et 5.7 Sélecteurs frère adjacent des feuilles de style en cascade, niveau 2, révision 2 (CSS 2.1) .
la source
J'ai trouvé un moyen de styliser tous les frères et sœurs précédents (à l'opposé de
~
) qui peuvent fonctionner selon ce dont vous avez besoin.Supposons que vous ayez une liste de liens et que lorsque vous passez la souris dessus, tous les précédents devraient devenir rouges. Vous pouvez le faire comme ceci:
la source
float:right
). Cela a nécessité un effondrement des espaces blancs entre les unités / mots et le remplissage au lieu des marges, mais cela fonctionne parfaitement sinon!Sélecteurs de niveau 4 introduit
:has()
(auparavant l'indicateur de sujet!
) qui vous permettra de sélectionner un frère précédent avec:… Mais au moment de la rédaction de ce document, la distance est au-delà du bord de saignement pour la prise en charge du navigateur.
la source
:has()
pseudo-classe.Considérez la
order
propriété des dispositions de flexion et de grille.Je vais me concentrer sur flexbox dans les exemples ci-dessous, mais les mêmes concepts s'appliquent à Grid.
Avec flexbox, un sélecteur de frère précédent peut être simulé.
En particulier, la
order
propriété flex peut déplacer des éléments autour de l'écran.Voici un exemple:
PAS
Faites
ul
un récipient flexible.Inversez l'ordre des frères et sœurs dans la majoration.
Utilisez un sélecteur frère pour cibler l'élément A (
~
ou+
fera l'affaire).Utilisez la
order
propriété flex pour restaurer l'ordre des frères et sœurs sur l'affichage visuel.... et voilà! Un ancien sélecteur de frères et sœurs est né (ou du moins simulé).
Voici le code complet:
De la spécification flexbox:
La première
order
valeur pour tous les éléments flexibles est 0.Voir également
order
dans la spécification CSS Grid Layout .Exemples de "sélecteurs de frères précédents" créés avec la
order
propriété flex .jsFiddle
Une note latérale - Deux croyances obsolètes sur CSS
Flexbox brise les croyances de longue date sur CSS.
L'une de ces croyances est qu'un sélecteur de frère précédent n'est pas possible en CSS .
Dire que cette croyance est répandue serait un euphémisme. Voici un échantillon de questions connexes sur Stack Overflow seul:
Comme décrit ci-dessus, cette croyance n'est pas entièrement vraie. Un sélecteur frère précédent peut être simulé en CSS à l'aide de la
order
propriété flex .Le
z-index
mytheUne autre croyance de longue date est que
z-index
ne fonctionne que sur les éléments positionnés.En fait, la version la plus récente de la spécification - le projet de l'éditeur du W3C - affirme toujours que cela est vrai:
En réalité, cependant, ces informations sont obsolètes et inexactes.
Les éléments qui sont des éléments flexibles ou des éléments de grille peuvent créer des contextes d'empilement même lorsqu'ils le
position
sontstatic
.Voici une démonstration du
z-index
travail sur des éléments flex non positionnés: https://jsfiddle.net/m0wddwxs/la source
order
propriété n'est pas une solution car elle est uniquement destinée à modifier l' ordre visuel , elle ne restaure donc pas l' ordre sémantique d' origine que vous êtes obligé de modifier en HTML pour que cette solution de contournement fonctionne.z-index
cela fonctionnera, même lorsque "omg, il n'y a pasposition
spécifié!", La spécification mentionne le concept de contexte d'empilement , qui est bien expliqué par cet article sur MDNfloat: right
(ou tout autre moyen pour inverser l'ordre, quiflex/order
a peu (le moins?) D'effets secondaires). Fouetté deux violons: démonstration de l'float: right
approche et démonstrationdirection: rtl
J'avais la même question, mais ensuite j'ai eu un moment "duh". Au lieu d'écrire
écrire
Évidemment, cela correspond à "x" au lieu de "y", mais il répond au "y a-t-il une correspondance?" question, et une simple traversée DOM peut vous amener au bon élément plus efficacement que de boucler en javascript.
Je me rends compte que la question d'origine était une question CSS, donc cette réponse est probablement complètement hors de propos, mais d'autres utilisateurs Javascript peuvent tomber sur la question via la recherche comme je l'ai fait.
la source
y ~ x
résoudre mon problèmey ~ x
ne répond pas "y a-t-il une correspondance?" question, parce que les deux sélecteurs donnés ici signifient des choses complètement différentes. Il n'y a aucun moyen dey ~ x
produire une correspondance avec le sous-arbre<root><x/><y/></root>
par exemple. Si la question est "existe-t-il?" alors le sélecteur est simplementy
. Si la question est "y existe-t-il étant donné un frère x dans une position arbitraire?" alors vous auriez besoin des deux sélecteurs. (Bien que je sois peut-être en train de taquiner à ce stade ...)Deux astuces . Fondamentalement, inverser l'ordre HTML de vos éléments souhaités en HTML et utiliser l' opérateur
~
Next siblings :float-right
+ inverser l'ordre des éléments HTMLParent avec
direction: rtl;
+ inverse l'ordre des éléments internesla source
Vous pouvez utiliser les deux sélecteurs de haches :
!
et?
Il y a 2 sélecteurs de frères et sœurs subséquents en CSS conventionnel:
+
est l' immédiat sélecteur frère / sœur suivant~
est le tout sélecteur de fratrie ultérieurEn CSS conventionnel, il n'y a pas de sélecteur de frère précédent .
Cependant, dans la bibliothèque de post-processeur ax ax CSS, il y a 2 sélecteurs frères précédents :
?
est le sélecteur frère immédiat immédiat (opposé à+
)!
est le tout sélecteur de frère précédent ( à l' opposé de~
)Exemple de travail:
Dans l'exemple ci-dessous:
.any-subsequent:hover ~ div
sélectionne toutdiv
.immediate-subsequent:hover + div
sélectionne le suivant immédiatdiv
.any-previous:hover ! div
sélectionne tout précédentdiv
.immediate-previous:hover ? div
sélectionne le précédent immédiatdiv
la source
Une autre solution flexbox
Vous pouvez utiliser l'ordre inverse des éléments en HTML. Ensuite, en plus d'utiliser
order
comme dans la réponse de Michael_B, vous pouvez utiliserflex-direction: row-reverse;
ouflex-direction: column-reverse;
fonction de votre mise en page.Échantillon de travail:
la source
Il n'y a aucun moyen officiel de le faire pour le moment mais vous pouvez utiliser une petite astuce pour y parvenir! N'oubliez pas qu'il est expérimental et qu'il a des limites ... (vérifiez ce lien si vous vous inquiétez de la compatibilité du navigateur)
Ce que vous pouvez faire, c'est utiliser un sélecteur CSS3: la pseudo classe appelée
nth-child()
Limites
la source
:nth-child(-n+4)
est une pseudo-classe qui doit être appliquée à un sélecteur pour fonctionner correctement. Si vous n'êtes pas convaincu, essayez de l'expérimenter à l'aide d'une fourchette de mon violon et vous verrez qu'il ne fonctionne pas*
sélecteur, mais c'est une mauvaise pratique odieuse.li#someListItem
et je voulais le ou les nœuds juste avant (c'est ainsi que j'interprète "précédent") - Je ne vois pas comment les informations que vous avez fournies peuvent m'aider à exprimer cela via CSS. Vous sélectionnez simplement les n premiers frères et sœurs, et supposez que je connais le n. Sur la base de cette logique, n'importe quel sélecteur peut faire l'affaire et sélectionner les éléments dont j'ai besoin (tels que: not ()).Si vous connaissez la position exacte, une
:nth-child()
exclusion basée sur tous les frères et sœurs suivants fonctionnerait.Qui sélectionnerait tous les
li
s avant le 3ème (par exemple 1er et 2ème). Mais, à mon avis, cela semble moche et a un cas d'utilisation très serré.Vous pouvez également sélectionner le nième enfant de droite à gauche:
Ce qui fait la même chose.
la source
Non, ce n'est pas possible via CSS. Il prend à cœur la "Cascade" ;-).
Cependant, si vous pouvez ajouter JavaScript à votre page, un peu de jQuery pourrait vous permettre d'atteindre votre objectif final.
Vous pouvez utiliser jQuery
find
pour effectuer une "anticipation" sur votre élément / classe / id cible, puis revenir en arrière pour sélectionner votre cible.Ensuite, vous utilisez jQuery pour réécrire le DOM (CSS) pour votre élément.
Sur la base de cette réponse de Mike Brant , l'extrait de code jQuery suivant pourrait vous aider.
Cette première sélectionne tous les
<ul>
s qui suivent immédiatement a<p>
.Ensuite, il "revient en arrière" pour sélectionner tous les
<p>
s précédents de cet ensemble de<ul>
s.En effet, "frère précédent" a été sélectionné via jQuery.
Maintenant, utilisez la
.css
fonction pour passer vos nouvelles valeurs CSS pour cet élément.Dans mon cas, je cherchais un moyen de sélectionner un DIV avec l'id
#full-width
, mais UNIQUEMENT s'il avait un DIV descendant (indirect) avec la classe de.companies
.J'avais le contrôle de tout le HTML sous
.companies
, mais je ne pouvais pas modifier le HTML au-dessus.Et la cascade ne va que dans un sens: vers le bas.
Ainsi, je pouvais sélectionner TOUS les
#full-width
s.Ou je pourrais sélectionner
.companies
qui a seulement suivi a#full-width
.Mais je ne pouvais pas sélectionner uniquement les
#full-width
s qui se déroulaient.companies
.Et, encore une fois, je n'ai pas pu ajouter
.companies
plus haut dans le HTML. Cette partie du code HTML a été écrite en externe et a enveloppé notre code.Mais avec jQuery, je peux sélectionner les
#full-width
s requis , puis attribuer le style approprié:Cela trouve tout
#full-width .companies
, et sélectionne seulement ceux-ci.companies
, de la même manière que les sélecteurs sont utilisés pour cibler des éléments spécifiques en standard en CSS.Ensuite, il utilise
.parents
pour "revenir en arrière" et sélectionner TOUS les parents de.companies
,mais filtre ces résultats pour ne conserver que les
#fill-width
éléments, de sorte qu'à la fin,il ne sélectionne un
#full-width
élément que s'il a un.companies
descendant de classe.Enfin, il attribue une nouvelle
width
valeur CSS ( ) à l'élément résultant.Documents de référence jQuery:
$ () ou jQuery () : élément DOM.
. find : récupère les descendants de chaque élément dans l'ensemble actuel d'éléments correspondants, filtré par un sélecteur, un objet jQuery ou un élément.
. parents : Obtenez le frère immédiatement précédent de chaque élément dans l'ensemble des éléments correspondants. Si un sélecteur est fourni, il ne récupère le frère précédent que s'il correspond à ce sélecteur (filtre les résultats pour n'inclure que les éléments / sélecteurs répertoriés).
. css : définissez une ou plusieurs propriétés CSS pour l'ensemble des éléments correspondants.
la source
previousElementSibling
).previousElementSibling()
pour ceux qui connaissent mieux les fonctions natives de JS DOM pourraient fournir un autre chemin non CSS vers l'avant.+
sélecteur (inexistant) que l'OP a spécifiquement demandé. Considérez cette réponse comme un "hack" JS. C'est là pour faire gagner du temps à quelqu'un d'autre pour trouver une solution.Il n'y a malheureusement pas de sélecteur de frère "précédent", mais vous pouvez éventuellement encore obtenir le même effet en utilisant le positionnement (par exemple le droit à flotteur). Cela dépend de ce que vous essayez de faire.
Dans mon cas, je voulais un système de notation 5 étoiles principalement CSS. Il faudrait que je colorie (ou permute l'icône) des étoiles précédentes. En flottant chaque élément à droite, j'obtiens essentiellement le même effet (le html pour les étoiles doit donc être écrit «à l'envers»).
J'utilise FontAwesome dans cet exemple et permute entre les unicodes de fa-star-o et fa-star http://fortawesome.github.io/Font-Awesome/
CSS:
HTML: (40)
JSFiddle: http://jsfiddle.net/andrewleyva/88j0105g/
la source
+
ou les~
sélecteurs me semblent être le travail le plus propre qui soit.Selon votre objectif exact, il existe un moyen de réaliser l'utilité d'un sélecteur de parents sans en utiliser un (même s'il en existait un) ...
Disons que nous avons:
Que pouvons-nous faire pour que le bloc de chaussettes (y compris les couleurs de chaussettes) se démarque visuellement en utilisant l'espacement?
Ce qui serait bien mais n'existe pas:
Ce qui existe:
Cela définit tous les liens d'ancrage pour avoir une marge de 15 pixels en haut et la réinitialise à 0 pour ceux sans éléments UL (ou autres balises) à l'intérieur des LI.
la source
J'avais besoin d'une solution pour sélectionner le frère précédent tr. J'ai trouvé cette solution en utilisant des composants React et Styled. Ce n'est pas ma solution exacte (c'est de mémoire, des heures plus tard). Je sais qu'il y a une faille dans la fonction setHighlighterRow.
OnMouseOver une ligne définira l'index de ligne à l'état et rendra la ligne précédente avec une nouvelle couleur d'arrière-plan
la source
Il n'y a pas, et il y a .
Si vous devez placer l'étiquette avant l'entrée, au lieu de la placer après l'entrée, conservez à la fois l'étiquette et l'entrée dans un div et stylisez le div comme suit:
Vous pouvez maintenant appliquer les options de style frère suivant standard disponibles dans css, et cela apparaîtra comme si vous utilisiez un style frère précédent.
la source
J'ai eu un problème similaire et j'ai découvert que tous les problèmes de cette nature peuvent être résolus comme suit:
et de cette façon, vous pourrez styliser vos éléments actuels et précédents (tous les éléments remplacés par les éléments actuels et suivants) et vos prochains éléments.
exemple:
J'espère que cela aide quelqu'un.
la source