Bird
Raised Fist0
CSSmarkup~8 mins

After pseudo-element in CSS - Performance & Optimization

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Performance: After pseudo-element
LOW IMPACT
This affects the rendering performance by adding extra elements to the DOM visually without increasing DOM nodes, impacting paint and composite stages.
Adding decorative content after an element without extra DOM nodes
CSS
div::after {
  content: '';
  display: block;
  width: 100%;
  height: 10px;
  background: red;
  position: relative;
  margin-top: 10px;
}
Using relative positioning and margin avoids layout shifts and keeps flow stable.
📈 Performance Gainreduces layout recalculations and prevents CLS
Adding decorative content after an element without extra DOM nodes
CSS
div::after {
  content: '';
  display: block;
  width: 100%;
  height: 10px;
  background: red;
  position: absolute;
  top: 100%;
  left: 0;
}
Using absolute positioning with :after can cause layout shifts if the parent size changes or is dynamic.
📉 Performance Costmay trigger layout recalculations and cause CLS if content size changes
Performance Comparison
PatternDOM OperationsReflowsPaint CostVerdict
Using :after with absolute positioning0 (no new DOM nodes)1+ if layout changesmedium due to paint and composite[!] OK
Using :after with relative positioning and margin00low paint cost[OK] Good
Rendering Pipeline
The :after pseudo-element is generated during style calculation and painted as part of the element's layer without adding DOM nodes. It affects paint and composite stages but not layout unless positioned absolutely.
Style Calculation
Paint
Composite
⚠️ BottleneckPaint stage when complex styles or large areas are used
Core Web Vital Affected
CLS
This affects the rendering performance by adding extra elements to the DOM visually without increasing DOM nodes, impacting paint and composite stages.
Optimization Tips
1Avoid absolute positioning in :after to prevent layout shifts.
2Keep :after styles simple to minimize paint cost.
3:after does not increase DOM size but affects paint and composite.
Performance Quiz - 3 Questions
Test your performance knowledge
What is the main performance impact of using the :after pseudo-element?
AIt blocks JavaScript execution
BIt adds extra DOM nodes increasing DOM size
CIt increases paint and composite cost without adding DOM nodes
DIt causes network requests to load content
DevTools: Performance
How to check: Record a performance profile while interacting with the page and look for layout shifts and paint events related to the element with :after.
What to look for: Look for Layout Shift events and Paint times; minimal layout shifts and low paint cost indicate good performance.

Practice

(1/5)
1. What does the CSS ::after pseudo-element do?
easy
A. Adds content after an element without changing the HTML
B. Removes the element from the page
C. Changes the background color of an element
D. Makes the element invisible

Solution

  1. Step 1: Understand the purpose of ::after

    The ::after pseudo-element inserts content after the selected element in the page layout without modifying the HTML structure.
  2. Step 2: Compare with other options

    Options A, C, and D describe different CSS effects unrelated to ::after.
  3. Final Answer:

    Adds content after an element without changing the HTML -> Option A
  4. Quick Check:

    ::after adds content after element [OK]
Hint: Remember ::after adds content visually, not in HTML [OK]
Common Mistakes:
  • Thinking it changes the HTML structure
  • Confusing it with visibility or color changes
  • Forgetting it needs content property to show
2. Which CSS rule correctly uses ::after to add a red asterisk after a paragraph?
easy
A. p::after { content: '*'; color: red; }
B. p:after { content: '*'; color: red; }
C. p::after { text: '*'; color: red; }
D. p::after { content: '*'; font-color: red; }

Solution

  1. Step 1: Check correct pseudo-element syntax

    The modern and correct syntax for the after pseudo-element is ::after, not :after.
  2. Step 2: Verify property names

    The property to add text is content, and color is set with color. Options C and D use incorrect properties (text and font-color).
  3. Final Answer:

    p::after { content: '*'; color: red; } -> Option A
  4. Quick Check:

    Use ::after with content and color [OK]
Hint: Use double colons and 'content' property for ::after [OK]
Common Mistakes:
  • Using single colon instead of double (::after vs :after)
  • Using wrong property like 'text' instead of 'content'
  • Using 'font-color' instead of 'color'
3. What will be the visual output of this CSS?
h1::after { content: ' [check]'; color: green; }

Given HTML: <h1>Task Complete</h1>

medium
A. [check] Task Complete (green check mark before text)
B. Task Complete [check] (green check mark after text)
C. Task Complete (no change visible)
D. Task Complete [check] (check mark in default color)

Solution

  1. Step 1: Understand ::after content insertion

    The ::after adds the string ' [check]' after the h1 text, so the check mark appears after "Task Complete".
  2. Step 2: Check color styling

    The color property applies to the inserted content, so the check mark will be green.
  3. Final Answer:

    Task Complete [check] (green check mark after text) -> Option B
  4. Quick Check:

    ::after adds green check after text [OK]
Hint: Content appears after element text with given styles [OK]
Common Mistakes:
  • Thinking content appears before text
  • Ignoring color styling on inserted content
  • Expecting no visible change without HTML change
4. Identify the error in this CSS code:
div::after { content: foo; }
medium
A. content: foo; is valid and will not show anything
B. Missing semicolon after content property
C. ::after cannot be used on div elements
D. content must be a string or url, not 'foo'

Solution

  1. Step 1: Check valid values for content

    The content property requires a string (in quotes), url(), or special keywords like '' (empty string). The value foo is invalid here.
  2. Step 2: Verify usage of ::after on div

    The ::after pseudo-element can be used on any element, including div.
  3. Final Answer:

    content must be a string or url, not 'foo' -> Option D
  4. Quick Check:

    content needs string or url, not 'foo' [OK]
Hint: Use quotes for content, 'foo' is invalid [OK]
Common Mistakes:
  • Using 'foo' instead of empty string or valid content
  • Thinking ::after can't be on div
  • Missing semicolon (not the main error here)
5. You want to add a decorative quote mark after every blockquote without changing HTML. Which CSS snippet correctly does this and ensures accessibility?
hard
A. blockquote::after { content: '"'; font-size: 2rem; color: gray; aria-hidden: true; }
B. blockquote::after { content: '"'; font-size: 2rem; color: gray; display: none; }
C. blockquote::after { content: '"'; font-size: 2rem; color: gray; }
D. blockquote::after { content: '"'; font-size: 2rem; color: gray; role: presentation; }

Solution

  1. Step 1: Add decorative content with ::after

    Using content: '"' adds the quote mark after blockquote text visually.
  2. Step 2: Accessibility for pseudo-elements

    Generated content from ::after is not part of the DOM accessibility tree and is ignored by screen readers, so no additional CSS properties are needed.
  3. Step 3: Check other options

    blockquote::after { content: '"'; font-size: 2rem; color: gray; aria-hidden: true; } uses invalid CSS property aria-hidden (ARIA attributes belong on HTML elements). blockquote::after { content: '"'; font-size: 2rem; color: gray; display: none; } uses display: none; which hides the quote visually. blockquote::after { content: '"'; font-size: 2rem; color: gray; role: presentation; } uses invalid CSS property role.
  4. Final Answer:

    blockquote::after { content: '"'; font-size: 2rem; color: gray; } -> Option C
  5. Quick Check:

    ::after content ignored by screen readers [OK]
Hint: Pseudo ::after content doesn't need special accessibility handling [OK]
Common Mistakes:
  • Using invalid CSS properties like aria-hidden or role
  • Using invalid CSS properties like role
  • Hiding content visually instead of from screen readers