28173 sujets

CSS et mise en forme, CSS3

Salut,

http://www.w3.org/TR/CSS21/selector.html#class-html
Ce qui m'intersse est la partie où il est expliqué comment selectionner un elements qui a 2 classes bien précise.
Le problème c'est que ca ne marche pas sous IE :
div { height: 100px; width: 100px; margin: 10px 0;}
    .blue_bg { background: #00f;}
    .green_bg { background: #0f0;}
    .blue_bg.green_bg { background: #ff0;}/*yellow*/

et
<div class="blue_bg">
      <p>&nbsp;</p>
    </div>
    <div class="green_bg">
      <p>&nbsp;</p>
    </div>
    <div class="blue_bg green_bg">
      <p>&nbsp;</p>
    </div>>


Quelqu'un a-t-il déjà eu ce problème ?

Merci
La fermeture de ta troisième division est mal faite, regarde comme il faut. Deuxièmement, tu ne peux faire une classe .blue_bg.green_bg ! Et puis, troisièmement, si tu descends dans les topics, tu vas avoir immédiatement la réponse : je viens de répondre à la même question il y a quelques heures. Mais, sache que tu ne peux faire un mélange de couleur comme ça. Ce n'est pas en mettant du rouge par-dessus du bleu que tu vas obtenir du violet. Non, ça restera rouge, à moins d'utiliser de la transparence, mais là, c'est une toute autre affaire.
Modifié par D@n!eL_ (02 Jul 2006 - 19:06)
D@n!eL_ a écrit :
La fermeture de ta troisième division est mal faite, regarde comme il faut. Deuxièmement, tu ne peux faire une classe .blue_bg.green_bg ! Et puis, troisièmement, si tu descends dans les topics, tu vas avoir immédiatement la réponse : je viens de répondre à la même question il y a quelques heures. Mais, sache que tu ne peux faire un mélange de couleur comme ça. Ce n'est pas en mettant du rouge par-dessus du bleu que tu vas obtenir du violet. Non, ça restera rouge, à moins d'utiliser de la transparence, mais là, c'est une toute autre affaire.

La première remarque est juste. Le reste est un peu à côté de la plaque, si tu relis bien le message et le code posté par dhjapan.

Il y a deux classes de créées : une classe pour le fond bleu et une classe pour le fond vert. Jusqu'ici pas de problème.

Une div a la première classe, une deuxième a la deuxième classe, et une troisième a les deux classes (séparées par une espace), ce qui est tout à fait valide.

Là où je m'interroge, c'est que je ne suis pas sûr que l'on puisse faire un sélecteur avec deux classes à la fois. On peut très bien pointer l'élément machin portant la classe truc et l'identifiant bidule (sélecteur du type machin.truc#bidule), mais je ne suis pas sûr que l'on puisse pointer l'élément machin porteur de la classe truc1 ET de la classe truc2 (sélecteur de type machin.truc1.truc2).

Si un expert passe par là, il pourra peut-être confirmer.
Bon, jouons à l'expert en allant consulter la spécification CSS 2.1

a écrit :
For example, the following rule matches any P element whose "class" attribute has been assigned a list of space-separated values that includes "pastoral" and "marine":
p.pastoral.marine { color: green }

This rule matches when class="pastoral blue aqua marine" but does not match for class="pastoral blue".

Source : W3C, CSS 2.1 specification, Class selectors.

Il s'agirait donc uniquement d'un problème d'implémentation avec Internet Explorer.
Après tests avec Internet Explorer, voilà ce que ça donne :

– Combiner classes et identifiants dans un sélecteur ([élément]#identifiant.classe ou [élément].classe#identifiant [1]) ne semble pas poser de problème. Je n'ai pas observé le moindre problème.

– Combiner deux classes pour un même élément pose problème si on veut viser cet élément via la conjonction de ces deux classes. Ainsi, même s'il est théoriquement possible d'écrire [élément].classe1.classe2, cela pose quelques problèmes.

Voici un petit exemple :
CSS :
.red {background: #f88;}
.blu {background: #88f;}
.blu.red {background: black;}

HTML :
<p class="red">Ceci est un paragraphe</p>
<p class="blu">Ceci est un paragraphe</p>
<p class="red blu">Ceci est un paragraphe</p>


Les deux premiers sélecteurs marchent sans problème. Quant au troisième sélecteur (avec les classes combinées), il a pour effet de donner un fond noir non seulement au troisième paragraphe, mais aussi au deuxième paragraphe.

Pour un sélecteur combiné .classe1.classe2, il y aurait alors deux possibilités :
– le sélecteur combiné viserait à la fois les éléments ayant parmi leurs classes à la fois "classe1" et "classe2" ;
– le sélecteur serait interprété comme sélectionnant uniquement les éléments ayant parmi leurs classes "classe1". La deuxième classe indiquée serait alors ignorée.

Si quelqu'un a une idée de test pour savoir laquelle des deux possibilités est la bonne ?


Conclusion provisoire : avec IE6, les sélecteurs de type [élément].classe1.classe2 ne sont pas efficaces : soit pas implémentés et interprétés comme [élément].classe1[i], soit mal implémentés et interprétés à la fois comme [i][élément].classe1.classe2 ET comme [élément].classe1.
À noter bien sûr que les navigateurs récents (versions récentes de Konqueror, Firefox, Opera…) ne présentent pas ce défaut d'implémentation.

----
[1] Les crochets autour de « élément » indiquent que la mention de l'élément visé est optionnelle).[/i][/i]
Modifié par mpop (03 Jul 2006 - 00:23)
mpop a écrit :

La première remarque est juste. Le reste est un peu à côté de la plaque, si tu relis bien le message et le code posté par dhjapan.

Désolé, je ne croyais même pas cela possible sous cet angle. Je comprends pas mal mieux l'astuce maintenant... utile dans certains cas.
Merci à tous,
d'après le W3C le comportement normal serait : le sélecteur combiné vise les éléments ayant parmi leurs classes à la fois "classe1" et "classe2".

Mais apparement IE ne supporte pas les sélecteurs combinés
.classe1.classe2 ; associe le style à .classe1 et ignore .classe2

Pas de bol pour moi.
Modifié par dhjapan (03 Jul 2006 - 14:48)
Bonjour
Je crois qu'il y a un "bémol" dès le départ.

.class1{color:blue}
.class2{color:red}
.class1 .class2 {color:yellow}

Dans cet exemple similaire au tien la dernière ligne ne signifie pas "class1 + class2 = yellow" mais "tout élément class2 inclus dans un premier élément class1 = yellow". Par la suite, quand tu indiques dans html…<p class="class1 class2"> il sagit bien d'une combinaison de classes mais tu appeles les deux premières lignes (contradictoires)

<p class="class1 class2">le paragraphe n'est ni bleu ni rouge à cause des indications contradictoires et encore moins jaune car il n'est pas inclu comme ceci:</p>
<p class="class1"><span class="class2>Cette span de class2 est jaune car inclue dans un élément p de class1</span></p>

edit: il se peut que certains navigateurs tiennent compte d'une des deux classes indiquées en cas de conflit.
Modifié par Aureance (03 Jul 2006 - 23:42)
Aureance a écrit :
Dans cet exemple similaire au tien la dernière ligne ne signifie pas "class1 + class2 = yellow" mais "tout élément class2 inclus dans un premier élément class1 = yellow".

Justement, ton exemple n'est pas similaire. Tu as rajouté une espace, qui est en CSS le sélecteur descendant.

Les deux sélecteurs suivants ne sont pas identiques :
.classe1.classe2 {/* sélectionne tout élément porteur à la fois de la classe "classe1" et de la classe "classe2" */}
.classe1 .classe2 {/* sélectionne tout élément porteur de la classe "classe2" qui est un descendant d'un élément porteur de la classe "classe1" */}

Les deux sont valides, mais le premier est mal implémenté par IE6. Mais tout ceci a déjà été dit plus haut dans ce fil.