Badger3000onlineRésumé
Articles
Back to Articles
Tech

10 Modern CSS Features You Want to Use

Explore powerful modern CSS features that eliminate the need for many preprocessors and complex workarounds.

*inspired from Rails designers article(opens in a new tab)

This article explores powerful modern CSS features that eliminate the need for many preprocessors and complex workarounds. These features are now supported across modern browsers and represent a significant evolution in CSS capabilities.

📊 Math Functions: min(), max(), and clamp()

What they do: Dynamic sizing functions that automatically choose values based on conditions.

Key Features:

  • min() - Sets a maximum limit (picks the smaller value)
  • max() - Sets a minimum limit (picks the larger value)
  • clamp() - Combines both with min, preferred, and max values

Use Cases:

  • Responsive typography: font-size: clamp(1.5rem, 5vw, 3rem)
  • Flexible containers: width: min(300px, 90%)
  • Accessible button sizes: width: max(300px, 20%)

Documentation:

📦 Container Queries

What they do: Apply styles based on a container's size instead of viewport size, enabling truly reusable components.

Key Features:

  • container-type property to establish containment context
  • @container rule for size-based queries
  • Component-level responsive design

Use Cases:

  • Cards that adapt layout based on available space
  • Sidebar components that work in any context
  • Reusable UI components

Example:

css
.cards {
  container-type: inline-size;
}

@container (width > 200px) {
  .card {
    flex-direction: row;
  }
}

Documentation:

✍️ Advanced Text Wrapping: text-wrap: balance & pretty

What they do: Improve typography by controlling how text breaks across lines.

Key Features:

  • balance - Creates visually balanced line lengths (ideal for headings)
  • pretty - Prevents orphaned words and improves paragraph flow

Use Cases:

  • Headlines with balanced line breaks
  • Body text without awkward single-word lines
  • Improved reading experience

Documentation:

🎬 @starting-style

What they do: Define starting styles for elements appearing from display: none, enabling smooth entry animations.

Key Features:

  • Enables transitions from display: none
  • Works with popovers, modals, and dynamic content
  • Can be used standalone or nested within rulesets

Example:

css
.modal.open {
  display: block;
  opacity: 1;
  transition: opacity 300ms;
}

@starting-style {
  .modal.open {
    opacity: 0;
  }
}

Documentation:

🎯 :has() - The Parent Selector

What they do: Select parent elements based on their children's characteristics.

Key Features:

  • Parent selector functionality
  • Previous sibling selection
  • Conditional styling based on content

Use Cases:

  • Style cards containing error messages
  • Form groups with required inputs
  • Layout adjustments based on content presence

Example:

css
.card:has(.error-message) {
  border-color: red;
  background: rgb(255 0 0 / .05);
}

Documentation:

📱 Media Query Range Syntax

What they do: Simplified syntax for setting min/max ranges using mathematical comparison operators.

Key Features:

  • Cleaner syntax with <=, >=, <, >
  • More intuitive range definitions
  • Reduced verbosity

Examples:

css
/* Old syntax */
@media (min-width: 768px) and (max-width: 1199px) {
  .card { width: 65ch; }
}

/* New range syntax */
@media (768px <= width <= 1199px) {
  .card { width: 65ch; }
}

Documentation:

🌓 light-dark() Function

What they do: Automatically switch between light and dark color values based on user's color scheme preference.

Key Features:

  • Automatic theme switching
  • Works with color-scheme property
  • No need for separate media queries

Example:

css
:root {
  color-scheme: light dark;
}

.card {
  background: light-dark(#f1f5f9, #0f172a);
  color: light-dark(#0f172a, #f1f5f9);
}

Documentation:

🎨 color-scheme Property

What they do: Tell the browser which color schemes a component supports, affecting native UI elements.

Key Features:

  • Controls browser UI (scrollbars, form controls)
  • Works with light-dark() function
  • Can be set globally or per component

Documentation:

🪆 CSS Nesting

What they do: Nest CSS selectors inside other selectors, similar to Sass/Less preprocessors.

Key Features:

  • Native browser support for nesting
  • & selector for parent references
  • Cleaner, more maintainable CSS
  • Can nest media queries and other at-rules

Example:

css
.card {
  padding: .75rem 1.25rem;
  background-color: #fff;

  & .header {
    font-size: 1.7rem;
  }

  &:hover {
    background: #f1f5f9;
  }

  @media (width > 768px) {
    padding: 1rem 1.375rem;
  }
}

Documentation:

📏 Modern CSS Units

What they do: More precise and flexible sizing options for modern web development.

Font-based Units:

  • em - Relative to parent element's font size
  • rem - Relative to root element's font size
  • ex - Height of lowercase "x"
  • ch - Width of "0" character
  • lh - Equal to line-height

Viewport Units:

  • vh/vw - Viewport height/width
  • vmin/vmax - Smaller/larger viewport dimension

Modern Viewport Units:

  • dvh/dvw - Dynamic viewport (adjusts for mobile browser UI)
  • svh/svw - Small viewport (smallest possible)
  • lvh/lvw - Large viewport (largest possible)

Documentation:

🏗️ @layer - Cascade Layers

What they do: Explicitly control CSS specificity by creating ordered layers, solving cascade conflicts.

Key Features:

  • Define explicit cascade order
  • Override specificity wars
  • Better organization of CSS from different sources
  • Integration with frameworks and third-party CSS

Example:

css


@layer reset, components, utilities;

@layer reset {
  * {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
  }
}

@layer components {
  .button {
    padding: .5rem 1rem;
    background: blue;
  }
}

@layer utilities {
  .p-4 {
    padding: 1.25rem; /* This wins over component padding */
  }
}

Documentation:

🚀 Benefits of Modern CSS

These features represent a significant evolution in CSS capabilities:

  1. Reduced Dependencies - Less need for preprocessors like Sass/Less
  2. Better Performance - Native browser optimizations
  3. Improved Maintainability - Cleaner, more semantic code
  4. Enhanced Responsiveness - More flexible and contextual designs
  5. Future-Proof - Built on open web standards

🌐 Browser Support

Most of these features have good modern browser support, but always check Can I Use(opens in a new tab) for the latest compatibility information before implementing in production.

This summary covers modern CSS features that are transforming how we write styles, making CSS more powerful and developer-friendly than ever before.

  • Tech

More from the journal

View all →
Badger3000Kyle's AI
New conversationExplore
Appearance
Kyle RossPrescott, AZ