{"id":2332,"date":"2012-04-03T09:12:43","date_gmt":"2012-04-03T07:12:43","guid":{"rendered":"https:\/\/www.creativejuiz.fr\/blog\/?p=2332"},"modified":"2015-06-02T20:46:59","modified_gmt":"2015-06-02T18:46:59","slug":"menu-deroulant-css3-transition-max-height","status":"publish","type":"post","link":"https:\/\/www.creativejuiz.fr\/blog\/tutoriels\/menu-deroulant-css3-transition-max-height","title":{"rendered":"Menu d\u00e9roulant en CSS3 avec transition et max-height"},"content":{"rendered":"<p>Il y a quelques temps d\u00e9j\u00e0, <a href=\"http:\/\/jsfiddle.net\/leaverou\/zwvNY\/\">Lea Verou proposait<\/a> d&rsquo;utiliser la propri\u00e9t\u00e9 <code>max-height<\/code> afin d&rsquo;effectuer des animations sur un \u00e9l\u00e9ment sans toucher \u00e0 la propri\u00e9t\u00e9 <code>height<\/code>. Avec une petite adaptation, il est possible de cr\u00e9er un menu d\u00e9roulant au survol avec un petit d\u00e9lai cr\u00e9\u00e9 gr\u00e2ce \u00e0 la propri\u00e9t\u00e9 CSS 3 <code>transition<\/code>.<!--more--><\/p>\n<p class=\"center\"><a class=\"demonstration\" href=\"\/blog\/doc\/menu-css3-dropdown-max-height.html\">D\u00e9monstration<\/a><\/p>\n<p class=\"message important\">Le sujet du menu d\u00e9roulant est tr\u00e8s sensible. De par sa nature, il est bien souvent consid\u00e9r\u00e9 comme peu ergonomique, inaccessible et dans certains cas il est l&rsquo;illustration d&rsquo;un mauvais travail sur l&rsquo;arborescence d&rsquo;un site. Bref, l&rsquo;article ici pr\u00e9sente une d\u00e9monstration en CSS, non une \u00e9tude approfondie des tenants et aboutissants d&rsquo;un menu d\u00e9roulant.<\/p>\n<h2>Un bout de HTML<\/h2>\n<p>Le code HTML est assez classique, il s&rsquo;agit d&rsquo;imbriquer des listes non-ordonn\u00e9es.<\/p>\n<pre class=\"code\"><code class=\"language-markup\">&lt;ul id=\"menu\"&gt;\r\n\t&lt;li&gt;&lt;a href=\"#\"&gt;Menu 1&lt;\/a&gt;\r\n\t\t&lt;ul&gt;\r\n\t\t\t&lt;li&gt;&lt;a href=\"#\"&gt;Level 1.1&lt;\/a&gt;&lt;\/li&gt;\r\n\t\t\t&lt;li&gt;&lt;a href=\"#\"&gt;Level 1.2&lt;\/a&gt;&lt;\/li&gt;\r\n\t\t&lt;\/ul&gt;\r\n\t&lt;\/li&gt;&lt;li&gt;&lt;a href=\"#\"&gt;Menu 2&lt;\/a&gt;\r\n\t\t&lt;ul&gt;\r\n\t\t\t&lt;li&gt;&lt;a href=\"#\"&gt;Level 2.1&lt;\/a&gt;&lt;\/li&gt;\r\n\t\t\t&lt;li&gt;&lt;a href=\"#\"&gt;Level 2.2&lt;\/a&gt;&lt;\/li&gt;\r\n\t\t\t&lt;li&gt;&lt;a href=\"#\"&gt;Level 2.3&lt;\/a&gt;&lt;\/li&gt;\r\n\t\t\t&lt;li&gt;&lt;a href=\"#\"&gt;Level 2.4&lt;\/a&gt;&lt;\/li&gt;\r\n\t\t&lt;\/ul&gt;\r\n\t&lt;\/li&gt;&lt;li&gt;&lt;a href=\"#\"&gt;Menu 3&lt;\/a&gt;\r\n\t\t&lt;ul&gt;\r\n\t\t\t&lt;li&gt;&lt;a href=\"#\"&gt;Level 3.1&lt;\/a&gt;&lt;\/li&gt;\r\n\t\t\t&lt;li&gt;&lt;a href=\"#\"&gt;Level 3.2&lt;\/a&gt;&lt;\/li&gt;\r\n\t\t\t&lt;li&gt;&lt;a href=\"#\"&gt;Level 3.3&lt;\/a&gt;&lt;\/li&gt;\r\n\t\t&lt;\/ul&gt;\r\n\t&lt;\/li&gt;\r\n&lt;\/ul&gt;<\/code><\/pre>\n<p>Les chevrons fermants et ouvrants des <code class=\"element\">li<\/code> de premier niveau sont coll\u00e9s pour \u00e9viter le <code>white-space<\/code>. (pour en savoir plus : <a href=\"\/blog\/tutoriels\/display-inline-block-une-valeur-trop-peu-utilisee\">Article sur display inline-block &#8211; Creative Juiz<\/a>)<\/p>\n<h2>Place au CSS<\/h2>\n<figure id=\"attachment_2344\" aria-labelledby=\"figcaption_attachment_2344\" class=\"wp-caption aligncenter\" style=\"width: 468px\"><img decoding=\"async\" class=\"size-full wp-image-2344\" title=\"\" src=\"https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2012\/04\/drop-down-menu-css3.png\" alt=\"\" width=\"458\" height=\"174\" srcset=\"https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2012\/04\/drop-down-menu-css3.png 458w, https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2012\/04\/drop-down-menu-css3-300x113.png 300w\" sizes=\"(max-width: 458px) 100vw, 458px\" \/><figcaption id=\"figcaption_attachment_2344\" class=\"wp-caption-text\">Le menu d\u00e9roulant termin\u00e9<\/figcaption><\/figure>\n<p>Je ne vais pas d\u00e9tailler ici la partie sur la cr\u00e9ation d&rsquo;un menu horizontal. Je vous invite \u00e0 lire le tutoriel \u00ab\u00a0<a href=\"\/blog\/tutoriels\/creer-menu-horizontal-centre-css-sans-javascript\">Cr\u00e9er un menu horizontal centr\u00e9<\/a>\u00a0\u00bb qui reprend une partie des explications.<\/p>\n<pre class=\"code\"><code class=\"language-css\">\/* partie positionnement et d\u00e9co *\/\r\n#menu a { \r\n\tdisplay:block; \r\n\tcolor: #fff; \r\n\ttext-decoration:none;\r\n}\r\n#menu &gt; li,\r\n#menu &gt; li li {\r\n\tposition: relative;\r\n\tdisplay:inline-block;\r\n\twidth: 110px;\r\n\tpadding: 6px 15px;\r\n\tbackground-color: #777;\r\n\tbackground-image: linear-gradient(#aaa, #888 50%, #777 50%,#999);\r\n}\r\n#menu &gt; li li { background: transparent none; }\r\n#menu &gt; li li a { color: #444; }\r\n#menu &gt; li li:hover { background:#eee; }\r\n#menu &gt; li:first-child {\r\n\tborder-right: 1px solid #777;\r\n\tborder-radius: 8px 0 0 8px;\r\n}\r\n#menu &gt; li + li {\r\n\tborder-left: 1px solid #aaa;\r\n\tborder-right: 1px solid #777;\r\n}\r\n#menu &gt; li:last-child {\r\n\tborder-right: 0;\r\n\tborder-left: 1px solid #aaa;\r\n\tborder-radius: 0 8px 8px 0 ;\r\n}\r\n#menu &gt; li:hover {\r\n\tbackground-color: #999;\r\n\tbackground-image: linear-gradient(#ccc, #aaa 50%, #999 50%,#bbb);\r\n}\r\n\/* (presque) fin de la partie positionnement\/d\u00e9co *\/\r\n\/* dans cette d\u00e9claration, on fixe le max-height *\/\r\n#menu ul {\r\n\tposition: absolute;\r\n\ttop: 2em; left: 0;\r\n\tmax-height:0em;\t\r\n\tmargin: 0; padding: 0;\r\n\tbackground-color: #ddd;\r\n\tbackground-image: linear-gradient(#fff,#ddd);\r\n\toverflow: hidden;\r\n\ttransition: 1s max-height 0.3s;\r\n\tborder-radius: 0 0 8px 8px;\r\n}\r\n\/* ici on change la valeur de max-height au :hover *\/\r\n#menu &gt; li:hover ul {\r\n\t\/* \u00e0 adapter, le minimum est le meilleur mais voyez large ;) *\/\r\n\tmax-height: 13em;\r\n}<\/code><\/pre>\n<p>Concentrons nous sur l&rsquo;utilisation de <code>max-height<\/code> et <code>transition<\/code> pour effectuer notre animation.<br \/>\nLorsqu&rsquo;on fixe, ligne 41, la valeur de <code>max-height<\/code> \u00e0 <code>0<\/code>, on lui dit clairement : ta hauteur maximale sera nulle (l&rsquo;\u00e9l\u00e9ment ne sera pas visible).<br \/>\nPour que cela fonctionne, il faut coupler cette propri\u00e9t\u00e9 \u00e0 un d\u00e9bordement cach\u00e9 (ligne 45).<\/p>\n<p>Ligne 46, nous pr\u00e9voyons une transition sur la propri\u00e9t\u00e9 <code>max-height<\/code> que nous allons faire varier par la suite. Cette transition se d\u00e9roulera sur <code>1s<\/code> et se d\u00e9clanchera <code>0.3s<\/code> apr\u00e8s le survol de l&rsquo;\u00e9l\u00e9ment, et ce pour le confort de l&rsquo;utilisateur. (\u00e7a \u00e9vite d&rsquo;avoir des sous-menus qui se d\u00e9roulent d\u00e8s qu&rsquo;on effleure le menu)<\/p>\n<p>Enfin, au survol de l&rsquo;\u00e9l\u00e9ment <code class=\"element\">li<\/code>, nous faisons varier la hauteur maximale du sous-menu (ligne 52).<br \/>\nEn pr\u00e9voyant large (mais pas trop), vous cr\u00e9erez un effet de d\u00e9lai avant l&rsquo;animation de repliement. Ici <code>8em<\/code> seraient suffisant, j&rsquo;en pr\u00e9voit 13.<\/p>\n<p class=\"center\"><a class=\"demonstration\" href=\"\/blog\/doc\/menu-css3-dropdown-max-height.html\">D\u00e9monstration<\/a><\/p>\n<p>N&rsquo;h\u00e9sitez pas \u00e0 commenter si vous avez des zones floues \ud83d\ude09<br \/>\nAmusez-vous bien !<\/p>\n<div class=\"sources\">\n<h2>Sources et liens utiles<\/h2>\n<ul>\n<li><a href=\"http:\/\/dabblet.com\/gist\/1922992\/\" hreflang=\"en\">D\u00e9mo sur Dabblet<\/a><\/li>\n<li><a href=\"http:\/\/blog.goetter.fr\/post\/19567164775\/max-height-a-la-rescousse-des-transitions-css3\">Max-height \u00e0 la rescousse des Animations CSS3 &#8211; Goetter<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Il y a quelques temps d\u00e9j\u00e0, Lea Verou proposait d&rsquo;utiliser la propri\u00e9t\u00e9 max-height afin d&rsquo;effectuer des animations sur un \u00e9l\u00e9ment sans toucher \u00e0 la propri\u00e9t\u00e9 height. Avec une petite adaptation, il est possible de cr\u00e9er un menu d\u00e9roulant au survol avec un petit d\u00e9lai cr\u00e9\u00e9 gr\u00e2ce \u00e0 la propri\u00e9t\u00e9 CSS 3 transition.<\/p>\n","protected":false},"author":4,"featured_media":2340,"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":[428,158,157,121],"coauthors":[597],"class_list":["post-2332","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-css-css3","category-tutoriels","category-veille-technologique","tag-css3","tag-deroulant","tag-menu","tag-transition"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts\/2332","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=2332"}],"version-history":[{"count":0,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts\/2332\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/media\/2340"}],"wp:attachment":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/media?parent=2332"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/categories?post=2332"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/tags?post=2332"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/coauthors?post=2332"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}