[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-config":3,"course-tree":6,"blog-categories":646,"topic:motion-accessibility-prefers-reduced-motion-performance":670},{"data":4},{"google_site_verification":5,"ga4_measurement_id":5,"site_name":5,"default_og_image":5,"twitter_handle":5},null,{"data":7},[8,334],{"id":9,"name":10,"slug":11,"icon":5,"icon_url":5,"short_description":12,"meta_title":13,"meta_description":14,"og_image":15,"locale":16,"subcategories":17},1,"HTML","html-tutorial","Welcome to our HTML Tutorial for Beginners, a complete guide designed to help you learn HTML from the ground up.\n\nHTML, which stands for HyperText Markup Language, is the standard language used to structure content on the web. Whether you want to become a web developer, build your own website, or continue learning CSS and JavaScript, understanding HTML is an essential first step.\n\nThis HTML course takes you through the fundamentals step by step, using simple explanations and practical examples. ","HTML Tutorial for Beginners - Learn HTML Step by Step","Learn HTML from scratch with our beginner-friendly HTML tutorial. Understand HTML tags, elements, forms, tables, links, images, semantic HTML and more with practical examples.","https:\u002F\u002Fwpfsharp.com\u002Fstorage\u002Fcourses\u002Fog\u002F01M2GK0XN45C0B937NF9XFAD4S.webp","en",[18,46,82,106,182,216,230,258,282,298],{"id":9,"name":19,"slug":20,"order_index":9,"topics":21},"HTML Fundamentals & Setup","html-fundamentals-setup",[22,27,30,34,38,42],{"id":23,"title":24,"slug":25,"order_index":9,"cornerstone":26,"reading_time_minutes":23},2,"HTML Editors & Environment Setup","html-editors-and-environment-setup",false,{"id":9,"title":28,"slug":29,"order_index":9,"cornerstone":26,"reading_time_minutes":9},"HTML Introduction & History","html-introduction-and-history",{"id":31,"title":32,"slug":33,"order_index":31,"cornerstone":26,"reading_time_minutes":23},3,"HTML Basic Syntax & Document Structure","html-basic-syntax-document-structure",{"id":35,"title":36,"slug":37,"order_index":35,"cornerstone":26,"reading_time_minutes":23},4,"HTML Elements & Tags Explained","html-elements-tags-explained",{"id":39,"title":40,"slug":41,"order_index":39,"cornerstone":26,"reading_time_minutes":23},5,"HTML Attributes (Global & Standard)","html-attributes-global-standard",{"id":43,"title":44,"slug":45,"order_index":43,"cornerstone":26,"reading_time_minutes":23},6,"Understanding the DOCTYPE & HTML5 Boilerplate","understanding-doctype-html5-boilerplate",{"id":23,"name":47,"slug":48,"order_index":23,"topics":49},"Text & Content Basics","text-content-basics",[50,54,58,62,66,70,74,78],{"id":51,"title":52,"slug":53,"order_index":51,"cornerstone":26,"reading_time_minutes":23},7,"HTML Headings (H1–H6) & SEO Best Practices","html-headings-h1-h6-seo-best-practices",{"id":55,"title":56,"slug":57,"order_index":55,"cornerstone":26,"reading_time_minutes":23},8,"HTML Paragraphs & Line Breaks","html-paragraphs-line-breaks",{"id":59,"title":60,"slug":61,"order_index":59,"cornerstone":26,"reading_time_minutes":9},9,"HTML Text Formatting (Bold, Italic, Mark, etc.)","html-text-formatting-bold-italic-mark",{"id":63,"title":64,"slug":65,"order_index":63,"cornerstone":26,"reading_time_minutes":23},10,"HTML Styles (Inline CSS Basics)","html-styles-inline-css-basics",{"id":67,"title":68,"slug":69,"order_index":67,"cornerstone":26,"reading_time_minutes":23},11,"HTML Quotations & Citations (blockquote, q, cite)","html-quotations-citations-blockquote-q-cite",{"id":71,"title":72,"slug":73,"order_index":71,"cornerstone":26,"reading_time_minutes":23},12,"HTML Comments (Best Practices)","html-comments-best-practices",{"id":75,"title":76,"slug":77,"order_index":75,"cornerstone":26,"reading_time_minutes":23},13,"HTML Colors (Names, HEX, RGB, HSL)","html-colors-names-hex-rgb-hsl",{"id":79,"title":80,"slug":81,"order_index":79,"cornerstone":26,"reading_time_minutes":23},14,"HTML & CSS Integration (Inline, Internal, External)","html-css-integration-inline-internal-external",{"id":31,"name":83,"slug":84,"order_index":31,"topics":85},"Links, Media & Navigation","links-media-navigation",[86,90,94,98,102],{"id":87,"title":88,"slug":89,"order_index":87,"cornerstone":26,"reading_time_minutes":23},15,"HTML Links (Anchor Tags & Hyperlinks)","html-links-anchor-tags-hyperlinks",{"id":91,"title":92,"slug":93,"order_index":91,"cornerstone":26,"reading_time_minutes":23},16,"HTML Images (Alt Text, Lazy Loading, Formats)","html-images-alt-text-lazy-loading-formats",{"id":95,"title":96,"slug":97,"order_index":95,"cornerstone":26,"reading_time_minutes":9},17,"HTML Favicon Setup","html-favicon-setup",{"id":99,"title":100,"slug":101,"order_index":99,"cornerstone":26,"reading_time_minutes":23},18,"HTML Page Title & Meta Tags (SEO Essentials)","html-page-title-meta-tags-seo-essentials",{"id":103,"title":104,"slug":105,"order_index":103,"cornerstone":26,"reading_time_minutes":23},19,"HTML File Paths (Absolute vs Relative)","html-file-paths-absolute-vs-relative",{"id":35,"name":107,"slug":108,"order_index":35,"topics":109},"Structuring Content","structuring-content",[110,115,120,125,130,134,138,142,146,150,154,158,162,166,170,174,178],{"id":111,"title":112,"slug":113,"order_index":114,"cornerstone":26,"reading_time_minutes":23},24,"HTML Tables Explained: Rows, Columns & Merging Cells","html-tables-rows-columns-merging-cells",20,{"id":116,"title":117,"slug":118,"order_index":119,"cornerstone":26,"reading_time_minutes":23},25,"HTML Lists: Ordered, Unordered & Description Lists","html-lists-ordered-unordered-description",21,{"id":121,"title":122,"slug":123,"order_index":124,"cornerstone":26,"reading_time_minutes":23},26,"HTML Block vs Inline Elements Explained","html-block-vs-inline-elements",22,{"id":126,"title":127,"slug":128,"order_index":129,"cornerstone":26,"reading_time_minutes":9},27,"HTML Div & Span: Generic Containers Explained","html-div-and-span-containers",23,{"id":131,"title":132,"slug":133,"order_index":111,"cornerstone":26,"reading_time_minutes":23},28,"HTML Classes vs ID: Selectors Explained","html-classes-vs-id-selectors-explained",{"id":135,"title":136,"slug":137,"order_index":116,"cornerstone":26,"reading_time_minutes":9},29,"HTML Iframes: Embedding External Content","html-iframes-embedding-content",{"id":139,"title":140,"slug":141,"order_index":121,"cornerstone":26,"reading_time_minutes":23},30,"HTML Head Element Deep Dive","html-head-element-deep-dive",{"id":143,"title":144,"slug":145,"order_index":126,"cornerstone":26,"reading_time_minutes":23},31,"HTML Layout Techniques: Header, Nav & Footer","html-layout-techniques-header-nav-footer",{"id":147,"title":148,"slug":149,"order_index":131,"cornerstone":26,"reading_time_minutes":23},32,"Responsive HTML Design: Mobile-First Approach","responsive-html-design-mobile-first-approach",{"id":151,"title":152,"slug":153,"order_index":135,"cornerstone":26,"reading_time_minutes":31},74,"HTML Semantic Elements (article, section, aside, nav)","html-semantic-elements-article-section-aside-nav",{"id":155,"title":156,"slug":157,"order_index":139,"cornerstone":26,"reading_time_minutes":23},75,"HTML Style Guide & Coding Conventions","html-style-guide-coding-conventions",{"id":159,"title":160,"slug":161,"order_index":143,"cornerstone":26,"reading_time_minutes":23},76,"HTML Entities & Special Characters","html-entities-special-characters",{"id":163,"title":164,"slug":165,"order_index":147,"cornerstone":26,"reading_time_minutes":9},77,"HTML Symbols","html-symbols",{"id":167,"title":168,"slug":169,"order_index":167,"cornerstone":26,"reading_time_minutes":9},33,"HTML Emojis 😀: How to Use Them in Web Pages","html-emojis-trending-guide",{"id":171,"title":172,"slug":173,"order_index":171,"cornerstone":26,"reading_time_minutes":23},34,"HTML Character Sets: UTF-8 & Encoding Explained","html-character-sets-utf-8-encoding",{"id":175,"title":176,"slug":177,"order_index":175,"cornerstone":26,"reading_time_minutes":9},35,"HTML URL Encoding Explained","html-url-encoding-explained",{"id":179,"title":180,"slug":181,"order_index":179,"cornerstone":26,"reading_time_minutes":9},36,"HTML vs XHTML: Key Differences","html-vs-xhtml-key-differences",{"id":51,"name":183,"slug":184,"order_index":39,"topics":185},"Forms & User Input","forms-user-input",[186,191,196,201,206,211],{"id":187,"title":188,"slug":189,"order_index":190,"cornerstone":26,"reading_time_minutes":23},49,"HTML Forms Introduction","html-forms-introduction",37,{"id":192,"title":193,"slug":194,"order_index":195,"cornerstone":26,"reading_time_minutes":9},50,"HTML Form Attributes (action, method, etc.)","html-form-attributes-action-method",38,{"id":197,"title":198,"slug":199,"order_index":200,"cornerstone":26,"reading_time_minutes":9},51,"HTML Form Elements (input, select, textarea, button)","html-form-elements-input-select-textarea-button",39,{"id":202,"title":203,"slug":204,"order_index":205,"cornerstone":26,"reading_time_minutes":23},52,"HTML Input Types (Modern Types: email, date, color, range)","html-input-types-modern-email-date-color-range",40,{"id":207,"title":208,"slug":209,"order_index":210,"cornerstone":26,"reading_time_minutes":23},53,"HTML Input Attributes (required, placeholder, pattern)","html-input-attributes-required-placeholder-pattern",41,{"id":212,"title":213,"slug":214,"order_index":215,"cornerstone":26,"reading_time_minutes":23},54,"HTML Form Validation (Client-Side)","html-form-validation-client-side",42,{"id":55,"name":217,"slug":218,"order_index":43,"topics":219},"Graphics & Visuals","graphics-visuals",[220,225],{"id":221,"title":222,"slug":223,"order_index":224,"cornerstone":26,"reading_time_minutes":31},55,"HTML Canvas (2D Drawing API) 🔥","html-canvas-2d-drawing-api",43,{"id":226,"title":227,"slug":228,"order_index":229,"cornerstone":26,"reading_time_minutes":31},56,"HTML SVG (Scalable Vector Graphics)","html-svg-scalable-vector-graphics",44,{"id":59,"name":231,"slug":232,"order_index":51,"topics":233},"Multimedia","multimedia",[234,239,244,249,254],{"id":235,"title":236,"slug":237,"order_index":238,"cornerstone":26,"reading_time_minutes":23},57,"HTML Media Overview","html-media-overview",45,{"id":240,"title":241,"slug":242,"order_index":243,"cornerstone":26,"reading_time_minutes":23},58,"HTML Video Embedding (Native Player)","html-video-embedding-native-player",46,{"id":245,"title":246,"slug":247,"order_index":248,"cornerstone":26,"reading_time_minutes":23},59,"HTML Audio Embedding","html-audio-embedding",47,{"id":250,"title":251,"slug":252,"order_index":253,"cornerstone":26,"reading_time_minutes":23},60,"HTML Plug-ins (Object & Embed Tags)","html-plugins-object-embed-tags",48,{"id":255,"title":256,"slug":257,"order_index":187,"cornerstone":26,"reading_time_minutes":23},61,"Embedding YouTube Videos in HTML","embedding-youtube-videos-in-html",{"id":63,"name":259,"slug":260,"order_index":55,"topics":261},"HTML5 Web APIs (Advanced\u002FTrending)","html5-web-apis-advancedtrending",[262,266,270,274,278],{"id":263,"title":264,"slug":265,"order_index":192,"cornerstone":26,"reading_time_minutes":23},62,"HTML Geolocation API","html-geolocation-api",{"id":267,"title":268,"slug":269,"order_index":197,"cornerstone":26,"reading_time_minutes":23},63,"HTML Drag & Drop API","html-drag-and-drop-api",{"id":271,"title":272,"slug":273,"order_index":202,"cornerstone":26,"reading_time_minutes":23},64,"HTML Web Storage (localStorage & sessionStorage)","html-web-storage-localstorage-sessionstorage",{"id":275,"title":276,"slug":277,"order_index":207,"cornerstone":26,"reading_time_minutes":23},65,"HTML Web Workers (Background Processing)","html-web-workers-background-processing",{"id":279,"title":280,"slug":281,"order_index":212,"cornerstone":26,"reading_time_minutes":23},66,"HTML Server-Sent Events (SSE)","html-server-sent-events-sse",{"id":67,"name":283,"slug":284,"order_index":59,"topics":285},"Accessibility & Best Practices (High-Demand  Skill) �","accessibility-best-practices-high-demand-skill",[286,290,294],{"id":287,"title":288,"slug":289,"order_index":221,"cornerstone":26,"reading_time_minutes":23},67,"HTML Accessibility (ARIA, Screen Readers)","html-accessibility-aria-screen-readers",{"id":291,"title":292,"slug":293,"order_index":226,"cornerstone":26,"reading_time_minutes":23},68,"Writing Semantic & SEO-Friendly HTML","writing-semantic-and-seo-friendly-html",{"id":295,"title":296,"slug":297,"order_index":235,"cornerstone":26,"reading_time_minutes":23},69,"HTML Performance Optimization Basics","html-performance-optimization-basics",{"id":71,"name":299,"slug":300,"order_index":63,"topics":301},"Reference & Practice","reference-practice",[302,306,310,314,318,322,326,330],{"id":303,"title":304,"slug":305,"order_index":9,"cornerstone":26,"reading_time_minutes":23},70,"HTML Tag List (Full Reference)","html-tag-list-full-reference",{"id":307,"title":308,"slug":309,"order_index":23,"cornerstone":26,"reading_time_minutes":23},71,"HTML Global Attributes Reference","html-global-attributes-reference",{"id":311,"title":312,"slug":313,"order_index":31,"cornerstone":26,"reading_time_minutes":23},72,"HTML Events Reference","html-events-reference",{"id":315,"title":316,"slug":317,"order_index":35,"cornerstone":26,"reading_time_minutes":23},73,"HTML Browser Support & Compatibility","html-browser-support-compatibility",{"id":319,"title":320,"slug":321,"order_index":39,"cornerstone":26,"reading_time_minutes":23},78,"HTML Doctypes Reference","html-doctypes-reference",{"id":323,"title":324,"slug":325,"order_index":43,"cornerstone":26,"reading_time_minutes":23},79,"HTTP Methods & Messages (Basics for Forms\u002FAPIs)","http-methods-messages-basics",{"id":327,"title":328,"slug":329,"order_index":51,"cornerstone":26,"reading_time_minutes":31},80,"HTML Interview Preparation (Top Q&A)","html-interview-preparation-top-qa",{"id":331,"title":332,"slug":333,"order_index":55,"cornerstone":26,"reading_time_minutes":9},81,"HTML Quiz & Practice Exercises","html-quiz-practice-exercises",{"id":23,"name":335,"slug":336,"icon":5,"icon_url":5,"short_description":337,"meta_title":338,"meta_description":339,"og_image":5,"locale":16,"subcategories":340},"CSS","css","Master CSS from basics to advanced. Learn styling, layouts, Flexbox, Grid, and responsive design with practical examples.","CSS Course - Learn CSS from Scratch to Advanced","Learn CSS (Cascading Style Sheets) step by step. Master selectors, layouts, Flexbox, Grid, animations, and responsive web design with hands-on examples.",[341,370,394,430,462,494,526,558,586,614],{"id":129,"name":342,"slug":343,"order_index":344,"topics":345},"UI Components","ui-components",0,[346,350,354,358,362,366],{"id":347,"title":348,"slug":349,"order_index":255,"cornerstone":26,"reading_time_minutes":43},148,"CSS Buttons: Variants, States, Sizes and Accessible Button Design","css-buttons",{"id":351,"title":352,"slug":353,"order_index":263,"cornerstone":26,"reading_time_minutes":43},149,"CSS Card Component: Layouts with Flexbox, Grid, Container Queries and Subgrid","css-cards",{"id":355,"title":356,"slug":357,"order_index":267,"cornerstone":26,"reading_time_minutes":51},150,"CSS Navbar and Dropdown Menus: Responsive, Sticky and Accessible Navigation","css-navbar-dropdowns",{"id":359,"title":360,"slug":361,"order_index":271,"cornerstone":26,"reading_time_minutes":43},151,"HTML and CSS Forms and Inputs: Styled, Accessible and Validated Form Controls","css-forms-inputs",{"id":363,"title":364,"slug":365,"order_index":275,"cornerstone":26,"reading_time_minutes":43},152,"CSS Tooltips and Popovers: Popover API, Anchor Positioning and Accessible Overlays","css-tooltips-popovers",{"id":367,"title":368,"slug":369,"order_index":279,"cornerstone":26,"reading_time_minutes":43},153,"Pagination and Breadcrumbs: Accessible Navigation Patterns with HTML, CSS and Schema","pagination-breadcrumbs",{"id":75,"name":371,"slug":372,"order_index":344,"topics":373},"CSS Fundamentals & Setup","css-fundamentals-setup",[374,378,382,386,390],{"id":375,"title":376,"slug":377,"order_index":9,"cornerstone":26,"reading_time_minutes":35},82,"CSS Introduction & History: What Is CSS and Why It Matters","css-introduction-and-history",{"id":379,"title":380,"slug":381,"order_index":23,"cornerstone":26,"reading_time_minutes":35},83,"CSS Syntax & How Browsers Apply Styles","css-syntax-how-browsers-apply-styles",{"id":383,"title":384,"slug":385,"order_index":31,"cornerstone":26,"reading_time_minutes":31},84,"Setting Up Your CSS Workspace: Linking Files & Live Server","setting-up-css-workspace-linking-files-live-server",{"id":387,"title":388,"slug":389,"order_index":35,"cornerstone":26,"reading_time_minutes":31},85,"CSS Comments & Code Formatting Best Practices","css-comments-and-code-formatting",{"id":391,"title":392,"slug":393,"order_index":39,"cornerstone":26,"reading_time_minutes":39},86,"Browser DevTools for CSS: Inspect, Debug & Edit Styles Live","browser-devtools-for-css",{"id":79,"name":395,"slug":396,"order_index":344,"topics":397},"Selectors & the Cascade","selectors-the-cascade",[398,402,406,410,414,418,422,426],{"id":399,"title":400,"slug":401,"order_index":43,"cornerstone":26,"reading_time_minutes":35},87,"CSS Basic Selectors: Type, Class, ID, Universal & Grouping","css-basic-selectors",{"id":403,"title":404,"slug":405,"order_index":51,"cornerstone":26,"reading_time_minutes":35},88,"CSS Combinators: Descendant, Child, Adjacent & General Sibling","css-combinators",{"id":407,"title":408,"slug":409,"order_index":55,"cornerstone":26,"reading_time_minutes":35},89,"CSS Attribute Selectors: [attr], ^=, $=, *= and More","css-attribute-selectors",{"id":411,"title":412,"slug":413,"order_index":59,"cornerstone":26,"reading_time_minutes":43},90,"CSS Pseudo-classes: :hover, :focus, :nth-child & Modern Selectors","css-pseudo-classes",{"id":415,"title":416,"slug":417,"order_index":63,"cornerstone":26,"reading_time_minutes":39},91,"CSS Pseudo-elements (::before, ::after)","css-pseudo-elements-before-after",{"id":419,"title":420,"slug":421,"order_index":67,"cornerstone":26,"reading_time_minutes":39},92,"Modern CSS Selectors: :is(), :where(), :has()","modern-css-selectors-is-where-has",{"id":423,"title":424,"slug":425,"order_index":71,"cornerstone":26,"reading_time_minutes":35},93,"CSS Specificity Explained","css-specificity-explained",{"id":427,"title":428,"slug":429,"order_index":75,"cornerstone":26,"reading_time_minutes":39},94,"Cascade, Inheritance & !important","css-cascade-inheritance-important",{"id":87,"name":431,"slug":432,"order_index":344,"topics":433},"Colors, Backgrounds & Effects","colors-backgrounds-effects",[434,438,442,446,450,454,458],{"id":435,"title":436,"slug":437,"order_index":79,"cornerstone":26,"reading_time_minutes":39},95,"CSS Colors (HEX, RGB, HSL, OKLCH)","css-colors-hex-rgb-hsl-oklch",{"id":439,"title":440,"slug":441,"order_index":87,"cornerstone":26,"reading_time_minutes":35},96,"CSS Backgrounds","css-backgrounds",{"id":443,"title":444,"slug":445,"order_index":91,"cornerstone":26,"reading_time_minutes":39},97,"CSS Gradients (Linear, Radial, Conic)","css-gradients-linear-radial-conic",{"id":447,"title":448,"slug":449,"order_index":95,"cornerstone":26,"reading_time_minutes":39},98,"CSS Borders, Outlines & Rounded Corners","css-borders-outlines-rounded-corners",{"id":451,"title":452,"slug":453,"order_index":99,"cornerstone":26,"reading_time_minutes":43},99,"CSS Box Shadow & Text Shadow","css-box-shadow-text-shadow",{"id":455,"title":456,"slug":457,"order_index":103,"cornerstone":26,"reading_time_minutes":39},100,"CSS Opacity & Blend Modes","css-opacity-blend-modes",{"id":459,"title":460,"slug":461,"order_index":114,"cornerstone":26,"reading_time_minutes":43},101,"CSS Filters & backdrop-filter (Glassmorphism)","css-filters-backdrop-filter-glassmorphism",{"id":91,"name":463,"slug":464,"order_index":344,"topics":465},"Box Model & Spacing","box-model-spacing",[466,470,474,478,482,486,490],{"id":467,"title":468,"slug":469,"order_index":119,"cornerstone":26,"reading_time_minutes":51},102,"The CSS Box Model: Content, Padding, Border and Margin","css-box-model",{"id":471,"title":472,"slug":473,"order_index":124,"cornerstone":26,"reading_time_minutes":51},103,"CSS Margin and Margin Collapse","css-margin-and-margin-collapse",{"id":475,"title":476,"slug":477,"order_index":129,"cornerstone":26,"reading_time_minutes":43},104,"CSS Padding: Shorthand, Percentages and Best Practices","css-padding",{"id":479,"title":480,"slug":481,"order_index":111,"cornerstone":26,"reading_time_minutes":59},105,"CSS Width, Height, Min-Width, Max-Width, Min-Height & Max-Height","css-width-height-min-max",{"id":483,"title":484,"slug":485,"order_index":116,"cornerstone":26,"reading_time_minutes":39},106,"CSS box-sizing: content-box vs border-box","css-box-sizing",{"id":487,"title":488,"slug":489,"order_index":121,"cornerstone":26,"reading_time_minutes":51},107,"CSS Overflow: hidden, scroll, auto, clip and Text Truncation","css-overflow",{"id":491,"title":492,"slug":493,"order_index":126,"cornerstone":26,"reading_time_minutes":51},108,"CSS Units: px, rem, em, %, vw, vh and dvh","css-units",{"id":95,"name":495,"slug":496,"order_index":344,"topics":497},"Typography & Text","typography-text",[498,502,506,510,514,518,522],{"id":499,"title":500,"slug":501,"order_index":131,"cornerstone":26,"reading_time_minutes":51},109,"CSS Text Properties: Alignment, Spacing, Decoration and Wrapping","css-text-properties",{"id":503,"title":504,"slug":505,"order_index":135,"cornerstone":26,"reading_time_minutes":51},110,"CSS Fonts and font-family: Font Stacks, Weights and System Fonts","css-fonts-font-family",{"id":507,"title":508,"slug":509,"order_index":139,"cornerstone":26,"reading_time_minutes":51},111,"Web Fonts: Google Fonts, @font-face and Variable Fonts","web-fonts",{"id":511,"title":512,"slug":513,"order_index":143,"cornerstone":26,"reading_time_minutes":51},112,"CSS Text Effects: text-wrap balance, line-clamp, Ellipsis and More","css-text-effects",{"id":515,"title":516,"slug":517,"order_index":147,"cornerstone":26,"reading_time_minutes":55},113,"Styling Links","styling-links-css",{"id":519,"title":520,"slug":521,"order_index":167,"cornerstone":26,"reading_time_minutes":51},114,"Styling Lists & Tables","styling-lists-and-tables-css",{"id":523,"title":524,"slug":525,"order_index":171,"cornerstone":26,"reading_time_minutes":63},115,"Icons (SVG & Icon Fonts)","icons-svg-and-icon-fonts",{"id":99,"name":527,"slug":528,"order_index":344,"topics":529},"Display, Position & Layout Basics","display-position-layout-basics",[530,534,538,542,546,550,554],{"id":531,"title":532,"slug":533,"order_index":175,"cornerstone":26,"reading_time_minutes":51},116,"Display & Inline-block","display-and-inline-block",{"id":535,"title":536,"slug":537,"order_index":179,"cornerstone":26,"reading_time_minutes":43},117,"Position (relative, absolute, fixed, sticky)","position-relative-absolute-fixed-sticky",{"id":539,"title":540,"slug":541,"order_index":190,"cornerstone":26,"reading_time_minutes":43},118,"Z-index & Stacking Contexts","z-index-and-stacking-contexts",{"id":543,"title":544,"slug":545,"order_index":195,"cornerstone":26,"reading_time_minutes":39},119,"Float & Clear (Legacy, and Why to Avoid It)","float-and-clear",{"id":547,"title":548,"slug":549,"order_index":200,"cornerstone":26,"reading_time_minutes":43},120,"Centering Techniques","centering-techniques",{"id":551,"title":552,"slug":553,"order_index":205,"cornerstone":26,"reading_time_minutes":51},121,"aspect-ratio & object-fit","aspect-ratio-and-object-fit",{"id":555,"title":556,"slug":557,"order_index":210,"cornerstone":26,"reading_time_minutes":55},122,"Website Layout Basics","website-layout-basics",{"id":114,"name":559,"slug":560,"order_index":344,"topics":561},"The Modern CSS Toolkit","the-modern-css-toolkit",[562,566,570,574,578,582],{"id":563,"title":564,"slug":565,"order_index":215,"cornerstone":26,"reading_time_minutes":55},129,"CSS Variables (Custom Properties)","css-variables-custom-properties",{"id":567,"title":568,"slug":569,"order_index":224,"cornerstone":26,"reading_time_minutes":55},130,"Math Functions (calc, min, max, clamp)","math-functions-calc-min-max-clamp",{"id":571,"title":572,"slug":573,"order_index":229,"cornerstone":26,"reading_time_minutes":51},131,"Native CSS Nesting","native-css-nesting",{"id":575,"title":576,"slug":577,"order_index":238,"cornerstone":26,"reading_time_minutes":51},132,"Cascade Layers (@layer)","cascade-layers-at-layer",{"id":579,"title":580,"slug":581,"order_index":243,"cornerstone":26,"reading_time_minutes":59},133,"Dark Mode (prefers-color-scheme, light-dark())","dark-mode-prefers-color-scheme-light-dark",{"id":583,"title":584,"slug":585,"order_index":248,"cornerstone":26,"reading_time_minutes":55},134,"CSS Reset & Normalize","css-reset-and-normalize",{"id":119,"name":587,"slug":588,"order_index":344,"topics":589},"Responsive Design","responsive-design",[590,594,598,602,606,610],{"id":591,"title":592,"slug":593,"order_index":253,"cornerstone":26,"reading_time_minutes":59},135,"Mobile-First & the Viewport","mobile-first-and-the-viewport",{"id":595,"title":596,"slug":597,"order_index":187,"cornerstone":26,"reading_time_minutes":55},136,"Media Queries","media-queries",{"id":599,"title":600,"slug":601,"order_index":192,"cornerstone":26,"reading_time_minutes":55},137,"Responsive Images & Video","responsive-images-and-video",{"id":603,"title":604,"slug":605,"order_index":197,"cornerstone":26,"reading_time_minutes":59},138,"Fluid Typography with clamp()","fluid-typography-with-clamp",{"id":607,"title":608,"slug":609,"order_index":202,"cornerstone":26,"reading_time_minutes":59},139,"Container Queries","container-queries",{"id":611,"title":612,"slug":613,"order_index":207,"cornerstone":26,"reading_time_minutes":71},140,"Responsive Navigation Pattern","responsive-navigation-pattern",{"id":124,"name":615,"slug":616,"order_index":344,"topics":617},"Transitions & Animation","transitions-animation",[618,622,626,630,634,638,642],{"id":619,"title":620,"slug":621,"order_index":212,"cornerstone":26,"reading_time_minutes":39},141,"CSS Transitions: Smooth State Changes with transition, @starting-style and allow-discrete","css-transitions",{"id":623,"title":624,"slug":625,"order_index":221,"cornerstone":26,"reading_time_minutes":35},142,"CSS 2D Transforms: translate, rotate, scale, skew and transform-origin","css-2d-transforms",{"id":627,"title":628,"slug":629,"order_index":226,"cornerstone":26,"reading_time_minutes":39},143,"CSS 3D Transforms: perspective, preserve-3d, rotateX\u002FY and backface-visibility","css-3d-transforms",{"id":631,"title":632,"slug":633,"order_index":235,"cornerstone":26,"reading_time_minutes":39},144,"CSS Keyframe Animations: @keyframes, animation shorthand, fill-mode and @property","css-keyframe-animations",{"id":635,"title":636,"slug":637,"order_index":240,"cornerstone":26,"reading_time_minutes":39},145,"CSS Scroll-Driven Animations: animation-timeline, scroll() and view()","css-scroll-driven-animations",{"id":639,"title":640,"slug":641,"order_index":245,"cornerstone":26,"reading_time_minutes":39},146,"CSS View Transitions API: Progressive Enhancement for Page and State Animations","css-view-transitions",{"id":643,"title":644,"slug":645,"order_index":250,"cornerstone":26,"reading_time_minutes":43},147,"Motion Accessibility and Performance: prefers-reduced-motion, will-change and Smooth 60fps Animations","motion-accessibility-prefers-reduced-motion-performance",{"data":647},[648,651,655,660,665],{"name":335,"slug":336,"description":649,"post_count":23,"subcategories":650},"Learn CSS with practical tutorials and examples covering layouts, Flexbox, Grid, responsive design, typography, positioning, animations, and more.",[],{"name":10,"slug":652,"description":653,"post_count":23,"subcategories":654},"html","Learn HTML with practical tutorials and examples for beginners. Explore HTML tags, elements, attributes, links, images, forms, semantic HTML, and more with clear explanations and real code examples.",[],{"name":656,"slug":657,"description":658,"post_count":9,"subcategories":659},"WPF","wpf","Learn WPF with practical tutorials and examples covering XAML, windows, controls, layouts, data binding, MVVM, commands, styles, templates, debugging, and modern WPF UI development.",[],{"name":661,"slug":662,"description":663,"post_count":9,"subcategories":664},"Python","python","Learn Python with practical tutorials covering strings, lists, functions, exceptions, files, packages, virtual environments, modules, classes, and beginner programming concepts.",[],{"name":666,"slug":667,"description":668,"post_count":9,"subcategories":669},"Java","java","Learn Java with practical tutorials and examples for beginners. Explore Java syntax, variables, data types, classes, objects, methods, inheritance, exceptions, collections, and more with clear explanations and real code examples.",[],{"data":671},{"id":643,"title":644,"slug":645,"content":672,"course":673,"subcategory":674,"author":675,"reading_time_minutes":43,"cornerstone":26,"schema_type":681,"faq_json":5,"video_url":5,"canonical_url":682,"meta_title":683,"meta_description":684,"og_image":5,"toc_json":685,"code_examples":730,"quiz":5,"exercises":747,"published_at":5,"updated_at":755,"prev":756,"next":757},"\u003Ch2 id=\"why-motion-accessibility-matters\">Why motion accessibility matters\u003C\u002Fh2>\u003Cp>\u003Cstrong>Motion accessibility\u003C\u002Fstrong> means making sure animation helps users instead of harming them. Large movement, parallax, zooming, spinning and constant looping can trigger dizziness, nausea, migraines or distraction for people with vestibular disorders, epilepsy, ADHD or cognitive differences. Operating systems provide a setting such as Reduce Motion, and the CSS media feature \u003Ccode>prefers-reduced-motion\u003C\u002Fcode> lets your site respond to it.\u003C\u002Fp>\u003Cp>Focus keyword: \u003Cstrong>prefers-reduced-motion\u003C\u002Fstrong>. Related trending keywords: \u003Cem>reduced motion CSS\u003C\u002Fem>, \u003Cem>accessible animations\u003C\u002Fem>, \u003Cem>WCAG animation guidelines\u003C\u002Fem>, \u003Cem>CSS animation performance\u003C\u002Fem>, \u003Cem>will-change\u003C\u002Fem>, \u003Cem>compositor-only animations\u003C\u002Fem>, \u003Cem>Interaction to Next Paint (INP)\u003C\u002Fem>, \u003Cem>Core Web Vitals animation\u003C\u002Fem>, \u003Cem>60fps animation\u003C\u002Fem>.\u003C\u002Fp>\u003Ch2 id=\"the-prefers-reduced-motion-media-query\">The prefers-reduced-motion media query\u003C\u002Fh2>\u003Cul>\u003Cli>\u003Ccode>@media (prefers-reduced-motion: reduce)\u003C\u002Fcode>: the user asked the system to minimize non-essential motion.\u003C\u002Fli>\u003Cli>\u003Ccode>@media (prefers-reduced-motion: no-preference)\u003C\u002Fcode>: no request has been made.\u003C\u002Fli>\u003C\u002Ful>\u003Cp>\u003Cstrong>Reduce does not always mean remove.\u003C\u002Fstrong> Replace large movement (sliding, zooming, spinning, parallax, bouncing) with gentle alternatives such as a short opacity fade or an instant state change. Keep essential motion that explains a change, but make it smaller and calmer.\u003C\u002Fp>\u003Ch2 id=\"two-implementation-strategies\">Two implementation strategies\u003C\u002Fh2>\u003Cul>\u003Cli>\u003Cstrong>Opt-out (reduce first)\u003C\u002Fstrong>: write animations normally, then inside \u003Ccode>@media (prefers-reduced-motion: reduce)\u003C\u002Fcode> disable or simplify them. Quick to add to an existing project.\u003C\u002Fli>\u003Cli>\u003Cstrong>Opt-in (no-preference first)\u003C\u002Fstrong>: write motion only inside \u003Ccode>@media (prefers-reduced-motion: no-preference)\u003C\u002Fcode>. This is safer, because users with the preference (and browsers that do not report it) get the calm version by default.\u003C\u002Fli>\u003C\u002Ful>\u003Cp>A common global safety net sets animation and transition durations to near zero and stops scroll-behavior smoothing. It is a good last resort, but design intentional reduced versions for important components.\u003C\u002Fp>\u003Ch2 id=\"reading-the-preference-in-javascript\">Reading the preference in JavaScript\u003C\u002Fh2>\u003Cp>Use \u003Ccode>window.matchMedia('(prefers-reduced-motion: reduce)')\u003C\u002Fcode>. Listen for changes with \u003Ccode>addEventListener('change', ...)\u003C\u002Fcode> because users can switch the setting while the page is open. Apply it to JavaScript animation libraries, autoplaying carousels, canvas and WebGL effects, video backgrounds and View Transitions as well.\u003C\u002Fp>\u003Ch2 id=\"wcag-rules-you-should-know\">WCAG rules you should know\u003C\u002Fh2>\u003Cul>\u003Cli>\u003Cstrong>2.2.2 Pause, Stop, Hide (Level A)\u003C\u002Fstrong>: any moving, blinking or auto-updating content that starts automatically, lasts more than 5 seconds and appears alongside other content needs a mechanism to pause, stop or hide it.\u003C\u002Fli>\u003Cli>\u003Cstrong>2.3.1 Three Flashes or Below Threshold (Level A)\u003C\u002Fstrong>: nothing should flash more than three times per second.\u003C\u002Fli>\u003Cli>\u003Cstrong>2.3.3 Animation from Interactions (Level AAA)\u003C\u002Fstrong>: motion triggered by interaction can be disabled unless essential.\u003C\u002Fli>\u003C\u002Ful>\u003Cp>Also avoid motion that blocks reading, and never hide critical information behind an animation that only runs once.\u003C\u002Fp>\u003Ch2 id=\"css-animation-performance-basics\">CSS animation performance basics\u003C\u002Fh2>\u003Cp>Browsers render in stages: style, layout, paint and composite. The cheapest animations only touch the composite stage, which can run on the GPU and even off the main thread.\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cstrong>Cheap (composite only)\u003C\u002Fstrong>: \u003Ccode>transform\u003C\u002Fcode>, \u003Ccode>opacity\u003C\u002Fcode>. In many browsers \u003Ccode>filter\u003C\u002Fcode> and \u003Ccode>backdrop-filter\u003C\u002Fcode> are also composited but can be costly on large areas.\u003C\u002Fli>\u003Cli>\u003Cstrong>Medium (paint)\u003C\u002Fstrong>: \u003Ccode>color\u003C\u002Fcode>, \u003Ccode>background-color\u003C\u002Fcode>, \u003Ccode>box-shadow\u003C\u002Fcode>, \u003Ccode>border-radius\u003C\u002Fcode>.\u003C\u002Fli>\u003Cli>\u003Cstrong>Expensive (layout)\u003C\u002Fstrong>: \u003Ccode>width\u003C\u002Fcode>, \u003Ccode>height\u003C\u002Fcode>, \u003Ccode>margin\u003C\u002Fcode>, \u003Ccode>padding\u003C\u002Fcode>, \u003Ccode>top\u003C\u002Fcode>, \u003Ccode>left\u003C\u002Fcode>, \u003Ccode>font-size\u003C\u002Fcode>. These can force the page to recalculate positions for many elements.\u003C\u002Fli>\u003C\u002Ful>\u003Cp>Replace \u003Ccode>left\u003C\u002Fcode> with \u003Ccode>translateX\u003C\u002Fcode>, \u003Ccode>width\u003C\u002Fcode> with \u003Ccode>scaleX\u003C\u002Fcode> (when appropriate), and fading with \u003Ccode>opacity\u003C\u002Fcode>.\u003C\u002Fp>\u003Ch2 id=\"will-change-contain-and-content-visibility\">will-change, contain and content-visibility\u003C\u002Fh2>\u003Cul>\u003Cli>\u003Ccode>will-change: transform\u003C\u002Fcode> hints that an element is about to animate so the browser can promote it to its own layer. Use it sparingly, add it shortly before an animation and remove it afterward. Too many layers waste memory and can slow the page.\u003C\u002Fli>\u003Cli>\u003Ccode>contain: layout paint\u003C\u002Fcode> (or \u003Ccode>contain: content\u003C\u002Fcode>) limits how far the browser must recalculate when something changes.\u003C\u002Fli>\u003Cli>\u003Ccode>content-visibility: auto\u003C\u002Fcode> skips rendering of off-screen sections, which frees time for animations that matter.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"javascript-animation-tips\">JavaScript animation tips\u003C\u002Fh2>\u003Cul>\u003Cli>Use \u003Ccode>requestAnimationFrame\u003C\u002Fcode> for visual updates, never \u003Ccode>setInterval\u003C\u002Fcode>.\u003C\u002Fli>\u003Cli>Prefer the Web Animations API (\u003Ccode>element.animate()\u003C\u002Fcode>) or CSS over manual style changes.\u003C\u002Fli>\u003Cli>Avoid reading layout values (like \u003Ccode>offsetHeight\u003C\u002Fcode>) and writing styles in the same loop, which causes layout thrashing.\u003C\u002Fli>\u003Cli>Keep main-thread work short so user input stays responsive. Long tasks hurt the Core Web Vitals metric INP.\u003C\u002Fli>\u003Cli>Do not use animation on LCP elements in a way that delays their first visible paint.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"how-to-measure\">How to measure\u003C\u002Fh2>\u003Cul>\u003Cli>Chrome DevTools, Performance panel: record, look for long frames, layout and paint cost.\u003C\u002Fli>\u003Cli>Rendering tab: enable Paint flashing, Layout Shift Regions and FPS meter.\u003C\u002Fli>\u003Cli>Animations panel: slow down and inspect timing.\u003C\u002Fli>\u003Cli>Test on a mid-range phone, not only your laptop. Also test with OS Reduce Motion turned on.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"checklist\">Checklist\u003C\u002Fh2>\u003Cul>\u003Cli>Motion has a purpose (feedback, orientation, hierarchy).\u003C\u002Fli>\u003Cli>Large or looping motion respects \u003Ccode>prefers-reduced-motion\u003C\u002Fcode>.\u003C\u002Fli>\u003Cli>Autoplaying motion longer than 5 seconds can be paused.\u003C\u002Fli>\u003Cli>Only transform and opacity are animated for frequent or large effects.\u003C\u002Fli>\u003Cli>No flashing content above the WCAG threshold.\u003C\u002Fli>\u003Cli>will-change is used rarely and removed after use.\u003C\u002Fli>\u003Cli>Keyboard and screen reader users get the same information without the animation.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"quick-summary\">Quick summary\u003C\u002Fh2>\u003Cp>Great motion design is fast, purposeful and optional. Use \u003Cstrong>prefers-reduced-motion\u003C\u002Fstrong> to adapt to user needs, follow WCAG rules, and keep your animations on the compositor for smooth performance.\u003C\u002Fp>\u003Cdiv class=\"try-it-yourself language-html\">\u003Cpre>\u003Ccode>&lt;style&gt;\n  body { font-family: system-ui, sans-serif; padding: 30px; }\n  .badge { display: inline-block; padding: 14px 22px; background: #ef4444; color: #fff; border-radius: 12px; font-weight: 700; animation: wobble 1.2s ease-in-out infinite; }\n  @keyframes wobble { 0%, 100% { transform: rotate(0); } 25% { transform: rotate(-8deg) scale(1.05); } 75% { transform: rotate(8deg) scale(1.05); } }\n  \u002F* Opt-out: simplify for users who ask for less motion *\u002F\n  @media (prefers-reduced-motion: reduce) {\n    .badge { animation: none; }\n  }\n&lt;\u002Fstyle&gt;\n&lt;div class='badge'&gt;Sale ends soon&lt;\u002Fdiv&gt;\n&lt;p&gt;Turn on Reduce Motion in your OS settings to see the difference.&lt;\u002Fp&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003Cdiv class=\"try-it-yourself language-html\">\u003Cpre>\u003Ccode>&lt;style&gt;\n  body { font-family: system-ui, sans-serif; padding: 30px; }\n  .card { width: 240px; padding: 20px; border-radius: 14px; background: #eef2ff; opacity: 0; }\n  \u002F* Default is calm: a simple, short fade *\u002F\n  .card { animation: fade .3s ease-out forwards; }\n  @keyframes fade { to { opacity: 1; } }\n  \u002F* Opt-in: add bigger movement only when the user has no preference *\u002F\n  @media (prefers-reduced-motion: no-preference) {\n    .card { transform: translateY(40px) scale(.96); animation: fly .7s cubic-bezier(.2, .8, .2, 1) forwards; }\n    @keyframes fly { to { opacity: 1; transform: none; } }\n  }\n&lt;\u002Fstyle&gt;\n&lt;div class='card'&gt;Calm by default, expressive when allowed.&lt;\u002Fdiv&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003Cdiv class=\"try-it-yourself language-css\">\u003Cpre>\u003Ccode>\u002F* Global safety net: a last-resort reset for reduced motion *\u002F\n@media (prefers-reduced-motion: reduce) {\n  *,\n  *::before,\n  *::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003Cdiv class=\"try-it-yourself language-html\">\u003Cpre>\u003Ccode>&lt;style&gt;\n  body { font-family: system-ui, sans-serif; padding: 24px; }\n  .stage { position: relative; height: 150px; border-radius: 12px; background: #f1f5f9; overflow: hidden; margin-bottom: 18px; }\n  .label { position: absolute; top: 8px; left: 10px; font-size: 12px; color: #475569; }\n  .dot { position: absolute; bottom: 20px; left: 0; width: 34px; height: 34px; border-radius: 50%; }\n  .slow { background: #ef4444; animation: slow 2s ease-in-out infinite alternate; }\n  .fast { background: #10b981; animation: fast 2s ease-in-out infinite alternate; will-change: transform; }\n  \u002F* Bad: animates left (layout) *\u002F\n  @keyframes slow { to { left: calc(100% - 34px); } }\n  \u002F* Good: animates transform (composite) *\u002F\n  @keyframes fast { to { transform: translateX(calc(100cqw - 34px)); } }\n  .stage { container-type: inline-size; }\n  @media (prefers-reduced-motion: reduce) { .dot { animation: none; } }\n&lt;\u002Fstyle&gt;\n&lt;div class='stage'&gt;&lt;span class='label'&gt;Animating left (layout cost)&lt;\u002Fspan&gt;&lt;div class='dot slow'&gt;&lt;\u002Fdiv&gt;&lt;\u002Fdiv&gt;\n&lt;div class='stage'&gt;&lt;span class='label'&gt;Animating transform (compositor friendly)&lt;\u002Fspan&gt;&lt;div class='dot fast'&gt;&lt;\u002Fdiv&gt;&lt;\u002Fdiv&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003Cdiv class=\"try-it-yourself language-html\">\u003Cpre>\u003Ccode>&lt;style&gt;\n  body { font-family: system-ui, sans-serif; padding: 30px; }\n  .ticker { width: 300px; overflow: hidden; background: #0f172a; color: #fff; border-radius: 10px; padding: 12px 0; }\n  .ticker span { display: inline-block; white-space: nowrap; padding-left: 100%; animation: marquee 12s linear infinite; }\n  .ticker.paused span { animation-play-state: paused; }\n  @keyframes marquee { to { transform: translateX(-100%); } }\n&lt;\u002Fstyle&gt;\n&lt;button id='pause' aria-pressed='false'&gt;Pause animation&lt;\u002Fbutton&gt;\n&lt;div class='ticker' id='ticker' style='margin-top: 14px'&gt;&lt;span&gt;Auto-moving content needs a pause control (WCAG 2.2.2). &lt;\u002Fspan&gt;&lt;\u002Fdiv&gt;\n&lt;script&gt;\n  var mq = window.matchMedia('(prefers-reduced-motion: reduce)');\n  var ticker = document.getElementById('ticker');\n  var btn = document.getElementById('pause');\n  function setPaused(p) {\n    ticker.classList.toggle('paused', p);\n    btn.setAttribute('aria-pressed', String(p));\n    btn.textContent = p ? 'Play animation' : 'Pause animation';\n  }\n  setPaused(mq.matches);\n  mq.addEventListener('change', function (e) { setPaused(e.matches); });\n  btn.addEventListener('click', function () { setPaused(!ticker.classList.contains('paused')); });\n&lt;\u002Fscript&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>",{"name":335,"slug":336},{"name":615,"slug":616},{"slug":676,"display_name":677,"job_title":5,"short_bio":5,"expertise_tags":678,"headshot":5,"long_bio":5,"credentials":5,"twitter_url":5,"linkedin_url":5,"github_url":5,"personal_website_url":5,"other_sameas_urls":5,"topics":679,"posts":680},"badar-khalil","Badar Khalil",[],[],[],"Article","https:\u002F\u002Fwpfsharp.com\u002Ftopics\u002Fmotion-accessibility-prefers-reduced-motion-performance","prefers-reduced-motion & CSS Animation Performance Guide","Learn motion accessibility with prefers-reduced-motion, WCAG animation rules and CSS animation performance: compositor, will-change, INP and DevTools tips.",[686,690,694,698,702,706,710,714,718,722,726],{"id":687,"text":688,"level":23,"children":689},"why-motion-accessibility-matters","Why motion accessibility matters",[],{"id":691,"text":692,"level":23,"children":693},"the-prefers-reduced-motion-media-query","The prefers-reduced-motion media query",[],{"id":695,"text":696,"level":23,"children":697},"two-implementation-strategies","Two implementation strategies",[],{"id":699,"text":700,"level":23,"children":701},"reading-the-preference-in-javascript","Reading the preference in JavaScript",[],{"id":703,"text":704,"level":23,"children":705},"wcag-rules-you-should-know","WCAG rules you should know",[],{"id":707,"text":708,"level":23,"children":709},"css-animation-performance-basics","CSS animation performance basics",[],{"id":711,"text":712,"level":23,"children":713},"will-change-contain-and-content-visibility","will-change, contain and content-visibility",[],{"id":715,"text":716,"level":23,"children":717},"javascript-animation-tips","JavaScript animation tips",[],{"id":719,"text":720,"level":23,"children":721},"how-to-measure","How to measure",[],{"id":723,"text":724,"level":23,"children":725},"checklist","Checklist",[],{"id":727,"text":728,"level":23,"children":729},"quick-summary","Quick summary",[],[731,735,738,741,744],{"id":732,"language":652,"code":733,"is_editable":734},599,"\u003Cstyle>\n  body { font-family: system-ui, sans-serif; padding: 30px; }\n  .badge { display: inline-block; padding: 14px 22px; background: #ef4444; color: #fff; border-radius: 12px; font-weight: 700; animation: wobble 1.2s ease-in-out infinite; }\n  @keyframes wobble { 0%, 100% { transform: rotate(0); } 25% { transform: rotate(-8deg) scale(1.05); } 75% { transform: rotate(8deg) scale(1.05); } }\n  \u002F* Opt-out: simplify for users who ask for less motion *\u002F\n  @media (prefers-reduced-motion: reduce) {\n    .badge { animation: none; }\n  }\n\u003C\u002Fstyle>\n\u003Cdiv class='badge'>Sale ends soon\u003C\u002Fdiv>\n\u003Cp>Turn on Reduce Motion in your OS settings to see the difference.\u003C\u002Fp>",true,{"id":736,"language":652,"code":737,"is_editable":734},600,"\u003Cstyle>\n  body { font-family: system-ui, sans-serif; padding: 30px; }\n  .card { width: 240px; padding: 20px; border-radius: 14px; background: #eef2ff; opacity: 0; }\n  \u002F* Default is calm: a simple, short fade *\u002F\n  .card { animation: fade .3s ease-out forwards; }\n  @keyframes fade { to { opacity: 1; } }\n  \u002F* Opt-in: add bigger movement only when the user has no preference *\u002F\n  @media (prefers-reduced-motion: no-preference) {\n    .card { transform: translateY(40px) scale(.96); animation: fly .7s cubic-bezier(.2, .8, .2, 1) forwards; }\n    @keyframes fly { to { opacity: 1; transform: none; } }\n  }\n\u003C\u002Fstyle>\n\u003Cdiv class='card'>Calm by default, expressive when allowed.\u003C\u002Fdiv>",{"id":739,"language":336,"code":740,"is_editable":734},601,"\u002F* Global safety net: a last-resort reset for reduced motion *\u002F\n@media (prefers-reduced-motion: reduce) {\n  *,\n  *::before,\n  *::after {\n    animation-duration: 0.01ms !important;\n    animation-iteration-count: 1 !important;\n    transition-duration: 0.01ms !important;\n    scroll-behavior: auto !important;\n  }\n}",{"id":742,"language":652,"code":743,"is_editable":734},602,"\u003Cstyle>\n  body { font-family: system-ui, sans-serif; padding: 24px; }\n  .stage { position: relative; height: 150px; border-radius: 12px; background: #f1f5f9; overflow: hidden; margin-bottom: 18px; }\n  .label { position: absolute; top: 8px; left: 10px; font-size: 12px; color: #475569; }\n  .dot { position: absolute; bottom: 20px; left: 0; width: 34px; height: 34px; border-radius: 50%; }\n  .slow { background: #ef4444; animation: slow 2s ease-in-out infinite alternate; }\n  .fast { background: #10b981; animation: fast 2s ease-in-out infinite alternate; will-change: transform; }\n  \u002F* Bad: animates left (layout) *\u002F\n  @keyframes slow { to { left: calc(100% - 34px); } }\n  \u002F* Good: animates transform (composite) *\u002F\n  @keyframes fast { to { transform: translateX(calc(100cqw - 34px)); } }\n  .stage { container-type: inline-size; }\n  @media (prefers-reduced-motion: reduce) { .dot { animation: none; } }\n\u003C\u002Fstyle>\n\u003Cdiv class='stage'>\u003Cspan class='label'>Animating left (layout cost)\u003C\u002Fspan>\u003Cdiv class='dot slow'>\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003Cdiv class='stage'>\u003Cspan class='label'>Animating transform (compositor friendly)\u003C\u002Fspan>\u003Cdiv class='dot fast'>\u003C\u002Fdiv>\u003C\u002Fdiv>",{"id":745,"language":652,"code":746,"is_editable":734},603,"\u003Cstyle>\n  body { font-family: system-ui, sans-serif; padding: 30px; }\n  .ticker { width: 300px; overflow: hidden; background: #0f172a; color: #fff; border-radius: 10px; padding: 12px 0; }\n  .ticker span { display: inline-block; white-space: nowrap; padding-left: 100%; animation: marquee 12s linear infinite; }\n  .ticker.paused span { animation-play-state: paused; }\n  @keyframes marquee { to { transform: translateX(-100%); } }\n\u003C\u002Fstyle>\n\u003Cbutton id='pause' aria-pressed='false'>Pause animation\u003C\u002Fbutton>\n\u003Cdiv class='ticker' id='ticker' style='margin-top: 14px'>\u003Cspan>Auto-moving content needs a pause control (WCAG 2.2.2). \u003C\u002Fspan>\u003C\u002Fdiv>\n\u003Cscript>\n  var mq = window.matchMedia('(prefers-reduced-motion: reduce)');\n  var ticker = document.getElementById('ticker');\n  var btn = document.getElementById('pause');\n  function setPaused(p) {\n    ticker.classList.toggle('paused', p);\n    btn.setAttribute('aria-pressed', String(p));\n    btn.textContent = p ? 'Play animation' : 'Pause animation';\n  }\n  setPaused(mq.matches);\n  mq.addEventListener('change', function (e) { setPaused(e.matches); });\n  btn.addEventListener('click', function () { setPaused(!ticker.classList.contains('paused')); });\n\u003C\u002Fscript>",[748],{"id":749,"title":750,"slug":751,"prompt":752,"starter_code":753,"expected_output":754,"language":652,"order_index":9},211,"Make an animation accessible and fast","accessible-fast-animation","The .slider currently animates the left property forever. Rewrite the keyframes to use transform instead of left, and add a prefers-reduced-motion: reduce rule that stops the animation completely. Bonus: add will-change: transform only while the animation runs.","\u003Cstyle>\n  .track { position: relative; width: 300px; height: 60px; background: #e2e8f0; border-radius: 10px; overflow: hidden; }\n  .slider { position: absolute; top: 10px; left: 0; width: 40px; height: 40px; background: #6366f1; border-radius: 8px; animation: move 2s ease-in-out infinite alternate; }\n  @keyframes move { to { left: 260px; } }\n  \u002F* TODO: replace left animation with transform *\u002F\n  \u002F* TODO: add prefers-reduced-motion rule *\u002F\n\u003C\u002Fstyle>\n\u003Cdiv class='track'>\u003Cdiv class='slider'>\u003C\u002Fdiv>\u003C\u002Fdiv>","The square slides back and forth using transform: translateX(260px), and does not animate when the OS Reduce Motion setting is enabled.","2026-09-30T18:50:34+00:00",{"id":639,"slug":641,"title":640},{"id":347,"slug":349,"title":348}]