{"id":1577,"date":"2011-11-17T08:56:11","date_gmt":"2011-11-17T07:56:11","guid":{"rendered":"https:\/\/www.creativejuiz.fr\/blog\/?p=1577"},"modified":"2015-01-18T16:21:08","modified_gmt":"2015-01-18T15:21:08","slug":"selecteur-dadjacence-indirecte-en-css3","status":"publish","type":"post","link":"https:\/\/www.creativejuiz.fr\/blog\/tutoriels\/selecteur-dadjacence-indirecte-en-css3","title":{"rendered":"S\u00e9lecteur d&rsquo;adjacence indirecte en CSS3"},"content":{"rendered":"<p>Le s\u00e9lecteur d&rsquo;adjacence indirecte est peu connu en <abbr>CSS<\/abbr>.<br \/>\nArriv\u00e9 avec la nouvelle mouture <abbr>CSS3<\/abbr>, ce s\u00e9lecteur vous permet de s\u00e9lectionner d&rsquo;un seul coup tous les fr\u00e8res d&rsquo;un \u00e9l\u00e9ment cibl\u00e9 r\u00e9pondant \u00e0 un s\u00e9lecteur pr\u00e9cis.<br \/>\nVoyons voir avec quelques exemples comment l&rsquo;utiliser et quels sont ses effets.<!--more--><\/p>\n<h2 id=\"ex1-art\">Syntaxe de base<\/h2>\n<p>Le s\u00e9lecteur, que j&rsquo;appelle incorrectement <em lang=\"en\">siblings<\/em> du fait de sa ressemblance avec la fonction <code><a href=\"http:\/\/api.jquery.com\/siblings\/\">siblings()<\/a><\/code> de jQuery, utilise le caract\u00e8re ~ disponible sous PC depuis les touches <kbd><kbd>Alt Gr<\/kbd><\/kbd> + <kbd><kbd>2(\u00e9 ~)<\/kbd><\/kbd>.<\/p>\n<pre class=\"code\"><code class=\"css\">element1 ~ element2 {\r\n\/* mes styles *\/\r\n}<\/code><\/pre>\n<p>Ici les styles seront appliqu\u00e9s \u00e0 tous les <code>element2<\/code> fr\u00e8res de <code>element1<\/code>, m\u00eame si un autre fr\u00e8re vient se m\u00ealer entre deux <code>element2<\/code>, par exemple.<\/p>\n<p class=\"center\"><a href=\"\/blog\/doc\/sibling-selecteur-adjacence.html\" class=\"demonstration\">Voir la d\u00e9mo<\/a><\/p>\n<p class=\"message important\">Il est important de noter que ce s\u00e9lecteur ne cible que les fr\u00e8res suivants d&rsquo;un \u00e9l\u00e9ment. En aucun cas les fr\u00e8res pr\u00e9c\u00e9dents ne seront concern\u00e9s.<\/p>\n<h2>Quelques exemples d&rsquo;utilisations<\/h2>\n<p>En r\u00e9alit\u00e9 je n&rsquo;en ai pas trouv\u00e9 tant que \u00e7a, peut-\u00eatre par habitude d&rsquo;utiliser d&rsquo;autres techniques.<br \/>\nG\u00e9n\u00e9ralement la technique <code>li + li<\/code> pour cibler tous les fr\u00e8res du premier <code>li<\/code> dans une liste, par exemple, me suffit.<\/p>\n<h3>Cibler les fr\u00e8res non identiques \u00e0 l&rsquo;\u00e9l\u00e9ment de d\u00e9part<\/h3>\n<p>Cependant ce s\u00e9lecteur d&rsquo;adjacence indirecte (<code>~<\/code>) va permettre de combler certaines lacunes du s\u00e9lecteur d&rsquo;adjacence directe (<code>+<\/code>).<br \/>\nIl sera capable de cibler tous les paragraphes qui suivent un titre, par exemple. Chose qui ne fonctionnera pas en faisant <code>h3 + p<\/code>, mais qui fonctionnera avec <code>h3 ~ p<\/code>.<\/p>\n<h3>Cibler les fr\u00e8res d&rsquo;un \u00e9l\u00e9ment survol\u00e9, cibl\u00e9 ou typ\u00e9<\/h3>\n<p>Dans la m\u00eame logique que pr\u00e9c\u00e9demment, il est possible de cibler, par exemple, tous les fr\u00e8res d&rsquo;un <code>li<\/code> survol\u00e9 (donc les autres <code>li<\/code>), ou d&rsquo;un <code>input<\/code> typ\u00e9.<\/p>\n<pre class=\"code\"><code class=\"css\">li:hover ~ li {\r\nopacity: 0.4;\r\n}<\/code><\/pre>\n<p>Cet exemple provient d&rsquo;un effet produit sur <a href=\"http:\/\/jq.creativejuiz.fr\">jq.creativejuiz.fr<\/a> (avec une solution jQuery), ou sur la r\u00e9cente d\u00e9monstration de Rapha\u00ebl Goetter sur un fil d&rsquo;ariane enti\u00e8rement con\u00e7u en CSS : <a href=\"http:\/\/ie7nomore.com\/fun\/breadcrumb\/\" hreflang=\"en\" lang=\"en\">Breadcrumbs without images<\/a>.<\/p>\n<p>Ou avec le deuxi\u00e8me exemple :<\/p>\n<pre class=\"code\" id=\"ex2-art\"><code class=\"css\">input[type=\"radio\"] ~ input {\r\n   margin-left: 2.6em;\r\n}<\/code><\/pre>\n<p>Ce qui permettrait, dans un encha\u00eenement de <code>input + label<\/code> de type radio, d&rsquo;espacer les choix.<br \/>\n<a href=\"\/blog\/doc\/sibling-selecteur-adjacence.html#ex1-b\" class=\"demonstration\">D\u00e9monstration<\/a><\/p>\n<h3 id=\"ex3-art\">Exemple de factorisation pour les niveaux de titre<\/h3>\n<p>J&rsquo;ai essay\u00e9 d&rsquo;aller plus loin encore, avec des choses un peu pouss\u00e9es&#8230; un peu trop peut-\u00eatre.<br \/>\nJe m&rsquo;explique.<\/p>\n<p>Je ne sais pas si la pratique est courante, mais il peut-\u00eatre int\u00e9ressant d&rsquo;avoir une indentation des blocs de texte en fonction du niveau dans lequel on se trouve dans un document (pas du niveau dans le <abbr>DOM<\/abbr>, mais dans la hi\u00e9rarchie des titres).<br \/>\nC&rsquo;est surtout dans un contexte de forte densit\u00e9 de texte que je vois l&rsquo;int\u00e9r\u00eat.<br \/>\nVoici une illustration de mon propos : <a href=\"\/blog\/doc\/sibling-selecteur-adjacence.html#ex2\">voir la d\u00e9monstration<\/a>.<\/p>\n<p>Comme vous pouvez le voir, une marge \u00e0 gauche est appliqu\u00e9e en fonction du niveau de titre qui pr\u00e9c\u00e8de le contenu.<br \/>\nOu plut\u00f4t, en terme de <abbr>CSS<\/abbr>, tout ce qui suit un niveau de titre se verra appliquer une marge en cons\u00e9quence.<br \/>\nLa marge n&rsquo;est qu&rsquo;un exemple parmi d&rsquo;autres, on peut tr\u00e8s bien imager d&rsquo;autres styles plus color\u00e9s.<\/p>\n<p>Vous avez le droit de vous dire que sur le web \u00e7a ne sert pas \u00e0 grand chose et qu&rsquo;on cherche souvent \u00e0 avoir un contenu \u00e9pur\u00e9&#8230; soit, mais imaginons.<\/p>\n<p>Avant de vous donner du code, je tiens \u00e0 pr\u00e9ciser que \u00e7a ne fonctionne pas. En effet, dans le cas pr\u00e9sent, je place les uns \u00e0 la suite des autres des titres, paragraphes et listes.<br \/>\nIl n&rsquo;y a donc aucune profondeur, aucun sectionnement du contenu.<\/p>\n<p>Voici la CSS (version pour Firefox) de l&rsquo;exemple, si vous ne l&rsquo;avez pas d\u00e9j\u00e0 analys\u00e9e directement dans la d\u00e9mo :<\/p>\n<pre class=\"code\"><code class=\"css\">.ex2 h3 {\r\n\tmargin-left: 1em;\r\n}\r\n.ex2 h3 ~ :-moz-any(p, ul, blockquote, h4) {\r\n\tmargin-left: 2em;\r\n}\r\n\t\t\t\r\n.ex2 h4 {\r\n\tmargin-left: 4em;\r\n}\r\n.ex2 h4 ~ :-moz-any(p, ul, blockquote, h5) {\r\n\tmargin-left: 5em;\r\n}\r\n\t\t\t\r\n.ex2 h5 {\r\n\tmargin-left: 7em;\r\n}\r\n.ex2 h5 ~ :-moz-any(p, ul, blockquote, h6) {\r\n\tmargin-left: 8em;\r\n}\r\n\t\t\t\r\n\/* \r\n\tpermettre de remonter dans la hi\u00e9rarchie...\r\n\tmais pas trop...\r\n*\/\r\n.ex2 h5 ~ h4 ~ :-moz-any(p, ul, blockquote, h5) {\r\n\tmargin-left: 5em;\r\n}\r\n\t\t\t\r\n.ex2 h4 ~ h3 ~ :-moz-any(p, ul, blockquote, h4) {\r\n\tmargin-left: 3em;\r\n}<\/code><\/pre>\n<p>Vous remarquerez l&rsquo;utilisation de <code>any()<\/code>, pseudo-classe vue pr\u00e9c\u00e9demment dans l&rsquo;article \u00ab\u00a0<a href=\"\/blog\/veille-technologique\/css3-any-pseudo-classe-prometteuse-et-econome\">CSS3&nbsp;&#8211;&nbsp;Any(),&nbsp;pseudo-classe&nbsp;prometteuse&nbsp;et&nbsp;\u00e9conome<\/a>\u00ab\u00a0, qui me permet d&rsquo;\u00e9conomiser quelques lignes de code.<\/p>\n<p><img decoding=\"async\" src=\"\/blog\/wp-content\/uploads\/2011\/11\/demo-freres1.png\" alt=\"\" title=\"\" width=\"180\" height=\"236\" class=\"alignright size-full wp-image-1621\" \/>Voyez-vous o\u00f9 le probl\u00e8me se pose ?<br \/>\nEn fait, un paragraphe (ou liste) qui se trouve apr\u00e8s un <code>h3<\/code> qui serait lui m\u00eame apr\u00e8s un <code>h4<\/code> se verrait appliquer les styles d&rsquo;un paragraphe (ou liste) se trouvant apr\u00e8s un <code>h4<\/code>. Et oui ! Puisque dans l&rsquo;absolu, ce <code>p<\/code>, m\u00eame si pr\u00e9c\u00e9d\u00e9 d&rsquo;un <code>h3<\/code>, se trouve fr\u00e8re d&rsquo;un <code>h4<\/code>.<\/p>\n<p>Euh&hellip; \u00e7a va ? Je ne vous ai pas perdu ?<\/p>\n<p>Sinon pour information, ce s\u00e9lecteur est compatible avec IE7 et version sup\u00e9rieure, g\u00e9nial non ?<\/p>\n<p>C&rsquo;\u00e9tait une simple r\u00e9flexion sur l&rsquo;utilisation de ce s\u00e9lecteur.<br \/>\nEt vous, vous en pensez quoi ?<br \/>\nJe vous laisse me dire comment vous voyez l&rsquo;utilisation de ce s\u00e9lecteur.<\/p>\n<p>Je rends l&rsquo;antenne.<br \/>\n\u00c0 vous !<\/p>\n<div class=\"sources\">\n<h2>Liens utiles<\/h2>\n<ul>\n<li><a href=\"http:\/\/www.w3.org\/Style\/css3-selectors-updates\/WD-css3-selectors-20010126.fr.html#adjacent-d-combinators\" hreflang=\"en\">Documentation sur les combinateurs d&rsquo;adjacence (W3C &#8211; Anglais)<\/a><\/li>\n<li><a href=\"\/blog\/doc\/sibling-selecteur-adjacence.html\">D\u00e9monstrations de l&rsquo;article<\/a><\/li>\n<li><a href=\"http:\/\/ie7nomore.com\/fun\/breadcrumb\/\" hreflang=\"en\" lang=\"en\">Breadcrumbs without images by Rapha\u00ebl Goetter<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Le s\u00e9lecteur d&rsquo;adjacence indirecte est peu connu en CSS. Arriv\u00e9 avec la nouvelle mouture CSS3, ce s\u00e9lecteur vous permet de s\u00e9lectionner d&rsquo;un seul coup tous les fr\u00e8res d&rsquo;un \u00e9l\u00e9ment cibl\u00e9 r\u00e9pondant \u00e0 un s\u00e9lecteur pr\u00e9cis. Voyons voir avec quelques exemples comment l&rsquo;utiliser et quels sont ses effets.<\/p>\n","protected":false},"author":4,"featured_media":1624,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_bluesky_dont_syndicate":"","_bluesky_syndication_accounts":"","_bluesky_syndication_text":"","footnotes":""},"categories":[17,9,12],"tags":[398,400,405,399,397],"coauthors":[597],"class_list":["post-1577","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-css-css3","category-tutoriels","category-veille-technologique","tag-adjacence","tag-freres","tag-indirecte","tag-selecteur","tag-sibling"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts\/1577","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/comments?post=1577"}],"version-history":[{"count":0,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts\/1577\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/media\/1624"}],"wp:attachment":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/media?parent=1577"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/categories?post=1577"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/tags?post=1577"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/coauthors?post=1577"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}