[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-config":3,"blog-categories":6,"course-tree":35,"topic:responsive-images-and-video":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,14,19,25,30],{"name":9,"slug":10,"description":11,"post_count":12,"subcategories":13},"CSS","css","Learn CSS with practical tutorials and examples covering layouts, Flexbox, Grid, responsive design, typography, positioning, animations, and more.",2,[],{"name":15,"slug":16,"description":17,"post_count":12,"subcategories":18},"HTML","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":20,"slug":21,"description":22,"post_count":23,"subcategories":24},"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.",1,[],{"name":26,"slug":27,"description":28,"post_count":23,"subcategories":29},"Python","python","Learn Python with practical tutorials covering strings, lists, functions, exceptions, files, packages, virtual environments, modules, classes, and beginner programming concepts.",[],{"name":31,"slug":32,"description":33,"post_count":23,"subcategories":34},"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":36},[37,360],{"id":23,"name":15,"slug":38,"icon":5,"icon_url":5,"short_description":39,"meta_title":40,"meta_description":41,"og_image":42,"locale":43,"subcategories":44},"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",[45,72,108,132,208,242,256,284,308,324],{"id":23,"name":46,"slug":47,"order_index":23,"topics":48},"HTML Fundamentals & Setup","html-fundamentals-setup",[49,53,56,60,64,68],{"id":12,"title":50,"slug":51,"order_index":23,"cornerstone":52,"reading_time_minutes":12},"HTML Editors & Environment Setup","html-editors-and-environment-setup",false,{"id":23,"title":54,"slug":55,"order_index":23,"cornerstone":52,"reading_time_minutes":23},"HTML Introduction & History","html-introduction-and-history",{"id":57,"title":58,"slug":59,"order_index":57,"cornerstone":52,"reading_time_minutes":12},3,"HTML Basic Syntax & Document Structure","html-basic-syntax-document-structure",{"id":61,"title":62,"slug":63,"order_index":61,"cornerstone":52,"reading_time_minutes":12},4,"HTML Elements & Tags Explained","html-elements-tags-explained",{"id":65,"title":66,"slug":67,"order_index":65,"cornerstone":52,"reading_time_minutes":12},5,"HTML Attributes (Global & Standard)","html-attributes-global-standard",{"id":69,"title":70,"slug":71,"order_index":69,"cornerstone":52,"reading_time_minutes":12},6,"Understanding the DOCTYPE & HTML5 Boilerplate","understanding-doctype-html5-boilerplate",{"id":12,"name":73,"slug":74,"order_index":12,"topics":75},"Text & Content Basics","text-content-basics",[76,80,84,88,92,96,100,104],{"id":77,"title":78,"slug":79,"order_index":77,"cornerstone":52,"reading_time_minutes":12},7,"HTML Headings (H1–H6) & SEO Best Practices","html-headings-h1-h6-seo-best-practices",{"id":81,"title":82,"slug":83,"order_index":81,"cornerstone":52,"reading_time_minutes":12},8,"HTML Paragraphs & Line Breaks","html-paragraphs-line-breaks",{"id":85,"title":86,"slug":87,"order_index":85,"cornerstone":52,"reading_time_minutes":23},9,"HTML Text Formatting (Bold, Italic, Mark, etc.)","html-text-formatting-bold-italic-mark",{"id":89,"title":90,"slug":91,"order_index":89,"cornerstone":52,"reading_time_minutes":12},10,"HTML Styles (Inline CSS Basics)","html-styles-inline-css-basics",{"id":93,"title":94,"slug":95,"order_index":93,"cornerstone":52,"reading_time_minutes":12},11,"HTML Quotations & Citations (blockquote, q, cite)","html-quotations-citations-blockquote-q-cite",{"id":97,"title":98,"slug":99,"order_index":97,"cornerstone":52,"reading_time_minutes":12},12,"HTML Comments (Best Practices)","html-comments-best-practices",{"id":101,"title":102,"slug":103,"order_index":101,"cornerstone":52,"reading_time_minutes":12},13,"HTML Colors (Names, HEX, RGB, HSL)","html-colors-names-hex-rgb-hsl",{"id":105,"title":106,"slug":107,"order_index":105,"cornerstone":52,"reading_time_minutes":12},14,"HTML & CSS Integration (Inline, Internal, External)","html-css-integration-inline-internal-external",{"id":57,"name":109,"slug":110,"order_index":57,"topics":111},"Links, Media & Navigation","links-media-navigation",[112,116,120,124,128],{"id":113,"title":114,"slug":115,"order_index":113,"cornerstone":52,"reading_time_minutes":12},15,"HTML Links (Anchor Tags & Hyperlinks)","html-links-anchor-tags-hyperlinks",{"id":117,"title":118,"slug":119,"order_index":117,"cornerstone":52,"reading_time_minutes":12},16,"HTML Images (Alt Text, Lazy Loading, Formats)","html-images-alt-text-lazy-loading-formats",{"id":121,"title":122,"slug":123,"order_index":121,"cornerstone":52,"reading_time_minutes":23},17,"HTML Favicon Setup","html-favicon-setup",{"id":125,"title":126,"slug":127,"order_index":125,"cornerstone":52,"reading_time_minutes":12},18,"HTML Page Title & Meta Tags (SEO Essentials)","html-page-title-meta-tags-seo-essentials",{"id":129,"title":130,"slug":131,"order_index":129,"cornerstone":52,"reading_time_minutes":12},19,"HTML File Paths (Absolute vs Relative)","html-file-paths-absolute-vs-relative",{"id":61,"name":133,"slug":134,"order_index":61,"topics":135},"Structuring Content","structuring-content",[136,141,146,151,156,160,164,168,172,176,180,184,188,192,196,200,204],{"id":137,"title":138,"slug":139,"order_index":140,"cornerstone":52,"reading_time_minutes":12},24,"HTML Tables Explained: Rows, Columns & Merging Cells","html-tables-rows-columns-merging-cells",20,{"id":142,"title":143,"slug":144,"order_index":145,"cornerstone":52,"reading_time_minutes":12},25,"HTML Lists: Ordered, Unordered & Description Lists","html-lists-ordered-unordered-description",21,{"id":147,"title":148,"slug":149,"order_index":150,"cornerstone":52,"reading_time_minutes":12},26,"HTML Block vs Inline Elements Explained","html-block-vs-inline-elements",22,{"id":152,"title":153,"slug":154,"order_index":155,"cornerstone":52,"reading_time_minutes":23},27,"HTML Div & Span: Generic Containers Explained","html-div-and-span-containers",23,{"id":157,"title":158,"slug":159,"order_index":137,"cornerstone":52,"reading_time_minutes":12},28,"HTML Classes vs ID: Selectors Explained","html-classes-vs-id-selectors-explained",{"id":161,"title":162,"slug":163,"order_index":142,"cornerstone":52,"reading_time_minutes":23},29,"HTML Iframes: Embedding External Content","html-iframes-embedding-content",{"id":165,"title":166,"slug":167,"order_index":147,"cornerstone":52,"reading_time_minutes":12},30,"HTML Head Element Deep Dive","html-head-element-deep-dive",{"id":169,"title":170,"slug":171,"order_index":152,"cornerstone":52,"reading_time_minutes":12},31,"HTML Layout Techniques: Header, Nav & Footer","html-layout-techniques-header-nav-footer",{"id":173,"title":174,"slug":175,"order_index":157,"cornerstone":52,"reading_time_minutes":12},32,"Responsive HTML Design: Mobile-First Approach","responsive-html-design-mobile-first-approach",{"id":177,"title":178,"slug":179,"order_index":161,"cornerstone":52,"reading_time_minutes":57},74,"HTML Semantic Elements (article, section, aside, nav)","html-semantic-elements-article-section-aside-nav",{"id":181,"title":182,"slug":183,"order_index":165,"cornerstone":52,"reading_time_minutes":12},75,"HTML Style Guide & Coding Conventions","html-style-guide-coding-conventions",{"id":185,"title":186,"slug":187,"order_index":169,"cornerstone":52,"reading_time_minutes":12},76,"HTML Entities & Special Characters","html-entities-special-characters",{"id":189,"title":190,"slug":191,"order_index":173,"cornerstone":52,"reading_time_minutes":23},77,"HTML Symbols","html-symbols",{"id":193,"title":194,"slug":195,"order_index":193,"cornerstone":52,"reading_time_minutes":23},33,"HTML Emojis 😀: How to Use Them in Web Pages","html-emojis-trending-guide",{"id":197,"title":198,"slug":199,"order_index":197,"cornerstone":52,"reading_time_minutes":12},34,"HTML Character Sets: UTF-8 & Encoding Explained","html-character-sets-utf-8-encoding",{"id":201,"title":202,"slug":203,"order_index":201,"cornerstone":52,"reading_time_minutes":23},35,"HTML URL Encoding Explained","html-url-encoding-explained",{"id":205,"title":206,"slug":207,"order_index":205,"cornerstone":52,"reading_time_minutes":23},36,"HTML vs XHTML: Key Differences","html-vs-xhtml-key-differences",{"id":77,"name":209,"slug":210,"order_index":65,"topics":211},"Forms & User Input","forms-user-input",[212,217,222,227,232,237],{"id":213,"title":214,"slug":215,"order_index":216,"cornerstone":52,"reading_time_minutes":12},49,"HTML Forms Introduction","html-forms-introduction",37,{"id":218,"title":219,"slug":220,"order_index":221,"cornerstone":52,"reading_time_minutes":23},50,"HTML Form Attributes (action, method, etc.)","html-form-attributes-action-method",38,{"id":223,"title":224,"slug":225,"order_index":226,"cornerstone":52,"reading_time_minutes":23},51,"HTML Form Elements (input, select, textarea, button)","html-form-elements-input-select-textarea-button",39,{"id":228,"title":229,"slug":230,"order_index":231,"cornerstone":52,"reading_time_minutes":12},52,"HTML Input Types (Modern Types: email, date, color, range)","html-input-types-modern-email-date-color-range",40,{"id":233,"title":234,"slug":235,"order_index":236,"cornerstone":52,"reading_time_minutes":12},53,"HTML Input Attributes (required, placeholder, pattern)","html-input-attributes-required-placeholder-pattern",41,{"id":238,"title":239,"slug":240,"order_index":241,"cornerstone":52,"reading_time_minutes":12},54,"HTML Form Validation (Client-Side)","html-form-validation-client-side",42,{"id":81,"name":243,"slug":244,"order_index":69,"topics":245},"Graphics & Visuals","graphics-visuals",[246,251],{"id":247,"title":248,"slug":249,"order_index":250,"cornerstone":52,"reading_time_minutes":57},55,"HTML Canvas (2D Drawing API) 🔥","html-canvas-2d-drawing-api",43,{"id":252,"title":253,"slug":254,"order_index":255,"cornerstone":52,"reading_time_minutes":57},56,"HTML SVG (Scalable Vector Graphics)","html-svg-scalable-vector-graphics",44,{"id":85,"name":257,"slug":258,"order_index":77,"topics":259},"Multimedia","multimedia",[260,265,270,275,280],{"id":261,"title":262,"slug":263,"order_index":264,"cornerstone":52,"reading_time_minutes":12},57,"HTML Media Overview","html-media-overview",45,{"id":266,"title":267,"slug":268,"order_index":269,"cornerstone":52,"reading_time_minutes":12},58,"HTML Video Embedding (Native Player)","html-video-embedding-native-player",46,{"id":271,"title":272,"slug":273,"order_index":274,"cornerstone":52,"reading_time_minutes":12},59,"HTML Audio Embedding","html-audio-embedding",47,{"id":276,"title":277,"slug":278,"order_index":279,"cornerstone":52,"reading_time_minutes":12},60,"HTML Plug-ins (Object & Embed Tags)","html-plugins-object-embed-tags",48,{"id":281,"title":282,"slug":283,"order_index":213,"cornerstone":52,"reading_time_minutes":12},61,"Embedding YouTube Videos in HTML","embedding-youtube-videos-in-html",{"id":89,"name":285,"slug":286,"order_index":81,"topics":287},"HTML5 Web APIs (Advanced\u002FTrending)","html5-web-apis-advancedtrending",[288,292,296,300,304],{"id":289,"title":290,"slug":291,"order_index":218,"cornerstone":52,"reading_time_minutes":12},62,"HTML Geolocation API","html-geolocation-api",{"id":293,"title":294,"slug":295,"order_index":223,"cornerstone":52,"reading_time_minutes":12},63,"HTML Drag & Drop API","html-drag-and-drop-api",{"id":297,"title":298,"slug":299,"order_index":228,"cornerstone":52,"reading_time_minutes":12},64,"HTML Web Storage (localStorage & sessionStorage)","html-web-storage-localstorage-sessionstorage",{"id":301,"title":302,"slug":303,"order_index":233,"cornerstone":52,"reading_time_minutes":12},65,"HTML Web Workers (Background Processing)","html-web-workers-background-processing",{"id":305,"title":306,"slug":307,"order_index":238,"cornerstone":52,"reading_time_minutes":12},66,"HTML Server-Sent Events (SSE)","html-server-sent-events-sse",{"id":93,"name":309,"slug":310,"order_index":85,"topics":311},"Accessibility & Best Practices (High-Demand  Skill) �","accessibility-best-practices-high-demand-skill",[312,316,320],{"id":313,"title":314,"slug":315,"order_index":247,"cornerstone":52,"reading_time_minutes":12},67,"HTML Accessibility (ARIA, Screen Readers)","html-accessibility-aria-screen-readers",{"id":317,"title":318,"slug":319,"order_index":252,"cornerstone":52,"reading_time_minutes":12},68,"Writing Semantic & SEO-Friendly HTML","writing-semantic-and-seo-friendly-html",{"id":321,"title":322,"slug":323,"order_index":261,"cornerstone":52,"reading_time_minutes":12},69,"HTML Performance Optimization Basics","html-performance-optimization-basics",{"id":97,"name":325,"slug":326,"order_index":89,"topics":327},"Reference & Practice","reference-practice",[328,332,336,340,344,348,352,356],{"id":329,"title":330,"slug":331,"order_index":23,"cornerstone":52,"reading_time_minutes":12},70,"HTML Tag List (Full Reference)","html-tag-list-full-reference",{"id":333,"title":334,"slug":335,"order_index":12,"cornerstone":52,"reading_time_minutes":12},71,"HTML Global Attributes Reference","html-global-attributes-reference",{"id":337,"title":338,"slug":339,"order_index":57,"cornerstone":52,"reading_time_minutes":12},72,"HTML Events Reference","html-events-reference",{"id":341,"title":342,"slug":343,"order_index":61,"cornerstone":52,"reading_time_minutes":12},73,"HTML Browser Support & Compatibility","html-browser-support-compatibility",{"id":345,"title":346,"slug":347,"order_index":65,"cornerstone":52,"reading_time_minutes":12},78,"HTML Doctypes Reference","html-doctypes-reference",{"id":349,"title":350,"slug":351,"order_index":69,"cornerstone":52,"reading_time_minutes":12},79,"HTTP Methods & Messages (Basics for Forms\u002FAPIs)","http-methods-messages-basics",{"id":353,"title":354,"slug":355,"order_index":77,"cornerstone":52,"reading_time_minutes":57},80,"HTML Interview Preparation (Top Q&A)","html-interview-preparation-top-qa",{"id":357,"title":358,"slug":359,"order_index":81,"cornerstone":52,"reading_time_minutes":23},81,"HTML Quiz & Practice Exercises","html-quiz-practice-exercises",{"id":12,"name":9,"slug":10,"icon":5,"icon_url":5,"short_description":361,"meta_title":362,"meta_description":363,"og_image":5,"locale":43,"subcategories":364},"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.",[365,394,418,454,486,518,550,582,610,638],{"id":155,"name":366,"slug":367,"order_index":368,"topics":369},"UI Components","ui-components",0,[370,374,378,382,386,390],{"id":371,"title":372,"slug":373,"order_index":281,"cornerstone":52,"reading_time_minutes":69},148,"CSS Buttons: Variants, States, Sizes and Accessible Button Design","css-buttons",{"id":375,"title":376,"slug":377,"order_index":289,"cornerstone":52,"reading_time_minutes":69},149,"CSS Card Component: Layouts with Flexbox, Grid, Container Queries and Subgrid","css-cards",{"id":379,"title":380,"slug":381,"order_index":293,"cornerstone":52,"reading_time_minutes":77},150,"CSS Navbar and Dropdown Menus: Responsive, Sticky and Accessible Navigation","css-navbar-dropdowns",{"id":383,"title":384,"slug":385,"order_index":297,"cornerstone":52,"reading_time_minutes":69},151,"HTML and CSS Forms and Inputs: Styled, Accessible and Validated Form Controls","css-forms-inputs",{"id":387,"title":388,"slug":389,"order_index":301,"cornerstone":52,"reading_time_minutes":69},152,"CSS Tooltips and Popovers: Popover API, Anchor Positioning and Accessible Overlays","css-tooltips-popovers",{"id":391,"title":392,"slug":393,"order_index":305,"cornerstone":52,"reading_time_minutes":69},153,"Pagination and Breadcrumbs: Accessible Navigation Patterns with HTML, CSS and Schema","pagination-breadcrumbs",{"id":101,"name":395,"slug":396,"order_index":368,"topics":397},"CSS Fundamentals & Setup","css-fundamentals-setup",[398,402,406,410,414],{"id":399,"title":400,"slug":401,"order_index":23,"cornerstone":52,"reading_time_minutes":61},82,"CSS Introduction & History: What Is CSS and Why It Matters","css-introduction-and-history",{"id":403,"title":404,"slug":405,"order_index":12,"cornerstone":52,"reading_time_minutes":61},83,"CSS Syntax & How Browsers Apply Styles","css-syntax-how-browsers-apply-styles",{"id":407,"title":408,"slug":409,"order_index":57,"cornerstone":52,"reading_time_minutes":57},84,"Setting Up Your CSS Workspace: Linking Files & Live Server","setting-up-css-workspace-linking-files-live-server",{"id":411,"title":412,"slug":413,"order_index":61,"cornerstone":52,"reading_time_minutes":57},85,"CSS Comments & Code Formatting Best Practices","css-comments-and-code-formatting",{"id":415,"title":416,"slug":417,"order_index":65,"cornerstone":52,"reading_time_minutes":65},86,"Browser DevTools for CSS: Inspect, Debug & Edit Styles Live","browser-devtools-for-css",{"id":105,"name":419,"slug":420,"order_index":368,"topics":421},"Selectors & the Cascade","selectors-the-cascade",[422,426,430,434,438,442,446,450],{"id":423,"title":424,"slug":425,"order_index":69,"cornerstone":52,"reading_time_minutes":61},87,"CSS Basic Selectors: Type, Class, ID, Universal & Grouping","css-basic-selectors",{"id":427,"title":428,"slug":429,"order_index":77,"cornerstone":52,"reading_time_minutes":61},88,"CSS Combinators: Descendant, Child, Adjacent & General Sibling","css-combinators",{"id":431,"title":432,"slug":433,"order_index":81,"cornerstone":52,"reading_time_minutes":61},89,"CSS Attribute Selectors: [attr], ^=, $=, *= and More","css-attribute-selectors",{"id":435,"title":436,"slug":437,"order_index":85,"cornerstone":52,"reading_time_minutes":69},90,"CSS Pseudo-classes: :hover, :focus, :nth-child & Modern Selectors","css-pseudo-classes",{"id":439,"title":440,"slug":441,"order_index":89,"cornerstone":52,"reading_time_minutes":65},91,"CSS Pseudo-elements (::before, ::after)","css-pseudo-elements-before-after",{"id":443,"title":444,"slug":445,"order_index":93,"cornerstone":52,"reading_time_minutes":65},92,"Modern CSS Selectors: :is(), :where(), :has()","modern-css-selectors-is-where-has",{"id":447,"title":448,"slug":449,"order_index":97,"cornerstone":52,"reading_time_minutes":61},93,"CSS Specificity Explained","css-specificity-explained",{"id":451,"title":452,"slug":453,"order_index":101,"cornerstone":52,"reading_time_minutes":65},94,"Cascade, Inheritance & !important","css-cascade-inheritance-important",{"id":113,"name":455,"slug":456,"order_index":368,"topics":457},"Colors, Backgrounds & Effects","colors-backgrounds-effects",[458,462,466,470,474,478,482],{"id":459,"title":460,"slug":461,"order_index":105,"cornerstone":52,"reading_time_minutes":65},95,"CSS Colors (HEX, RGB, HSL, OKLCH)","css-colors-hex-rgb-hsl-oklch",{"id":463,"title":464,"slug":465,"order_index":113,"cornerstone":52,"reading_time_minutes":61},96,"CSS Backgrounds","css-backgrounds",{"id":467,"title":468,"slug":469,"order_index":117,"cornerstone":52,"reading_time_minutes":65},97,"CSS Gradients (Linear, Radial, Conic)","css-gradients-linear-radial-conic",{"id":471,"title":472,"slug":473,"order_index":121,"cornerstone":52,"reading_time_minutes":65},98,"CSS Borders, Outlines & Rounded Corners","css-borders-outlines-rounded-corners",{"id":475,"title":476,"slug":477,"order_index":125,"cornerstone":52,"reading_time_minutes":69},99,"CSS Box Shadow & Text Shadow","css-box-shadow-text-shadow",{"id":479,"title":480,"slug":481,"order_index":129,"cornerstone":52,"reading_time_minutes":65},100,"CSS Opacity & Blend Modes","css-opacity-blend-modes",{"id":483,"title":484,"slug":485,"order_index":140,"cornerstone":52,"reading_time_minutes":69},101,"CSS Filters & backdrop-filter (Glassmorphism)","css-filters-backdrop-filter-glassmorphism",{"id":117,"name":487,"slug":488,"order_index":368,"topics":489},"Box Model & Spacing","box-model-spacing",[490,494,498,502,506,510,514],{"id":491,"title":492,"slug":493,"order_index":145,"cornerstone":52,"reading_time_minutes":77},102,"The CSS Box Model: Content, Padding, Border and Margin","css-box-model",{"id":495,"title":496,"slug":497,"order_index":150,"cornerstone":52,"reading_time_minutes":77},103,"CSS Margin and Margin Collapse","css-margin-and-margin-collapse",{"id":499,"title":500,"slug":501,"order_index":155,"cornerstone":52,"reading_time_minutes":69},104,"CSS Padding: Shorthand, Percentages and Best Practices","css-padding",{"id":503,"title":504,"slug":505,"order_index":137,"cornerstone":52,"reading_time_minutes":85},105,"CSS Width, Height, Min-Width, Max-Width, Min-Height & Max-Height","css-width-height-min-max",{"id":507,"title":508,"slug":509,"order_index":142,"cornerstone":52,"reading_time_minutes":65},106,"CSS box-sizing: content-box vs border-box","css-box-sizing",{"id":511,"title":512,"slug":513,"order_index":147,"cornerstone":52,"reading_time_minutes":77},107,"CSS Overflow: hidden, scroll, auto, clip and Text Truncation","css-overflow",{"id":515,"title":516,"slug":517,"order_index":152,"cornerstone":52,"reading_time_minutes":77},108,"CSS Units: px, rem, em, %, vw, vh and dvh","css-units",{"id":121,"name":519,"slug":520,"order_index":368,"topics":521},"Typography & Text","typography-text",[522,526,530,534,538,542,546],{"id":523,"title":524,"slug":525,"order_index":157,"cornerstone":52,"reading_time_minutes":77},109,"CSS Text Properties: Alignment, Spacing, Decoration and Wrapping","css-text-properties",{"id":527,"title":528,"slug":529,"order_index":161,"cornerstone":52,"reading_time_minutes":77},110,"CSS Fonts and font-family: Font Stacks, Weights and System Fonts","css-fonts-font-family",{"id":531,"title":532,"slug":533,"order_index":165,"cornerstone":52,"reading_time_minutes":77},111,"Web Fonts: Google Fonts, @font-face and Variable Fonts","web-fonts",{"id":535,"title":536,"slug":537,"order_index":169,"cornerstone":52,"reading_time_minutes":77},112,"CSS Text Effects: text-wrap balance, line-clamp, Ellipsis and More","css-text-effects",{"id":539,"title":540,"slug":541,"order_index":173,"cornerstone":52,"reading_time_minutes":81},113,"Styling Links","styling-links-css",{"id":543,"title":544,"slug":545,"order_index":193,"cornerstone":52,"reading_time_minutes":77},114,"Styling Lists & Tables","styling-lists-and-tables-css",{"id":547,"title":548,"slug":549,"order_index":197,"cornerstone":52,"reading_time_minutes":89},115,"Icons (SVG & Icon Fonts)","icons-svg-and-icon-fonts",{"id":125,"name":551,"slug":552,"order_index":368,"topics":553},"Display, Position & Layout Basics","display-position-layout-basics",[554,558,562,566,570,574,578],{"id":555,"title":556,"slug":557,"order_index":201,"cornerstone":52,"reading_time_minutes":77},116,"Display & Inline-block","display-and-inline-block",{"id":559,"title":560,"slug":561,"order_index":205,"cornerstone":52,"reading_time_minutes":69},117,"Position (relative, absolute, fixed, sticky)","position-relative-absolute-fixed-sticky",{"id":563,"title":564,"slug":565,"order_index":216,"cornerstone":52,"reading_time_minutes":69},118,"Z-index & Stacking Contexts","z-index-and-stacking-contexts",{"id":567,"title":568,"slug":569,"order_index":221,"cornerstone":52,"reading_time_minutes":65},119,"Float & Clear (Legacy, and Why to Avoid It)","float-and-clear",{"id":571,"title":572,"slug":573,"order_index":226,"cornerstone":52,"reading_time_minutes":69},120,"Centering Techniques","centering-techniques",{"id":575,"title":576,"slug":577,"order_index":231,"cornerstone":52,"reading_time_minutes":77},121,"aspect-ratio & object-fit","aspect-ratio-and-object-fit",{"id":579,"title":580,"slug":581,"order_index":236,"cornerstone":52,"reading_time_minutes":81},122,"Website Layout Basics","website-layout-basics",{"id":140,"name":583,"slug":584,"order_index":368,"topics":585},"The Modern CSS Toolkit","the-modern-css-toolkit",[586,590,594,598,602,606],{"id":587,"title":588,"slug":589,"order_index":241,"cornerstone":52,"reading_time_minutes":81},129,"CSS Variables (Custom Properties)","css-variables-custom-properties",{"id":591,"title":592,"slug":593,"order_index":250,"cornerstone":52,"reading_time_minutes":81},130,"Math Functions (calc, min, max, clamp)","math-functions-calc-min-max-clamp",{"id":595,"title":596,"slug":597,"order_index":255,"cornerstone":52,"reading_time_minutes":77},131,"Native CSS Nesting","native-css-nesting",{"id":599,"title":600,"slug":601,"order_index":264,"cornerstone":52,"reading_time_minutes":77},132,"Cascade Layers (@layer)","cascade-layers-at-layer",{"id":603,"title":604,"slug":605,"order_index":269,"cornerstone":52,"reading_time_minutes":85},133,"Dark Mode (prefers-color-scheme, light-dark())","dark-mode-prefers-color-scheme-light-dark",{"id":607,"title":608,"slug":609,"order_index":274,"cornerstone":52,"reading_time_minutes":81},134,"CSS Reset & Normalize","css-reset-and-normalize",{"id":145,"name":611,"slug":612,"order_index":368,"topics":613},"Responsive Design","responsive-design",[614,618,622,626,630,634],{"id":615,"title":616,"slug":617,"order_index":279,"cornerstone":52,"reading_time_minutes":85},135,"Mobile-First & the Viewport","mobile-first-and-the-viewport",{"id":619,"title":620,"slug":621,"order_index":213,"cornerstone":52,"reading_time_minutes":81},136,"Media Queries","media-queries",{"id":623,"title":624,"slug":625,"order_index":218,"cornerstone":52,"reading_time_minutes":81},137,"Responsive Images & Video","responsive-images-and-video",{"id":627,"title":628,"slug":629,"order_index":223,"cornerstone":52,"reading_time_minutes":85},138,"Fluid Typography with clamp()","fluid-typography-with-clamp",{"id":631,"title":632,"slug":633,"order_index":228,"cornerstone":52,"reading_time_minutes":85},139,"Container Queries","container-queries",{"id":635,"title":636,"slug":637,"order_index":233,"cornerstone":52,"reading_time_minutes":97},140,"Responsive Navigation Pattern","responsive-navigation-pattern",{"id":150,"name":639,"slug":640,"order_index":368,"topics":641},"Transitions & Animation","transitions-animation",[642,646,650,654,658,662,666],{"id":643,"title":644,"slug":645,"order_index":238,"cornerstone":52,"reading_time_minutes":65},141,"CSS Transitions: Smooth State Changes with transition, @starting-style and allow-discrete","css-transitions",{"id":647,"title":648,"slug":649,"order_index":247,"cornerstone":52,"reading_time_minutes":61},142,"CSS 2D Transforms: translate, rotate, scale, skew and transform-origin","css-2d-transforms",{"id":651,"title":652,"slug":653,"order_index":252,"cornerstone":52,"reading_time_minutes":65},143,"CSS 3D Transforms: perspective, preserve-3d, rotateX\u002FY and backface-visibility","css-3d-transforms",{"id":655,"title":656,"slug":657,"order_index":261,"cornerstone":52,"reading_time_minutes":65},144,"CSS Keyframe Animations: @keyframes, animation shorthand, fill-mode and @property","css-keyframe-animations",{"id":659,"title":660,"slug":661,"order_index":266,"cornerstone":52,"reading_time_minutes":65},145,"CSS Scroll-Driven Animations: animation-timeline, scroll() and view()","css-scroll-driven-animations",{"id":663,"title":664,"slug":665,"order_index":271,"cornerstone":52,"reading_time_minutes":65},146,"CSS View Transitions API: Progressive Enhancement for Page and State Animations","css-view-transitions",{"id":667,"title":668,"slug":669,"order_index":276,"cornerstone":52,"reading_time_minutes":69},147,"Motion Accessibility and Performance: prefers-reduced-motion, will-change and Smooth 60fps Animations","motion-accessibility-prefers-reduced-motion-performance",{"data":671},{"id":623,"title":624,"slug":625,"content":672,"course":673,"subcategory":674,"author":675,"reading_time_minutes":81,"cornerstone":52,"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":746,"quiz":5,"exercises":770,"published_at":5,"updated_at":785,"prev":786,"next":787},"\u003Ch2 id=\"responsive-images-and-video-complete-guide\">Responsive Images and Video: Complete Guide\u003C\u002Fh2>\u003Cp>\u003Cstrong>Focus keyword: responsive images.\u003C\u002Fstrong> Images and video are usually the heaviest part of a page. A phone on a mobile network should not download a 2400px wide photo that is shown in a 360px wide space. In this lesson you will learn how to make media flexible, how to let the browser choose the best file with srcset and sizes, how to crop differently for each screen with the picture element, how to load images without hurting performance, and how to embed responsive video.\u003C\u002Fp>\u003Ch3 id=\"trending-keywords-covered-in-this-lesson\">Trending keywords covered in this lesson\u003C\u002Fh3>\u003Cp>responsive images srcset sizes, picture element art direction, AVIF vs WebP, image format fallback, lazy loading images, fetchpriority high, LCP image optimization, decoding async, width and height attributes, prevent layout shift, image-set CSS, responsive background image, responsive video embed, aspect-ratio iframe, video poster, playsinline autoplay muted, prefers-reduced-data, image CDN, Core Web Vitals.\u003C\u002Fp>\u003Ch2 id=\"1-start-with-flexible-images\">1. Start with Flexible Images\u003C\u002Fh2>\u003Cp>A responsive image never overflows its container. Add this to your reset: \u003Ccode>img, video { max-width: 100%; height: auto; display: block; }\u003C\u002Fcode>. Also write the real \u003Ccode>width\u003C\u002Fcode> and \u003Ccode>height\u003C\u002Fcode> attributes in the HTML. The browser uses them to compute an aspect ratio before the file loads, which reserves space and prevents layout shift. With \u003Ccode>height: auto\u003C\u002Fcode> in CSS the image still scales correctly.\u003C\u002Fp>\u003Ch2 id=\"2-the-problem-resolution-switching\">2. The Problem: Resolution Switching\u003C\u002Fh2>\u003Cp>A flexible image still downloads one file. A desktop layout may need 1200px, a phone may need 400px, and a high density phone may need 800px for the same 400 CSS pixels. The \u003Ccode>srcset\u003C\u002Fcode> and \u003Ccode>sizes\u003C\u002Fcode> attributes let the browser choose the smallest file that looks sharp.\u003C\u002Fp>\u003Ch2 id=\"3-srcset-with-width-descriptors-and-sizes\">3. srcset with Width Descriptors and sizes\u003C\u002Fh2>\u003Cp>Example: \u003Ccode>&lt;img src='photo-800.jpg' srcset='photo-400.jpg 400w, photo-800.jpg 800w, photo-1200.jpg 1200w' sizes='(min-width: 900px) 600px, 100vw' width='800' height='500' alt='...'&gt;\u003C\u002Fcode>.\u003C\u002Fp>\u003Cul>\u003Cli>Each candidate has a \u003Ccode>w\u003C\u002Fcode> descriptor: the real pixel width of that file.\u003C\u002Fli>\u003Cli>\u003Ccode>sizes\u003C\u002Fcode> tells the browser how wide the image will be displayed in CSS pixels, evaluated from left to right, with the last value as default. The browser needs this because it chooses the file before the CSS is loaded.\u003C\u002Fli>\u003Cli>The browser multiplies the displayed width by the device pixel ratio and picks the closest file. It may also consider the network and cache, so you cannot force one file.\u003C\u002Fli>\u003Cli>\u003Ccode>src\u003C\u002Fcode> is the fallback for browsers without srcset support.\u003C\u002Fli>\u003Cli>If you leave out \u003Ccode>sizes\u003C\u002Fcode>, the browser assumes 100vw and may download a file that is too large.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"4-srcset-with-density-descriptors\">4. srcset with Density Descriptors\u003C\u002Fh2>\u003Cp>For images with a fixed CSS size, such as a logo or an avatar, use density descriptors: \u003Ccode>srcset='logo.png 1x, logo@2x.png 2x, logo@3x.png 3x'\u003C\u002Fcode>. Do not mix \u003Ccode>w\u003C\u002Fcode> and \u003Ccode>x\u003C\u002Fcode> descriptors in one srcset.\u003C\u002Fp>\u003Ch2 id=\"5-the-picture-element-art-direction\">5. The picture Element: Art Direction\u003C\u002Fh2>\u003Cp>When the crop must change, not only the size, use \u003Ccode>picture\u003C\u002Fcode>. A wide landscape photo may need a square crop on a phone so the subject stays visible. The browser uses the first \u003Ccode>source\u003C\u002Fcode> whose \u003Ccode>media\u003C\u002Fcode> condition matches, and falls back to the \u003Ccode>img\u003C\u002Fcode> element inside. The \u003Ccode>img\u003C\u002Fcode> is required, and it carries the alt text and the size attributes.\u003C\u002Fp>\u003Cpre>&lt;picture&gt;\n  &lt;source media='(min-width: 800px)' srcset='hero-wide.jpg'&gt;\n  &lt;img src='hero-square.jpg' alt='...' width='600' height='600'&gt;\n&lt;\u002Fpicture&gt;\u003C\u002Fpre>\u003Ch2 id=\"6-modern-formats-with-a-fallback\">6. Modern Formats with a Fallback\u003C\u002Fh2>\u003Cp>Use the \u003Ccode>type\u003C\u002Fcode> attribute to offer smaller formats: AVIF first, WebP second and JPEG as the final fallback. The browser skips formats it cannot decode. AVIF and WebP often reduce file size a lot compared with JPEG at similar quality. Use SVG for logos and icons, because it scales without loss, and use PNG only when you need lossless transparency that WebP or AVIF cannot provide.\u003C\u002Fp>\u003Ch2 id=\"7-loading-strategy-and-performance\">7. Loading Strategy and Performance\u003C\u002Fh2>\u003Cul>\u003Cli>\u003Ccode>loading='lazy'\u003C\u002Fcode>: delays images that are far below the viewport. Do not use it on the main image at the top of the page.\u003C\u002Fli>\u003Cli>\u003Ccode>fetchpriority='high'\u003C\u002Fcode>: tells the browser that the hero image is important. It helps the Largest Contentful Paint score.\u003C\u002Fli>\u003Cli>\u003Ccode>decoding='async'\u003C\u002Fcode>: lets the browser decode the image without blocking rendering.\u003C\u002Fli>\u003Cli>Compress images and strip metadata. Serve them from a CDN or an image service that can resize on demand.\u003C\u002Fli>\u003Cli>Keep the intrinsic image size close to the largest display size multiplied by two, because larger files rarely look better.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"8-responsive-background-images-in-css\">8. Responsive Background Images in CSS\u003C\u002Fh2>\u003Cp>For decorative images, use \u003Ccode>background-image\u003C\u002Fcode> with media queries to switch files, and \u003Ccode>image-set()\u003C\u002Fcode> for density: \u003Ccode>background-image: image-set(url(bg.jpg) 1x, url(bg@2x.jpg) 2x);\u003C\u002Fcode>. A CSS background is not part of the content, so it has no alt text and is not announced by screen readers. Use an \u003Ccode>img\u003C\u002Fcode> or \u003Ccode>picture\u003C\u002Fcode> when the image carries meaning. Combine it with \u003Ccode>background-size: cover\u003C\u002Fcode> and \u003Ccode>background-position\u003C\u002Fcode> to choose a focal point.\u003C\u002Fp>\u003Ch2 id=\"9-responsive-video\">9. Responsive Video\u003C\u002Fh2>\u003Cul>\u003Cli>Make video flexible with \u003Ccode>video { max-width: 100%; height: auto; }\u003C\u002Fcode> or force a shape with \u003Ccode>aspect-ratio: 16 \u002F 9; width: 100%; object-fit: cover\u003C\u002Fcode>.\u003C\u002Fli>\u003Cli>Use \u003Ccode>poster\u003C\u002Fcode> so the user sees an image before playback, and \u003Ccode>preload='metadata'\u003C\u002Fcode> to avoid downloading the whole file.\u003C\u002Fli>\u003Cli>Offer several formats with \u003Ccode>source\u003C\u002Fcode> elements, such as WebM and MP4, and add a text fallback inside the element.\u003C\u002Fli>\u003Cli>For autoplay background videos use \u003Ccode>muted\u003C\u002Fcode>, \u003Ccode>loop\u003C\u002Fcode> and \u003Ccode>playsinline\u003C\u002Fcode>, and respect \u003Ccode>prefers-reduced-motion\u003C\u002Fcode> by not autoplaying.\u003C\u002Fli>\u003Cli>Add captions with \u003Ccode>track kind='captions'\u003C\u002Fcode> for accessibility.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"10-responsive-embeds-iframe\">10. Responsive Embeds (iframe)\u003C\u002Fh2>\u003Cp>YouTube and map embeds come with fixed width and height. Override them with \u003Ccode>iframe { width: 100%; height: auto; aspect-ratio: 16 \u002F 9; border: 0; }\u003C\u002Fcode>. Use \u003Ccode>loading='lazy'\u003C\u002Fcode> on iframes below the fold. Consider a click-to-load preview image for heavy third party embeds.\u003C\u002Fp>\u003Ch2 id=\"11-accessibility-checklist\">11. Accessibility Checklist\u003C\u002Fh2>\u003Cul>\u003Cli>Every informative image needs meaningful \u003Ccode>alt\u003C\u002Fcode> text. Decorative images use \u003Ccode>alt=''\u003C\u002Fcode>.\u003C\u002Fli>\u003Cli>Use \u003Ccode>figure\u003C\u002Fcode> and \u003Ccode>figcaption\u003C\u002Fcode> when the caption matters.\u003C\u002Fli>\u003Cli>Do not put essential text inside images. If you must, repeat it as real text.\u003C\u002Fli>\u003Cli>Provide captions and transcripts for video.\u003C\u002Fli>\u003Cli>Check that cropped images still show their subject at every size.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"12-common-mistakes\">12. Common Mistakes\u003C\u002Fh2>\u003Cul>\u003Cli>Forgetting width and height attributes and causing layout shift.\u003C\u002Fli>\u003Cli>Writing srcset without sizes and getting oversized downloads.\u003C\u002Fli>\u003Cli>Using lazy loading on the main hero image.\u003C\u002Fli>\u003Cli>Hiding images with display none and expecting the download to stop.\u003C\u002Fli>\u003Cli>Using picture when a simple srcset is enough. Use picture only for art direction or format choice.\u003C\u002Fli>\u003Cli>Mixing w and x descriptors in the same srcset.\u003C\u002Fli>\u003Cli>Using a CSS background image for meaningful content.\u003C\u002Fli>\u003Cli>Leaving an iframe at a fixed pixel width.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"key-takeaways\">Key Takeaways\u003C\u002Fh2>\u003Cp>Make every image flexible with max-width and intrinsic size attributes, use srcset with sizes so the browser chooses the right file, use picture for art direction and modern formats, lazy load only below the fold, prioritize the hero image, and keep video and embeds inside an aspect-ratio box.\u003C\u002Fp>\u003Cdiv class=\"try-it-yourself language-html\">\u003Cpre>\u003Ccode>&lt;style&gt;\n  body { font: 16px system-ui, sans-serif; padding: 16px; }\n  img { max-width: 100%; height: auto; display: block; border-radius: 10px; }\n  figure { margin: 0; max-width: 520px; }\n  figcaption { font-size: 14px; color: #555; margin-top: 6px; }\n&lt;\u002Fstyle&gt;\n&lt;figure&gt;\n  &lt;img width='800' height='500' alt='Teal placeholder with a label' src='data:image\u002Fsvg+xml,%3Csvg%20xmlns=%27http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg%27%20width=%27800%27%20height=%27500%27%3E%3Crect%20width=%27800%27%20height=%27500%27%20fill=%27%232a9d8f%27\u002F%3E%3Ctext%20x=%27400%27%20y=%27270%27%20font-size=%2780%27%20text-anchor=%27middle%27%20fill=%27white%27%3E800x500%3C\u002Ftext%3E%3C\u002Fsvg%3E'&gt;\n  &lt;figcaption&gt;width and height attributes reserve space, max-width keeps it flexible.&lt;\u002Ffigcaption&gt;\n&lt;\u002Ffigure&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003Cdiv class=\"try-it-yourself language-html\">\u003Cpre>\u003Ccode>&lt;style&gt;\n  body { font: 16px system-ui, sans-serif; padding: 16px; }\n  img { max-width: 100%; height: auto; display: block; border-radius: 10px; }\n  .frame { width: min(100%, 600px); }\n&lt;\u002Fstyle&gt;\n&lt;p&gt;The browser picks one candidate from srcset. Each image is labelled with its own width.&lt;\u002Fp&gt;\n&lt;div class='frame'&gt;\n  &lt;img width='400' height='250' alt='Responsive image candidates'\n    src='data:image\u002Fsvg+xml,%3Csvg%20xmlns=%27http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg%27%20width=%27400%27%20height=%27250%27%3E%3Crect%20width=%27400%27%20height=%27250%27%20fill=%27%232a9d8f%27\u002F%3E%3Ctext%20x=%27200%27%20y=%27135%27%20font-size=%2740%27%20text-anchor=%27middle%27%20fill=%27white%27%3E400w%3C\u002Ftext%3E%3C\u002Fsvg%3E'\n    srcset='data:image\u002Fsvg+xml,%3Csvg%20xmlns=%27http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg%27%20width=%27400%27%20height=%27250%27%3E%3Crect%20width=%27400%27%20height=%27250%27%20fill=%27%232a9d8f%27\u002F%3E%3Ctext%20x=%27200%27%20y=%27135%27%20font-size=%2740%27%20text-anchor=%27middle%27%20fill=%27white%27%3E400w%3C\u002Ftext%3E%3C\u002Fsvg%3E 400w, data:image\u002Fsvg+xml,%3Csvg%20xmlns=%27http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg%27%20width=%27800%27%20height=%27500%27%3E%3Crect%20width=%27800%27%20height=%27500%27%20fill=%27%23264653%27\u002F%3E%3Ctext%20x=%27400%27%20y=%27270%27%20font-size=%2780%27%20text-anchor=%27middle%27%20fill=%27white%27%3E800w%3C\u002Ftext%3E%3C\u002Fsvg%3E 800w, data:image\u002Fsvg+xml,%3Csvg%20xmlns=%27http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg%27%20width=%271200%27%20height=%27750%27%3E%3Crect%20width=%271200%27%20height=%27750%27%20fill=%27%23e76f51%27\u002F%3E%3Ctext%20x=%27600%27%20y=%27400%27%20font-size=%27120%27%20text-anchor=%27middle%27%20fill=%27white%27%3E1200w%3C\u002Ftext%3E%3C\u002Fsvg%3E 1200w'\n    sizes='(min-width: 640px) 600px, 100vw'&gt;\n&lt;\u002Fdiv&gt;\n&lt;p&gt;sizes says: 600px wide on screens 640px and up, otherwise 100vw.&lt;\u002Fp&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003Cdiv class=\"try-it-yourself language-html\">\u003Cpre>\u003Ccode>&lt;style&gt;\n  body { font: 16px system-ui, sans-serif; padding: 16px; }\n  picture img { width: 100%; max-width: 900px; height: auto; display: block; border-radius: 10px; }\n&lt;\u002Fstyle&gt;\n&lt;p&gt;Art direction: a square crop on small screens, a wide crop from 700px.&lt;\u002Fp&gt;\n&lt;picture&gt;\n  &lt;source media='(min-width: 700px)' width='1200' height='400' srcset='data:image\u002Fsvg+xml,%3Csvg%20xmlns=%27http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg%27%20width=%271200%27%20height=%27400%27%3E%3Crect%20width=%271200%27%20height=%27400%27%20fill=%27%23219ebc%27\u002F%3E%3Ctext%20x=%27600%27%20y=%27230%27%20font-size=%27100%27%20text-anchor=%27middle%27%20fill=%27white%27%3EWide%203:1%3C\u002Ftext%3E%3C\u002Fsvg%3E'&gt;\n  &lt;img width='600' height='600' alt='Hero with a different crop per screen' src='data:image\u002Fsvg+xml,%3Csvg%20xmlns=%27http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg%27%20width=%27600%27%20height=%27600%27%3E%3Crect%20width=%27600%27%20height=%27600%27%20fill=%27%23e9c46a%27\u002F%3E%3Ctext%20x=%27300%27%20y=%27320%27%20font-size=%2780%27%20text-anchor=%27middle%27%20fill=%27%23111%27%3ESquare%3C\u002Ftext%3E%3C\u002Fsvg%3E'&gt;\n&lt;\u002Fpicture&gt;\n&lt;p&gt;Real projects also add type sources: AVIF first, WebP second, JPEG in the img.&lt;\u002Fp&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003Cdiv class=\"try-it-yourself language-html\">\u003Cpre>\u003Ccode>&lt;style&gt;\n  body { font: 16px system-ui, sans-serif; padding: 16px; }\n  .scroller { height: 260px; overflow: auto; border: 2px solid #264653; padding: 8px; }\n  .scroller img { display: block; width: 100%; max-width: 360px; height: auto; margin-bottom: 12px; border-radius: 8px; }\n  .spacer { height: 160px; background: #eef2f7; margin-bottom: 12px; padding: 8px; }\n&lt;\u002Fstyle&gt;\n&lt;div class='scroller'&gt;\n  &lt;img width='400' height='250' alt='Hero image' fetchpriority='high' decoding='async' src='data:image\u002Fsvg+xml,%3Csvg%20xmlns=%27http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg%27%20width=%27400%27%20height=%27250%27%3E%3Crect%20width=%27400%27%20height=%27250%27%20fill=%27%23264653%27\u002F%3E%3Ctext%20x=%27200%27%20y=%27135%27%20font-size=%2728%27%20text-anchor=%27middle%27%20fill=%27white%27%3Ehero: fetchpriority high%3C\u002Ftext%3E%3C\u002Fsvg%3E'&gt;\n  &lt;div class='spacer'&gt;Content between images&lt;\u002Fdiv&gt;\n  &lt;img width='400' height='250' alt='Below the fold' loading='lazy' decoding='async' src='data:image\u002Fsvg+xml,%3Csvg%20xmlns=%27http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg%27%20width=%27400%27%20height=%27250%27%3E%3Crect%20width=%27400%27%20height=%27250%27%20fill=%27%232a9d8f%27\u002F%3E%3Ctext%20x=%27200%27%20y=%27135%27%20font-size=%2728%27%20text-anchor=%27middle%27%20fill=%27white%27%3Ebelow fold: lazy%3C\u002Ftext%3E%3C\u002Fsvg%3E'&gt;\n&lt;\u002Fdiv&gt;\n&lt;p&gt;Hero: fetchpriority high and no lazy loading. Images further down: loading lazy.&lt;\u002Fp&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003Cdiv class=\"try-it-yourself language-html\">\u003Cpre>\u003Ccode>&lt;style&gt;\n  body { margin: 0; font: 18px system-ui, sans-serif; }\n  .hero {\n    min-height: 40svh; display: grid; place-items: center; color: #fff; text-align: center; padding: 16px;\n    background-color: #264653;\n    background-image: url(data:image\u002Fsvg+xml,%3Csvg%20xmlns=%27http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg%27%20width=%27600%27%20height=%27400%27%3E%3Crect%20width=%27600%27%20height=%27400%27%20fill=%27%232a9d8f%27\u002F%3E%3Ctext%20x=%27300%27%20y=%27220%27%20font-size=%2748%27%20text-anchor=%27middle%27%20fill=%27white%27%3ESmall%20file%3C\u002Ftext%3E%3C\u002Fsvg%3E);\n    background-size: cover; background-position: center;\n  }\n  @media (min-width: 800px) {\n    .hero {\n      background-image: url(data:image\u002Fsvg+xml,%3Csvg%20xmlns=%27http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg%27%20width=%271600%27%20height=%27600%27%3E%3Crect%20width=%271600%27%20height=%27600%27%20fill=%27%23e76f51%27\u002F%3E%3Ctext%20x=%27800%27%20y=%27330%27%20font-size=%27100%27%20text-anchor=%27middle%27%20fill=%27white%27%3ELarge%20file%3C\u002Ftext%3E%3C\u002Fsvg%3E);\n    }\n  }\n  .hero h1 { margin: 0; text-shadow: 0 2px 8px rgba(0,0,0,.5); }\n&lt;\u002Fstyle&gt;\n&lt;section class='hero'&gt;&lt;h1&gt;Responsive background image&lt;\u002Fh1&gt;&lt;\u002Fsection&gt;\n&lt;p style='padding:16px'&gt;A different file is used from 800px. For density use image-set(url(a.jpg) 1x, url(a@2x.jpg) 2x).&lt;\u002Fp&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003Cdiv class=\"try-it-yourself language-html\">\u003Cpre>\u003Ccode>&lt;style&gt;\n  body { font: 16px system-ui, sans-serif; padding: 16px; }\n  .media { width: 100%; max-width: 720px; aspect-ratio: 16 \u002F 9; display: block; background: #000; border-radius: 12px; border: 0; margin-bottom: 16px; }\n  video.media { object-fit: cover; }\n  .embed { display: grid; place-items: center; color: #fff; }\n&lt;\u002Fstyle&gt;\n&lt;video class='media' controls playsinline preload='metadata' poster='data:image\u002Fsvg+xml,%3Csvg%20xmlns=%27http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg%27%20width=%271280%27%20height=%27720%27%3E%3Crect%20width=%271280%27%20height=%27720%27%20fill=%27%23264653%27\u002F%3E%3Ctext%20x=%27640%27%20y=%27390%27%20font-size=%2796%27%20text-anchor=%27middle%27%20fill=%27white%27%3EVideo%20poster%3C\u002Ftext%3E%3C\u002Fsvg%3E'&gt;\n  &lt;source src='movie.webm' type='video\u002Fwebm'&gt;\n  &lt;source src='movie.mp4' type='video\u002Fmp4'&gt;\n  Your browser does not support video.\n&lt;\u002Fvideo&gt;\n&lt;div class='media embed'&gt;Any iframe embed also gets width: 100% and aspect-ratio: 16 \u002F 9&lt;\u002Fdiv&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003Cdiv class=\"try-it-yourself language-javascript\">\u003Cpre>\u003Ccode>function buildSrcset(base, widths, ext) {\n  return widths.map(function (w) {\n    return base + '-' + w + '.' + ext + ' ' + w + 'w';\n  }).join(', ');\n}\n\nvar widths = [400, 800, 1200, 1600];\nconsole.log('srcset=' + buildSrcset('photo', widths, 'jpg'));\n\nfunction suggestSizes(maxContentWidth, breakpoint) {\n  return '(min-width: ' + breakpoint + 'px) ' + maxContentWidth + 'px, 100vw';\n}\n\nconsole.log('sizes=' + suggestSizes(600, 900));\n\nvar displayWidth = 360;\nvar dpr = 3;\nconsole.log('A ' + displayWidth + 'px wide slot at DPR ' + dpr + ' needs about ' + (displayWidth * dpr) + 'px of image width.');\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>",{"name":9,"slug":10},{"name":611,"slug":612},{"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\u002Fresponsive-images-and-video","Responsive Images & Video: srcset, sizes, picture, lazy loading","Learn responsive images and video: srcset, sizes, the picture element, art direction, AVIF and WebP, lazy loading, fetchpriority, image-set and responsive video embeds.",[686,694,698,702,706,710,714,718,722,726,730,734,738,742],{"id":687,"text":688,"level":12,"children":689},"responsive-images-and-video-complete-guide","Responsive Images and Video: Complete Guide",[690],{"id":691,"text":692,"level":57,"children":693},"trending-keywords-covered-in-this-lesson","Trending keywords covered in this lesson",[],{"id":695,"text":696,"level":12,"children":697},"1-start-with-flexible-images","1. Start with Flexible Images",[],{"id":699,"text":700,"level":12,"children":701},"2-the-problem-resolution-switching","2. The Problem: Resolution Switching",[],{"id":703,"text":704,"level":12,"children":705},"3-srcset-with-width-descriptors-and-sizes","3. srcset with Width Descriptors and sizes",[],{"id":707,"text":708,"level":12,"children":709},"4-srcset-with-density-descriptors","4. srcset with Density Descriptors",[],{"id":711,"text":712,"level":12,"children":713},"5-the-picture-element-art-direction","5. The picture Element: Art Direction",[],{"id":715,"text":716,"level":12,"children":717},"6-modern-formats-with-a-fallback","6. Modern Formats with a Fallback",[],{"id":719,"text":720,"level":12,"children":721},"7-loading-strategy-and-performance","7. Loading Strategy and Performance",[],{"id":723,"text":724,"level":12,"children":725},"8-responsive-background-images-in-css","8. Responsive Background Images in CSS",[],{"id":727,"text":728,"level":12,"children":729},"9-responsive-video","9. Responsive Video",[],{"id":731,"text":732,"level":12,"children":733},"10-responsive-embeds-iframe","10. Responsive Embeds (iframe)",[],{"id":735,"text":736,"level":12,"children":737},"11-accessibility-checklist","11. Accessibility Checklist",[],{"id":739,"text":740,"level":12,"children":741},"12-common-mistakes","12. Common Mistakes",[],{"id":743,"text":744,"level":12,"children":745},"key-takeaways","Key Takeaways",[],[747,751,754,757,760,763,766],{"id":748,"language":16,"code":749,"is_editable":750},544,"\u003Cstyle>\n  body { font: 16px system-ui, sans-serif; padding: 16px; }\n  img { max-width: 100%; height: auto; display: block; border-radius: 10px; }\n  figure { margin: 0; max-width: 520px; }\n  figcaption { font-size: 14px; color: #555; margin-top: 6px; }\n\u003C\u002Fstyle>\n\u003Cfigure>\n  \u003Cimg width='800' height='500' alt='Teal placeholder with a label' src='data:image\u002Fsvg+xml,%3Csvg%20xmlns=%27http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg%27%20width=%27800%27%20height=%27500%27%3E%3Crect%20width=%27800%27%20height=%27500%27%20fill=%27%232a9d8f%27\u002F%3E%3Ctext%20x=%27400%27%20y=%27270%27%20font-size=%2780%27%20text-anchor=%27middle%27%20fill=%27white%27%3E800x500%3C\u002Ftext%3E%3C\u002Fsvg%3E'>\n  \u003Cfigcaption>width and height attributes reserve space, max-width keeps it flexible.\u003C\u002Ffigcaption>\n\u003C\u002Ffigure>",true,{"id":752,"language":16,"code":753,"is_editable":750},545,"\u003Cstyle>\n  body { font: 16px system-ui, sans-serif; padding: 16px; }\n  img { max-width: 100%; height: auto; display: block; border-radius: 10px; }\n  .frame { width: min(100%, 600px); }\n\u003C\u002Fstyle>\n\u003Cp>The browser picks one candidate from srcset. Each image is labelled with its own width.\u003C\u002Fp>\n\u003Cdiv class='frame'>\n  \u003Cimg width='400' height='250' alt='Responsive image candidates'\n    src='data:image\u002Fsvg+xml,%3Csvg%20xmlns=%27http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg%27%20width=%27400%27%20height=%27250%27%3E%3Crect%20width=%27400%27%20height=%27250%27%20fill=%27%232a9d8f%27\u002F%3E%3Ctext%20x=%27200%27%20y=%27135%27%20font-size=%2740%27%20text-anchor=%27middle%27%20fill=%27white%27%3E400w%3C\u002Ftext%3E%3C\u002Fsvg%3E'\n    srcset='data:image\u002Fsvg+xml,%3Csvg%20xmlns=%27http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg%27%20width=%27400%27%20height=%27250%27%3E%3Crect%20width=%27400%27%20height=%27250%27%20fill=%27%232a9d8f%27\u002F%3E%3Ctext%20x=%27200%27%20y=%27135%27%20font-size=%2740%27%20text-anchor=%27middle%27%20fill=%27white%27%3E400w%3C\u002Ftext%3E%3C\u002Fsvg%3E 400w, data:image\u002Fsvg+xml,%3Csvg%20xmlns=%27http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg%27%20width=%27800%27%20height=%27500%27%3E%3Crect%20width=%27800%27%20height=%27500%27%20fill=%27%23264653%27\u002F%3E%3Ctext%20x=%27400%27%20y=%27270%27%20font-size=%2780%27%20text-anchor=%27middle%27%20fill=%27white%27%3E800w%3C\u002Ftext%3E%3C\u002Fsvg%3E 800w, data:image\u002Fsvg+xml,%3Csvg%20xmlns=%27http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg%27%20width=%271200%27%20height=%27750%27%3E%3Crect%20width=%271200%27%20height=%27750%27%20fill=%27%23e76f51%27\u002F%3E%3Ctext%20x=%27600%27%20y=%27400%27%20font-size=%27120%27%20text-anchor=%27middle%27%20fill=%27white%27%3E1200w%3C\u002Ftext%3E%3C\u002Fsvg%3E 1200w'\n    sizes='(min-width: 640px) 600px, 100vw'>\n\u003C\u002Fdiv>\n\u003Cp>sizes says: 600px wide on screens 640px and up, otherwise 100vw.\u003C\u002Fp>",{"id":755,"language":16,"code":756,"is_editable":750},546,"\u003Cstyle>\n  body { font: 16px system-ui, sans-serif; padding: 16px; }\n  picture img { width: 100%; max-width: 900px; height: auto; display: block; border-radius: 10px; }\n\u003C\u002Fstyle>\n\u003Cp>Art direction: a square crop on small screens, a wide crop from 700px.\u003C\u002Fp>\n\u003Cpicture>\n  \u003Csource media='(min-width: 700px)' width='1200' height='400' srcset='data:image\u002Fsvg+xml,%3Csvg%20xmlns=%27http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg%27%20width=%271200%27%20height=%27400%27%3E%3Crect%20width=%271200%27%20height=%27400%27%20fill=%27%23219ebc%27\u002F%3E%3Ctext%20x=%27600%27%20y=%27230%27%20font-size=%27100%27%20text-anchor=%27middle%27%20fill=%27white%27%3EWide%203:1%3C\u002Ftext%3E%3C\u002Fsvg%3E'>\n  \u003Cimg width='600' height='600' alt='Hero with a different crop per screen' src='data:image\u002Fsvg+xml,%3Csvg%20xmlns=%27http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg%27%20width=%27600%27%20height=%27600%27%3E%3Crect%20width=%27600%27%20height=%27600%27%20fill=%27%23e9c46a%27\u002F%3E%3Ctext%20x=%27300%27%20y=%27320%27%20font-size=%2780%27%20text-anchor=%27middle%27%20fill=%27%23111%27%3ESquare%3C\u002Ftext%3E%3C\u002Fsvg%3E'>\n\u003C\u002Fpicture>\n\u003Cp>Real projects also add type sources: AVIF first, WebP second, JPEG in the img.\u003C\u002Fp>",{"id":758,"language":16,"code":759,"is_editable":750},547,"\u003Cstyle>\n  body { font: 16px system-ui, sans-serif; padding: 16px; }\n  .scroller { height: 260px; overflow: auto; border: 2px solid #264653; padding: 8px; }\n  .scroller img { display: block; width: 100%; max-width: 360px; height: auto; margin-bottom: 12px; border-radius: 8px; }\n  .spacer { height: 160px; background: #eef2f7; margin-bottom: 12px; padding: 8px; }\n\u003C\u002Fstyle>\n\u003Cdiv class='scroller'>\n  \u003Cimg width='400' height='250' alt='Hero image' fetchpriority='high' decoding='async' src='data:image\u002Fsvg+xml,%3Csvg%20xmlns=%27http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg%27%20width=%27400%27%20height=%27250%27%3E%3Crect%20width=%27400%27%20height=%27250%27%20fill=%27%23264653%27\u002F%3E%3Ctext%20x=%27200%27%20y=%27135%27%20font-size=%2728%27%20text-anchor=%27middle%27%20fill=%27white%27%3Ehero: fetchpriority high%3C\u002Ftext%3E%3C\u002Fsvg%3E'>\n  \u003Cdiv class='spacer'>Content between images\u003C\u002Fdiv>\n  \u003Cimg width='400' height='250' alt='Below the fold' loading='lazy' decoding='async' src='data:image\u002Fsvg+xml,%3Csvg%20xmlns=%27http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg%27%20width=%27400%27%20height=%27250%27%3E%3Crect%20width=%27400%27%20height=%27250%27%20fill=%27%232a9d8f%27\u002F%3E%3Ctext%20x=%27200%27%20y=%27135%27%20font-size=%2728%27%20text-anchor=%27middle%27%20fill=%27white%27%3Ebelow fold: lazy%3C\u002Ftext%3E%3C\u002Fsvg%3E'>\n\u003C\u002Fdiv>\n\u003Cp>Hero: fetchpriority high and no lazy loading. Images further down: loading lazy.\u003C\u002Fp>",{"id":761,"language":16,"code":762,"is_editable":750},548,"\u003Cstyle>\n  body { margin: 0; font: 18px system-ui, sans-serif; }\n  .hero {\n    min-height: 40svh; display: grid; place-items: center; color: #fff; text-align: center; padding: 16px;\n    background-color: #264653;\n    background-image: url(data:image\u002Fsvg+xml,%3Csvg%20xmlns=%27http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg%27%20width=%27600%27%20height=%27400%27%3E%3Crect%20width=%27600%27%20height=%27400%27%20fill=%27%232a9d8f%27\u002F%3E%3Ctext%20x=%27300%27%20y=%27220%27%20font-size=%2748%27%20text-anchor=%27middle%27%20fill=%27white%27%3ESmall%20file%3C\u002Ftext%3E%3C\u002Fsvg%3E);\n    background-size: cover; background-position: center;\n  }\n  @media (min-width: 800px) {\n    .hero {\n      background-image: url(data:image\u002Fsvg+xml,%3Csvg%20xmlns=%27http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg%27%20width=%271600%27%20height=%27600%27%3E%3Crect%20width=%271600%27%20height=%27600%27%20fill=%27%23e76f51%27\u002F%3E%3Ctext%20x=%27800%27%20y=%27330%27%20font-size=%27100%27%20text-anchor=%27middle%27%20fill=%27white%27%3ELarge%20file%3C\u002Ftext%3E%3C\u002Fsvg%3E);\n    }\n  }\n  .hero h1 { margin: 0; text-shadow: 0 2px 8px rgba(0,0,0,.5); }\n\u003C\u002Fstyle>\n\u003Csection class='hero'>\u003Ch1>Responsive background image\u003C\u002Fh1>\u003C\u002Fsection>\n\u003Cp style='padding:16px'>A different file is used from 800px. For density use image-set(url(a.jpg) 1x, url(a@2x.jpg) 2x).\u003C\u002Fp>",{"id":764,"language":16,"code":765,"is_editable":750},549,"\u003Cstyle>\n  body { font: 16px system-ui, sans-serif; padding: 16px; }\n  .media { width: 100%; max-width: 720px; aspect-ratio: 16 \u002F 9; display: block; background: #000; border-radius: 12px; border: 0; margin-bottom: 16px; }\n  video.media { object-fit: cover; }\n  .embed { display: grid; place-items: center; color: #fff; }\n\u003C\u002Fstyle>\n\u003Cvideo class='media' controls playsinline preload='metadata' poster='data:image\u002Fsvg+xml,%3Csvg%20xmlns=%27http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg%27%20width=%271280%27%20height=%27720%27%3E%3Crect%20width=%271280%27%20height=%27720%27%20fill=%27%23264653%27\u002F%3E%3Ctext%20x=%27640%27%20y=%27390%27%20font-size=%2796%27%20text-anchor=%27middle%27%20fill=%27white%27%3EVideo%20poster%3C\u002Ftext%3E%3C\u002Fsvg%3E'>\n  \u003Csource src='movie.webm' type='video\u002Fwebm'>\n  \u003Csource src='movie.mp4' type='video\u002Fmp4'>\n  Your browser does not support video.\n\u003C\u002Fvideo>\n\u003Cdiv class='media embed'>Any iframe embed also gets width: 100% and aspect-ratio: 16 \u002F 9\u003C\u002Fdiv>",{"id":767,"language":768,"code":769,"is_editable":750},550,"javascript","function buildSrcset(base, widths, ext) {\n  return widths.map(function (w) {\n    return base + '-' + w + '.' + ext + ' ' + w + 'w';\n  }).join(', ');\n}\n\nvar widths = [400, 800, 1200, 1600];\nconsole.log('srcset=' + buildSrcset('photo', widths, 'jpg'));\n\nfunction suggestSizes(maxContentWidth, breakpoint) {\n  return '(min-width: ' + breakpoint + 'px) ' + maxContentWidth + 'px, 100vw';\n}\n\nconsole.log('sizes=' + suggestSizes(600, 900));\n\nvar displayWidth = 360;\nvar dpr = 3;\nconsole.log('A ' + displayWidth + 'px wide slot at DPR ' + dpr + ' needs about ' + (displayWidth * dpr) + 'px of image width.');",[771,778],{"id":772,"title":773,"slug":774,"prompt":775,"starter_code":776,"expected_output":777,"language":16,"order_index":23},197,"Add srcset and sizes to an Image","add-srcset-and-sizes","Turn this single image into a responsive one. Add a srcset with 400w, 800w and 1200w candidates (photo-400.jpg, photo-800.jpg, photo-1200.jpg), a sizes attribute that shows the image at 600px from 900px wide screens and 100vw otherwise, and width and height attributes. Keep it flexible with CSS.","\u003Cstyle>\n  img { border-radius: 8px; }\n\u003C\u002Fstyle>\n\u003Cimg src='photo-800.jpg' alt='Mountain lake at sunrise'>","img has src, srcset with three w descriptors, sizes='(min-width: 900px) 600px, 100vw', width and height attributes and CSS max-width: 100% with height: auto",{"id":779,"title":780,"slug":781,"prompt":782,"starter_code":783,"expected_output":784,"language":16,"order_index":12},198,"Art Direction with the picture Element","art-direction-with-picture","Use the picture element so screens 768px and wider load hero-wide.jpg (1200x400), and smaller screens load hero-square.jpg (600x600) inside the img. Add width and height attributes, alt text and make the image scale with its container.","\u003Cstyle>\n  \u002F* make the image flexible here *\u002F\n\u003C\u002Fstyle>\n\u003Cimg src='hero-square.jpg' alt='Team working at a table'>","A picture element with a source media='(min-width: 768px)' and srcset='hero-wide.jpg', an img fallback with hero-square.jpg, alt, width, height and max-width: 100% with height: auto","2026-09-30T18:35:35+00:00",{"id":619,"slug":621,"title":620},{"id":627,"slug":629,"title":628}]