[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-config":3,"blog-categories":6,"course-tree":35,"topic:css-pseudo-elements-before-after":458},{"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,390,422],{"id":101,"name":366,"slug":367,"order_index":368,"topics":369},"CSS Fundamentals & Setup","css-fundamentals-setup",0,[370,374,378,382,386],{"id":371,"title":372,"slug":373,"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":375,"title":376,"slug":377,"order_index":12,"cornerstone":52,"reading_time_minutes":61},83,"CSS Syntax & How Browsers Apply Styles","css-syntax-how-browsers-apply-styles",{"id":379,"title":380,"slug":381,"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":383,"title":384,"slug":385,"order_index":61,"cornerstone":52,"reading_time_minutes":57},85,"CSS Comments & Code Formatting Best Practices","css-comments-and-code-formatting",{"id":387,"title":388,"slug":389,"order_index":65,"cornerstone":52,"reading_time_minutes":65},86,"Browser DevTools for CSS: Inspect, Debug & Edit Styles Live","browser-devtools-for-css",{"id":113,"name":391,"slug":392,"order_index":368,"topics":393},"Colors, Backgrounds & Effects","colors-backgrounds-effects",[394,398,402,406,410,414,418],{"id":395,"title":396,"slug":397,"order_index":105,"cornerstone":52,"reading_time_minutes":65},95,"CSS Colors (HEX, RGB, HSL, OKLCH)","css-colors-hex-rgb-hsl-oklch",{"id":399,"title":400,"slug":401,"order_index":113,"cornerstone":52,"reading_time_minutes":61},96,"CSS Backgrounds","css-backgrounds",{"id":403,"title":404,"slug":405,"order_index":117,"cornerstone":52,"reading_time_minutes":65},97,"CSS Gradients (Linear, Radial, Conic)","css-gradients-linear-radial-conic",{"id":407,"title":408,"slug":409,"order_index":121,"cornerstone":52,"reading_time_minutes":65},98,"CSS Borders, Outlines & Rounded Corners","css-borders-outlines-rounded-corners",{"id":411,"title":412,"slug":413,"order_index":125,"cornerstone":52,"reading_time_minutes":69},99,"CSS Box Shadow & Text Shadow","css-box-shadow-text-shadow",{"id":415,"title":416,"slug":417,"order_index":129,"cornerstone":52,"reading_time_minutes":65},100,"CSS Opacity & Blend Modes","css-opacity-blend-modes",{"id":419,"title":420,"slug":421,"order_index":140,"cornerstone":52,"reading_time_minutes":69},101,"CSS Filters & backdrop-filter (Glassmorphism)","css-filters-backdrop-filter-glassmorphism",{"id":105,"name":423,"slug":424,"order_index":368,"topics":425},"Selectors & the Cascade","selectors-the-cascade",[426,430,434,438,442,446,450,454],{"id":427,"title":428,"slug":429,"order_index":69,"cornerstone":52,"reading_time_minutes":61},87,"CSS Basic Selectors: Type, Class, ID, Universal & Grouping","css-basic-selectors",{"id":431,"title":432,"slug":433,"order_index":77,"cornerstone":52,"reading_time_minutes":61},88,"CSS Combinators: Descendant, Child, Adjacent & General Sibling","css-combinators",{"id":435,"title":436,"slug":437,"order_index":81,"cornerstone":52,"reading_time_minutes":61},89,"CSS Attribute Selectors: [attr], ^=, $=, *= and More","css-attribute-selectors",{"id":439,"title":440,"slug":441,"order_index":85,"cornerstone":52,"reading_time_minutes":69},90,"CSS Pseudo-classes: :hover, :focus, :nth-child & Modern Selectors","css-pseudo-classes",{"id":443,"title":444,"slug":445,"order_index":89,"cornerstone":52,"reading_time_minutes":65},91,"CSS Pseudo-elements (::before, ::after)","css-pseudo-elements-before-after",{"id":447,"title":448,"slug":449,"order_index":93,"cornerstone":52,"reading_time_minutes":65},92,"Modern CSS Selectors: :is(), :where(), :has()","modern-css-selectors-is-where-has",{"id":451,"title":452,"slug":453,"order_index":97,"cornerstone":52,"reading_time_minutes":61},93,"CSS Specificity Explained","css-specificity-explained",{"id":455,"title":456,"slug":457,"order_index":101,"cornerstone":52,"reading_time_minutes":65},94,"Cascade, Inheritance & !important","css-cascade-inheritance-important",{"data":459},{"id":443,"title":444,"slug":445,"content":460,"course":461,"subcategory":462,"author":463,"reading_time_minutes":65,"cornerstone":52,"schema_type":469,"faq_json":5,"video_url":5,"canonical_url":470,"meta_title":471,"meta_description":472,"og_image":5,"toc_json":473,"code_examples":534,"quiz":551,"exercises":554,"published_at":5,"updated_at":567,"prev":568,"next":569},"\u003Ch2 id=\"what-are-css-pseudo-elements\">What Are CSS Pseudo-elements?\u003C\u002Fh2>\u003Cp>\u003Cstrong>CSS pseudo-elements\u003C\u002Fstrong> let you style a specific part of an element, or insert generated content, without adding extra HTML. The two most popular are \u003Ccode>::before\u003C\u002Fcode> and \u003Ccode>::after\u003C\u002Fcode>. They are the backbone of modern icon decoration, badges, tooltips, overlays, and many clever UI tricks. In this lesson our focus keyword is \u003Cstrong>CSS pseudo-elements\u003C\u002Fstrong>, and you will also learn the trending techniques developers search for: CSS ::before and ::after examples, CSS tooltip without JavaScript, CSS overlay gradient, CSS drop cap, and styling ::marker, ::selection and ::placeholder.\u003C\u002Fp>\u003Ch2 id=\"pseudo-class-vs-pseudo-element\">Pseudo-class vs Pseudo-element\u003C\u002Fh2>\u003Cp>A \u003Cstrong>pseudo-class\u003C\u002Fstrong> (single colon, such as \u003Ccode>:hover\u003C\u002Fcode> or \u003Ccode>:focus\u003C\u002Fcode>) selects an element in a certain \u003Cem>state\u003C\u002Fem>. A \u003Cstrong>pseudo-element\u003C\u002Fstrong> (double colon, such as \u003Ccode>::before\u003C\u002Fcode>) selects a \u003Cem>part\u003C\u002Fem> of an element or creates a virtual child. The double-colon syntax was introduced in CSS3 to tell them apart. Browsers still accept the single-colon form for the four legacy pseudo-elements (\u003Ccode>:before\u003C\u002Fcode>, \u003Ccode>:after\u003C\u002Fcode>, \u003Ccode>:first-line\u003C\u002Fcode>, \u003Ccode>:first-letter\u003C\u002Fcode>), but you should always write the double-colon form in new code.\u003C\u002Fp>\u003Ch2 id=\"how-before-and-after-work\">How ::before and ::after Work\u003C\u002Fh2>\u003Cul>\u003Cli>\u003Ccode>::before\u003C\u002Fcode> creates a virtual element as the \u003Cstrong>first child\u003C\u002Fstrong> of the selected element.\u003C\u002Fli>\u003Cli>\u003Ccode>::after\u003C\u002Fcode> creates a virtual element as the \u003Cstrong>last child\u003C\u002Fstrong> of the selected element.\u003C\u002Fli>\u003Cli>They are \u003Cstrong>inline\u003C\u002Fstrong> by default. Set \u003Ccode>display: block\u003C\u002Fcode>, \u003Ccode>inline-block\u003C\u002Fcode> or \u003Ccode>position: absolute\u003C\u002Fcode> to control layout.\u003C\u002Fli>\u003Cli>They will \u003Cstrong>not render unless the \u003Ccode>content\u003C\u002Fcode> property is set\u003C\u002Fstrong>. Even an empty string works: \u003Ccode>content: '';\u003C\u002Fcode>.\u003C\u002Fli>\u003Cli>They do not work on replaced elements such as \u003Ccode>&lt;img&gt;\u003C\u002Fcode>, \u003Ccode>&lt;input&gt;\u003C\u002Fcode>, \u003Ccode>&lt;br&gt;\u003C\u002Fcode> because these have no content box to place children in.\u003C\u002Fli>\u003Cli>They cannot be selected by JavaScript with \u003Ccode>querySelector\u003C\u002Fcode>, but you can read them with \u003Ccode>getComputedStyle(el, '::before')\u003C\u002Fcode>.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"the-content-property\">The content Property\u003C\u002Fh2>\u003Cp>The \u003Ccode>content\u003C\u002Fcode> property accepts several kinds of values:\u003C\u002Fp>\u003Cul>\u003Cli>A string: \u003Ccode>content: 'New';\u003C\u002Fcode>\u003C\u002Fli>\u003Cli>An empty string for purely decorative shapes: \u003Ccode>content: '';\u003C\u002Fcode>\u003C\u002Fli>\u003Cli>An attribute value: \u003Ccode>content: attr(data-label);\u003C\u002Fcode>\u003C\u002Fli>\u003Cli>A counter: \u003Ccode>content: counter(item) '. ';\u003C\u002Fcode>\u003C\u002Fli>\u003Cli>An image: \u003Ccode>content: url(icon.svg);\u003C\u002Fcode>\u003C\u002Fli>\u003Cli>Quote keywords: \u003Ccode>open-quote\u003C\u002Fcode> and \u003Ccode>close-quote\u003C\u002Fcode>\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"real-world-use-cases\">Real-world Use Cases\u003C\u002Fh2>\u003Ch3 id=\"1-decorative-icons-and-badges\">1. Decorative icons and badges\u003C\u002Fh3>\u003Cp>Add a small 'NEW' badge or an arrow icon after a link without touching the HTML markup. This keeps your HTML semantic and clean.\u003C\u002Fp>\u003Ch3 id=\"2-tooltips-without-javascript\">2. Tooltips without JavaScript\u003C\u002Fh3>\u003Cp>Combine \u003Ccode>attr(data-tip)\u003C\u002Fcode>, \u003Ccode>position: absolute\u003C\u002Fcode> and \u003Ccode>:hover\u003C\u002Fcode> to display a pure-CSS tooltip. This is one of the most searched CSS tricks.\u003C\u002Fp>\u003Ch3 id=\"3-gradient-overlays-on-images-or-cards\">3. Gradient overlays on images or cards\u003C\u002Fh3>\u003Cp>Use \u003Ccode>::after\u003C\u002Fcode> with \u003Ccode>position: absolute; inset: 0;\u003C\u002Fcode> and a \u003Ccode>linear-gradient\u003C\u002Fcode> to darken the bottom of a card so white text stays readable.\u003C\u002Fp>\u003Ch3 id=\"4-clearfix\">4. Clearfix\u003C\u002Fh3>\u003Cp>Before Flexbox and Grid, the clearfix hack used \u003Ccode>::after\u003C\u002Fcode> with \u003Ccode>clear: both\u003C\u002Fcode> to make a parent contain floated children. You will still meet it in legacy code.\u003C\u002Fp>\u003Ch3 id=\"5-custom-shapes\">5. Custom shapes\u003C\u002Fh3>\u003Cp>Triangles, ribbons, speech-bubble tails and decorative lines are all built with empty pseudo-elements and borders or gradients.\u003C\u002Fp>\u003Ch2 id=\"other-useful-pseudo-elements\">Other Useful Pseudo-elements\u003C\u002Fh2>\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>Pseudo-element\u003C\u002Fth>\u003Cth>What it styles\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>\u003Ccode>::first-letter\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>First letter of a block (drop caps)\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Ccode>::first-line\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>First formatted line of a block\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Ccode>::selection\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Text highlighted by the user\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Ccode>::placeholder\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Placeholder text in inputs\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Ccode>::marker\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Bullet or number of a list item\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Ccode>::backdrop\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>Background behind a \u003Ccode>&lt;dialog&gt;\u003C\u002Fcode> or fullscreen element\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Ccode>::file-selector-button\u003C\u002Fcode>\u003C\u002Ftd>\u003Ctd>The button inside \u003Ccode>input type='file'\u003C\u002Fcode>\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003Cp>Modern CSS also introduces \u003Ccode>::view-transition\u003C\u002Fcode> pseudo-elements for the View Transitions API, and \u003Ccode>::highlight()\u003C\u002Fcode> for the CSS Custom Highlight API. These are newer and browser support should be checked before production use.\u003C\u002Fp>\u003Ch2 id=\"accessibility-considerations\">Accessibility Considerations\u003C\u002Fh2>\u003Cul>\u003Cli>Generated content may be announced by some screen readers, and it cannot be selected or copied. Never place essential information only in \u003Ccode>::before\u003C\u002Fcode> or \u003Ccode>::after\u003C\u002Fcode>.\u003C\u002Fli>\u003Cli>For decorative icons you can provide alternative text using the modern syntax \u003Ccode>content: url(icon.svg) \u002F '';\u003C\u002Fcode> which marks the content as decorative in supporting browsers.\u003C\u002Fli>\u003Cli>Do not rely on pseudo-element text for SEO. Search engines treat it as presentation, not content.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"best-practices\">Best Practices\u003C\u002Fh2>\u003Cul>\u003Cli>Use pseudo-elements for \u003Cem>decoration\u003C\u002Fem>, not for meaningful content.\u003C\u002Fli>\u003Cli>Set \u003Ccode>position: relative\u003C\u002Fcode> on the parent when the pseudo-element uses \u003Ccode>position: absolute\u003C\u002Fcode>.\u003C\u002Fli>\u003Cli>Use \u003Ccode>pointer-events: none\u003C\u002Fcode> on overlay pseudo-elements so they do not block clicks.\u003C\u002Fli>\u003Cli>Keep a consistent naming approach and comment complex shape tricks for teammates.\u003C\u002Fli>\u003Cli>Prefer \u003Ccode>inset: 0\u003C\u002Fcode> over the four-property shorthand \u003Ccode>top\u002Fright\u002Fbottom\u002Fleft\u003C\u002Fcode> in modern projects.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"common-mistakes\">Common Mistakes\u003C\u002Fh2>\u003Cul>\u003Cli>Forgetting \u003Ccode>content\u003C\u002Fcode>, so nothing appears.\u003C\u002Fli>\u003Cli>Trying to add \u003Ccode>::before\u003C\u002Fcode> to an \u003Ccode>&lt;img&gt;\u003C\u002Fcode> or \u003Ccode>&lt;input&gt;\u003C\u002Fcode>.\u003C\u002Fli>\u003Cli>Forgetting \u003Ccode>position: relative\u003C\u002Fcode> on the parent, so the pseudo-element flies to the wrong place.\u003C\u002Fli>\u003Cli>Placing an overlay on top of a link without \u003Ccode>pointer-events: none\u003C\u002Fcode>, making the link unclickable.\u003C\u002Fli>\u003Cli>Using a single colon for newer pseudo-elements such as \u003Ccode>:marker\u003C\u002Fcode>, which is invalid.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2 id=\"summary\">Summary\u003C\u002Fh2>\u003Cp>CSS pseudo-elements let you add visual polish without extra markup. Master \u003Ccode>::before\u003C\u002Fcode> and \u003Ccode>::after\u003C\u002Fcode>, always set \u003Ccode>content\u003C\u002Fcode>, position them deliberately, and keep them decorative. Try the interactive examples below and edit them live.\u003C\u002Fp>\u003Cdiv class=\"try-it-yourself language-html\">\u003Cpre>\u003Ccode>&lt;style&gt;\n  .link-new { position: relative; font-family: sans-serif; font-size: 20px; color: #2563eb; text-decoration: none; }\n  .link-new::after { content: 'NEW'; margin-left: 8px; padding: 2px 8px; font-size: 12px; font-weight: bold; color: #fff; background: #ef4444; border-radius: 999px; vertical-align: middle; }\n  .link-external::before { content: '\\2192 '; }\n&lt;\u002Fstyle&gt;\n&lt;p&gt;&lt;a class='link-new' href='#'&gt;Latest CSS Course&lt;\u002Fa&gt;&lt;\u002Fp&gt;\n&lt;p&gt;&lt;a class='link-external' href='#'&gt;External Resource&lt;\u002Fa&gt;&lt;\u002Fp&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003Cdiv class=\"try-it-yourself language-html\">\u003Cpre>\u003Ccode>&lt;style&gt;\n  .tip { position: relative; display: inline-block; padding: 10px 16px; background: #1e293b; color: #fff; font-family: sans-serif; border-radius: 6px; cursor: help; margin: 50px; }\n  .tip::after { content: attr(data-tip); position: absolute; bottom: 120%; left: 50%; transform: translateX(-50%); background: #0f172a; color: #fff; padding: 6px 10px; border-radius: 4px; font-size: 13px; white-space: nowrap; opacity: 0; pointer-events: none; transition: opacity .2s; }\n  .tip::before { content: ''; position: absolute; bottom: 110%; left: 50%; transform: translateX(-50%); border: 6px solid transparent; border-top-color: #0f172a; opacity: 0; transition: opacity .2s; }\n  .tip:hover::after, .tip:hover::before { opacity: 1; }\n&lt;\u002Fstyle&gt;\n&lt;span class='tip' data-tip='Pure CSS tooltip, no JavaScript!'&gt;Hover over me&lt;\u002Fspan&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003Cdiv class=\"try-it-yourself language-html\">\u003Cpre>\u003Ccode>&lt;style&gt;\n  .card { position: relative; width: 300px; height: 200px; border-radius: 12px; overflow: hidden; background: linear-gradient(135deg, #22c55e, #3b82f6); font-family: sans-serif; }\n  .card::after { content: ''; position: absolute; inset: 0; background: linear-gradient(to top, rgba(0,0,0,.75), transparent 60%); pointer-events: none; }\n  .card h3 { position: absolute; left: 16px; bottom: 12px; margin: 0; color: #fff; z-index: 1; }\n&lt;\u002Fstyle&gt;\n&lt;div class='card'&gt;&lt;h3&gt;Readable Title Over Image&lt;\u002Fh3&gt;&lt;\u002Fdiv&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003Cdiv class=\"try-it-yourself language-html\">\u003Cpre>\u003Ccode>&lt;style&gt;\n  article { font-family: Georgia, serif; max-width: 420px; line-height: 1.6; }\n  article p:first-of-type::first-letter { float: left; font-size: 3.2em; line-height: .9; padding-right: 8px; color: #b91c1c; font-weight: bold; }\n  article ::selection { background: #fde047; color: #111; }\n  ul.custom li::marker { color: #2563eb; font-size: 1.2em; }\n  input::placeholder { color: #94a3b8; font-style: italic; }\n&lt;\u002Fstyle&gt;\n&lt;article&gt;\n  &lt;p&gt;Drop caps make long articles feel editorial. Select this text to see the custom highlight color.&lt;\u002Fp&gt;\n  &lt;ul class='custom'&gt;&lt;li&gt;Styled marker one&lt;\u002Fli&gt;&lt;li&gt;Styled marker two&lt;\u002Fli&gt;&lt;\u002Ful&gt;\n  &lt;input placeholder='Styled placeholder text'&gt;\n&lt;\u002Farticle&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003Cdiv class=\"try-it-yourself language-html\">\u003Cpre>\u003Ccode>&lt;style&gt;\n  .clearfix::after { content: ''; display: table; clear: both; }\n  .box { border: 2px solid #334155; padding: 8px; }\n  .float { float: left; width: 80px; height: 80px; background: #f97316; margin: 4px; }\n&lt;\u002Fstyle&gt;\n&lt;div class='box clearfix'&gt;&lt;div class='float'&gt;&lt;\u002Fdiv&gt;&lt;div class='float'&gt;&lt;\u002Fdiv&gt;&lt;\u002Fdiv&gt;\n&lt;p&gt;The bordered box now contains its floated children thanks to ::after.&lt;\u002Fp&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>",{"name":9,"slug":10},{"name":423,"slug":424},{"slug":464,"display_name":465,"job_title":5,"short_bio":5,"expertise_tags":466,"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":467,"posts":468},"badar-khalil","Badar Khalil",[],[],[],"Article","https:\u002F\u002Fwpfsharp.com\u002Ftopics\u002Fcss-pseudo-elements-before-after","CSS Pseudo-elements: ::before and ::after Guide","Learn CSS pseudo-elements ::before and ::after with live examples: icons, badges, overlays, clearfix, tooltips and best practices.",[474,478,482,486,490,514,518,522,526,530],{"id":475,"text":476,"level":12,"children":477},"what-are-css-pseudo-elements","What Are CSS Pseudo-elements?",[],{"id":479,"text":480,"level":12,"children":481},"pseudo-class-vs-pseudo-element","Pseudo-class vs Pseudo-element",[],{"id":483,"text":484,"level":12,"children":485},"how-before-and-after-work","How ::before and ::after Work",[],{"id":487,"text":488,"level":12,"children":489},"the-content-property","The content Property",[],{"id":491,"text":492,"level":12,"children":493},"real-world-use-cases","Real-world Use Cases",[494,498,502,506,510],{"id":495,"text":496,"level":57,"children":497},"1-decorative-icons-and-badges","1. Decorative icons and badges",[],{"id":499,"text":500,"level":57,"children":501},"2-tooltips-without-javascript","2. Tooltips without JavaScript",[],{"id":503,"text":504,"level":57,"children":505},"3-gradient-overlays-on-images-or-cards","3. Gradient overlays on images or cards",[],{"id":507,"text":508,"level":57,"children":509},"4-clearfix","4. Clearfix",[],{"id":511,"text":512,"level":57,"children":513},"5-custom-shapes","5. Custom shapes",[],{"id":515,"text":516,"level":12,"children":517},"other-useful-pseudo-elements","Other Useful Pseudo-elements",[],{"id":519,"text":520,"level":12,"children":521},"accessibility-considerations","Accessibility Considerations",[],{"id":523,"text":524,"level":12,"children":525},"best-practices","Best Practices",[],{"id":527,"text":528,"level":12,"children":529},"common-mistakes","Common Mistakes",[],{"id":531,"text":532,"level":12,"children":533},"summary","Summary",[],[535,539,542,545,548],{"id":536,"language":16,"code":537,"is_editable":538},234,"\u003Cstyle>\n  .link-new { position: relative; font-family: sans-serif; font-size: 20px; color: #2563eb; text-decoration: none; }\n  .link-new::after { content: 'NEW'; margin-left: 8px; padding: 2px 8px; font-size: 12px; font-weight: bold; color: #fff; background: #ef4444; border-radius: 999px; vertical-align: middle; }\n  .link-external::before { content: '\\2192 '; }\n\u003C\u002Fstyle>\n\u003Cp>\u003Ca class='link-new' href='#'>Latest CSS Course\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp>\u003Ca class='link-external' href='#'>External Resource\u003C\u002Fa>\u003C\u002Fp>",true,{"id":540,"language":16,"code":541,"is_editable":538},235,"\u003Cstyle>\n  .tip { position: relative; display: inline-block; padding: 10px 16px; background: #1e293b; color: #fff; font-family: sans-serif; border-radius: 6px; cursor: help; margin: 50px; }\n  .tip::after { content: attr(data-tip); position: absolute; bottom: 120%; left: 50%; transform: translateX(-50%); background: #0f172a; color: #fff; padding: 6px 10px; border-radius: 4px; font-size: 13px; white-space: nowrap; opacity: 0; pointer-events: none; transition: opacity .2s; }\n  .tip::before { content: ''; position: absolute; bottom: 110%; left: 50%; transform: translateX(-50%); border: 6px solid transparent; border-top-color: #0f172a; opacity: 0; transition: opacity .2s; }\n  .tip:hover::after, .tip:hover::before { opacity: 1; }\n\u003C\u002Fstyle>\n\u003Cspan class='tip' data-tip='Pure CSS tooltip, no JavaScript!'>Hover over me\u003C\u002Fspan>",{"id":543,"language":16,"code":544,"is_editable":538},236,"\u003Cstyle>\n  .card { position: relative; width: 300px; height: 200px; border-radius: 12px; overflow: hidden; background: linear-gradient(135deg, #22c55e, #3b82f6); font-family: sans-serif; }\n  .card::after { content: ''; position: absolute; inset: 0; background: linear-gradient(to top, rgba(0,0,0,.75), transparent 60%); pointer-events: none; }\n  .card h3 { position: absolute; left: 16px; bottom: 12px; margin: 0; color: #fff; z-index: 1; }\n\u003C\u002Fstyle>\n\u003Cdiv class='card'>\u003Ch3>Readable Title Over Image\u003C\u002Fh3>\u003C\u002Fdiv>",{"id":546,"language":16,"code":547,"is_editable":538},237,"\u003Cstyle>\n  article { font-family: Georgia, serif; max-width: 420px; line-height: 1.6; }\n  article p:first-of-type::first-letter { float: left; font-size: 3.2em; line-height: .9; padding-right: 8px; color: #b91c1c; font-weight: bold; }\n  article ::selection { background: #fde047; color: #111; }\n  ul.custom li::marker { color: #2563eb; font-size: 1.2em; }\n  input::placeholder { color: #94a3b8; font-style: italic; }\n\u003C\u002Fstyle>\n\u003Carticle>\n  \u003Cp>Drop caps make long articles feel editorial. Select this text to see the custom highlight color.\u003C\u002Fp>\n  \u003Cul class='custom'>\u003Cli>Styled marker one\u003C\u002Fli>\u003Cli>Styled marker two\u003C\u002Fli>\u003C\u002Ful>\n  \u003Cinput placeholder='Styled placeholder text'>\n\u003C\u002Farticle>",{"id":549,"language":16,"code":550,"is_editable":538},238,"\u003Cstyle>\n  .clearfix::after { content: ''; display: table; clear: both; }\n  .box { border: 2px solid #334155; padding: 8px; }\n  .float { float: left; width: 80px; height: 80px; background: #f97316; margin: 4px; }\n\u003C\u002Fstyle>\n\u003Cdiv class='box clearfix'>\u003Cdiv class='float'>\u003C\u002Fdiv>\u003Cdiv class='float'>\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003Cp>The bordered box now contains its floated children thanks to ::after.\u003C\u002Fp>",{"id":169,"slug":552,"title":553,"time_limit_seconds":5,"pass_percentage":329,"question_count":65},"pseudo-elements-quiz","Pseudo-elements Quiz",[555,561],{"id":403,"title":556,"slug":557,"prompt":558,"starter_code":559,"expected_output":560,"language":16,"order_index":23},"Add a Required Star to Labels","required-label-star","Using only CSS, make every label that has the class 'required' show a red asterisk after its text. Use the ::after pseudo-element and the content property. Do not change the HTML.","\u003Cstyle>\n  \u002F* Write your CSS here *\u002F\n\u003C\u002Fstyle>\n\u003Clabel class='required'>Full Name\u003C\u002Flabel>\n\u003Cbr>\n\u003Clabel class='required'>Email\u003C\u002Flabel>","Each label displays a red * immediately after the text.",{"id":407,"title":562,"slug":563,"prompt":564,"starter_code":565,"expected_output":566,"language":16,"order_index":12},"Build a Pure CSS Ribbon","css-ribbon-badge","Create a small 'SALE' ribbon in the top-right corner of a product box using ::before. The box must have position: relative. The ribbon should have a red background, white bold text, and rounded corners.","\u003Cstyle>\n  .product { position: relative; width: 240px; height: 140px; border: 1px solid #cbd5e1; padding: 16px; font-family: sans-serif; }\n  \u002F* Add .product::before here *\u002F\n\u003C\u002Fstyle>\n\u003Cdiv class='product'>Wireless Headphones\u003C\u002Fdiv>","A red SALE label appears in the top-right corner of the box.","2026-09-29T18:45:14+00:00",{"id":439,"slug":441,"title":440},{"id":447,"slug":449,"title":448}]