Drawing Connections with CSS Anchor Positioning
by Roland
Introduction
Every now and then, CSS gets a new feature that makes you pause and think: wait… we can do that now? That was exactly my reaction after watching a short by Kevin Powell on CSS Anchor Positioning.
The idea is deceptively simple: let one element position itself relative to another, without JavaScript, without fragile DOM assumptions, and without extra wrapper elements. Naturally, I had to try it myself.
What started as a small experiment turned into a neat little demo that visually connects a comment to its reply using nothing but CSS.
The Problem
Visually connecting related UI elements is surprisingly awkward in CSS. Think of:
- Comment threads
- Tooltips pointing to triggers
- Callouts referencing specific content
Traditionally, this meant one of three things:
- Extra markup just to draw a line or arrow
- JavaScript calculating positions and injecting styles
- Giving up and settling for “close enough”
Anchor positioning changes that equation.
Enter Anchor Positioning
CSS Anchor Positioning lets you name an element as an anchor and then reference its geometry elsewhere using the anchor() function.
At a high level, the flow looks like this:
- Give an element an
anchor-name - Optionally limit its visibility using
anchor-scope - Use
anchor()to position another element relative to it
No DOM traversal. No layout math. Just relationships.
Setting Up the Anchors
In my demo, I have two key elements:
.comment.reply
Each becomes an anchor:
.comment {
anchor-name: --comment;
}
.reply {
anchor-name: --reply;
anchor-scope: --reply;
}
The names (--comment, --reply) behave a lot like custom properties: they’re identifiers you can reference later. The anchor-scope ensures that only descendants of .reply can reference the --reply anchor, keeping things predictable and contained.
Drawing the Connection
The fun part happens in a pseudo-element. I use ::after on the reply to draw a subtle connecting line between the comment and the reply.
.reply::after {
content: "";
position: absolute;
inset-block-start: anchor(--comment end);
inset-inline-start: calc(anchor(--comment start) + 1.5rem);
inset-block-end: anchor(--reply center);
inset-inline-end: anchor(--reply start);
border: 1px solid var(--text);
border-block-start-color: transparent;
border-inline-end-color: transparent;
border-radius: 0 0 0 0.75rem;
}
This is where the anchor() function really shines.
Reading the Code
Each anchor() call resolves to a real layout value taken from another element:
anchor(--comment end)→ the block-end edge of the commentanchor(--comment start)→ the inline-start edge of the commentanchor(--reply center)→ the vertical center of the reply
By mixing these with logical properties (inset-block-*, inset-inline-*) the connection adapts automatically to writing mode and layout changes.
No magic numbers. No recalculation when content grows. The line simply follows the elements.
Why This Is Exciting
What I love most about anchor positioning is that it feels like layout-aware CSS.
Some immediate benefits:
- No JavaScript for positioning logic
- Relationships stay intact when content changes
- Fewer wrapper elements and cleaner markup
- Much easier to reason about intent
This feels especially powerful for UI patterns where relationships matter more than strict placement.
Browser Support (Reality Check)
Anchor positioning
Limited availability
Supported in Chrome: no.
Supported in Edge: no.
Supported in Firefox: no.
Supported in Safari: no.
This feature is not Baseline because it does not work in some of the most widely-used browsers.
The anchor() function has recently reached Baseline: Newly available, which means it’s supported in the latest versions of major browsers.
That said, anchor positioning as a whole is still evolving. While anchor() itself is available, related anchor positioning features like anchor-name and anchor-scope may still be behind flags or
rolling out gradually, depending on the browser.
In practice, this makes anchor positioning a great candidate for:
- Progressive enhancement
- Experiments and demos
- Forward-looking UI patterns
Used carefully, you can start exploring this today while keeping fallbacks in place for browsers that haven’t fully caught up yet.
See It in Action
The full demo lives on CodePen:
See the Pen CSS Anchor Positioning - Comment Replies by Roland ( @ROL4ND909 ) on CodePen .
If you inspect the code, you’ll notice how little CSS is actually required to make this work. Most of the complexity disappears once the relationship is expressed directly.
Closing Thoughts
Anchor positioning feels like a missing puzzle piece. Instead of asking “where should this element go?” we can finally say “this belongs there, relative to that.”
This opens the door to patterns like tooltips, popovers, annotations, and visual relationships that stay correct without ever reaching for JavaScript.
It’s early days, but features like this make me genuinely excited about where CSS is heading. If you enjoy experimenting with new layout primitives, this one is absolutely worth your time.