28172 sujets

CSS et mise en forme, CSS3

Bonjour,

J'essaie d'isoler au maximum le problème réel que je rencontre, et j'en arrive à la conclusion que quelque chose de très simple doit m'échapper dans le code suivant:


a:visited { color: red; }
.plop { color: green; }



<a class="plop" href="#">Bonjour</a>


Résultat une fois qu'on a bien visité le lien,

Sur firefox windows: c'est vert
Sur firefox mac: c'est rouge
Sur chrome windows: c'est vert
Sur chrome mac: c'est rouge
Sur safari mac: c'est vert

ON m'a aussi précisé que le problème n'est présent que depuis environ octobre 2016; avant quoi c'était vert partout.

Quelqu'un peut-il m'expliquer cette divergeance ? Je pensais pourtant que les moteurs de rendu entre la version mac et la version PC du même navigateur étaient les mêmes...

Quelle règle est censé être prioritaire d'après le standard ?


Mon souhait au final est que ce soit vert chez tout le monde; ça me paraît logique que la classe ait la priorité sur l'état visité.


Merci pour vos réponses.
Modifié par QuentinC (28 Mar 2017 - 22:56)
Bonjour Quentin,

J'ai moi aussi constaté qu'une balise en sélecteur prend un poids plus important lorsqu'on y appose un sélecteur lié à l'évènement (hover, focus etc).

Je ne sais ce qu'en disent les standards sur ce sujet et s'ils ont changés depuis, sachant que chaque navigateur fait de toute façon sa propre sauce mais pour ma part j'ai résolus le problème en précédent la directive prioritaire par :root (fonctionne pour tous sauf IE8-)

Ainsi
a:visited { color: red; }
:root .plop { color: green; }
rend les liens visités vert partout.


Bonne journée.
Smiley smile
Modérateur
Selon le standard, les pseudo-classes (:visited) ont le même poids qu'une classe.

Quant à :visited, son application est dépendante des règlages d'historique et de vie privée du navigateur.
Administrateur
Hello,
kustolovic a écrit :
Selon le standard, les pseudo-classes (:visited) ont le même poids qu'une classe.

Je confirme que "a:visited" a plus de poids que ".plop" (voir ce calculateur par exemple : https://specificity.keegan.st/)

Par contre, la différence d'interprétation des navigateurs est intéressante. Peut-être est-ce spécifique à l'état :visited. As-tu testé avec d'autres états (:focus / :hover) ?

EDIT : :visited est effectivement un état un peu spécial ( https://www.alsacreations.com/actu/lire/1027-Unefaillesurlapseudo-classevisited.html )
Modifié par Raphael (29 Mar 2017 - 10:01)
Modérateur
Raphael a écrit :
Je confirme que "a:visited" a plus de poids que ".plop" (voir ce calculateur par exemple : https://specificity.keegan.st/)

Wow je savais pas que les pseudo classe et attribut comptait dans la colonne des classe ! Smiley sweatdrop (et merci pour le site il est trop cool !)

Du coup la solution serait d'augmenter le poid du second sélecteur ?

a:visited { color: red; }
a.plop { color: green; }
Modérateur
Raphael a écrit :

EDIT : :visited est effectivement un état un peu spécial ( https://www.alsacreations.com/actu/lire/1027-Unefaillesurlapseudo-classevisited.html )

En effet, non seulement les styles applicables sont limités, mais le moteur javascript renverra toujours la valeur non-:visited lorsqu'il est interrogé.
Mais cela se répercute aussi sur les combinaisons, par exemple: (:visited + div).

Comme chaque amélioration CSS/js est susceptible d'apporter de nouveaux moyens d'exploiter la faille, elle est soumise à de fréquentes adaptations. ça ne me surprendrait pas du tout qu'il y ait des bugs.

Sinon il suffit en effet de rendre le sélecteur plus spécifique d'un côté ou de l'autre selon lequel on souhaite qu'il soit prioritaire. Tout en sachant que le mode de navigation ou les préférences d'historiques peuvent désactiver complètement :visited.
Bonsoir,

Merci pour vos réponses.

Excellente cette trouvaille de calculateur. Ca m'amène à une question sur ce petit outil: c'est quoi le premier chiffre ?

Sur la doc W3C mise en lien sur le calculateur, ils parlent de trois valeurs a,b,c:
a = ID
b = classe, attribut, pseudo-classe
c = élément

Il y a nulle part mention d'un quatrième chiffre dont la priorité surpasse toutes les autres...

Autre question sur la sélectivité tant qu'on y est: si j'écris:
.x, .y, .z

ça compte comme 030 ou bien c'est trois fois 010 complètement indépendantes ?

Pour en revenir plus précisément à mon problème, je ne peux pas renforcer le sélecteur en écrivant a.plop car je l'utilise potentiellement pour autre chose que des liens, je vais donc essayer la solution :root. J'ai 0.64% de IE<=8 dans mes stats donc c'est pas trop grave (j'ai quand même un perdu qui a réussi à venir avec IE 4.1.

C'est le'ffet du :visited que je cherche à neutraliser; d'ailleurs je pensais pas que les liens en question puissent être considérés comme visités, il s'agit d'actions JavaScript qui n'ouvrent jamais de nouvelle page.

Merci.

P.S. Le lien vers le calculateur est mauvais, la parenthèse a été prise dedans.
Modérateur
Salut !

QuentinC a écrit :
Ca m'amène à une question sur ce petit outil: c'est quoi le premier chiffre ?
C'est le style inline, c'est marqué dans le premier carré : https://specificity.keegan.st/ Smiley langue le style direct dans les balise html prend le dessus... Mais je te l'accorde c'est un peu hors sujet dans le calcul des priorités de sélecteur vu qu'on ne peut pas avoir les deux (si c'est inline, y'a pas de sélecteur). C’était juste pour garder en tete que ca override tout j'imagine.


QuentinC a écrit :
Autre question sur la sélectivité tant qu'on y est: si j'écris:
.x, .y, .z

ça compte comme 030 ou bien c'est trois fois 010 complètement indépendantes ?

Trois fois 10. Les virgules font des sélecteurs indépendants.
.x, .y, .z {}

c'est comme si tu écrivais :
.x {}
.y {}
.z {}



QuentinC a écrit :
Pour en revenir plus précisément à mon problème, je ne peux pas renforcer le sélecteur en écrivant a.plop car je l'utilise potentiellement pour autre chose que des liens, je vais donc essayer la solution :root. J'ai 0.64% de IE&lt;=8 dans mes stats donc c'est pas trop grave (j'ai quand même un perdu qui a réussi à venir avec IE 4.1..

a.plop {}
ou n'importe quoi d'autre hein !
body .plop {}
ca doit fonctionner aussi hein Smiley langue
Modifié par _laurent (30 Mar 2017 - 09:57)
Modérateur
Pour moi, il y a un cinquième colonne qui écrase le style inline... C'est le !important Smiley rolleyes
Administrateur
Yordi a écrit :
Pour moi, il y a un cinquième colonne qui écrase le style inline... C'est le !important Smiley rolleyes

Oui mais "!important" est forcément traité à part (et incalculable) puisqu'il s'applique à une déclaration et non à un sélecteur.
Modérateur
Je comprends bien ton commentaire Raphael, mais c'est pour moi lié avec ce genre d'exemple :
p.maClass{color: red !important;}
p{color: green !important;}


Ok, ça joue sur une déclaration mais le principe reste le même


ps : ce code qui n'existe pas évidement dans la vrai vie Smiley rolleyes
ps2 : on parle des !important en inline ? Smiley biggrin
Modifié par Yordi (30 Mar 2017 - 16:04)
Modérateur
QuentinC a écrit :
Sur la doc W3C mise en lien sur le calculateur, ils parlent de trois valeurs a,b,c:

Pour la petite histoire, sur la doc CSS 2, c'était en quatre paramètres: a, b, c, d. Le premier étant 1 ou 0 selon que c'était un style en ligne ou non.
Ils ont depuis corrigé cette absurdité, la question de l'origine de la règle et de la cascade (et donc du !important) concerne la spec idoine, celle de la spécificité la spec sur les sélecteurs, et la règle des style en ligne la spec 2.1 toujours valide. (bon mal de tête)
Modifié par kustolovic (30 Mar 2017 - 16:07)
Merci pour la réponse, le quatrième paramètre est donc style inline ou non.

Pour le !important, on n'est pas censé l'utiliser normalement, je me trompe ?
Il me semblais que c'était une bien mauvaise pratique, parce que ça fichait en l'air les paramètres que l'utilisateur peut avoir défini dans son navigateur (pour les malvoyants, ça peut être pratique ou même vital en complément des loupes d'écran)