{"id":176,"date":"2007-04-09T17:42:12","date_gmt":"2007-04-09T15:42:12","guid":{"rendered":"http:\/\/www.gatellier.be\/blog\/?p=176"},"modified":"2007-04-09T17:42:12","modified_gmt":"2007-04-09T15:42:12","slug":"css-pseudo-classes-internet-explorer","status":"publish","type":"post","link":"https:\/\/gatellier.be\/blog\/css-pseudo-classes-internet-explorer\/","title":{"rendered":"CSS: Pseudo classes sur Internet Explorer"},"content":{"rendered":"<p>Gr\u00e2ce aux <strong><a href=\"\/\/msdn.microsoft.com\/workshop\/author\/dhtml\/overview\/recalc.asp\" hreflang=\"en\">expressions <acronym title=\"Cascading Style Sheet\">CSS<\/acronym> d&#8217;Internet Explorer<\/a><\/strong>, il y a moyen de <strong>simuler les pseudo-classes<\/strong> qui ne sont pas support\u00e9es par IE6.<\/p>\n<h3>Les expressions CSS d&#8217;Internet Explorer<\/h3>\n<p>En effet, les expressions CSS (apparues avec IE5) permettent de calculer <strong>dynamiquement<\/strong> (via JScript) les diff\u00e9rentes propri\u00e9t\u00e9s stylistiques.<\/p>\n<p>On attribue une valeur calcul\u00e9e par JScript \u00e0 une propri\u00e9t\u00e9 CSS d&#8217;un \u00e9l\u00e9ment html. Les diff\u00e9rents objets du <acronym title=\"Document Object Model\">DOM<\/acronym> sont support\u00e9s<\/p>\n<pre class=\"brush: css; title: ; notranslate\" title=\"\">\r\n#centeredDiv {\r\n\tposition:absolute;\r\n\tleft:\r\n\t\texpression(\r\n\t\t\t(document.body.clientWidth\/2)-\r\n\t\t\t(this.offsetWidth\/2)\r\n\t\t);\r\n\ttop:\r\n\t\texpression(\r\n\t\t\t(document.body.clientHeight\/2)-\r\n\t\t\t(this.offsetWidth\/2)\r\n\t\t);\r\n}\r\n<\/pre>\n<p>Sur Internet Explorer, cet exemple positionnerait l&#8217;\u00e9l\u00e9ment ayant un id <code>centeredDiv<\/code> au centre de la page en le positionnant \u00e0 la diff\u00e9rence de la moiti\u00e9 hauteur de la page (<code>document.body.clientHeight\/2<\/code>) et de la moiti\u00e9 de sa hauteur (<code>this.offsetWidth\/2<\/code>). Notez que <code><strong>this<\/strong><\/code> repr\u00e9sente l&#8217;objet en lui-m\u00eame.<\/p>\n<p><!--more--><\/p>\n<h4>Les pseudo-classes <strong>:first-child<\/strong> et <strong>:last-child<\/strong> sur Internet Explorer<\/h4>\n<p>Avant Internet Explorer 7, ces <strong>pseudo-classes<\/strong> (propri\u00e9t\u00e9es qui ne sont pas issues d&#8217;\u00e9l\u00e9ments html en eux-m\u00eames) n&#8217;\u00e9taient pas support\u00e9es. Donc, gal\u00e8re pour les int\u00e9grateurs pour produire du <strong>code html compatible<\/strong> entre les diff\u00e9rents navigateurs.<\/p>\n<p>Gr\u00e2ce aux <strong>expressions CSS<\/strong>, ce manque de support des pseudo-classes peut \u00eatre corrig\u00e9.<\/p>\n<h5>Pseudo-classe <code>:first-child<\/code> sur IE&lt;=6<\/h5>\n<pre class=\"brush: css; title: ; notranslate\" title=\"\">\r\nli {\r\n\tbackground-image:\r\n\t\texpression(\r\n\t\t\t(this===this.parentNode.childNodes&#x5B;0])\r\n\t\t\t?&quot;none&quot;:&quot;auto&quot;\r\n\t\t);\r\n}\r\n<\/pre>\n<h6>Explication du code:<\/h6>\n<p>L&#8217;\u00e9l\u00e9ment \u00e0 styler est les tags <code>LI<\/code>. Je d\u00e9finis \u00e0 l&#8217;aide d&#8217;une expression CSS la valeur de la propri\u00e9t\u00e9 <code>background-image<\/code>.<\/p>\n<p>Si l&#8217;\u00e9l\u00e9ment en question (le <code>LI<\/code> repr\u00e9sent\u00e9 par <code>this<\/code> est strictement \u00e9gal (<code>===<\/code>: \u00e9galit\u00e9 de la valeur et de type d&#8217;\u00e9l\u00e9ment) au premier enfant (<code>.childNode[0]<\/code>) de l&#8217;\u00e9l\u00e9ment parent de l&#8217;objet <code>LI<\/code> en question (<code>this.parentNode<\/code>), la valeur de l&#8217;image de fond sera <code>none<\/code>.<\/p>\n<p>Dans le cas contraire, l&#8217;image de fond sera la valeur par d\u00e9faut (via h\u00e9ritance) d&#8217;un list-item.<\/p>\n<h5>Pseudo-classe <code>:last-child<\/code> sur IE&lt;=6<\/h5>\n<pre class=\"brush: css; title: ; notranslate\" title=\"\">\r\nli {\r\n\tbackground-image:\r\n\t\texpression(\r\n\t\t\t(this===this.parentNode.childNodes&#x5B;this.parentNode.childNodes.length-1])\r\n\t\t\t?&quot;none&quot;:&quot;auto&quot;\r\n\t\t);\r\n}\r\n<\/pre>\n<h6>Explication du code:<\/h6>\n<p>Dans ce cas-ci, je ne vise pas le premier \u00e9l\u00e9ment de la liste d&#8217;enfants de l&#8217;\u00e9l\u00e9ment parent (<code>this.parentNode.childNodes[0]<\/code>) mais bien le dernier (<code>this.parentNode.childNodes[this.parentNode.childNodes.length-1]<\/code>, l&#8217;\u00e9l\u00e9ment \u00e0 la derni\u00e8re position de l&#8217;array <code>childNodes<\/code> est l&#8217;\u00e9l\u00e9ment ayant la position \u00e9gale \u00e0 la longueur de l&#8217;array moins un).<\/p>\n<p>Si l&#8217;\u00e9l\u00e9ment en question (le <code>LI<\/code> repr\u00e9sent\u00e9 par <code>this<\/code> est strictement \u00e9gal (<code>===<\/code>: \u00e9galit\u00e9 de la valeur et de type d&#8217;\u00e9l\u00e9ment) au premier enfant (<code>.childNode[0]<\/code>) de l&#8217;\u00e9l\u00e9ment parent de l&#8217;objet <code>LI<\/code> en question (<code>this.parentNode<\/code>), la valeur de l&#8217;image de fond sera <code>none<\/code>.<\/p>\n<p>Dans le cas contraire, l&#8217;image de fond sera la valeur par d\u00e9faut (via h\u00e9ritance) d&#8217;un list-item.<\/p>\n<h3>Code html et programmation simplifi\u00e9e.<\/h3>\n<p>Maintenant que l&#8217;on peut simuler un \u00e9quivalent des pseudo-classes sur Internet Explorer, le code html (ou la programmation de celui-ci) pourra \u00eatre simplifi\u00e9.<\/p>\n<p>Prenons une liste de liens s\u00e9par\u00e9s par un \u00e9l\u00e9ment graphique (une petite barre verticale).<\/p>\n<p><a href=\"\/\/www.adobe.com\/be_fr\/\"><img decoding=\"async\" src=\"\/blog\/wp-content\/photos\/adobe_top_navigation.png\" alt=\"Exemple de navigation horizontale s\u00e9par\u00e9e par des \u00e9l\u00e9ments graphiques\" \/><\/a><\/p>\n<p>Avant, si on mettait le s\u00e9parateur vertical en <code>background-image<\/code> d&#8217;un \u00e9l\u00e9ment de liste, pour avoir du code html compatible avec autant IE6 et Firefox, il fallait sp\u00e9cifier une classe CSS au premier ou au dernier \u00e9l\u00e9ment de la liste pour ne pas mettre d&#8217;image de fond sur le premier ou dernier \u00e9l\u00e9ment.<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;ul class=&quot;fxNav&quot;&gt;\r\n\t&lt;li class=&quot;firstChild&quot;&gt;&lt;a href=&quot;\/solutions\/index.php&quot;&gt;Solutions&lt;\/a&gt;&lt;\/li&gt;\r\n\t&lt;li&gt;&lt;a href=&quot;\/products\/index.php&quot;&gt;Produits&lt;\/a&gt;&lt;\/li&gt;\r\n\t&lt;li&gt;&lt;a href=&quot;\/support\/index.php&quot;&gt;Support&lt;\/a&gt;&lt;\/li&gt;\r\n\t&lt;li&gt;&lt;a href=&quot;\/communities\/index.php&quot;&gt;Communaut\u00e9s&lt;\/a&gt;&lt;\/li&gt;\r\n\t&lt;li&gt;&lt;a href=&quot;\/company\/index.php&quot;&gt;Soci\u00e9t\u00e9&lt;\/a&gt;&lt;\/li&gt;\r\n\t&lt;li&gt;&lt;a href=&quot;\/download\/index.php&quot;&gt;T\u00e9l\u00e9charger&lt;\/a&gt;&lt;\/li&gt;\r\n\t&lt;li&gt;&lt;a href=&quot;\/store\/index.php&quot;&gt;Store&lt;\/a&gt;&lt;\/li&gt;\r\n&lt;\/ul&gt;\r\n<\/pre>\n<p>Maintenant gr\u00e2ce \u00e0 l&#8217;\u00e9quivalent des pseudo-classes CSS sur Internet Explorer, les d\u00e9veloppeurs peuvent supprimer une condition dans leur code!<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;ul class=&quot;fxNav&quot;&gt;\r\n\t&lt;li&gt;&lt;a href=&quot;\/solutions\/index.php&quot;&gt;Solutions&lt;\/a&gt;&lt;\/li&gt;\r\n\t&lt;li&gt;&lt;a href=&quot;\/products\/index.php&quot;&gt;Produits&lt;\/a&gt;&lt;\/li&gt;\r\n\t&lt;li&gt;&lt;a href=&quot;\/support\/index.php&quot;&gt;Support&lt;\/a&gt;&lt;\/li&gt;\r\n\t&lt;li&gt;&lt;a href=&quot;\/communities\/index.php&quot;&gt;Communaut\u00e9s&lt;\/a&gt;&lt;\/li&gt;\r\n\t&lt;li&gt;&lt;a href=&quot;\/company\/index.php&quot;&gt;Soci\u00e9t\u00e9&lt;\/a&gt;&lt;\/li&gt;\r\n\t&lt;li&gt;&lt;a href=&quot;\/download\/index.php&quot;&gt;T\u00e9l\u00e9charger&lt;\/a&gt;&lt;\/li&gt;\r\n\t&lt;li&gt;&lt;a href=&quot;\/store\/index.php&quot;&gt;Store&lt;\/a&gt;&lt;\/li&gt;\r\n&lt;\/ul&gt;\r\n<\/pre>\n<h3>Le code en pratique.<\/h3>\n<pre class=\"brush: css; title: ; notranslate\" title=\"\">\r\nul.fxNav, ul.fxNav li {\r\n\tlist-style-type:none;\r\n\tmargin:0;padding:0;\r\n\tdisplay:inline;\r\n}\r\nul.fxNav li {\r\n\ttext-transform:uppercase;\r\n\tfont-size:1em;\r\n\tpadding:0 5px 0 7px;\r\n\tbackground:url(pipe.gif) no-repeat 0 50%;\r\n}\r\nul.fxNav li:first-child {\r\n\tbackground:none;\r\n}\r\n<\/pre>\n<p>Pour tous les navigateurs, je d\u00e9finis que les \u00e9l\u00e9ments <code>LI<\/code> ont une image de fond (<code>pipe.gif<\/code>). Apr\u00e8s cela, je <strong>r\u00e9\u00e9cris<\/strong> l&#8217;instruction pour le premier <code>li<\/code> de la liste ayant une class <code>fxNav<\/code>.<\/p>\n<p>Ceci marche sur Firefox, Opera, Safari et IE7.<\/p>\n<p>Pour rendre ceci <strong>compatible avec les versions pr\u00e9c\u00e9dentes d&#8217;Internet Explorer<\/strong>, je rajoute des instructions, propres aux versions concern\u00e9es d&#8217;IE et apr\u00e8s les instructions CSS communes, mises dans des <strong>commentaires conditionnels<\/strong> pour conserver du <strong>code valide<\/strong>.<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;!--&amp;#91;if lte IE 6&amp;#93;&gt;\r\n&lt;style type=&quot;text\/css&quot;&gt;\r\nul.fxNav li {\r\n\tbackground-image:\r\n\t\texpression(\r\n\t\t\t(this===this.parentNode.childNodes&amp;#91;0&amp;#93;)?\r\n\t\t\t&quot;none&quot;:&quot;auto&quot;\r\n\t\t);\r\n}\r\n&lt;\/style&gt;\r\n&lt;!&amp;#91;endif&amp;#93;--&gt;\r\n<\/pre>\n<p>Je mets \u00e0 votre disposition d&#8217;un <a href=\"\/blog\/posts\/2007\/04\/pseudo-classes-first-child-internet-explorer\/demo.htm\">exemple de pseudo-class :first-child qui fonctionne sur IE &lt;=7<\/a>. En esp\u00e9rant que \u00e7a vous sera utile&nbsp;!<\/p>\n<h4>Liens relatifs&nbsp;:<\/h4>\n<ul>\n<li><a href=\"\/blog\/posts\/2007\/04\/pseudo-classes-first-child-internet-explorer\/demo.htm\"><strong>D\u00e9mo de navigation avec l&#8217;\u00e9quivalent de pseudo class :first-child<\/strong><\/a><\/li>\n<li><a href=\"\/\/msdn.microsoft.com\/workshop\/author\/dhtml\/overview\/recalc.asp\" hreflang=\"en\">les expressions CSS d&#8217;Internet Explorer<\/a><\/li>\n<li><a href=\"\/\/www.w3.org\/TR\/REC-CSS2\/selector.html#q15\" hreflang=\"en\">les d\u00e9finitions des pseudo-classes sur le W3C<\/a><\/li>\n<li><a href=\"\/\/msdn.microsoft.com\/workshop\/author\/dhtml\/overview\/ccomment_ovw.asp\" hreflang=\"en\">Les commentaires conditionnels d&#8217;Internet Explorer<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Gr\u00e2ce aux expressions CSS d&#8217;Internet Explorer, il y a moyen de simuler les pseudo-classes qui ne sont pas support\u00e9es par IE6. Les expressions CSS d&#8217;Internet Explorer En effet, les expressions CSS (apparues avec IE5) permettent de calculer dynamiquement (via JScript) les diff\u00e9rentes propri\u00e9t\u00e9s stylistiques. On attribue une valeur calcul\u00e9e par JScript \u00e0 une propri\u00e9t\u00e9 CSS [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[30,34,51,54,61,10],"tags":[],"class_list":["post-176","post","type-post","status-publish","format-standard","hentry","category-code","category-css","category-html","category-javascript","category-productivite","category-tutorial"],"_links":{"self":[{"href":"https:\/\/gatellier.be\/blog\/wp-json\/wp\/v2\/posts\/176","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gatellier.be\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gatellier.be\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gatellier.be\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/gatellier.be\/blog\/wp-json\/wp\/v2\/comments?post=176"}],"version-history":[{"count":0,"href":"https:\/\/gatellier.be\/blog\/wp-json\/wp\/v2\/posts\/176\/revisions"}],"wp:attachment":[{"href":"https:\/\/gatellier.be\/blog\/wp-json\/wp\/v2\/media?parent=176"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gatellier.be\/blog\/wp-json\/wp\/v2\/categories?post=176"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gatellier.be\/blog\/wp-json\/wp\/v2\/tags?post=176"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}