CSS Container Style Queries represent a revolutionary approach to responsive design, allowing components to adapt based on their container's properties rather than just the viewport. Let's dive into this powerful feature! 🎨
Understanding Container Style Queries
Container Style Queries extend beyond traditional container queries by allowing you to query not just the size, but also the style properties of containers. This enables more sophisticated and maintainable responsive designs.
Basic Setup
First, define your container:
.card-container {
container-type: inline-size;
container-name: card;
}
Querying Container Styles
Now you can style elements based on the container's properties:
@container card style(--theme: dark) {
.card {
background: #1a1a1a;
color: white;
}
}
@container card style(--columns > 2) {
.grid {
grid-template-columns: repeat(3, 1fr);
}
}
Practical Examples
1. Adaptive Card Component
Create a card that adapts based on its container's properties:
.product-card {
container-type: inline-size;
padding: 1rem;
border-radius: 8px;
}
.product-card__content {
display: grid;
gap: 1rem;
}
@container style(--layout: compact) {
.product-card__content {
grid-template-columns: auto 1fr;
}
.product-card__image {
width: 100px;
}
}
@container style(--emphasis: high) {
.product-card {
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
}
.product-card__title {
font-size: 1.5em;
font-weight: bold;
}
}
2. Dynamic Navigation
Create a navigation that adapts based on container properties:
.nav-container {
container-type: inline-size;
container-name: nav;
}
@container nav style(--nav-style: minimal) {
.nav-list {
gap: 0.5rem;
}
.nav-item {
padding: 0.25rem;
}
.nav-text {
display: none;
}
.nav-icon {
font-size: 1.25rem;
}
}
3. Smart Grid Layout
Create a grid that adapts based on container properties:
.grid-container {
container-type: inline-size;
container-name: grid;
}
.grid {
display: grid;
gap: 1rem;
}
@container grid style(--density: compact) {
.grid {
gap: 0.5rem;
}
.grid-item {
padding: 0.5rem;
}
}
@container grid style(--columns > 3) {
.grid {
grid-template-columns: repeat(4, 1fr);
}
}
Advanced Techniques
1. Nested Containers
Handle complex layouts with nested containers:
.outer-container {
container-type: inline-size;
container-name: outer;
}
.inner-container {
container-type: inline-size;
container-name: inner;
}
@container outer style(--theme: dark) {
@container inner style(--emphasis: high) {
.content {
color: #fff;
background: #333;
}
}
}
2. Dynamic Typography
Create responsive typography based on container properties:
.text-container {
container-type: inline-size;
container-name: text;
}
@container text style(--size: large) {
.heading {
font-size: clamp(1.5rem, 5vw, 2.5rem);
line-height: 1.2;
}
.body-text {
font-size: clamp(1rem, 3vw, 1.25rem);
line-height: 1.6;
}
}
3. Theme Switching
Implement dynamic theming using container queries:
.themed-container {
container-type: inline-size;
container-name: theme;
}
@container theme style(--theme: light) {
.component {
--bg-color: #fff;
--text-color: #333;
--accent-color: #0066cc;
}
}
@container theme style(--theme: dark) {
.component {
--bg-color: #1a1a1a;
--text-color: #fff;
--accent-color: #66b3ff;
}
}
Best Practices
- Performance Considerations
- Use container queries judiciously
- Avoid deep nesting of containers
- Consider using containment where appropriate
- Maintainability
- Use CSS custom properties for queried values
- Keep container queries organized by component
- Document container requirements
- Progressive Enhancement
@supports (container-type: inline-size) {
.container {
container-type: inline-size;
}
}
Browser Support and Fallbacks
Implement graceful fallbacks:
/* Fallback for browsers without container query support */
.card {
display: grid;
grid-template-columns: 1fr;
}
@supports (container-type: inline-size) {
.card {
container-type: inline-size;
}
@container (min-width: 400px) {
.card {
grid-template-columns: 200px 1fr;
}
}
}
Real-World Implementation
Here's a complete example of a flexible component system:
/* Define container */
.component-system {
container-type: inline-size;
container-name: system;
/* Default custom properties */
--theme: light;
--density: normal;
--emphasis: medium;
}
/* Base styles */
.component {
padding: var(--spacing, 1rem);
background: var(--bg-color, #fff);
color: var(--text-color, #333);
border-radius: var(--radius, 8px);
}
/* Style query adaptations */
@container system style(--theme: dark) {
.component {
--bg-color: #1a1a1a;
--text-color: #fff;
}
}
@container system style(--density: compact) {
.component {
--spacing: 0.5rem;
--radius: 4px;
}
}
@container system style(--emphasis: high) {
.component {
--shadow: 0 4px 12px rgba(0,0,0,0.15);
font-weight: 500;
}
}
Conclusion
CSS Container Style Queries provide a powerful way to create truly responsive and maintainable components. Key takeaways:
- Use container queries for component-level responsiveness
- Leverage style queries for dynamic theming and layouts
- Implement progressive enhancement for broader browser support
- Consider performance and maintainability in your implementations
Start experimenting with Container Style Queries to create more flexible and maintainable designs! 🚀