Pourquoi mon jQuery :non() sélecteur de ne pas travailler en CSS?
J'ai cette mise en page:
<div id="sectors">
<h1>Sectors</h1>
<div id="s7-1103" class="alpha"></div>
<div id="s8-1104" class="alpha"></div>
<div id="s1-7605" class="beta"></div>
<div id="s0-7479"></div>
<div id="s2-6528" class="gamma"></div>
<div id="s0-4444"></div>
</div>
Avec ces règles CSS:
#sectors {
width: 584px;
background-color: #ffd;
margin: 1.5em;
border: 4px dashed #000;
padding: 16px;
overflow: auto;
}
#sectors > h1 {
font-size: 2em;
font-weight: bold;
text-align: center;
}
#sectors > div {
float: left;
position: relative;
width: 180px;
height: 240px;
margin: 16px 0 0 16px;
border-style: solid;
border-width: 2px;
}
#sectors > div::after {
display: block;
position: absolute;
width: 100%;
bottom: 0;
font-weight: bold;
text-align: center;
text-transform: capitalize;
background-color: rgba(255, 255, 255, 0.8);
border-top: 2px solid;
content: attr(id) ' - ' attr(class);
}
#sectors > div:nth-of-type(3n+1) {
margin-left: 0;
}
#sectors > div.alpha { color: #b00; background-color: #ffe0d9; }
#sectors > div.beta { color: #05b; background-color: #c0edff; }
#sectors > div.gamma { color: #362; background-color: #d4f6c3; }
J'utilise jQuery pour ajouter le unassigned
classe pour les secteurs qui ne sont pas autrement l'une des classes alpha
, beta
ou gamma
:
$('#sectors > div:not(.alpha, .beta, .gamma)').addClass('unassigned');
Puis j'applique quelques règles différentes à cette classe:
#sectors > div.unassigned {
color: #808080;
background-color: #e9e9e9;
opacity: 0.5;
}
#sectors > div.unassigned::after {
content: attr(id) ' - Unassigned';
}
#sectors > div.unassigned:hover {
opacity: 1.0;
}
Et tout fonctionne parfaitement dans les navigateurs modernes.
Mais, voyant que le :non()
sélecteur jQuery est basé sur :non()
en CSS3, je pensais que je pouvais passer directement dans ma feuille de style, donc je n'aurais pas à compter sur l'ajout d'une classe supplémentaire à l'aide de jQuery. D'ailleurs, je ne suis pas vraiment intéressée à soutenir les anciennes versions d'IE et d'autres navigateurs ont un excellent support pour la :not()
sélecteur.
J'ai donc essayer de changer de .unassigned
partie au-dessus de cela (sachant que je n'aurai que des secteurs Α, Β et Γ dans ma mise en page):
#sectors > div:not(.alpha, .beta, .gamma) {
color: #808080;
background-color: #e9e9e9;
opacity: 0.5;
}
#sectors > div:not(.alpha, .beta, .gamma)::after {
content: attr(id) ' - Unassigned';
}
#sectors > div:not(.alpha, .beta, .gamma):hover {
opacity: 1.0;
}
Mais dès que j'ai ce faire, il s'arrête de travailler dans tous les navigateurs! Mon non affecté secteurs ne sont pas grisé, disparu ou étiquetés "non affecté" plus.
Mise à jour, mais pas de manière interactive jsFiddle aperçu
Pourquoi le :not()
sélecteur de travail en jQuery, mais ne parviennent pas dans le CSS? Ne faut-il pas travailler de manière identique dans les deux lieux depuis jQuery prétend être "CSS3 Conforme", ou est-il quelque chose que je suis absent?
Est-il un pur CSS solution de contournement pour ce ou vais-je devoir compter sur un script?
- Connexes: en Combinant :non() sélecteurs CSS
- Également liées: l'Encyclopédie de la Pile d'Échange - c'est ma première expérience avec elle, et jusqu'à présent, outre le fait que rogue downvote, je dois dire que c'est mieux que ce que j'avais prévu 🙂
Vous devez vous connecter pour publier un commentaire.
Peut-être qu'il devrait, mais il s'avère qu'il n'est pas: jQuery étend le
:not()
sélecteur tels que vous pouvez passer tout le sélecteur pour elle, peu importe la complexité, il peut être, et je soupçonne que la principale raison pour cela est pour la parité avec le.non()
méthode, qui prend également en tout arbitraire sélecteur complexe et filtres en conséquence. Il le fait de façon à maintenir un CSS syntaxe, mais elle s'étend à partir de ce qui est défini dans la norme.Comme autre exemple, cela fonctionne bien (je sais que c'est incroyablement ridicule exemple par rapport à ce qui est donné dans la question, mais c'est juste pour illustrer):
jsFiddle aperçu
Rappelez-vous que l'adoption d'une liste séparée par des virgules des sélecteurs de
:not()
moyens de filtrage des éléments qui ne correspondent pas à la liste des sélecteurs.Maintenant la
:non()
pseudo-classe dans les Sélecteurs de niveau 3, d'autre part, est très limité par lui-même. Vous ne pouvez passer un simple sélecteur de comme un argument de:not()
. Cela signifie que vous pouvez passer qu'un à la fois:*
), éventuellement avec un espace de nomsa
,div
,span
,ul
,li
, etc), éventuellement avec un espace de noms[att]
,[att=val]
, etc), éventuellement avec un espace de noms.class
)#id
):pseudo-class
)Donc, voici les différences entre jQuery
:non()
sélecteur et la norme actuelle est:non()
sélecteur:D'abord et avant tout, pour répondre directement à la question: vous ne pouvez pas passer par une virgule liste de sélection.1 Par exemple, alors que le sélecteur de donnée fonctionne en jQuery, comme le montre le violon, il n'est pas valide CSS:
Heureusement, dans ce cas, il est. Vous avez simplement à la chaîne de multiples
:not()
sélecteurs, l'un après l'autre, afin de la rendre valide CSS:Il ne fait pas le sélecteur que beaucoup plus de temps, mais l'incohérence et les inconvénients restent évidents.
Mise à jour interactive jsFiddle aperçu
Vous ne pouvez pas combiner les sélecteurs simples composés de sélecteurs pour une utilisation avec
:not()
. Cela fonctionne en jQuery, mais n'est pas valide CSS:Vous aurez besoin de le diviser en plusieurs négations (et pas seulement de la chaîne d'eux!) pour la rendre valide CSS:
Comme vous pouvez le voir, c'est encore plus gênant que le point 1.
Vous ne pouvez pas utiliser les combinators. Cela fonctionne en jQuery, mais pas CSS:
C'est un cas méchant, principalement parce qu'il n'a pas de véritable solution de contournement. Il y a quelques lâche solutions de contournement (Un et Deux), mais ils ont presque toujours dépendent de la structure HTML et sont donc très limitée dans l'utilitaire.
Dans un navigateur qui implémente
querySelectorAll()
et la:not()
sélecteur, à l'aide de:not()
dans un sélecteur de chaîne dans une manière qui le rend un selecteur CSS valide sera la cause de la méthode de retourner des résultats directement, au lieu de retomber à Grésiller (jQuery sélecteur moteur qui met en œuvre la:not()
extension). Si vous êtes un acharné pour la performance, c'est une façon positive de minuscules bonus, vous aurez certainement saliver plus.La bonne nouvelle, c'est que Sélecteurs 4 améliore le
:non()
sélecteur pour permettre une liste séparée par des virgules de complexe sélecteurs. Un sélecteur complexe est tout simplement soit un solitaire simple ou composé sélecteur, ou un ensemble de la chaîne de composé sélecteurs séparés par combinators. En bref, tout ce que vous voyez ci-dessus.Cela signifie que le jQuery exemples ci-dessus entrera en vigueur le niveau 4 sélecteurs, qui va faire de la pseudo-classe beaucoup, beaucoup plus utile lors de la CSS implémentations de commencer la soutenir dans les années à venir.
1 Bien que cet article dit que vous pouvez transmettre une liste séparée par des virgules des sélecteurs de
:not()
dans Firefox 3, vous n'êtes pas censé être en mesure de. Si cela fonctionne dans Firefox 3 que cet article prétend, alors c'est à cause d'un bug dans Firefox 3, pour lesquelles je ne peux pas trouver le billet, mais il ne devrait pas travailler jusqu'à ce que le futur mettre en œuvre les futures normes. Voir combien de fois que l'article est cité à ce jour, j'ai laissé un commentaire à cet effet, mais de voir aussi comment l'ancien article est et la maniere dont le site est en cours de mise à jour, je ne suis vraiment pas compter sur l'auteur de revenir à résoudre.:not(#foo, #foo *)
travaille dans le CSS. Eh bien, peut-être que jQuery soutien qu'il a aussi quelque chose à faire avec elle.