Year in Review: The Most Useful Web Platform Features of 2025
Year in Review: The Most Useful Web Platform Features of 2025
The web platform shipped a lot in 2025 — most of it Baseline-available across all evergreen browsers. Here are the features that actually move the needle.
1. View Transitions API (cross-document)
Animate between two pages with a single declaration:
@view-transition { navigation: auto; }
::view-transition-old(root), ::view-transition-new(root) {
animation: fade 0.3s;
}
Native page transitions for MPAs without a framework. Astro, Hotwire and HTMX integrate cleanly.
2. Popover API
Tooltips, menus and dialogs with no JavaScript for the open/close logic:
<button popovertarget="menu">Open</button>
<div id="menu" popover>Hello</div>
Light-dismiss, top-layer rendering and accessible focus management — for free.
3. CSS Anchor Positioning
Position one element relative to another, anywhere in the DOM:
.tooltip {
position: absolute;
position-anchor: --target;
top: anchor(bottom);
left: anchor(center);
}
Goodbye, Floating UI bundles for many simple cases.
4. CSS Nesting
Native nesting (no preprocessor needed):
.card {
padding: 1rem;
& .title { font-weight: bold; }
&:hover { background: #f3f4f6; }
}
5. :has() parent selector
The “previously impossible” selector — react to descendants:
form:has(input:invalid) button[type="submit"] {
opacity: 0.5;
pointer-events: none;
}
Replaces dozens of JavaScript handlers.
6. CSS @scope
Style isolation without Shadow DOM:
@scope (.product-card) to (.user-content) {
h2 { color: var(--brand); }
}
7. Temporal (incoming, polyfillable now)
The replacement for Date. Immutable, time-zone-aware, calendar-aware:
const now = Temporal.Now.zonedDateTimeISO("Europe/Madrid");
const tomorrow = now.add({ days: 1 });
Polyfill today, swap to native when shipped.
8. URL.parse and URL.canParse
Finally, no more try/catch around new URL:
if (URL.canParse(input)) { /* safe */ }
const url = URL.parse(input); // returns null on failure
9. Promise.try
Run a sync or async function and always get a Promise:
const p = Promise.try(() => maybeAsync()); // never throws synchronously
10. CSS light-dark() and color-scheme
Theming without media queries:
:root { color-scheme: light dark; }
.card { background: light-dark(#fff, #111); }
What to learn next
The platform has caught up to many JS framework conveniences. In 2026 we will see more declarative web — fewer event handlers, fewer dependencies, smaller bundles. Bookmark web.dev/baseline and ship.
Found this helpful? Try our free tools!
Explore Our Tools →