[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-config":3,"blog-categories":6,"course-tree":35,"topic:css-forms-inputs":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":383,"title":384,"slug":385,"content":672,"course":673,"subcategory":674,"author":675,"reading_time_minutes":69,"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":722,"quiz":5,"exercises":739,"published_at":5,"updated_at":747,"prev":748,"next":749},"\u003Ch2 id=\"why-forms-and-inputs-matter\">Why forms and inputs matter\u003C\u002Fh2>\u003Cp>\u003Cstrong>Forms and inputs\u003C\u002Fstrong> are how users log in, search, pay, sign up and send data. A poorly built form loses users, while a clear, accessible, well-validated form increases conversions. Modern HTML and CSS give you powerful tools so you can build great forms with less JavaScript.\u003C\u002Fp>\u003Cp>Focus keyword: \u003Cstrong>CSS forms and inputs\u003C\u002Fstrong>. Related trending keywords: \u003Cem>accessible form design\u003C\u002Fem>, \u003Cem>:user-invalid\u003C\u002Fem>, \u003Cem>:focus-visible\u003C\u002Fem>, \u003Cem>accent-color\u003C\u002Fem>, \u003Cem>field-sizing: content\u003C\u002Fem>, \u003Cem>CSS toggle switch\u003C\u002Fem>, \u003Cem>floating label CSS\u003C\u002Fem>, \u003Cem>HTML form validation\u003C\u002Fem>, \u003Cem>autocomplete attribute\u003C\u002Fem>.\u003C\u002Fp>\u003Ch2 id=\"start-with-correct-html\">Start with correct HTML\u003C\u002Fh2>\u003Cul>\u003Cli>Every control needs a visible \u003Ccode>&lt;label for='id'&gt;\u003C\u002Fcode> linked to the input. Placeholders are not labels because they disappear and often have low contrast.\u003C\u002Fli>\u003Cli>Use the right \u003Ccode>type\u003C\u002Fcode>: \u003Ccode>email\u003C\u002Fcode>, \u003Ccode>tel\u003C\u002Fcode>, \u003Ccode>url\u003C\u002Fcode>, \u003Ccode>number\u003C\u002Fcode>, \u003Ccode>date\u003C\u002Fcode>, \u003Ccode>search\u003C\u002Fcode>, \u003Ccode>password\u003C\u002Fcode>. This gives the right mobile keyboard and built-in validation.\u003C\u002Fli>\u003Cli>Add \u003Ccode>autocomplete\u003C\u002Fcode> tokens such as \u003Ccode>name\u003C\u002Fcode>, \u003Ccode>email\u003C\u002Fcode>, \u003Ccode>username\u003C\u002Fcode>, \u003Ccode>new-password\u003C\u002Fcode>, \u003Ccode>one-time-code\u003C\u002Fcode>, \u003Ccode>street-address\u003C\u002Fcode>. It helps users and is a WCAG requirement for common data.\u003C\u002Fli>\u003Cli>Use \u003Ccode>inputmode\u003C\u002Fcode> (for example \u003Ccode>numeric\u003C\u002Fcode>) when you need a specific keyboard without changing the type.\u003C\u002Fli>\u003Cli>Group related controls with \u003Ccode>&lt;fieldset&gt;\u003C\u002Fcode> and \u003Ccode>&lt;legend&gt;\u003C\u002Fcode>, especially radio buttons and checkboxes.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"base-input-styling\">Base input styling\u003C\u002Fh2>\u003Cp>Set \u003Ccode>font: inherit\u003C\u002Fcode> (controls do not inherit fonts by default), a minimum height of about 44px, padding, a visible border with at least 3:1 contrast against the background, and a clear \u003Ccode>:focus-visible\u003C\u002Fcode> state. Use \u003Ccode>box-sizing: border-box\u003C\u002Fcode> and \u003Ccode>width: 100%\u003C\u002Fcode> with a max width. Keep font size at 16px or larger on mobile so iOS does not zoom in on focus.\u003C\u002Fp>\u003Ch2 id=\"validation-with-html-and-css\">Validation with HTML and CSS\u003C\u002Fh2>\u003Cul>\u003Cli>Built-in attributes: \u003Ccode>required\u003C\u002Fcode>, \u003Ccode>minlength\u003C\u002Fcode>, \u003Ccode>maxlength\u003C\u002Fcode>, \u003Ccode>min\u003C\u002Fcode>, \u003Ccode>max\u003C\u002Fcode>, \u003Ccode>pattern\u003C\u002Fcode>, \u003Ccode>step\u003C\u002Fcode>.\u003C\u002Fli>\u003Cli>\u003Ccode>:invalid\u003C\u002Fcode> matches immediately, even before the user types, which shows red borders too early. Prefer \u003Ccode>:user-invalid\u003C\u002Fcode> and \u003Ccode>:user-valid\u003C\u002Fcode>, which only match after the user has interacted with the field.\u003C\u002Fli>\u003Cli>Show error text near the field and connect it with \u003Ccode>aria-describedby\u003C\u002Fcode>. Mark invalid fields with \u003Ccode>aria-invalid='true'\u003C\u002Fcode> when you control validation in JavaScript.\u003C\u002Fli>\u003Cli>Do not use color alone. Add an icon or text such as Enter a valid email address.\u003C\u002Fli>\u003Cli>The Constraint Validation API (\u003Ccode>input.validity\u003C\u002Fcode>, \u003Ccode>setCustomValidity()\u003C\u002Fcode>, \u003Ccode>reportValidity()\u003C\u002Fcode>) lets you customize messages.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"helpful-modern-css-for-forms\">Helpful modern CSS for forms\u003C\u002Fh2>\u003Cul>\u003Cli>\u003Ccode>accent-color\u003C\u002Fcode>: change the color of native checkboxes, radios, range and progress with one line.\u003C\u002Fli>\u003Cli>\u003Ccode>field-sizing: content\u003C\u002Fcode>: lets textareas and inputs grow with their content (check browser support and provide fallback rows).\u003C\u002Fli>\u003Cli>\u003Ccode>:has()\u003C\u002Fcode>: style a field wrapper when it contains an invalid input or a checked checkbox, for example \u003Ccode>.field:has(:user-invalid)\u003C\u002Fcode>.\u003C\u002Fli>\u003Cli>\u003Ccode>:placeholder-shown\u003C\u002Fcode>: detect an empty field to build floating labels.\u003C\u002Fli>\u003Cli>\u003Ccode>appearance: none\u003C\u002Fcode>: remove native styling to build custom switches, checkboxes and selects. Keep the real input in the DOM so it stays accessible.\u003C\u002Fli>\u003Cli>\u003Ccode>color-scheme\u003C\u002Fcode> and \u003Ccode>light-dark()\u003C\u002Fcode>: make controls follow the theme.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"custom-checkbox-and-switch\">Custom checkbox and switch\u003C\u002Fh2>\u003Cp>Keep the native input and style it with \u003Ccode>appearance: none\u003C\u002Fcode>, or hide it visually (not with \u003Ccode>display: none\u003C\u002Fcode>) and style a sibling. For a toggle switch use \u003Ccode>&lt;input type='checkbox' role='switch'&gt;\u003C\u002Fcode> so screen readers announce it as a switch.\u003C\u002Fp>\u003Ch2 id=\"floating-labels\">Floating labels\u003C\u002Fh2>\u003Cp>A floating label sits inside the input and moves up when the field is focused or filled. Use \u003Ccode>placeholder=' '\u003C\u002Fcode> and the selector \u003Ccode>input:not(:placeholder-shown) + label\u003C\u002Fcode>. Make sure the label stays readable and does not overlap the text.\u003C\u002Fp>\u003Ch2 id=\"layout-and-usability\">Layout and usability\u003C\u002Fh2>\u003Cul>\u003Cli>Use a single column for most forms. Use CSS grid for small related groups (city and ZIP).\u003C\u002Fli>\u003Cli>Put hints below the label, not inside the placeholder.\u003C\u002Fli>\u003Cli>Mark required fields consistently and explain the marker.\u003C\u002Fli>\u003Cli>Disable the submit button only if you explain why. Usually show errors on submit instead.\u003C\u002Fli>\u003Cli>Keep touch targets large, and do not break paste in password fields.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"quick-summary\">Quick summary\u003C\u002Fh2>\u003Cp>Combine semantic labels, the right input types and autocomplete, clear focus and error states, and modern CSS like \u003Ccode>:user-invalid\u003C\u002Fcode>, \u003Ccode>accent-color\u003C\u002Fcode> and \u003Ccode>:has()\u003C\u002Fcode> to create accessible \u003Cstrong>CSS forms and inputs\u003C\u002Fstrong>.\u003C\u002Fp>\u003Cdiv class=\"try-it-yourself language-html\">\u003Cpre>\u003Ccode>&lt;style&gt;\n  body { font-family: system-ui, sans-serif; padding: 24px; background: #f8fafc; }\n  form { max-width: 380px; display: grid; gap: 16px; background: #fff; padding: 24px; border-radius: 16px; box-shadow: 0 6px 20px rgba(0,0,0,.08); }\n  .field { display: grid; gap: 6px; }\n  label { font-weight: 600; font-size: 14px; }\n  .hint { font-size: 13px; color: #64748b; }\n  input, select, textarea { font: inherit; font-size: 16px; min-height: 44px; padding: 10px 12px; border: 2px solid #94a3b8; border-radius: 10px; background: #fff; width: 100%; box-sizing: border-box; }\n  input:focus-visible, select:focus-visible, textarea:focus-visible { outline: 3px solid #c7d2fe; border-color: #4f46e5; }\n  button { min-height: 46px; border: 0; border-radius: 10px; background: #4f46e5; color: #fff; font: 700 16px system-ui; cursor: pointer; }\n&lt;\u002Fstyle&gt;\n&lt;form&gt;\n  &lt;div class='field'&gt;\n    &lt;label for='n'&gt;Full name&lt;\u002Flabel&gt;\n    &lt;input id='n' name='name' autocomplete='name' required&gt;\n  &lt;\u002Fdiv&gt;\n  &lt;div class='field'&gt;\n    &lt;label for='e'&gt;Email&lt;\u002Flabel&gt;\n    &lt;input id='e' type='email' name='email' autocomplete='email' aria-describedby='eh' required&gt;\n    &lt;span class='hint' id='eh'&gt;We will never share your email.&lt;\u002Fspan&gt;\n  &lt;\u002Fdiv&gt;\n  &lt;div class='field'&gt;\n    &lt;label for='c'&gt;Country&lt;\u002Flabel&gt;\n    &lt;select id='c' name='country' autocomplete='country-name'&gt;&lt;option&gt;Pakistan&lt;\u002Foption&gt;&lt;option&gt;India&lt;\u002Foption&gt;&lt;option&gt;Other&lt;\u002Foption&gt;&lt;\u002Fselect&gt;\n  &lt;\u002Fdiv&gt;\n  &lt;button type='submit'&gt;Create account&lt;\u002Fbutton&gt;\n&lt;\u002Fform&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003Cdiv class=\"try-it-yourself language-html\">\u003Cpre>\u003Ccode>&lt;style&gt;\n  body { font-family: system-ui, sans-serif; padding: 24px; }\n  .field { display: grid; gap: 6px; max-width: 340px; margin-bottom: 16px; }\n  input { font: inherit; font-size: 16px; min-height: 44px; padding: 8px 12px; border: 2px solid #94a3b8; border-radius: 10px; }\n  .msg { display: none; font-size: 13px; }\n  \u002F* Only after the user interacts *\u002F\n  input:user-invalid { border-color: #dc2626; background: #fef2f2; }\n  input:user-valid { border-color: #16a34a; }\n  .field:has(input:user-invalid) .err { display: block; color: #b91c1c; }\n  .field:has(input:user-valid) .ok { display: block; color: #15803d; }\n  input:focus-visible { outline: 3px solid #c7d2fe; }\n&lt;\u002Fstyle&gt;\n&lt;div class='field'&gt;\n  &lt;label for='em'&gt;Email&lt;\u002Flabel&gt;\n  &lt;input id='em' type='email' required aria-describedby='em-msg'&gt;\n  &lt;span id='em-msg'&gt;&lt;span class='msg err'&gt;Please enter a valid email, like name@example.com.&lt;\u002Fspan&gt;&lt;span class='msg ok'&gt;Looks good.&lt;\u002Fspan&gt;&lt;\u002Fspan&gt;\n&lt;\u002Fdiv&gt;\n&lt;div class='field'&gt;\n  &lt;label for='pw'&gt;Password (min 8 characters)&lt;\u002Flabel&gt;\n  &lt;input id='pw' type='password' minlength='8' required autocomplete='new-password'&gt;\n&lt;\u002Fdiv&gt;\n&lt;p&gt;Type, then leave the field. Errors appear only after interaction (:user-invalid).&lt;\u002Fp&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003Cdiv class=\"try-it-yourself language-html\">\u003Cpre>\u003Ccode>&lt;style&gt;\n  body { font-family: system-ui, sans-serif; padding: 24px; }\n  .row { display: flex; align-items: center; gap: 12px; }\n  .switch { appearance: none; position: relative; width: 52px; height: 30px; border-radius: 999px; background: #94a3b8; cursor: pointer; transition: background-color .25s; margin: 0; }\n  .switch::before { content: ''; position: absolute; top: 3px; left: 3px; width: 24px; height: 24px; border-radius: 50%; background: #fff; box-shadow: 0 1px 3px rgba(0,0,0,.3); transition: transform .25s; }\n  .switch:checked { background: #16a34a; }\n  .switch:checked::before { transform: translateX(22px); }\n  .switch:focus-visible { outline: 3px solid #f59e0b; outline-offset: 3px; }\n  @media (prefers-reduced-motion: reduce) { .switch, .switch::before { transition: none; } }\n  .chk { accent-color: #4f46e5; width: 20px; height: 20px; }\n&lt;\u002Fstyle&gt;\n&lt;div class='row'&gt;\n  &lt;input class='switch' type='checkbox' role='switch' id='notif'&gt;\n  &lt;label for='notif'&gt;Email notifications&lt;\u002Flabel&gt;\n&lt;\u002Fdiv&gt;\n&lt;div class='row' style='margin-top:16px'&gt;\n  &lt;input class='chk' type='checkbox' id='terms'&gt;\n  &lt;label for='terms'&gt;I accept the terms (accent-color)&lt;\u002Flabel&gt;\n&lt;\u002Fdiv&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003Cdiv class=\"try-it-yourself language-html\">\u003Cpre>\u003Ccode>&lt;style&gt;\n  body { font-family: system-ui, sans-serif; padding: 30px; }\n  .float { position: relative; width: 320px; }\n  .float input { width: 100%; box-sizing: border-box; font: inherit; font-size: 16px; padding: 22px 12px 8px; min-height: 56px; border: 2px solid #94a3b8; border-radius: 12px; background: #fff; }\n  .float label { position: absolute; left: 14px; top: 16px; color: #64748b; pointer-events: none; transition: transform .2s, color .2s; transform-origin: left top; }\n  .float input:focus-visible { outline: 3px solid #c7d2fe; border-color: #4f46e5; }\n  .float input:focus + label, .float input:not(:placeholder-shown) + label { transform: translateY(-10px) scale(.78); color: #4f46e5; }\n  @media (prefers-reduced-motion: reduce) { .float label { transition: none; } }\n&lt;\u002Fstyle&gt;\n&lt;div class='float'&gt;\n  &lt;input id='fn' placeholder=' ' autocomplete='given-name'&gt;\n  &lt;label for='fn'&gt;First name&lt;\u002Flabel&gt;\n&lt;\u002Fdiv&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003Cdiv class=\"try-it-yourself language-html\">\u003Cpre>\u003Ccode>&lt;style&gt;\n  body { font-family: system-ui, sans-serif; padding: 24px; max-width: 420px; }\n  textarea { width: 100%; box-sizing: border-box; font: inherit; font-size: 16px; padding: 10px 12px; border: 2px solid #94a3b8; border-radius: 10px; min-height: 3lh; max-height: 12lh; field-sizing: content; }\n  input[type='range'] { width: 100%; accent-color: #ec4899; }\n  output { font-weight: 700; }\n  fieldset { border: 2px solid #e2e8f0; border-radius: 12px; margin-top: 18px; }\n  legend { font-weight: 700; padding: 0 6px; }\n  fieldset label { display: flex; gap: 8px; align-items: center; padding: 6px 0; }\n  input[type='radio'] { accent-color: #4f46e5; width: 18px; height: 18px; }\n&lt;\u002Fstyle&gt;\n&lt;label for='msg'&gt;Message (grows as you type)&lt;\u002Flabel&gt;\n&lt;textarea id='msg' placeholder='Type several lines...'&gt;&lt;\u002Ftextarea&gt;\n&lt;label for='vol' style='display:block;margin-top:18px'&gt;Volume: &lt;output id='o'&gt;50&lt;\u002Foutput&gt;&lt;\u002Flabel&gt;\n&lt;input id='vol' type='range' min='0' max='100' value='50'&gt;\n&lt;fieldset&gt;\n  &lt;legend&gt;Plan&lt;\u002Flegend&gt;\n  &lt;label&gt;&lt;input type='radio' name='plan' checked&gt; Free&lt;\u002Flabel&gt;\n  &lt;label&gt;&lt;input type='radio' name='plan'&gt; Pro&lt;\u002Flabel&gt;\n&lt;\u002Ffieldset&gt;\n&lt;script&gt;\n  document.getElementById('vol').addEventListener('input', function (e) { document.getElementById('o').textContent = e.target.value; });\n&lt;\u002Fscript&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>",{"name":9,"slug":10},{"name":366,"slug":367},{"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-forms-inputs","HTML & CSS Forms: Styled, Accessible Inputs and Validation","Master forms and inputs: labels, input types, :user-invalid validation, custom switches, floating labels, accent-color and field-sizing with live code.",[686,690,694,698,702,706,710,714,718],{"id":687,"text":688,"level":12,"children":689},"why-forms-and-inputs-matter","Why forms and inputs matter",[],{"id":691,"text":692,"level":12,"children":693},"start-with-correct-html","Start with correct HTML",[],{"id":695,"text":696,"level":12,"children":697},"base-input-styling","Base input styling",[],{"id":699,"text":700,"level":12,"children":701},"validation-with-html-and-css","Validation with HTML and CSS",[],{"id":703,"text":704,"level":12,"children":705},"helpful-modern-css-for-forms","Helpful modern CSS for forms",[],{"id":707,"text":708,"level":12,"children":709},"custom-checkbox-and-switch","Custom checkbox and switch",[],{"id":711,"text":712,"level":12,"children":713},"floating-labels","Floating labels",[],{"id":715,"text":716,"level":12,"children":717},"layout-and-usability","Layout and usability",[],{"id":719,"text":720,"level":12,"children":721},"quick-summary","Quick summary",[],[723,727,730,733,736],{"id":724,"language":16,"code":725,"is_editable":726},619,"\u003Cstyle>\n  body { font-family: system-ui, sans-serif; padding: 24px; background: #f8fafc; }\n  form { max-width: 380px; display: grid; gap: 16px; background: #fff; padding: 24px; border-radius: 16px; box-shadow: 0 6px 20px rgba(0,0,0,.08); }\n  .field { display: grid; gap: 6px; }\n  label { font-weight: 600; font-size: 14px; }\n  .hint { font-size: 13px; color: #64748b; }\n  input, select, textarea { font: inherit; font-size: 16px; min-height: 44px; padding: 10px 12px; border: 2px solid #94a3b8; border-radius: 10px; background: #fff; width: 100%; box-sizing: border-box; }\n  input:focus-visible, select:focus-visible, textarea:focus-visible { outline: 3px solid #c7d2fe; border-color: #4f46e5; }\n  button { min-height: 46px; border: 0; border-radius: 10px; background: #4f46e5; color: #fff; font: 700 16px system-ui; cursor: pointer; }\n\u003C\u002Fstyle>\n\u003Cform>\n  \u003Cdiv class='field'>\n    \u003Clabel for='n'>Full name\u003C\u002Flabel>\n    \u003Cinput id='n' name='name' autocomplete='name' required>\n  \u003C\u002Fdiv>\n  \u003Cdiv class='field'>\n    \u003Clabel for='e'>Email\u003C\u002Flabel>\n    \u003Cinput id='e' type='email' name='email' autocomplete='email' aria-describedby='eh' required>\n    \u003Cspan class='hint' id='eh'>We will never share your email.\u003C\u002Fspan>\n  \u003C\u002Fdiv>\n  \u003Cdiv class='field'>\n    \u003Clabel for='c'>Country\u003C\u002Flabel>\n    \u003Cselect id='c' name='country' autocomplete='country-name'>\u003Coption>Pakistan\u003C\u002Foption>\u003Coption>India\u003C\u002Foption>\u003Coption>Other\u003C\u002Foption>\u003C\u002Fselect>\n  \u003C\u002Fdiv>\n  \u003Cbutton type='submit'>Create account\u003C\u002Fbutton>\n\u003C\u002Fform>",true,{"id":728,"language":16,"code":729,"is_editable":726},620,"\u003Cstyle>\n  body { font-family: system-ui, sans-serif; padding: 24px; }\n  .field { display: grid; gap: 6px; max-width: 340px; margin-bottom: 16px; }\n  input { font: inherit; font-size: 16px; min-height: 44px; padding: 8px 12px; border: 2px solid #94a3b8; border-radius: 10px; }\n  .msg { display: none; font-size: 13px; }\n  \u002F* Only after the user interacts *\u002F\n  input:user-invalid { border-color: #dc2626; background: #fef2f2; }\n  input:user-valid { border-color: #16a34a; }\n  .field:has(input:user-invalid) .err { display: block; color: #b91c1c; }\n  .field:has(input:user-valid) .ok { display: block; color: #15803d; }\n  input:focus-visible { outline: 3px solid #c7d2fe; }\n\u003C\u002Fstyle>\n\u003Cdiv class='field'>\n  \u003Clabel for='em'>Email\u003C\u002Flabel>\n  \u003Cinput id='em' type='email' required aria-describedby='em-msg'>\n  \u003Cspan id='em-msg'>\u003Cspan class='msg err'>Please enter a valid email, like name@example.com.\u003C\u002Fspan>\u003Cspan class='msg ok'>Looks good.\u003C\u002Fspan>\u003C\u002Fspan>\n\u003C\u002Fdiv>\n\u003Cdiv class='field'>\n  \u003Clabel for='pw'>Password (min 8 characters)\u003C\u002Flabel>\n  \u003Cinput id='pw' type='password' minlength='8' required autocomplete='new-password'>\n\u003C\u002Fdiv>\n\u003Cp>Type, then leave the field. Errors appear only after interaction (:user-invalid).\u003C\u002Fp>",{"id":731,"language":16,"code":732,"is_editable":726},621,"\u003Cstyle>\n  body { font-family: system-ui, sans-serif; padding: 24px; }\n  .row { display: flex; align-items: center; gap: 12px; }\n  .switch { appearance: none; position: relative; width: 52px; height: 30px; border-radius: 999px; background: #94a3b8; cursor: pointer; transition: background-color .25s; margin: 0; }\n  .switch::before { content: ''; position: absolute; top: 3px; left: 3px; width: 24px; height: 24px; border-radius: 50%; background: #fff; box-shadow: 0 1px 3px rgba(0,0,0,.3); transition: transform .25s; }\n  .switch:checked { background: #16a34a; }\n  .switch:checked::before { transform: translateX(22px); }\n  .switch:focus-visible { outline: 3px solid #f59e0b; outline-offset: 3px; }\n  @media (prefers-reduced-motion: reduce) { .switch, .switch::before { transition: none; } }\n  .chk { accent-color: #4f46e5; width: 20px; height: 20px; }\n\u003C\u002Fstyle>\n\u003Cdiv class='row'>\n  \u003Cinput class='switch' type='checkbox' role='switch' id='notif'>\n  \u003Clabel for='notif'>Email notifications\u003C\u002Flabel>\n\u003C\u002Fdiv>\n\u003Cdiv class='row' style='margin-top:16px'>\n  \u003Cinput class='chk' type='checkbox' id='terms'>\n  \u003Clabel for='terms'>I accept the terms (accent-color)\u003C\u002Flabel>\n\u003C\u002Fdiv>",{"id":734,"language":16,"code":735,"is_editable":726},622,"\u003Cstyle>\n  body { font-family: system-ui, sans-serif; padding: 30px; }\n  .float { position: relative; width: 320px; }\n  .float input { width: 100%; box-sizing: border-box; font: inherit; font-size: 16px; padding: 22px 12px 8px; min-height: 56px; border: 2px solid #94a3b8; border-radius: 12px; background: #fff; }\n  .float label { position: absolute; left: 14px; top: 16px; color: #64748b; pointer-events: none; transition: transform .2s, color .2s; transform-origin: left top; }\n  .float input:focus-visible { outline: 3px solid #c7d2fe; border-color: #4f46e5; }\n  .float input:focus + label, .float input:not(:placeholder-shown) + label { transform: translateY(-10px) scale(.78); color: #4f46e5; }\n  @media (prefers-reduced-motion: reduce) { .float label { transition: none; } }\n\u003C\u002Fstyle>\n\u003Cdiv class='float'>\n  \u003Cinput id='fn' placeholder=' ' autocomplete='given-name'>\n  \u003Clabel for='fn'>First name\u003C\u002Flabel>\n\u003C\u002Fdiv>",{"id":737,"language":16,"code":738,"is_editable":726},623,"\u003Cstyle>\n  body { font-family: system-ui, sans-serif; padding: 24px; max-width: 420px; }\n  textarea { width: 100%; box-sizing: border-box; font: inherit; font-size: 16px; padding: 10px 12px; border: 2px solid #94a3b8; border-radius: 10px; min-height: 3lh; max-height: 12lh; field-sizing: content; }\n  input[type='range'] { width: 100%; accent-color: #ec4899; }\n  output { font-weight: 700; }\n  fieldset { border: 2px solid #e2e8f0; border-radius: 12px; margin-top: 18px; }\n  legend { font-weight: 700; padding: 0 6px; }\n  fieldset label { display: flex; gap: 8px; align-items: center; padding: 6px 0; }\n  input[type='radio'] { accent-color: #4f46e5; width: 18px; height: 18px; }\n\u003C\u002Fstyle>\n\u003Clabel for='msg'>Message (grows as you type)\u003C\u002Flabel>\n\u003Ctextarea id='msg' placeholder='Type several lines...'>\u003C\u002Ftextarea>\n\u003Clabel for='vol' style='display:block;margin-top:18px'>Volume: \u003Coutput id='o'>50\u003C\u002Foutput>\u003C\u002Flabel>\n\u003Cinput id='vol' type='range' min='0' max='100' value='50'>\n\u003Cfieldset>\n  \u003Clegend>Plan\u003C\u002Flegend>\n  \u003Clabel>\u003Cinput type='radio' name='plan' checked> Free\u003C\u002Flabel>\n  \u003Clabel>\u003Cinput type='radio' name='plan'> Pro\u003C\u002Flabel>\n\u003C\u002Ffieldset>\n\u003Cscript>\n  document.getElementById('vol').addEventListener('input', function (e) { document.getElementById('o').textContent = e.target.value; });\n\u003C\u002Fscript>",[740],{"id":741,"title":742,"slug":743,"prompt":744,"starter_code":745,"expected_output":746,"language":16,"order_index":23},215,"Create an accessible validated signup field","accessible-validated-field","Style the email input. It needs a visible label, a hint linked with aria-describedby, a clear focus-visible style, and validation styling that only appears after interaction using :user-invalid. Show an error message next to the field using :has() without relying on color alone.","\u003Cstyle>\n  input { font: inherit; font-size: 16px; min-height: 44px; padding: 8px 12px; border: 2px solid #94a3b8; border-radius: 8px; }\n  .error { display: none; }\n  \u002F* TODO: focus-visible, :user-invalid, .field:has(...) .error { display:block } *\u002F\n\u003C\u002Fstyle>\n\u003Cdiv class='field'>\n  \u003Clabel for='mail'>Work email\u003C\u002Flabel>\n  \u003Cinput id='mail' type='email' required>\n  \u003C!-- TODO: hint with id and aria-describedby -->\n  \u003Cp class='error'>Enter a valid email address.\u003C\u002Fp>\n\u003C\u002Fdiv>","After typing an invalid email and leaving the field, the input shows a red border and the error text appears. Before interaction, nothing is shown in red.","2026-09-30T18:59:00+00:00",{"id":379,"slug":381,"title":380},{"id":387,"slug":389,"title":388}]