[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-config":3,"course-tree":6,"blog-categories":646,"topic:css-transitions":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":619,"title":620,"slug":621,"content":672,"course":673,"subcategory":674,"author":675,"reading_time_minutes":39,"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":722,"quiz":5,"exercises":739,"published_at":5,"updated_at":747,"prev":748,"next":749},"\u003Ch2 id=\"what-are-css-transitions\">What are CSS transitions?\u003C\u002Fh2>\u003Cp>\u003Cstrong>CSS transitions\u003C\u002Fstrong> let the browser animate a property from its old value to its new value over a set time, instead of changing instantly. They are the simplest way to add motion to hover effects, focus rings, menus, cards, buttons and UI state changes. A transition needs only two things: a start state, an end state, and a rule telling the browser how long the change should take.\u003C\u002Fp>\u003Cp>Focus keyword: \u003Cstrong>CSS transitions\u003C\u002Fstrong>. Related trending keywords: \u003Cem>transition-behavior allow-discrete\u003C\u002Fem>, \u003Cem>@starting-style\u003C\u002Fem>, \u003Cem>interpolate-size\u003C\u002Fem>, \u003Cem>linear() easing\u003C\u002Fem>, \u003Cem>CSS micro-interactions\u003C\u002Fem>, \u003Cem>GPU accelerated animation\u003C\u002Fem>, \u003Cem>smooth hover effects\u003C\u002Fem>.\u003C\u002Fp>\u003Ch2 id=\"the-four-transition-longhand-properties\">The four transition longhand properties\u003C\u002Fh2>\u003Cul>\u003Cli>\u003Ccode>transition-property\u003C\u002Fcode>: which property to animate (\u003Ccode>opacity\u003C\u002Fcode>, \u003Ccode>transform\u003C\u002Fcode>, \u003Ccode>background-color\u003C\u002Fcode>, or \u003Ccode>all\u003C\u002Fcode>).\u003C\u002Fli>\u003Cli>\u003Ccode>transition-duration\u003C\u002Fcode>: how long it takes (\u003Ccode>200ms\u003C\u002Fcode>, \u003Ccode>0.3s\u003C\u002Fcode>). Default is \u003Ccode>0s\u003C\u002Fcode>, which means no transition.\u003C\u002Fli>\u003Cli>\u003Ccode>transition-timing-function\u003C\u002Fcode>: the speed curve (\u003Ccode>ease\u003C\u002Fcode>, \u003Ccode>linear\u003C\u002Fcode>, \u003Ccode>ease-in\u003C\u002Fcode>, \u003Ccode>ease-out\u003C\u002Fcode>, \u003Ccode>ease-in-out\u003C\u002Fcode>, \u003Ccode>cubic-bezier()\u003C\u002Fcode>, \u003Ccode>steps()\u003C\u002Fcode>, \u003Ccode>linear()\u003C\u002Fcode>).\u003C\u002Fli>\u003Cli>\u003Ccode>transition-delay\u003C\u002Fcode>: wait time before starting (\u003Ccode>100ms\u003C\u002Fcode>). Negative delays start part-way through.\u003C\u002Fli>\u003C\u002Ful>\u003Cp>The shorthand is \u003Ccode>transition: property duration timing-function delay\u003C\u002Fcode>. You can chain several transitions with commas: \u003Ccode>transition: opacity .3s ease, transform .3s ease-out .05s;\u003C\u002Fcode>. A fifth longhand, \u003Ccode>transition-behavior\u003C\u002Fcode>, is covered below.\u003C\u002Fp>\u003Ch2 id=\"put-the-transition-on-the-base-state\">Put the transition on the base state\u003C\u002Fh2>\u003Cp>Declare the transition on the element's normal rule, not only on \u003Ccode>:hover\u003C\u002Fcode>. If it only exists on \u003Ccode>:hover\u003C\u002Fcode>, the element animates in but snaps back instantly when the pointer leaves. Declaring it on the base state makes both directions smooth. You can also give the return direction a different speed by setting another \u003Ccode>transition\u003C\u002Fcode> in the hover rule.\u003C\u002Fp>\u003Ch2 id=\"timing-functions-and-easing\">Timing functions and easing\u003C\u002Fh2>\u003Cul>\u003Cli>\u003Cstrong>ease\u003C\u002Fstrong> (default): slow start, fast middle, slow end.\u003C\u002Fli>\u003Cli>\u003Cstrong>ease-out\u003C\u002Fstrong>: fast start, gentle stop. Best for elements entering the screen.\u003C\u002Fli>\u003Cli>\u003Cstrong>ease-in\u003C\u002Fstrong>: slow start, fast end. Best for elements leaving.\u003C\u002Fli>\u003Cli>\u003Cstrong>cubic-bezier(x1, y1, x2, y2)\u003C\u002Fstrong>: custom curve. Y values can go beyond 0 to 1 for overshoot (bounce-like) effects.\u003C\u002Fli>\u003Cli>\u003Cstrong>steps(n)\u003C\u002Fstrong>: jumps in n discrete steps, useful for sprite or typewriter effects.\u003C\u002Fli>\u003Cli>\u003Cstrong>linear(...)\u003C\u002Fstrong>: a modern easing function that takes many points, so you can approximate springs and bounces in pure CSS. Example: \u003Ccode>linear(0, 0.5 25%, 1, 0.9 60%, 1)\u003C\u002Fcode>. Generate long lists with an online linear() easing generator.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"what-can-be-transitioned\">What can be transitioned?\u003C\u002Fh2>\u003Cp>Only properties with an interpolable value type can transition: numbers, lengths, percentages, colors, transforms, shadows, and similar. Classic examples include \u003Ccode>opacity\u003C\u002Fcode>, \u003Ccode>transform\u003C\u002Fcode>, \u003Ccode>color\u003C\u002Fcode>, \u003Ccode>background-color\u003C\u002Fcode>, \u003Ccode>width\u003C\u002Fcode>, \u003Ccode>box-shadow\u003C\u002Fcode> and \u003Ccode>filter\u003C\u002Fcode>. Keywords such as \u003Ccode>display\u003C\u002Fcode> and \u003Ccode>height: auto\u003C\u002Fcode> were historically not animatable, which is why developers used \u003Ccode>max-height\u003C\u002Fcode> hacks.\u003C\u002Fp>\u003Ch2 id=\"modern-features-allow-discrete-at-starting-style-and-interpolate-size\">Modern features: allow-discrete, @starting-style and interpolate-size\u003C\u002Fh2>\u003Cul>\u003Cli>\u003Cstrong>transition-behavior: allow-discrete\u003C\u002Fstrong> lets discrete properties like \u003Ccode>display\u003C\u002Fcode> and \u003Ccode>content-visibility\u003C\u002Fcode> take part in a transition. The value flips at the right moment, so an element can fade out before \u003Ccode>display: none\u003C\u002Fcode> is applied.\u003C\u002Fli>\u003Cli>\u003Cstrong>@starting-style\u003C\u002Fstrong> defines the style an element transitions \u003Cem>from\u003C\u002Fem> on its first render, for example when it is added to the DOM or changes from \u003Ccode>display: none\u003C\u002Fcode>. This gives you entry animations with no JavaScript.\u003C\u002Fli>\u003Cli>\u003Cstrong>interpolate-size: allow-keywords\u003C\u002Fstrong> (set on \u003Ccode>:root\u003C\u002Fcode>) lets you transition to and from intrinsic sizes like \u003Ccode>height: auto\u003C\u002Fcode>, \u003Ccode>min-content\u003C\u002Fcode> and \u003Ccode>fit-content\u003C\u002Fcode>. Use it as progressive enhancement, since support is not universal yet.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"best-practices\">Best practices\u003C\u002Fh2>\u003Cul>\u003Cli>Prefer animating \u003Ccode>transform\u003C\u002Fcode> and \u003Ccode>opacity\u003C\u002Fcode>. They are usually handled by the compositor and stay smooth. Animating \u003Ccode>width\u003C\u002Fcode>, \u003Ccode>height\u003C\u002Fcode>, \u003Ccode>top\u003C\u002Fcode> or \u003Ccode>left\u003C\u002Fcode> triggers layout and can cause jank.\u003C\u002Fli>\u003Cli>Avoid \u003Ccode>transition: all\u003C\u002Fcode> in production. It animates properties you did not intend and can hurt performance. List properties explicitly.\u003C\u002Fli>\u003Cli>Keep UI transitions short: about 150ms to 300ms for small controls, up to 500ms for larger movements.\u003C\u002Fli>\u003Cli>Never rely on a transition alone to communicate state. Keep colors, text and ARIA states correct, and respect \u003Ccode>prefers-reduced-motion\u003C\u002Fcode> (see the last topic in this chapter).\u003C\u002Fli>\u003Cli>Transitions fire only when a computed value changes. If an element is inserted with its final styles, nothing animates unless you use \u003Ccode>@starting-style\u003C\u002Fcode>.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"common-mistakes\">Common mistakes\u003C\u002Fh2>\u003Cul>\u003Cli>Forgetting units: \u003Ccode>transition: opacity 0.3\u003C\u002Fcode> is invalid. Use \u003Ccode>0.3s\u003C\u002Fcode>.\u003C\u002Fli>\u003Cli>Putting the transition only in \u003Ccode>:hover\u003C\u002Fcode> so the un-hover snaps back.\u003C\u002Fli>\u003Cli>Trying to transition between \u003Ccode>display: none\u003C\u002Fcode> and \u003Ccode>block\u003C\u002Fcode> without \u003Ccode>allow-discrete\u003C\u002Fcode>.\u003C\u002Fli>\u003Cli>Expecting transitions to run on page load. They need a change after first render, or \u003Ccode>@starting-style\u003C\u002Fcode>.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"quick-summary\">Quick summary\u003C\u002Fh2>\u003Cp>Use \u003Cstrong>CSS transitions\u003C\u002Fstrong> for simple two-state motion. Reach for keyframe animations when you need multiple steps, looping or automatic playback. Try the interactive examples below and edit the code to see the result instantly.\u003C\u002Fp>\u003Cdiv class=\"try-it-yourself language-html\">\u003Cpre>\u003Ccode>&lt;style&gt;\n  .btn {\n    padding: 14px 28px;\n    border: 0;\n    border-radius: 10px;\n    background: #4f46e5;\n    color: #fff;\n    font: 600 16px system-ui, sans-serif;\n    cursor: pointer;\n    box-shadow: 0 2px 6px rgba(0,0,0,.2);\n    transition: transform .2s ease-out, background-color .2s ease-out, box-shadow .2s ease-out;\n  }\n  .btn:hover, .btn:focus-visible {\n    background: #6366f1;\n    transform: translateY(-3px);\n    box-shadow: 0 10px 20px rgba(79,70,229,.35);\n  }\n  .btn:active { transform: translateY(0); }\n&lt;\u002Fstyle&gt;\n&lt;button class='btn'&gt;Hover or focus me&lt;\u002Fbutton&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003Cdiv class=\"try-it-yourself language-html\">\u003Cpre>\u003Ccode>&lt;style&gt;\n  .row { display: flex; flex-direction: column; gap: 10px; font-family: system-ui, sans-serif; }\n  .track { background: #e5e7eb; border-radius: 8px; width: 320px; }\n  .dot { height: 28px; width: 28px; border-radius: 8px; color: #fff; font-size: 11px; display: grid; place-items: center; transition: transform 1.2s; }\n  .t1 .dot { background: #ef4444; transition-timing-function: linear; }\n  .t2 .dot { background: #f59e0b; transition-timing-function: ease-in; }\n  .t3 .dot { background: #10b981; transition-timing-function: ease-out; }\n  .t4 .dot { background: #3b82f6; transition-timing-function: cubic-bezier(.68,-.55,.27,1.55); }\n  .t5 .dot { background: #8b5cf6; transition-timing-function: steps(5); }\n  .go .dot { transform: translateX(292px); }\n&lt;\u002Fstyle&gt;\n&lt;div class='row' id='demo'&gt;\n  &lt;button id='run'&gt;Run \u002F Reset&lt;\u002Fbutton&gt;\n  &lt;div class='track t1'&gt;&lt;div class='dot'&gt;lin&lt;\u002Fdiv&gt;&lt;\u002Fdiv&gt;\n  &lt;div class='track t2'&gt;&lt;div class='dot'&gt;in&lt;\u002Fdiv&gt;&lt;\u002Fdiv&gt;\n  &lt;div class='track t3'&gt;&lt;div class='dot'&gt;out&lt;\u002Fdiv&gt;&lt;\u002Fdiv&gt;\n  &lt;div class='track t4'&gt;&lt;div class='dot'&gt;bez&lt;\u002Fdiv&gt;&lt;\u002Fdiv&gt;\n  &lt;div class='track t5'&gt;&lt;div class='dot'&gt;stp&lt;\u002Fdiv&gt;&lt;\u002Fdiv&gt;\n&lt;\u002Fdiv&gt;\n&lt;script&gt;\n  document.getElementById('run').addEventListener('click', function () {\n    document.getElementById('demo').classList.toggle('go');\n  });\n&lt;\u002Fscript&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003Cdiv class=\"try-it-yourself language-html\">\u003Cpre>\u003Ccode>&lt;style&gt;\n  .ball {\n    width: 60px; height: 60px; border-radius: 50%;\n    background: #ec4899; margin: 20px;\n    \u002F* linear() approximates a bouncy spring in pure CSS *\u002F\n    transition: transform 1s linear(0, 0.22 10%, 0.75 20%, 1 30%, 0.88 40%, 1 50%, 0.96 60%, 1 75%, 1);\n  }\n  .wrap:hover .ball { transform: translateX(240px); }\n  .wrap { font-family: system-ui, sans-serif; padding: 10px; border: 2px dashed #cbd5e1; width: 340px; }\n&lt;\u002Fstyle&gt;\n&lt;div class='wrap'&gt;Hover this box (linear() easing):&lt;div class='ball'&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  .panel {\n    display: none;\n    opacity: 0;\n    transform: translateY(16px);\n    padding: 18px;\n    margin-top: 14px;\n    width: 280px;\n    border-radius: 12px;\n    background: #0ea5e9;\n    color: #fff;\n    font-family: system-ui, sans-serif;\n    transition: opacity .4s ease, transform .4s ease, display .4s allow-discrete;\n  }\n  .panel.open { display: block; opacity: 1; transform: none; }\n  @starting-style {\n    .panel.open { opacity: 0; transform: translateY(16px); }\n  }\n&lt;\u002Fstyle&gt;\n&lt;button id='btn'&gt;Toggle panel&lt;\u002Fbutton&gt;\n&lt;div class='panel' id='panel'&gt;I fade in from display:none and fade out before being hidden.&lt;\u002Fdiv&gt;\n&lt;script&gt;\n  document.getElementById('btn').addEventListener('click', function () {\n    document.getElementById('panel').classList.toggle('open');\n  });\n&lt;\u002Fscript&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003Cdiv class=\"try-it-yourself language-html\">\u003Cpre>\u003Ccode>&lt;style&gt;\n  :root { interpolate-size: allow-keywords; }\n  .acc { font-family: system-ui, sans-serif; width: 320px; }\n  .acc button { width: 100%; text-align: left; padding: 12px; border: 0; background: #1f2937; color: #fff; border-radius: 8px; cursor: pointer; }\n  .body { height: 0; overflow: hidden; transition: height .35s ease; background: #f1f5f9; padding: 0 12px; border-radius: 0 0 8px 8px; }\n  .acc.open .body { height: auto; padding: 12px; }\n&lt;\u002Fstyle&gt;\n&lt;div class='acc' id='acc'&gt;\n  &lt;button id='toggle'&gt;Toggle accordion (height: auto)&lt;\u002Fbutton&gt;\n  &lt;div class='body'&gt;With interpolate-size, the browser can animate to height auto. In browsers without support, it simply snaps open, which is a safe fallback.&lt;\u002Fdiv&gt;\n&lt;\u002Fdiv&gt;\n&lt;script&gt;\n  document.getElementById('toggle').addEventListener('click', function () {\n    document.getElementById('acc').classList.toggle('open');\n  });\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\u002Fcss-transitions","CSS Transitions: Complete Guide with Examples (2026)","Learn CSS transitions: transition shorthand, timing functions, linear(), @starting-style, allow-discrete and height auto animation with live code.",[686,690,694,698,702,706,710,714,718],{"id":687,"text":688,"level":23,"children":689},"what-are-css-transitions","What are CSS transitions?",[],{"id":691,"text":692,"level":23,"children":693},"the-four-transition-longhand-properties","The four transition longhand properties",[],{"id":695,"text":696,"level":23,"children":697},"put-the-transition-on-the-base-state","Put the transition on the base state",[],{"id":699,"text":700,"level":23,"children":701},"timing-functions-and-easing","Timing functions and easing",[],{"id":703,"text":704,"level":23,"children":705},"what-can-be-transitioned","What can be transitioned?",[],{"id":707,"text":708,"level":23,"children":709},"modern-features-allow-discrete-at-starting-style-and-interpolate-size","Modern features: allow-discrete, @starting-style and interpolate-size",[],{"id":711,"text":712,"level":23,"children":713},"best-practices","Best practices",[],{"id":715,"text":716,"level":23,"children":717},"common-mistakes","Common mistakes",[],{"id":719,"text":720,"level":23,"children":721},"quick-summary","Quick summary",[],[723,727,730,733,736],{"id":724,"language":652,"code":725,"is_editable":726},572,"\u003Cstyle>\n  .btn {\n    padding: 14px 28px;\n    border: 0;\n    border-radius: 10px;\n    background: #4f46e5;\n    color: #fff;\n    font: 600 16px system-ui, sans-serif;\n    cursor: pointer;\n    box-shadow: 0 2px 6px rgba(0,0,0,.2);\n    transition: transform .2s ease-out, background-color .2s ease-out, box-shadow .2s ease-out;\n  }\n  .btn:hover, .btn:focus-visible {\n    background: #6366f1;\n    transform: translateY(-3px);\n    box-shadow: 0 10px 20px rgba(79,70,229,.35);\n  }\n  .btn:active { transform: translateY(0); }\n\u003C\u002Fstyle>\n\u003Cbutton class='btn'>Hover or focus me\u003C\u002Fbutton>",true,{"id":728,"language":652,"code":729,"is_editable":726},573,"\u003Cstyle>\n  .row { display: flex; flex-direction: column; gap: 10px; font-family: system-ui, sans-serif; }\n  .track { background: #e5e7eb; border-radius: 8px; width: 320px; }\n  .dot { height: 28px; width: 28px; border-radius: 8px; color: #fff; font-size: 11px; display: grid; place-items: center; transition: transform 1.2s; }\n  .t1 .dot { background: #ef4444; transition-timing-function: linear; }\n  .t2 .dot { background: #f59e0b; transition-timing-function: ease-in; }\n  .t3 .dot { background: #10b981; transition-timing-function: ease-out; }\n  .t4 .dot { background: #3b82f6; transition-timing-function: cubic-bezier(.68,-.55,.27,1.55); }\n  .t5 .dot { background: #8b5cf6; transition-timing-function: steps(5); }\n  .go .dot { transform: translateX(292px); }\n\u003C\u002Fstyle>\n\u003Cdiv class='row' id='demo'>\n  \u003Cbutton id='run'>Run \u002F Reset\u003C\u002Fbutton>\n  \u003Cdiv class='track t1'>\u003Cdiv class='dot'>lin\u003C\u002Fdiv>\u003C\u002Fdiv>\n  \u003Cdiv class='track t2'>\u003Cdiv class='dot'>in\u003C\u002Fdiv>\u003C\u002Fdiv>\n  \u003Cdiv class='track t3'>\u003Cdiv class='dot'>out\u003C\u002Fdiv>\u003C\u002Fdiv>\n  \u003Cdiv class='track t4'>\u003Cdiv class='dot'>bez\u003C\u002Fdiv>\u003C\u002Fdiv>\n  \u003Cdiv class='track t5'>\u003Cdiv class='dot'>stp\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003Cscript>\n  document.getElementById('run').addEventListener('click', function () {\n    document.getElementById('demo').classList.toggle('go');\n  });\n\u003C\u002Fscript>",{"id":731,"language":652,"code":732,"is_editable":726},574,"\u003Cstyle>\n  .ball {\n    width: 60px; height: 60px; border-radius: 50%;\n    background: #ec4899; margin: 20px;\n    \u002F* linear() approximates a bouncy spring in pure CSS *\u002F\n    transition: transform 1s linear(0, 0.22 10%, 0.75 20%, 1 30%, 0.88 40%, 1 50%, 0.96 60%, 1 75%, 1);\n  }\n  .wrap:hover .ball { transform: translateX(240px); }\n  .wrap { font-family: system-ui, sans-serif; padding: 10px; border: 2px dashed #cbd5e1; width: 340px; }\n\u003C\u002Fstyle>\n\u003Cdiv class='wrap'>Hover this box (linear() easing):\u003Cdiv class='ball'>\u003C\u002Fdiv>\u003C\u002Fdiv>",{"id":734,"language":652,"code":735,"is_editable":726},575,"\u003Cstyle>\n  .panel {\n    display: none;\n    opacity: 0;\n    transform: translateY(16px);\n    padding: 18px;\n    margin-top: 14px;\n    width: 280px;\n    border-radius: 12px;\n    background: #0ea5e9;\n    color: #fff;\n    font-family: system-ui, sans-serif;\n    transition: opacity .4s ease, transform .4s ease, display .4s allow-discrete;\n  }\n  .panel.open { display: block; opacity: 1; transform: none; }\n  @starting-style {\n    .panel.open { opacity: 0; transform: translateY(16px); }\n  }\n\u003C\u002Fstyle>\n\u003Cbutton id='btn'>Toggle panel\u003C\u002Fbutton>\n\u003Cdiv class='panel' id='panel'>I fade in from display:none and fade out before being hidden.\u003C\u002Fdiv>\n\u003Cscript>\n  document.getElementById('btn').addEventListener('click', function () {\n    document.getElementById('panel').classList.toggle('open');\n  });\n\u003C\u002Fscript>",{"id":737,"language":652,"code":738,"is_editable":726},576,"\u003Cstyle>\n  :root { interpolate-size: allow-keywords; }\n  .acc { font-family: system-ui, sans-serif; width: 320px; }\n  .acc button { width: 100%; text-align: left; padding: 12px; border: 0; background: #1f2937; color: #fff; border-radius: 8px; cursor: pointer; }\n  .body { height: 0; overflow: hidden; transition: height .35s ease; background: #f1f5f9; padding: 0 12px; border-radius: 0 0 8px 8px; }\n  .acc.open .body { height: auto; padding: 12px; }\n\u003C\u002Fstyle>\n\u003Cdiv class='acc' id='acc'>\n  \u003Cbutton id='toggle'>Toggle accordion (height: auto)\u003C\u002Fbutton>\n  \u003Cdiv class='body'>With interpolate-size, the browser can animate to height auto. In browsers without support, it simply snaps open, which is a safe fallback.\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003Cscript>\n  document.getElementById('toggle').addEventListener('click', function () {\n    document.getElementById('acc').classList.toggle('open');\n  });\n\u003C\u002Fscript>",[740],{"id":741,"title":742,"slug":743,"prompt":744,"starter_code":745,"expected_output":746,"language":652,"order_index":9},205,"Add a smooth hover transition to a card","transition-card-hover","Make the card lift up by 6px, grow its shadow and change its background color on hover and focus-within. Use a transition on the base state only for transform, box-shadow and background-color (do not use transition: all). Keep the duration between 200ms and 300ms and use ease-out.","\u003Cstyle>\n  .card { width: 240px; padding: 20px; border-radius: 12px; background: #fff; box-shadow: 0 1px 3px rgba(0,0,0,.2); font-family: system-ui, sans-serif; }\n  \u002F* TODO: add transition on .card *\u002F\n  \u002F* TODO: add hover \u002F focus-within styles *\u002F\n\u003C\u002Fstyle>\n\u003Cdiv class='card' tabindex='0'>Hover me\u003C\u002Fdiv>","The card smoothly lifts by 6px with a larger shadow and a new background color on hover, and smoothly returns when the pointer leaves.","2026-09-30T18:50:34+00:00",{"id":611,"slug":613,"title":612},{"id":623,"slug":625,"title":624}]