CSS keeps evolving faster than most of us can keep up. While everyone talks about container queries and the :has() selector, a handful of powerful CSS features stay hidden in plain sight. These underutilized CSS features in 2026 can replace dozens of lines of JavaScript, cut your debugging time, and make your layouts more resilient. Let’s look at seven of them that deserve a spot in your daily workflow.
The seven features covered here can eliminate JavaScript hacks for common layout tasks. You will learn how to use `@container`, `interpolate-size`, `scroll-timeline`, `anchor-positioning`, `field-sizing`, `:modal`, and `lh` to build cleaner, more maintainable interfaces. Each technique works in modern browsers today and reduces your dependency on frameworks.
Why These Features Stay Hidden
Most developers learn CSS through tutorials that recycle the same twenty properties. Flexbox, Grid, custom properties, and animations get all the attention. But the CSS Working Group has been shipping practical, targeted features that solve specific pain points. The problem is awareness. These features rarely appear in blog roundups or conference talks because they solve niche problems. Once you know them, though, you will wonder how you lived without them.
1. The @container Rule for Scoped Styles
The @container at-rule lets you apply styles only when a container meets certain conditions. Think of it as a media query for your parent element instead of the viewport. This is different from container queries, which are still experimental in many browsers. @container is stable in 2026 and works across all major browsers.
@container (min-inline-size: 600px) {
.card {
display: grid;
grid-template-columns: 1fr 1fr;
}
}
When the parent container is at least 600px wide, the card switches to a two-column grid. No JavaScript. No breakpoint classes. The container decides.
Here is a practical process to start using @container today:
- Identify a component that changes layout based on its parent width.
- Replace any JavaScript that watches
element.offsetWidthwith a@containerrule. - Test the component inside different parent sizes to confirm the toggle works.
- Remove the JavaScript resize listener entirely.
2. The interpolate-size Property for Smooth Height Transitions
Animating height has always been a pain. You cannot easily transition from 0 to auto because the browser needs a concrete numeric value. The interpolate-size property solves this by telling the browser to treat auto as an interpolatable value.
.accordion-content {
interpolate-size: allow;
height: auto;
transition: height 0.3s ease;
}
.accordion-content.collapsed {
height: 0;
}
This works for accordions, expandable menus, and any collapsible section. No more max-height workarounds or grid-template-rows hacks. The browser handles the math.
- Benefits of
interpolate-size: - Removes the need for JavaScript-driven height calculations.
- Works with any block element, not just grid or flex children.
- Plays nicely with overflow handling and scroll containers.
3. Scroll Timeline for Animation Control
The scroll-timeline property lets you tie an animation directly to scroll position. You define a timeline that maps scroll progress to animation progress. This replaces the common pattern of listening to scroll events in JavaScript and manually calculating percentages.
.scroll-container {
scroll-timeline: --progress;
}
@scroll-timeline --progress {
source: auto;
orientation: block;
scroll-offsets: 0, 400px;
}
.progress-bar {
animation: 1s linear grow;
animation-timeline: --progress;
}
@keyframes grow {
from { width: 0%; }
to { width: 100%; }
}
The progress bar fills as the user scrolls. No JavaScript event handlers. No requestAnimationFrame loops. The browser syncs the animation to the scroll position automatically.
4. Anchor Positioning for Tooltips and Popovers
Positioning a tooltip relative to an anchor element usually requires JavaScript to calculate offsets. The anchor-name and anchor-position properties give you native CSS control.
| Technique | Old Way (JavaScript) | New Way (CSS) |
|---|---|---|
| Positioning | Calculate bounding box offsets | anchor-name + position-anchor |
| Responsive adjustments | Recalculate on resize | Automatic by the browser |
| Multi-element support | Track multiple references | Named anchors in CSS |
.tooltip {
position: absolute;
position-anchor: --button-anchor;
bottom: anchor(top);
left: anchor(center);
margin-bottom: 8px;
}
The tooltip stays attached to its anchor element even when the layout shifts. This is a game changer for dropdown menus, context menus, and help icons.
5. Field Sizing for Form Elements
Forms have always been a weak spot for CSS. Input fields and textareas resist styling in predictable ways. The field-sizing property gives you control over how form controls size themselves.
input[type="text"] {
field-sizing: content;
min-inline-size: 12ch;
max-inline-size: 40ch;
}
The input grows and shrinks based on its content, within your defined bounds. This eliminates the need for JavaScript that watches input length and adjusts width. It also works with textareas that need to expand as the user types.
Expert advice: Use
field-sizing: contentfor search bars and tag inputs. It keeps the input compact when empty and expands naturally as the user types. Pair it withmin-inline-sizeto avoid a tiny click target.
6. The :modal Pseudo-Class for Dialog Styling
The :modal pseudo-class targets elements that are currently in a modal state. This applies to <dialog> elements opened with showModal() and to any element using the popover attribute with modal behavior.
dialog:modal {
background: white;
border: 2px solid #333;
box-shadow: 0 8px 24px rgba(0,0,0,0.15);
}
dialog:modal::backdrop {
background: rgba(0,0,0,0.4);
backdrop-filter: blur(2px);
}
Before :modal, developers had to add a class to the dialog and a separate overlay element. Now the browser provides the modal state and the backdrop automatically. You style them directly.
7. The lh Unit for Line Height Based Sizing
The lh unit represents one line height of the current element. This is incredibly useful for vertical rhythm in typography and spacing.
.article-body {
margin-block: 1lh;
}
.article-body p {
margin-block-end: 0.5lh;
}
Instead of guessing pixel values or using em units that change with font size, lh ties spacing directly to the line height. This keeps vertical spacing proportional even when users zoom or change default font sizes.
When to Reach for These Features
Some of these features replace JavaScript entirely. Others just make your CSS more expressive. Here is a quick reference table to help you decide:
| Feature | Replaces JavaScript? | Browser Support (2026) |
|---|---|---|
| @container | Yes | All major browsers |
| interpolate-size | Yes | Chrome, Firefox, Edge |
| scroll-timeline | Yes | Chrome, Edge, Safari |
| anchor-positioning | Yes | Chrome, Firefox, Edge |
| field-sizing | Partially | Chrome, Firefox |
| :modal | No (enhances) | All major browsers |
| lh unit | No (enhances) | Chrome, Firefox, Edge |
Common Mistakes to Avoid
When adopting these features, watch out for these pitfalls:
- Using
@containerwithout setting acontainer-typeon the parent element. The parent must be a container context. - Forgetting that
interpolate-sizeonly works when the element has an explicittransitionon theheightorwidthproperty. - Applying
anchor-positioningto elements that are notposition: absoluteorposition: fixed. The anchor system only works with positioned elements. - Overusing
field-sizing: contenton password fields. The variable width can reveal the length of the password visually, which is a security concern.
A Quick Implementation Checklist
To start using these features in your next project, follow this numbered checklist:
- Audit your current codebase for JavaScript that manages height, scroll position, or tooltip placement.
- Replace height animations with
interpolate-sizeand a CSS transition. - Convert scroll-based progress indicators to
scroll-timeline. - Swap JavaScript tooltip positioning for
anchor-nameandposition-anchor. - Update form inputs with
field-sizing: contentand remove the JavaScript width watchers. - Replace custom dialog overlays with the
:modalpseudo-class and::backdrop. - Standardize vertical spacing using the
lhunit across your typography system.
Where These Features Fit in Your Stack
These CSS features do not replace the need for a solid understanding of master-modern-web-frameworks-for-faster-development. They complement it. Frameworks handle routing, state management, and server-side logic. CSS handles presentation. The less JavaScript you need for presentation, the simpler your application becomes.
If you are already using top-open-source-frameworks-every-web-developer-should-know-in-2026, you can integrate these CSS features as drop-in replacements for framework-specific layout utilities. Many CSS frameworks already support these properties natively, so you do not need to fight against opinionated defaults.
Making These Features Part of Your Workflow
The hardest part of adopting underutilized CSS features in 2026 is remembering they exist. Here are a few strategies to keep them top of mind:
- Add a comment block at the top of your main stylesheet listing the seven features as a reminder.
- Create CSS custom properties for common
@containerbreakpoints so you reuse them across components. - Set up a linting rule that flags JavaScript functions for height animation and tooltip positioning, suggesting the CSS alternative.
- Share this list with your team during your next code review session. Pair programming is a great way to spread awareness of these techniques.
Start with one feature this week. Pick interpolate-size if you maintain an accordion or collapsible menu. Pick anchor-positioning if you build tooltips or dropdowns. Once you see how much code you can delete, you will want to try the rest.
CSS in 2026 is more capable than ever. These seven features prove that the language can handle layout challenges that previously required a full JavaScript dependency. Give them a try on your next project. Your future self will thank you for the cleaner codebase.