Pourquoi n'est-il pas possible de combiner des pseudo-éléments/classes spécifiques à un fournisseur en un ensemble de règles?

dans CSS, Il est possible de styliser le texte placeholder à l'intérieur d'une entrée en utilisant une combinaison de pseudo-classes spécifiques au fournisseur et de pseudo-éléments (pour obtenir la meilleure couverture croisée des navigateurs).

ceux-ci partagent tous les mêmes propriétés de base (c'est-à-dire: le style du texte et les déclarations de couleur).

cependant, alors que je veux inévitablement appliquer les mêmes styles indépendamment du fournisseur de navigateur, il ne semble pas être possible de les combiner ensemble dans un sélecteur séparé par des virgules (comme vous le feriez avec n'importe quel autre morceau de CSS où vous voulez que deux sélecteurs partagent les mêmes styles).

à titre d'exemple, j'ai tendance à cibler le style placeholder en utilisant les quatre sélecteurs suivants:

  • input:-moz-placeholder
  • input::-moz-placeholder
  • input:-ms-input-placeholder
  • input::-webkit-input-placeholder

(bien que :-moz-placeholder est déprécié en faveur de ::-moz-placeholder cela s'est produit seulement avec la libération de FireFox 19, donc à l'heure actuelle les deux sont nécessaires pour un meilleur navigateur-Soutien).

ce qui est frustrant est que déclarer et donner chaque style (le même) mène à beaucoup de répétition au sein de la CSS.

donc, pour s'assurer que le texte du conteneur est aligné à droite et en italique, je finirais par:

input:-moz-placeholder{
    font-style: italic;
    text-align: right;
}
input::-moz-placeholder{
    font-style: italic;
    text-align: right;
}
input:-ms-input-placeholder{
    font-style: italic;
    text-align: right;
}
input::-webkit-input-placeholder{
    font-style: italic;
    text-align: right;
}

Ce Que Je je veux vraiment les combiner comme un seul ensemble de règles séparées par des virgules comme ceci:

input:-moz-placeholder,
input::-moz-placeholder,
input:-ms-input-placeholder,
input::-webkit-input-placeholder{
    font-style: italic;
    text-align: right;
}

cependant, malgré quelques tentatives, cela ne semble jamais fonctionner. Cela m'inquiète qu'il y ait une partie fondamentale de CSS que je ne comprends pas.

Quelqu'un peut-il nous expliquer pourquoi cela se produit?

63
demandé sur Timwi 2013-06-07 14:57:29

2 réponses

CSS2.1 états :

le sélecteur (voir aussi la section sélecteurs ) comprend tout jusqu'à (mais non compris) la première couronne bouclée à gauche ({). Un sélecteur va toujours avec un bloc de déclaration. Lorsqu'un agent utilisateur ne peut pas analyser le sélecteur (c.-à-d. qu'il n'est pas valide CSS 2.1), il doit ignorer le sélecteur et le bloc de déclaration suivant (le cas échéant) ainsi.

notez que depuis CSS2.1 pré-dates CSS3, "it is not valid CSS 2.1" est écrit sous l'hypothèse qu'un agent utilisateur est entièrement CSS2.1-conforme et que CSS3 n'existe pas en théorie. Dans la pratique, lorsque la spécification dit "il n'est pas valide CSS" ou quelque chose à cet effet, il doit être considéré comme signifiant "il n'est pas compris par l'agent utilisateur". Voir ma réponse à cette question connexe pour une explication plus approfondie.

à savoir, puisque le navigateur d'un vendeur ne comprend pas les préfixes des autres vendeurs, il doit supprimer toutes les règles qui contiennent ces préfixes non reconnus dans les sélecteurs de pseudo-classe et de pseudo-élément. 1

Pour un aperçu de pourquoi une telle règle a été mise en place, voir cette réponse .


1 notez que WebKit est connu pour avoir partiellement ignoré cette règle: il n'a aucun problème à analyser les règles dont les sélecteurs ont des pseudo-éléments préfixés non reconnus (qui dans ce cas est ::-moz-placeholder ). Cela dit, la pseudo-classe :-moz-placeholder dans votre règle combinée va la faire casser de toute façon.

69
répondu BoltClock 2018-05-30 05:27:24

les spécifications disent que si un agent utilisateur ne reconnaît pas une partie d'un sélecteur, il doit ignorer tout le sélecteur et son bloc.

http://www.w3.org/TR/css3-syntax/#rule-sets

le sélecteur (voir le module sélecteurs [SELECT]) se compose de tout jusqu'à (mais pas y compris) la première couronne bouclée à gauche ({). Un sélecteur va toujours avec un bloc. Quand un agent utilisateur ne peut pas analyser sélecteur (c'est à dire, il n'est pas valide CSS3), il doit ignorer les {}-bloc.

14
répondu Alessandro Vendruscolo 2013-06-07 10:59:26