Year in Review: The Most Useful Web Platform Features of 2025

DataFmt Team
#web-platform #css #browser-apis #frontend
5 min read

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 →