{"id":1156,"date":"2014-02-07T13:59:45","date_gmt":"2014-02-07T12:59:45","guid":{"rendered":"http:\/\/cyol.fr\/blog\/?p=1156"},"modified":"2014-04-28T15:57:08","modified_gmt":"2014-04-28T14:57:08","slug":"priorites-en-css","status":"publish","type":"post","link":"https:\/\/cyol.fr\/blog\/post\/priorites-en-css\/","title":{"rendered":"Priorit\u00e9s en CSS"},"content":{"rendered":"<p>Un truc qui arrive parfois quand on s&rsquo;attaque \u00e0 du CSS c&rsquo;est l&rsquo;\u00e9l\u00e9ment qui se retrouve cibl\u00e9 par plusieurs instructions, \u00e9videmment contradictoires. Deux trucs qu&rsquo;on apprend bien vite quand on fait du CSS pour ce genre de cas c&rsquo;est :<\/p>\n<ul>\n<li>La derni\u00e8re d\u00e9claration ciblant un \u00e9l\u00e9ment gagne toujours (Ce qui est faux dans l&rsquo;absolu, mais on a cette impression que c&rsquo;est vrai)<\/li>\n<li>En ciblant au plus pr\u00e9cis son \u00e9l\u00e9ment, on \u00e9vite les probl\u00e8mes<\/li>\n<li>(On peut utiliser !important&#8230; Pourquoi entre parenth\u00e8se, car c&rsquo;est une solution qui peut vite devenir impossible \u00e0 maintenir&#8230;)<\/li>\n<\/ul>\n<p><!--more-->Derni\u00e8rement j&rsquo;ai du travailler sur une surcharge css d&rsquo;une interface. C&rsquo;est \u00e0 dire appliquer un rendu diff\u00e9rent que le rendu de base mais simplement en ajoutant une nouvelle feuille de style et non pas en subsituant.<\/p>\n<p>Ce faisant, j&rsquo;ai rencontr\u00e9 un cas particulier qui m&rsquo;a interpel\u00e9. Alors que je tenais pour acquis ma premi\u00e8re assertion (<em>\u00ab\u00a0La derni\u00e8re d\u00e9claration ciblant un \u00e9l\u00e9ment gagne toujours\u00a0\u00bb<\/em>) je suis tomb\u00e9 sur un cas l&rsquo;invalidant !<\/p>\n<p>Soit ce HTML :<\/p>\n<pre class=\"brush:xml\">&lt;div id=\"conteneurId\" class=\"conteneur\"&gt;\r\n    &lt;div id=\"elementId\" class=\"content\"&gt;El\u00e9ment&lt;\/div&gt;\r\n&lt;\/div&gt;<\/pre>\n<p>Avec cette CSS :<\/p>\n<pre class=\"brush:css\">.conteneur #elementId{\r\nbackground:red;\r\n}\r\n#elementId{\r\nbackground:blue;\r\n}<\/pre>\n<p>Qu&rsquo;est ce qui ressort ? Il ressort un fond rouge (red) !<\/p>\n<p>En effet, le s\u00e9lecteur est plus pr\u00e9cis. Mais quelle logique exactement ? Car l\u00e0 le code est simple et on \u00ab\u00a0voit\u00a0\u00bb clairement que le premier s\u00e9lecteur est plus pr\u00e9cis donc a plus de poids. Qu&rsquo;en est il avec des chaines de s\u00e9lection css \u00e0 rallonge ?<\/p>\n<p>Et bien il y a un moyen facile de savoir. Un moyen logique de calculer le \u00ab\u00a0poids\u00a0\u00bb de la cha\u00eene de s\u00e9lection et donc quand elle va intervenir par rapport \u00e0 d&rsquo;autres.<\/p>\n<ul>\n<li>Calculer le nombre d&rsquo;id (avec #) et multipliez par 100<\/li>\n<li>Calculer le nombre de class (avec .) et multipliez par 10<\/li>\n<li>Calculer le nombre de balises HTML et ce sont les unit\u00e9s<\/li>\n<\/ul>\n<p>Additionner apr\u00e8s les 3 chiffres et cela donne le poids de la cha\u00eene.<\/p>\n<p>Il suffit apr\u00e8s de comparer les poids de chaque cha\u00eene. La cha\u00eene ayant le poids le plus \u00e9lev\u00e9 est celle qui sera appliqu\u00e9e en priorit\u00e9.<\/p>\n<p>Exemple :<\/p>\n<pre class=\"brush:css\">div#conteneurId div.content{\r\n  background:red;\r\n}\r\n#conteneurId #contentId{\r\n  background:green;\r\n}<\/pre>\n<ul>\n<li>La premi\u00e8re chaine de s\u00e9lection vaut : div 1+ #conteneurId 100 + div 1 + .content 10 = 102<\/li>\n<li>La seconde vaut : #conteneur 100 + #contentId 100 = 200<\/li>\n<\/ul>\n<p>C&rsquo;est donc la seconde qui s&rsquo;appliquera.<\/p>\n<p>Toutes les informations \u00e0 ce sujet sur le site de la W3C\u00a0 : <a title=\"CSS\/Training\/Priority level of selector sur W3C\" href=\"http:\/\/www.w3.org\/wiki\/CSS\/Training\/Priority_level_of_selector\" target=\"_blank\">Priority level of selector<\/a><\/p>\n<p>Il y est indiqu\u00e9 aussi que les instructions CSS pr\u00e9sentent dans le HTML via l&rsquo;attribut style de la balise ont un poids de 1000.<\/p>\n<p>\u00c9videmment, lisant \u00e7a je me suis demand\u00e9 si une instruction css pouvait r\u00e9ellement prendre priorit\u00e9 sur une instruction dans l&rsquo;attribut style de la balise. Bon, \u00e7a demande de pouvoir cibler assez profond\u00e9ment mais&#8230; Testons !<\/p>\n<p>1000 = 10*100, il me faut au moins 10 niveaux avec id :<\/p>\n<pre class=\"brush:xml\">&lt;!DOCTYPE html&gt;\r\n&lt;html&gt;\r\n&lt;body&gt;\r\n    &lt;div id=\"niveau1\"&gt;\r\n        &lt;div id=\"niveau2\"&gt;\r\n            &lt;div id=\"niveau3\"&gt;\r\n                &lt;div id=\"niveau4\"&gt;\r\n                    &lt;div id=\"niveau5\"&gt;\r\n                        &lt;div id=\"niveau6\"&gt;\r\n                            &lt;div id=\"niveau7\"&gt;\r\n                                &lt;div id=\"niveau8\"&gt;\r\n                                    &lt;div id=\"niveau9\"&gt;\r\n                                        &lt;div id=\"niveau10\" style=\"background-color: red\"&gt;\r\n                                            Test\r\n                                        &lt;\/div&gt;\r\n                                    &lt;\/div&gt;\r\n                                &lt;\/div&gt;\r\n                            &lt;\/div&gt;\r\n                        &lt;\/div&gt;\r\n                    &lt;\/div&gt;\r\n                &lt;\/div&gt;\r\n            &lt;\/div&gt;\r\n        &lt;\/div&gt;\r\n    &lt;\/div&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p>Et la CSS :<\/p>\n<pre class=\"brush:css\">body div#niveau1 div#niveau2 div#niveau3 div#niveau4 div#niveau5 div#niveau6 div#niveau7 div#niveau8 div#niveau9 div#niveau10{\r\n    background-color: green;\r\n}<\/pre>\n<p>Bein&#8230; \u00e7a n&rsquo;a pas march\u00e9 malgr\u00e9 un poids de 1011 pour ma cha\u00eene CSS qui est sup\u00e9rieure aux 1000 de l&rsquo;attribut style&#8230; Le !important dans la feuille CSS fonctionne bien cela dit pour outrepasser l&rsquo;attribut style.<\/p>\n<p>Pour tester : <a title=\"Test de css\/style sur jsfiddle\" href=\"http:\/\/jsfiddle.net\/ERV6r\/\" target=\"_blank\">http:\/\/jsfiddle.net\/ERV6r\/<\/a><\/p>\n<p>Cela dit, si pour les milliers (attribut style dans la balise) \u00e7a ne marche pas, pour le reste c&rsquo;est concluant. Et bon \u00e0 savoir !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Un truc qui arrive parfois quand on s&rsquo;attaque \u00e0 du CSS c&rsquo;est l&rsquo;\u00e9l\u00e9ment qui se retrouve cibl\u00e9 par plusieurs instructions, \u00e9videmment contradictoires. Deux trucs qu&rsquo;on apprend bien vite quand on fait du CSS pour ce genre de cas c&rsquo;est : La derni\u00e8re d\u00e9claration gagne toujours (Ce qui est faux dans l&rsquo;absolu, mais on a cette impression que c&rsquo;est vrai) En ciblant au plus pr\u00e9cis son \u00e9l\u00e9ment, on \u00e9vite les probl\u00e8mes (On peut utiliser !important&#8230; [&#8230;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[84,2],"tags":[91,62],"class_list":["post-1156","post","type-post","status-publish","format-standard","hentry","category-css","category-developpement","tag-css-2","tag-developpement-2","odd"],"_links":{"self":[{"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/posts\/1156","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/comments?post=1156"}],"version-history":[{"count":7,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/posts\/1156\/revisions"}],"predecessor-version":[{"id":1167,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/posts\/1156\/revisions\/1167"}],"wp:attachment":[{"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/media?parent=1156"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/categories?post=1156"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/tags?post=1156"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}