﻿{"id":549,"date":"2026-02-05T21:47:03","date_gmt":"2026-02-05T20:47:03","guid":{"rendered":"https:\/\/lmspro.fr\/2-1-menu-burger-anime-morphing-css-avec-transitions-avancees-2\/"},"modified":"2026-02-17T19:39:21","modified_gmt":"2026-02-17T18:39:21","slug":"menu-burger-anime-morphing-css-avec-transitions-avancees-2","status":"publish","type":"post","link":"https:\/\/lmspro.fr\/en\/menu-burger-anime-morphing-css-avec-transitions-avancees-2\/","title":{"rendered":"Animated burger menu: CSS morphing with advanced transitions"},"content":{"rendered":"<h2>2.1 Animated burger menu: CSS morphing with advanced transitions<\/h2>\n<p class=\"wpa-text\">Creating an animated burger menu that seamlessly transforms is one of the most iconic micro-interactions in modern web design. This seemingly simple component actually harnesses the full power of CSS transformations and transitions to create a sleek and professional user experience.<\/p>\n<div class=\"article-meta\">\n<p><strong>Module:<\/strong> Module 1: Technical Fundamentals of the Web<\/p>\n<p><strong>Level :<\/strong> Beginner<\/p>\n<p><strong>Duration :<\/strong> 20 minutes<\/p>\n<p><strong>Prerequisites:<\/strong> None<\/p>\n<\/div>\n<h2>Educational objectives<\/h2>\n<ul>\n<li>Mastering the semantic HTML structure of a hamburger menu button<\/li>\n<li>Apply CSS transformations (rotate, translate, scale) precisely<\/li>\n<li>Create smooth transitions with custom cubic-bezier functions<\/li>\n<li>Manage absolute positioning and transformation points (transform-origin)<\/li>\n<li>Implement creative morphing variations (cross, arrow, offset effects)<\/li>\n<\/ul>\n<div class=\"wpa-accordion wpa-accordion-flush\" id=\"accordion-2-1-menu-burger-anime-morphing-css-avec-transitions-avancees\">\n<div class=\"wpa-accordion-item\">\n<button class=\"wpa-accordion-header\" data-wpa-target=\"#accordion-2-1-menu-burger-anime-morphing-css-avec-transitions-avancees-item-1\" aria-expanded=\"false\"><span class=\"wpa-accordion-title\"><span class=\"wpa-accordion-number\">01<\/span> Semantic HTML structure of the burger button<\/span><span class=\"wpa-accordion-icon\"><\/span><\/button><\/p>\n<div id=\"accordion-2-1-menu-burger-anime-morphing-css-avec-transitions-avancees-item-1\" class=\"wpa-accordion-body\">\n<div class=\"wpa-accordion-content\">\n<h4>Optimal HTML architecture<\/h4>\n<p>The structure of a burger menu must adhere to accessibility best practices while offering the necessary flexibility for animations. The element <code><button><\/code> is essential because it naturally provides the interactive semantics expected by assistive technologies. Within this, we use three elements <code>&lt;span&gt;<\/code> which will represent the three horizontal bars of the hamburger menu.<\/p>\n<h4>ARIA attributes and accessibility<\/h4>\n<p>For an inclusive user experience, the button must include appropriate ARIA attributes. The attribute <code>aria-label<\/code> describes the action of the button, while\u2019<code>aria-expanded<\/code> This indicates the menu&#039;s state (open\/closed). This information is crucial for users navigating with screen readers. State management via JavaScript will allow these attributes to be dynamically updated during interactions.<\/p>\n<div class=\"info-box\">\n<p><strong>Key point<\/strong> : The use of empty spans is acceptable here as they serve only for visual decoration, the meaning being carried by the parent button and its ARIA attributes.<\/p>\n<\/div>\n<div class=\"tuto-objectif\" style=\"background: #f5f5f5; border-left: 4px solid #667eea; padding: 16px 20px; margin-top: 24px; border-radius: 0 8px 8px 0;\">\n<h3 style=\"color: #667eea; margin: 0 0 8px 0; font-size: 16px;\">Key points to remember<\/h3>\n<p style=\"margin: 0; color: #333;\">The HTML structure of a burger menu is based on a semantic button containing three spans, enriched with ARIA attributes for accessibility.<\/p>\n<\/div>\n<div class=\"tuto-exercise\" style=\"background: #fff3e0; border-left: 4px solid #ff9800; padding: 16px 20px; margin-top: 20px; border-radius: 0 8px 8px 0;\">\n<h4 style=\"color: #ff9800; margin: 0 0 8px 0; font-size: 15px;\">\ud83c\udfaf Mini-exercise: Accessible HTML structure<\/h4>\n<p style=\"margin: 0; color: #333; font-size: 14px;\">Create the HTML structure of a hamburger menu button with the appropriate accessibility attributes.<\/p>\n<\/div>\n<div class=\"codepen-block\" data-block-id=\"exercise-1\">\n<p class=\"codepen-block-label\">Reference code:<\/p>\n<div class=\"codepen-header\">\n<div class=\"codepen-tabs\">\n<button class=\"codepen-tab active\" data-tab=\"html\">HTML<\/button><br \/>\n<button class=\"codepen-tab\" data-tab=\"css\">CSS<\/button><br \/>\n<button class=\"codepen-tab\" data-tab=\"javascript\">JS<\/button>\n<\/div>\n<p><button class=\"codepen-copy-btn\">Copy<\/button>\n<\/div>\n<div class=\"codepen-code-container\">\n<pre class=\"codepen-code active\" data-lang=\"html\">&lt;button class=&quot;burger-menu&quot; aria-label=&quot;Menu&quot; aria-expanded=&quot;false&quot;&gt;\n  &lt;span class=&quot;burger-line burger-line--top&quot;&gt;&lt;\/span&gt;\n  &lt;span class=&quot;burger-line burger-line--middle&quot;&gt;&lt;\/span&gt;\n  &lt;span class=&quot;burger-line burger-line--bottom&quot;&gt;&lt;\/span&gt;\n&lt;\/button&gt;<\/pre>\n<pre class=\"codepen-code\" data-lang=\"css\">.burger-menu { width: 50px; height: 50px; background: transparent; border:none; cursor: pointer; padding: 12px; position: relative; border-radius: 8px; transition: background-color 0.3s ease; } .burger-menu:hover { background-color: rgba(0, 0, 0, 0.05); } .burger-line { display: block; width: 26px; height: 3px; background-color: #333; margin: 5px 0; border-radius: 2px; transition: all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55); transform-origin: center; }<\/pre>\n<pre class=\"codepen-code\" data-lang=\"javascript\">No JavaScript is required for this CSS exercise.<\/pre>\n<\/div>\n<\/div>\n<div class=\"monaco-sandbox\" data-block-id=\"exercise-1\">\n<div class=\"monaco-header\">\n<div class=\"monaco-tabs\">\n<button class=\"monaco-tab active\" data-lang=\"html\">HTML<\/button><br \/>\n<button class=\"monaco-tab\" data-lang=\"css\">CSS<\/button><br \/>\n<button class=\"monaco-tab\" data-lang=\"javascript\">JS<\/button>\n<\/div>\n<div class=\"monaco-actions\">\n<button class=\"monaco-btn monaco-btn-run\">\u25b6 Run<\/button><br \/>\n<button class=\"monaco-btn monaco-btn-reset\">\u21ba Reset<\/button>\n<\/div>\n<\/div>\n<div class=\"monaco-container\">\n<div class=\"monaco-editor-wrapper\">\n<div class=\"monaco-editor-pane active\" data-lang=\"html\"><\/div>\n<div class=\"monaco-editor-pane\" data-lang=\"css\"><\/div>\n<div class=\"monaco-editor-pane\" data-lang=\"javascript\"><\/div>\n<\/div>\n<div class=\"monaco-preview-wrapper\">\n<div class=\"monaco-preview-header\">Result<\/div>\n<\/div>\n<\/div>\n<div class=\"monaco-status\">\n<span class=\"monaco-status-left\">\u25cf Ready<\/span><br \/>\n<span class=\"monaco-status-right\">Monaco Editor v0.45<\/span>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"wpa-accordion-item\">\n<button class=\"wpa-accordion-header\" data-wpa-target=\"#accordion-2-1-menu-burger-anime-morphing-css-avec-transitions-avancees-item-2\" aria-expanded=\"false\"><span class=\"wpa-accordion-title\"><span class=\"wpa-accordion-number\">02<\/span> Absolute positioning and origin CSS transformations<\/span><span class=\"wpa-accordion-icon\"><\/span><\/button><\/p>\n<div id=\"accordion-2-1-menu-burger-anime-morphing-css-avec-transitions-avancees-item-2\" class=\"wpa-accordion-body\">\n<div class=\"wpa-accordion-content\">\n<h4>Mastery of the transform-origin<\/h4>\n<p>The transform origin determines the point around which rotations and scaling are performed. For a hamburger menu, this choice is crucial: rotating around the center of each bar will create a different effect than rotating around the center of the button. By default, transformations are performed around the center of the element (50% 50%), but you can specify precise positions in pixels, percentages, or keywords (top, bottom, left, right).<\/p>\n<h4>Relative vs. absolute positioning<\/h4>\n<p>The choice between relative and absolute positioning directly impacts the fluidity of animations. Relative positioning keeps the element within the normal document flow, while absolute positioning removes it from the flow. For complex animations where bars need to overlap or drastically change position, absolute positioning offers more control. However, this requires manually managing the spacing and alignment of elements.<\/p>\n<div class=\"info-box\">\n<p><strong>Key point<\/strong> : Using transform-origin: center allows for symmetrical rotations, while left center or right center create more dynamic pivot effects.<\/p>\n<\/div>\n<div class=\"tuto-objectif\" style=\"background: #f5f5f5; border-left: 4px solid #667eea; padding: 16px 20px; margin-top: 24px; border-radius: 0 8px 8px 0;\">\n<h3 style=\"color: #667eea; margin: 0 0 8px 0; font-size: 16px;\">Key points to remember<\/h3>\n<p style=\"margin: 0; color: #333;\">The transform-origin defines the pivot point of transformations, allowing for the creation of precise and natural rotation and scaling effects.<\/p>\n<\/div>\n<div class=\"tuto-exercise\" style=\"background: #fff3e0; border-left: 4px solid #ff9800; padding: 16px 20px; margin-top: 20px; border-radius: 0 8px 8px 0;\">\n<h4 style=\"color: #ff9800; margin: 0 0 8px 0; font-size: 15px;\">\ud83c\udfaf Mini-exercise: Animation with transform-origin<\/h4>\n<p style=\"margin: 0; color: #333; font-size: 14px;\">Create an animation where the burger bars rotate with different origin points to understand the impact of transform-origin.<\/p>\n<\/div>\n<div class=\"codepen-block\" data-block-id=\"exercise-2\">\n<p class=\"codepen-block-label\">Reference code:<\/p>\n<div class=\"codepen-header\">\n<div class=\"codepen-tabs\">\n<button class=\"codepen-tab active\" data-tab=\"html\">HTML<\/button><br \/>\n<button class=\"codepen-tab\" data-tab=\"css\">CSS<\/button><br \/>\n<button class=\"codepen-tab\" data-tab=\"javascript\">JS<\/button>\n<\/div>\n<p><button class=\"codepen-copy-btn\">Copy<\/button>\n<\/div>\n<div class=\"codepen-code-container\">\n<pre class=\"codepen-code active\" data-lang=\"html\">&lt;div class=&quot;transform-demo&quot;&gt;\n  &lt;div class=&quot;demo-section&quot;&gt;\n    &lt;h3&gt;Origin: center (default)&lt;\/h3&gt;\n    &lt;div class=&quot;burger-line demo-center&quot;&gt;&lt;\/div&gt;\n  &lt;\/div&gt;\n  \n  &lt;div class=&quot;demo-section&quot;&gt;\n    &lt;h3&gt;Origin: left center&lt;\/h3&gt;\n    &lt;div class=&quot;burger-line demo-left&quot;&gt;&lt;\/div&gt;\n  &lt;\/div&gt;\n  \n  &lt;div class=&quot;demo-section&quot;&gt;\n    &lt;h3&gt;Origin: right center&lt;\/h3&gt;\n    &lt;div class=&quot;burger-line demo-right&quot;&gt;&lt;\/div&gt;\n  &lt;\/div&gt;\n&lt;\/div&gt;<\/pre>\n<pre class=\"codepen-code\" data-lang=\"css\">.transform-demo { padding: 20px; font-family: system-ui, sans-serif; } .demo-section { margin-bottom: 40px; text-align: center; } .demo-section h3 { margin-bottom: 20px; color: #333; font-size: 14px; } .burger-line { width: 40px; height: 4px; background: linear-gradient(45deg, #667eea, #764ba2); margin: 0 auto; border-radius: 2px; cursor: pointer; transition: transform 0.6s cubic-bezier(0.68, -0.55, 0.265, 1.55); } .demo-center { transform-origin: center; } .demo-center:hover { transform: rotate(45deg) scale(1.2); } .demo-left { transform-origin: left center; } .demo-left:hover { transform: rotate(45deg) scale(1.2); } .demo-right { transform-origin: right center; } .demo-right:hover { transform: rotate(-45deg) scale(1.2); }<\/pre>\n<pre class=\"codepen-code\" data-lang=\"javascript\">No JavaScript is required for this CSS exercise.<\/pre>\n<\/div>\n<\/div>\n<div class=\"monaco-sandbox\" data-block-id=\"exercise-2\">\n<div class=\"monaco-header\">\n<div class=\"monaco-tabs\">\n<button class=\"monaco-tab active\" data-lang=\"html\">HTML<\/button><br \/>\n<button class=\"monaco-tab\" data-lang=\"css\">CSS<\/button><br \/>\n<button class=\"monaco-tab\" data-lang=\"javascript\">JS<\/button>\n<\/div>\n<div class=\"monaco-actions\">\n<button class=\"monaco-btn monaco-btn-run\">\u25b6 Run<\/button><br \/>\n<button class=\"monaco-btn monaco-btn-reset\">\u21ba Reset<\/button>\n<\/div>\n<\/div>\n<div class=\"monaco-container\">\n<div class=\"monaco-editor-wrapper\">\n<div class=\"monaco-editor-pane active\" data-lang=\"html\"><\/div>\n<div class=\"monaco-editor-pane\" data-lang=\"css\"><\/div>\n<div class=\"monaco-editor-pane\" data-lang=\"javascript\"><\/div>\n<\/div>\n<div class=\"monaco-preview-wrapper\">\n<div class=\"monaco-preview-header\">Result<\/div>\n<\/div>\n<\/div>\n<div class=\"monaco-status\">\n<span class=\"monaco-status-left\">\u25cf Ready<\/span><br \/>\n<span class=\"monaco-status-right\">Monaco Editor v0.45<\/span>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"wpa-accordion-item\">\n<button class=\"wpa-accordion-header\" data-wpa-target=\"#accordion-2-1-menu-burger-anime-morphing-css-avec-transitions-avancees-item-3\" aria-expanded=\"false\"><span class=\"wpa-accordion-title\"><span class=\"wpa-accordion-number\">03<\/span> Transitions with custom cubic-bezier for a bouncy effect<\/span><span class=\"wpa-accordion-icon\"><\/span><\/button><\/p>\n<div id=\"accordion-2-1-menu-burger-anime-morphing-css-avec-transitions-avancees-item-3\" class=\"wpa-accordion-body\">\n<div class=\"wpa-accordion-content\">\n<h4>Advanced timing functions<\/h4>\n<p>Cubic-Bezier functions allow you to create custom transition curves that bring animations to life. Unlike predefined keywords (ease, linear, ease-in-out), cubic-Bezier offers complete control over acceleration and deceleration. The function takes four parameters (x1, y1, x2, y2) that define two control points of a cubic B\u00e9zier curve. Negative y-values or values greater than 1 create bouncing or elastic effects that are particularly appealing for micro-interactions.<\/p>\n<h4>Performance optimization<\/h4>\n<p>The use of the property <code>will-change<\/code> This tells the browser that an element will undergo transformations, allowing for GPU optimization. For hamburger menu animations, <code>will-change: transform<\/code> Significantly improves performance on mobile devices. However, be careful to remove this property once the animation is finished to avoid excessive memory consumption. The transform and opacity properties are the most efficient because they do not trigger a DOM reflow or repaint.<\/p>\n<div class=\"info-box\">\n<p><strong>Key point<\/strong> : The cubic-bezier(0.68, -0.55, 0.265, 1.55) function creates an elegant bounce effect, perfect for burger menu interactions.<\/p>\n<\/div>\n<div class=\"tuto-objectif\" style=\"background: #f5f5f5; border-left: 4px solid #667eea; padding: 16px 20px; margin-top: 24px; border-radius: 0 8px 8px 0;\">\n<h3 style=\"color: #667eea; margin: 0 0 8px 0; font-size: 16px;\">Key points to remember<\/h3>\n<p style=\"margin: 0; color: #333;\">Custom cubic-bezier curves transform basic transitions into engaging micro-interactions with natural bounce effects.<\/p>\n<\/div>\n<div class=\"tuto-exercise\" style=\"background: #fff3e0; border-left: 4px solid #ff9800; padding: 16px 20px; margin-top: 20px; border-radius: 0 8px 8px 0;\">\n<h4 style=\"color: #ff9800; margin: 0 0 8px 0; font-size: 15px;\">\ud83c\udfaf Mini-exercise: Comparing timing curves<\/h4>\n<p style=\"margin: 0; color: #333; font-size: 14px;\">Explore different cubic-bezier functions to understand their impact on the feel of the burger menu animation.<\/p>\n<\/div>\n<div class=\"codepen-block\" data-block-id=\"exercise-3\">\n<p class=\"codepen-block-label\">Reference code:<\/p>\n<div class=\"codepen-header\">\n<div class=\"codepen-tabs\">\n<button class=\"codepen-tab active\" data-tab=\"html\">HTML<\/button><br \/>\n<button class=\"codepen-tab\" data-tab=\"css\">CSS<\/button><br \/>\n<button class=\"codepen-tab\" data-tab=\"javascript\">JS<\/button>\n<\/div>\n<p><button class=\"codepen-copy-btn\">Copy<\/button>\n<\/div>\n<div class=\"codepen-code-container\">\n<pre class=\"codepen-code active\" data-lang=\"html\">&lt;div class=&quot;timing-comparison&quot;&gt;\n  &lt;div class=&quot;timing-demo&quot;&gt;\n    &lt;h3&gt;ease (default)&lt;\/h3&gt;\n    &lt;button class=&quot;burger-btn timing-ease&quot;&gt;\n      &lt;span&gt;&lt;\/span&gt;\n      &lt;span&gt;&lt;\/span&gt;\n      &lt;span&gt;&lt;\/span&gt;\n    &lt;\/button&gt;\n  &lt;\/div&gt;\n  \n  &lt;div class=&quot;timing-demo&quot;&gt;\n    &lt;h3&gt;cubic-bezier bounce&lt;\/h3&gt;\n    &lt;button class=&quot;burger-btn timing-bounce&quot;&gt;\n      &lt;span&gt;&lt;\/span&gt;\n      &lt;span&gt;&lt;\/span&gt;\n      &lt;span&gt;&lt;\/span&gt;\n    &lt;\/button&gt;\n  &lt;\/div&gt;\n  \n  &lt;div class=&quot;timing-demo&quot;&gt;\n    &lt;h3&gt;cubic-bezier elastic&lt;\/h3&gt;\n    &lt;button class=&quot;burger-btn timing-elastic&quot;&gt;\n      &lt;span&gt;&lt;\/span&gt;\n      &lt;span&gt;&lt;\/span&gt;\n      &lt;span&gt;&lt;\/span&gt;\n    &lt;\/button&gt;\n  &lt;\/div&gt;\n&lt;\/div&gt;<\/pre>\n<pre class=\"codepen-code\" data-lang=\"css\">.timing-comparison { display: flex; gap: 40px; justify-content: center; padding: 20px; flex-wrap:wrap; font-family: system-ui, sans-serif; } .timing-demo { text-align: center; } .timing-demo h3 { margin-bottom: 15px; font-size: 12px; color: #666; text-transform: uppercase; letter-spacing: 0.5px; } .burger-btn { width: 50px; height: 50px; background:white; border: 2px solid #ddd; border-radius: 12px; cursor: pointer; padding: 12px; will-change: transform; transition: border-color 0.2s ease; } .burger-btn:hover { border-color: #667eea; } .burger-btn span { display: block; width: 22px; height: 2px; background: #333; margin: 4px 0; border-radius: 1px; } .timing-ease span { transition: all 0.4s ease; } .timing-bounce span { transition: all 0.6s cubic-bezier(0.68, -0.55, 0.265, 1.55); } .timing-elastic span { transition: all 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275); } .burger-btn.active span:nth-child(1) { transform: rotate(45deg) translateY(6px); } .burger-btn.active span:nth-child(2) { opacity: 0; transform: scaleX(0); } .burger-btn.active span:nth-child(3) { transform: rotate(-45deg) translateY(-6px); }<\/pre>\n<pre class=\"codepen-code\" data-lang=\"javascript\">No JavaScript is required for this CSS exercise.<\/pre>\n<\/div>\n<\/div>\n<div class=\"monaco-sandbox\" data-block-id=\"exercise-3\">\n<div class=\"monaco-header\">\n<div class=\"monaco-tabs\">\n<button class=\"monaco-tab active\" data-lang=\"html\">HTML<\/button><br \/>\n<button class=\"monaco-tab\" data-lang=\"css\">CSS<\/button><br \/>\n<button class=\"monaco-tab\" data-lang=\"javascript\">JS<\/button>\n<\/div>\n<div class=\"monaco-actions\">\n<button class=\"monaco-btn monaco-btn-run\">\u25b6 Run<\/button><br \/>\n<button class=\"monaco-btn monaco-btn-reset\">\u21ba Reset<\/button>\n<\/div>\n<\/div>\n<div class=\"monaco-container\">\n<div class=\"monaco-editor-wrapper\">\n<div class=\"monaco-editor-pane active\" data-lang=\"html\"><\/div>\n<div class=\"monaco-editor-pane\" data-lang=\"css\"><\/div>\n<div class=\"monaco-editor-pane\" data-lang=\"javascript\"><\/div>\n<\/div>\n<div class=\"monaco-preview-wrapper\">\n<div class=\"monaco-preview-header\">Result<\/div>\n<\/div>\n<\/div>\n<div class=\"monaco-status\">\n<span class=\"monaco-status-left\">\u25cf Ready<\/span><br \/>\n<span class=\"monaco-status-right\">Monaco Editor v0.45<\/span>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"wpa-accordion-item\">\n<button class=\"wpa-accordion-header\" data-wpa-target=\"#accordion-2-1-menu-burger-anime-morphing-css-avec-transitions-avancees-item-4\" aria-expanded=\"false\"><span class=\"wpa-accordion-title\"><span class=\"wpa-accordion-number\">04<\/span> Creative variations: arrow morphing, offset cross morphing<\/span><span class=\"wpa-accordion-icon\"><\/span><\/button><\/p>\n<div id=\"accordion-2-1-menu-burger-anime-morphing-css-avec-transitions-avancees-item-4\" class=\"wpa-accordion-body\">\n<div class=\"wpa-accordion-content\">\n<h4>Directional arrow morphing<\/h4>\n<p>Arrow morphing requires a different approach than the classic burger-to-X. The top and bottom bars must rotate and translate to form the arrow&#039;s branches, while the middle bar can either disappear or transform into a stem. The trick is to combine several transformations: rotation for the angle, translation for positioning, and scaling to adjust the length. This technique is particularly effective for navigation buttons (previous\/next) or accordions.<\/p>\n<h4>Offset cross effect and temporal variations<\/h4>\n<p>The staggered cross animation adds further sophistication by introducing different delays for each bar. The property <code>transition-delay<\/code> This technique creates a cascading effect where the bars don&#039;t move simultaneously. It can be taken further with sequential transformations: the middle bar disappears first, followed by the outer bars which rotate with a slight time lag. The overall effect is more organic and more eye-catching.<\/p>\n<div class=\"info-box\">\n<p><strong>Key point<\/strong> : Using transition-delay with stepped values (0s, 0.1s, 0.2s) creates an elegant and professional cascading effect.<\/p>\n<\/div>\n<div class=\"tuto-objectif\" style=\"background: #f5f5f5; border-left: 4px solid #667eea; padding: 16px 20px; margin-top: 24px; border-radius: 0 8px 8px 0;\">\n<h3 style=\"color: #667eea; margin: 0 0 8px 0; font-size: 16px;\">Key points to remember<\/h3>\n<p style=\"margin: 0; color: #333;\">Creative morphing variants combine rotations, translations, and time delays to create unique and memorable micro-interactions.<\/p>\n<\/div>\n<div class=\"tuto-exercise\" style=\"background: #fff3e0; border-left: 4px solid #ff9800; padding: 16px 20px; margin-top: 20px; border-radius: 0 8px 8px 0;\">\n<h4 style=\"color: #ff9800; margin: 0 0 8px 0; font-size: 15px;\">\ud83c\udfaf Mini exercise: Multi-variation burger menu<\/h4>\n<p style=\"margin: 0; color: #333; font-size: 14px;\">Implement three morphing variants: classic cross, directional arrow and offset cross with temporal effects.<\/p>\n<\/div>\n<div class=\"codepen-block\" data-block-id=\"exercise-4\">\n<p class=\"codepen-block-label\">Reference code:<\/p>\n<div class=\"codepen-header\">\n<div class=\"codepen-tabs\">\n<button class=\"codepen-tab active\" data-tab=\"html\">HTML<\/button><br \/>\n<button class=\"codepen-tab\" data-tab=\"css\">CSS<\/button><br \/>\n<button class=\"codepen-tab\" data-tab=\"javascript\">JS<\/button>\n<\/div>\n<p><button class=\"codepen-copy-btn\">Copy<\/button>\n<\/div>\n<div class=\"codepen-code-container\">\n<pre class=\"codepen-code active\" data-lang=\"html\">&lt;div class=&quot;burger-variants&quot;&gt;\n  &lt;div class=&quot;variant-section&quot;&gt;\n    &lt;h3&gt;Classic Cross&lt;\/h3&gt;\n    &lt;button class=&quot;burger-menu variant-cross&quot; onclick=&quot;this.classList.toggle(&#039;active&#039;)&quot;&gt;\n      &lt;span&gt;&lt;\/span&gt;\n      &lt;span&gt;&lt;\/span&gt;\n      &lt;span&gt;&lt;\/span&gt;\n    &lt;\/button&gt;\n  &lt;\/div&gt;\n  \n  &lt;div class=&quot;variant-section&quot;&gt;\n    &lt;h3&gt;Arrow&lt;\/h3&gt;\n    &lt;button class=&quot;burger-menu variant-arrow&quot; onclick=&quot;this.classList.toggle(&#039;active&#039;)&quot;&gt;\n      &lt;span&gt;&lt;\/span&gt;\n      &lt;span&gt;&lt;\/span&gt;\n      &lt;span&gt;&lt;\/span&gt;\n    &lt;\/button&gt;\n  &lt;\/div&gt;\n  \n  &lt;div class=&quot;variant-section&quot;&gt;\n    &lt;h3&gt;Offset Cross&lt;\/h3&gt;\n    &lt;button class=&quot;burger-menu variant-stagger&quot; onclick=&quot;this.classList.toggle(&#039;active&#039;)&quot;&gt;\n      &lt;span&gt;&lt;\/span&gt;\n      &lt;span&gt;&lt;\/span&gt;\n      &lt;span&gt;&lt;\/span&gt;\n    &lt;\/button&gt;\n  &lt;\/div&gt;\n&lt;\/div&gt;<\/pre>\n<pre class=\"codepen-code\" data-lang=\"css\">.burger-variants { display: flex; gap: 60px; justify-content: center; padding: 40px 20px; flex-wrap:wrap; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); font-family: system-ui, sans-serif; } .variant-section { text-align: center; } .variant-section h3 { color: white; margin-bottom: 20px; font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 1px; } .burger-menu { width: 60px; height: 60px; background: rgba(255, 255, 255, 0.1); border: 2px solid rgba(255, 255, 255, 0.2); border-radius: 15px; cursor: pointer; backdrop-filter: blur(10px); transition: all 0.3s ease; } .burger-menu:hover { background: rgba(255, 255, 255, 0.15); border-color: rgba(255, 255, 255, 0.4); transform: translateY(-2px); box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2); } .burger-menu span { display: block; width: 26px; height: 3px; background:white; margin: 7px self; border-radius: 2px; transform-origin: center; } \/* Classic cross *\/ .variant-cross span { transition: all 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55); } .variant-cross.active span:nth-child(1) { transform: rotate(45deg) translateY(10px); } .variant-cross.active span:nth-child(2) { opacity: 0; transform: scaleX(0); } .variant-cross.active span:nth-child(3) { transform: rotate(-45deg) translateY(-10px); } \/* Arrow *\/ .variant-arrow span { transition: all 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275); } .variant-arrow.active span:nth-child(1) { transform: rotate(-45deg) translateX(-8px) translateY(8px) scaleX(0.7); } .variant-arrow.active span:nth-child(2) { transform: translateX(-6px); } .variant-arrow.active span:nth-child(3) { transform: rotate(45deg) translateX(-8px) translateY(-8px) scaleX(0.7); } \/* Shifted cross *\/ .variant-stagger span:nth-child(1) { transition: all 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55) 0s; } .variant-stagger span:nth-child(2) { transition: all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55) 0.1s; } .variant-stagger span:nth-child(3) { transition: all 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55) 0.2s; } .variant-stagger.active span:nth-child(1) { transform: rotate(45deg) translateY(10px) translateX(2px); } .variant-stagger.active span:nth-child(2) { opacity: 0; transform: scaleX(0) rotate(180deg); } .variant-stagger.active span:nth-child(3) { transform: rotate(-45deg) translateY(-10px) translateX(2px); }<\/pre>\n<pre class=\"codepen-code\" data-lang=\"javascript\">\/\/ Minimal JavaScript for toggles (included in the HTML onclick) \/\/ Alternative with addEventListener if preferred: \/* document.querySelectorAll(&#039;.burger-menu&#039;).forEach(button =&gt; { button.addEventListener(&#039;click&#039;, () =&gt; { button.classList.toggle(&#039;active&#039;); }); }); *\/<\/pre>\n<\/div>\n<\/div>\n<div class=\"monaco-sandbox\" data-block-id=\"exercise-4\">\n<div class=\"monaco-header\">\n<div class=\"monaco-tabs\">\n<button class=\"monaco-tab active\" data-lang=\"html\">HTML<\/button><br \/>\n<button class=\"monaco-tab\" data-lang=\"css\">CSS<\/button><br \/>\n<button class=\"monaco-tab\" data-lang=\"javascript\">JS<\/button>\n<\/div>\n<div class=\"monaco-actions\">\n<button class=\"monaco-btn monaco-btn-run\">\u25b6 Run<\/button><br \/>\n<button class=\"monaco-btn monaco-btn-reset\">\u21ba Reset<\/button>\n<\/div>\n<\/div>\n<div class=\"monaco-container\">\n<div class=\"monaco-editor-wrapper\">\n<div class=\"monaco-editor-pane active\" data-lang=\"html\"><\/div>\n<div class=\"monaco-editor-pane\" data-lang=\"css\"><\/div>\n<div class=\"monaco-editor-pane\" data-lang=\"javascript\"><\/div>\n<\/div>\n<div class=\"monaco-preview-wrapper\">\n<div class=\"monaco-preview-header\">Result<\/div>\n<\/div>\n<\/div>\n<div class=\"monaco-status\">\n<span class=\"monaco-status-left\">\u25cf Ready<\/span><br \/>\n<span class=\"monaco-status-right\">Monaco Editor v0.45<\/span>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h2>Summary<\/h2>\n<div class=\"tuto-recap\" style=\"background: #f5f5f5; border-left: 4px solid #9c27b0; padding: 16px 20px; border-radius: 0 8px 8px 0;\">\n<h3 style=\"color: #9c27b0; margin: 0 0 12px 0; font-size: 16px;\">Key points to remember<\/h3>\n<ul style=\"margin: 0; padding-left: 20px; color: #333;\">\n<li><strong>Semantic HTML structure<\/strong> A button with ARIA attributes containing three spans for accessibility<\/li>\n<li><strong>Strategic transformation origin<\/strong> The pivot point determines the style and fluidity of the animation.<\/li>\n<li><strong>Custom cubic-bezier functions<\/strong> Create professional rebound and elasticity effects<\/li>\n<li><strong>GPU Optimization<\/strong> Will-change and transform\/opacity properties for smooth performance<\/li>\n<li><strong>Creative variations<\/strong> Time delays and combinations of transformations for unique effects<\/li>\n<\/ul>\n<\/div>\n<h2>Sources<\/h2>\n<div class=\"sources-box\" style=\"background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%); border: 1px solid #cbd5e1; border-radius: 12px; padding: 16px; margin-bottom: 24px;\">\n<p style=\"color: #64748b; margin: 0 0 12px 0; font-size: 13px;\">To deepen your knowledge:<\/p>\n<ul style=\"margin: 0; padding-left: 0; list-style: none;\">\n<li style=\"margin-bottom: 8px;\">\n<a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\/CSS_Transitions\/Using_CSS_transitions\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"display: flex; align-items: center; gap: 10px; padding: 10px 14px; background: white; border-radius: 8px; text-decoration: none; color: #1e293b; border: 1px solid #e2e8f0;\"><br \/>\n<span style=\"color: #94a3b8;\">\ud83d\udd17<\/span><br \/>\n<span style=\"flex: 1; font-weight: 500; color: #0f172a;\">MDN \u2013 Using CSS transitions<\/span><br \/>\n<span style=\"color: #94a3b8;\">\u2192<\/span><br \/>\n<\/a>\n<\/li>\n<li style=\"margin-bottom: 0;\">\n<a href=\"https:\/\/css-tricks.com\/almanac\/properties\/t\/transform-origin\/\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"display: flex; align-items: center; gap: 10px; padding: 10px 14px; background: white; border-radius: 8px; text-decoration: none; color: #1e293b; border: 1px solid #e2e8f0;\"><br \/>\n<span style=\"color: #94a3b8;\">\ud83d\udd17<\/span><br \/>\n<span style=\"flex: 1; font-weight: 500; color: #0f172a;\">CSS-Tricks \u2013 Transform Origin<\/span><br \/>\n<span style=\"color: #94a3b8;\">\u2192<\/span><br \/>\n<\/a>\n<\/li>\n<\/ul>\n<\/div>\n<h2>Validate your knowledge<\/h2>\n<p>Test your understanding with this 10-question quiz:<\/p>\n<div id=\"quiz-block-1\" class=\"quiz-container\" data-quiz-json=\"https:\/\/lmspro.fr\/wp-content\/plugins\/generate-article-endpoint\/quiz-data\/en\/quiz-2-1-menu-burger-anime-morphing-css-avec-transitions-avancees.json\" aria-label=\"Interactive Quiz\"><div class=\"quiz-loading\" role=\"status\" aria-live=\"polite\"><span class=\"quiz-sr-only\">Loading quiz...<\/span><\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>2.1 Animated Burger Menu: CSS Morphing with Advanced Transitions. Creating an animated burger menu that transforms smoothly is one of the most iconic micro-interactions in modern web design. This seemingly simple component actually harnesses the full power of CSS transformations and transitions to create a sleek and professional user experience. Module: \u2026 <a href=\"https:\/\/lmspro.fr\/en\/menu-burger-anime-morphing-css-avec-transitions-avancees-2\/\" class=\"more-link\">Read More<span class=\"screen-reader-text\"> \u00ab\u00a0Menu burger anim\u00e9 : morphing CSS avec transitions avanc\u00e9es\u00a0\u00bb<\/span> &raquo;<\/a><\/p>","protected":false},"author":1,"featured_media":550,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[30],"tags":[34,25,26,132,27,28,133,2],"class_list":["post-549","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-module-1-fondamentaux-techniques-du-web","tag-accessibilite","tag-animation","tag-css","tag-fondamentaux-web","tag-html","tag-javascript","tag-js","tag-ux"],"_links":{"self":[{"href":"https:\/\/lmspro.fr\/en\/wp-json\/wp\/v2\/posts\/549","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lmspro.fr\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lmspro.fr\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lmspro.fr\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lmspro.fr\/en\/wp-json\/wp\/v2\/comments?post=549"}],"version-history":[{"count":2,"href":"https:\/\/lmspro.fr\/en\/wp-json\/wp\/v2\/posts\/549\/revisions"}],"predecessor-version":[{"id":637,"href":"https:\/\/lmspro.fr\/en\/wp-json\/wp\/v2\/posts\/549\/revisions\/637"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/lmspro.fr\/en\/wp-json\/wp\/v2\/media\/550"}],"wp:attachment":[{"href":"https:\/\/lmspro.fr\/en\/wp-json\/wp\/v2\/media?parent=549"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lmspro.fr\/en\/wp-json\/wp\/v2\/categories?post=549"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lmspro.fr\/en\/wp-json\/wp\/v2\/tags?post=549"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}