Modern CSS: The End of JavaScript Positioning Hacks

Abu Bakar
3 min readDec 26, 2024

--

Remember the challenges of building dropdown menus or tooltips? For years, developers relied on JavaScript libraries and custom logic to handle positioning. This often led to:

  • Flickering elements during page load
  • Performance bottlenecks due to constant recalculations
  • Complex code to manage viewport boundaries
  • Accessibility issues requiring manual ARIA attributes
  • Maintenance woes when updating positioning logic

But 2024 revolutionizes how we build UIs, thanks to CSS Anchor Positioning and the Popover API. Together, these features promise:

  • Less JavaScript code
  • Smoother performance
  • Improved accessibility and developer experience

Why These Features Matter

These new CSS features significantly advance web development by providing native solutions for common UI patterns. Key benefits include:

  • Native browser-level positioning calculations without JavaScript overhead
  • Built-in accessibility features without manual ARIA attribute management
  • Reduced complexity in implementing common UI patterns like dropdowns and tooltips
  • Improved performance through browser optimization of layout calculations

Introducing CSS Anchor Positioning

CSS Anchor Positioning enables precise element positioning relative to other elements. Think of it as a smarter, more powerful position: absolute.

Basic Syntax

/* The anchor element */
.trigger {
anchor-name: --anchor;
}
.popup {
position: anchor(--anchor);
anchor-side: bottom;
anchor-align: center;
}

Key Properties

  • anchor-name: Defines the anchor point.
  • anchor-side: Specifies the side for positioning (e.g., top, bottom).
  • anchor-align: Controls alignment (start, center, end).

The Popover API: Native Popup Management

The Popover API provides built-in popup behavior, eliminating the need for JavaScript.

Basic Implementation

<button popovertarget="popup">Open Menu</button>
<div id="popup" popover>
<ul>
<li>Option 1</li>
<li>Option 2</li>
</ul>
</div>

Popover Attributes

  • popover: Declares an element as a popover.
  • popovertarget: Links a trigger to its popover.
  • popovertargetaction: Defines trigger behavior (toggle, show, hide).

Combining the Features: Real-World Examples

1. Smart Dropdown Menu

<button class="menu-trigger" popovertarget="user-menu">
User Profile
</button>

<div id="user-menu" popover class="dropdown">
<nav>
<ul>
<li><a href="/profile">Profile</a></li>
<li><a href="/settings">Settings</a></li>
<li><a href="/logout">Logout</a></li>
</ul>
</nav>
</div>
.menu-trigger {
anchor-name: --menu-anchor;
}
.dropdown {
position: anchor(--menu-anchor);
anchor-side: bottom;
anchor-align: start;
padding: 1rem;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
.dropdown[popover] {
opacity: 1;
transform: translateY(0);
transition: all 0.2s ease-out;
}

2. Tooltip System

<button class="tooltip-trigger" popovertarget="help-tooltip">
Help
</button>

<div id="help-tooltip" popover="manual" class="tooltip">
This is a helpful tooltip with perfect positioning!
</div>
.tooltip-trigger {
anchor-name: --tooltip-anchor;
}
.tooltip {
position: anchor(--tooltip-anchor);
anchor-side: top;
anchor-align: center;
background: #333;
color: white;
padding: 0.5rem 1rem;
border-radius: 5px;
max-width: 200px;
}

Performance Benefits

Reduced JavaScript Overhead

  • Eliminates position calculations in JavaScript.
  • Reduces DOM updates.
  • Improves memory usage.

Native Optimizations

  • Browser-level calculations ensure optimal positioning.
  • Automatic layout optimization reduces layout shifts.
  • Hardware acceleration enhances animation performance.

Smaller JavaScript Bundles

  • Removes the need for positioning libraries.
  • Decreases dependencies and code footprint.

Accessibility Benefits

The combination of these features brings built-in accessibility:

  • Automatic focus management
  • Keyboard navigation support
  • Native ARIA attribute updates

Example

<!-- Before -->
<div
role="tooltip"
aria-hidden="true"
aria-describedby="tooltip-content"
class="tooltip">
Content
</div>

<!-- After -->
<div popover class="tooltip">
Content
</div>

Browser Support and Progressive Enhancement

CSS Anchor Positioning:

  • Chrome: Supported since version 119
  • Firefox: In development (available in Nightly behind flag)
  • Safari: Not supported yet
  • Edge: Same as Chrome (behind flag)

Popover API

  • Chrome: Supported since version 114
  • Firefox: Supported since version 119
  • Safari: Supported since version 16.4
  • Edge: Supported since version 114
  • Opera: Supported since version 100

Fallback Strategies

@supports not ((popover: auto) and (anchor-name: --anchor)) {
.dropdown {
position: absolute;
top: 100%;
left: 0;
}
}

Best Practices

  • Use feature detection:
@supports (anchor-name: --anchor) {   /* Modern styles */ }
  • Implement JavaScript fallbacks for unsupported browsers.
  • Optimize with CSS containment:
[popover] {   contain: layout; }

The Future is Even Brighter

What we’ve covered today is just the tip of the iceberg. The CSS working group is actively developing even more powerful features, such as:

  • Containerized popovers for isolated styling
  • Virtual positioning for complex layouts
  • Scroll-linked animations using anchor points
  • Smart layout-aware positioning

These features will further revolutionize how we build web interfaces, making our applications more performant, accessible, and maintainable.

Explore these features in detail and discover what’s next for web UI. The Chrome team has put together an incredible resource showcasing the latest developments:

👉 The latest in CSS and web UI: I/O 2024

Have you enjoyed this article? Clap 👏 and follow for more content!

--

--

Abu Bakar
Abu Bakar

Written by Abu Bakar

Polyglot Software Engineer | Building end-to-end, turnkey solutions for web | Designer who loves minimalism

No responses yet