Interop 2026 is formally a thing. So, you know all of those wild, new CSS features we’re always poking at but always putting under a “lack of browser support” caveat? The Big Three — Blink (Chrome/Edge), WebKit (Safari), and Mozilla (Firefox) — are working together to bring full and consistent support to them!
You can read the blog posts yourself:
- Interop 2026: Continuing to improve the web for developers (web.dev)
- Announcing Interop 2026 (WekBit Blog)
- Launching Interop 2026 (Mozilla)
- Microsoft Edge and Interop 2026 (Edge)
An, yes, there’s plenty to get excited about specifically for CSS:
Anchor positioning
From our guide:
CSS Anchor Positioning gives us a simple interface to attach elements next to others just by saying which sides to connect — directly in CSS. It also lets us set a fallback position so that we can avoid the overflow issues we just described.
Anchor Positioning Just Don’t Care About Source Order
Anchor Positioning Quirks
CSS Anchor Positioning Guide
A First Look at the Interest Invoker API (for Hover-Triggered Popovers)
Fancy Menu Navigation Using Anchor Positioning
Advanced attr()
We’ve actually had the attr() function for something like 15 years. But now we’re gonna be able to pass variables in there… with type conversion!
attr()
.element { color: attr(data-color type()); }
CSS Bar Charts Using Modern Functions
The CSS attr() function got nothin’ on custom properties
Container style queries
We can already query containers by “type” but only by size. It’ll be so much cooler when we can apply styles based on other styles. Say:
@container style((font-style: italic) and (--color-mode: light)) {
em, i, q {
background: lightpink;
}
}
A Cornucopia of Container Queries
Early Days of Container Style Queries
Digging Deeper Into Container Style Queries
Worlds Collide: Keyframe Collision Detection Using Style Queries
CSS Container Queries
The contrast-color() function
Getting the right color contrast between foreground text and background can be easy enough, but it’s been more of a manual type thing that we might switch with a media query based on the current color scheme. With contrast-color() (I always want to write that as color-contrast(), maybe because that was the original name) we can dynamically toggle the color between white and black.
button {
--background-color: darkblue;
background-color: var(--background-color);
color: contrast-color(var(--background-color));
}
Exploring color-contrast() for the First Time
Exploring the CSS contrast-color() Function… a Second Time
The thing about contrast-color
Approximating contrast-color() With Other CSS Features
Custom Highlights
Highlight all the things! We’ve had ::selection forever, but now we’ll have a bunch of others:
| Pseudo-selector | Selects… | Notes |
|---|---|---|
::search-text | Find-in-page matches | ::search-text:currentselects the current target |
::target-text | Text fragments | Text fragments allow for programmatic highlighting using URL parameters. If you’re referred to a website by a search engine, it might use text fragments, which is why ::target-text is easily confused with ::search-text. |
::selection | Text highlighted using the pointer | |
::highlight() | Custom highlights as defined by JavaScript’s Custom Highlight API | |
::spelling-error | Incorrectly spelled words | Pretty much applies to editable content only |
::grammar-error | Incorrect grammar | Pretty much applies to editable content only |
CSS Custom Highlight API: The Future of Highlighting Text Ranges on the Web
Styling ::search-text and Other Highlight-y Pseudo-Elements
Dialogs and popovers
Finally, a JavaScript-less (and declarative) way to set elements on the top layer! We’ve really dug into these over the years.
Clarifying the Relationship Between Popovers and Dialogs
Poppin’ In
There is No Need to Trap Focus on a Dialog Element
Pop(over) the Balloons
Working With Multiple CSS Anchors and Popovers Inside the WordPress Loop
Creating an Auto-Closing Notification With an HTML Popover
A First Look at the Interest Invoker API (for Hover-Triggered Popovers)
Getting Creative With HTML Dialog
Meet the New Dialog Element
Prevent a page from scrolling while a dialog is open
Invoker Commands: Additional Ways to Work With Dialog, Popover… and More?
Some Hands-On with the HTML Dialog Element
Media pseudo-classes
How often have you wanted to style an <audio> or <video> element based on its state? Perhaps with, JavaScript, right? We’ll have several states in CSS to work off:
:playing:paused:seeking:buffering:stalled:muted:volume-locked
I love this example from the WebKit announcement:
video:buffering::after {
content: "Loading...";
}
Scroll-driven animations
OK, we all want this one. We’re talking specifically about animation that responds to scrolling. In other words, there’s a direct link between scrolling progress and the animation’s progress.
#progress {
animation: grow-progress linear forwards;
animation-timeline: scroll();
}
Scroll-Driven Animations Inside a CSS Carousel
Scroll-Driven Sticky Heading
Bringing Back Parallax With Scroll-Driven CSS Animations
Modern Scroll Shadows Using Scroll-Driven Animations
Scroll Driven Animations Notebook
Unleash the Power of Scroll-Driven Animations
Slide Through Unlimited Dimensions With CSS Scroll Timelines
Web-Slinger.css: Like Wow.js But With CSS-y Scroll Animations
Scroll snapping
Nothing new here, but bringing everyone in line with how the specs have changed over the years!
scroll-margin
.scroll-element { scroll-margin: 50px 0 0 50px; }
scroll-padding
.scroll-element{ scroll-padding: 50px 0 0 50px; }
scroll-snap-align
.element { scroll-snap-align: start; }
scroll-snap-stop
.element { scroll-snap-stop: always; }
scroll-snap-type
.scroll-element { scroll-snap-type: y mandatory; }
CSS Scroll Snap Slide Deck That Supports Live Coding
How I Added Scroll Snapping To My Twitter Timeline
How to use CSS Scroll Snap
Introducing CSS Scroll Snap Points
Practical CSS Scroll Snapping
The shape() function
This is one that Temani has been all over lately and his SVG Path to Shape Converter is a must-bookmark. The shape() can draw complex shapes when clipping elements with the clip-path property. We’ve had the ability to draw basic shapes for years — think circle, ellipse(), and polygon() — but no “easy” way to draw more complex shapes. And now we have something less SVG-y that accepts CSS-y units, calculations, and whatnot.
.clipped {
width: 250px;
height: 100px;
box-sizing: border-box;
background-color: blue;
clip-path: shape(
from top left,
hline to 100%,
vline to 100%,
curve to 0% 100% with 50% 0%,
);
}
CSS shape() Commands
Better CSS Shapes Using shape() — Part 1: Lines and Arcs
Better CSS Shapes Using shape() — Part 2: More on Arcs
Better CSS Shapes Using shape() — Part 3: Curves
Better CSS Shapes Using shape() — Part 4: Close and Move
SVG to CSS Shape Converter
View transitions
There are two types of view transitions: same-document (transitions on the same page) and cross-document (or what we often call multi-page transitions). Same-page transitions went Baseline in 2025 and now browsers are working to be cross-compatible implementations of cross-document transitions.
Toe Dipping Into View Transitions
What on Earth is the `types` Descriptor in View Transitions?
::view-transition
::view-transition { position: fixed; }
::view-transition-group
::view-transition-group(transition-name) { animation-duration: 1.25s; }
::view-transition-image-new
::view-transition-image-new(*) { animation-duration: 700ms; }
::view-transition-image-old
::view-transition-image-old(*) { animation-duration: 700ms; }
::view-transition-image-pair
::view-transition-image-pair(root) { animation-duration: 1s; }
::view-transition-new()
::view-transition-new(item) { animation-name: fade-in; }
::view-transition-old()
::view-transition-old(item) { animation-name: fade-out; }
@view-transition
@view-transition { navigation: auto; }
view()
.element { animation-timeline: view(); }
view-transition-class
.element { view-transition-class: bearhugs; }
view-transition-name
.element { view-transition-name: image-zoom; }
CSS zoom property
Oh, I wasn’t expecting this! I mean, we’ve had zoom for years — our Almanac page was published back in 2011 — but as a non-standard property. I must have overlooked that it was Baseline 2024 newly available and worked on as part of Interop 2025. It’s carrying over into this year.
zoom is sorta like the scale() function, but it actually affects the layout whereas scale() it’s merely visual and will run over anything in its way.
That’s a wrap! Bookmark the Interop 2026 Dashboard to keep tabs on how things are progressing along.