提示:本网站现在为维护调试状态

CSS Container Queries 完全指南

Choyeon
Choyeon
2026年9月1日 1 分鐘閱讀 529 閱讀
511 字 1,625 字元 更新於 2026年11月8日
CSS Container Queries 完全指南
目錄

多年来响应式只能依赖媒体查询(基于视口),但组件化时代组件可能被放置在任意宽度区域。Container Queries + :has() 开启真正组件级响应式。

Container Queries 容器查询

给父容器声明 container-type: inline-size,子元素即可用 @container 根据父容器宽度切换布局,搭配 cqw/cqh/cqi 容器相对单位,实现上下文自适应。

.card-wrapper { container-type: inline-size; container-name: productCard; }
.product-card {
  display: flex; flex-direction: column; padding: 1rem;
  border: 1px solid var(--border); border-radius: 12px; transition: all 0.2s;
}
.product-image { width: 100%; aspect-ratio: 4 / 3; }
.product-info { display: grid; grid-template-columns: 1fr; gap: 0.5rem; }
.product-title { font-size: 1rem; }
.product-price { font-weight: 700; color: var(--primary); }

@container productCard (min-width: 400px) {
  .product-card { flex-direction: row; gap: 1rem; }
  .product-image { width: 45%; aspect-ratio: 1 / 1; }
  .product-title { font-size: 1.125rem; }
}
@container productCard (min-width: 640px) {
  .product-card { padding: 1.5rem; }
  .product-info { grid-template-columns: 2fr 1fr; }
  .product-title { font-size: 1.25rem; grid-row: span 2; }
  .product-price { font-size: 1.5rem; align-self: end; }
}

.product-card:has(.out-of-stock) { opacity: 0.7; filter: grayscale(0.3); }
.product-card:has(input[type="checkbox"]:checked) {
  border-color: var(--primary);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--primary) 30%, transparent);
}
.product-wrapper:has(> .product-card:hover) .product-card:not(:hover) {
  transform: scale(0.98); opacity: 0.85;
}

.hero-title { font-size: clamp(1.5rem, 8cqi, 3rem); line-height: 1.1; }
.hero-cta { padding: 0.05cqw 0.2cqh; border-radius: 0.1cqh; }

:has() 父选择器

长久以来 CSS 只能祖先 → 后代单向选择,:has() 打破这个限制。根据子元素是否存在/状态设置祖先样式,实现悬停兄弟弱化、表单验证反馈、空状态样式等。

特性 媒体查询 @media 容器查询 @container :has() 选择器
触发依据 视口尺寸 父容器尺寸 后代元素状态
适用层级 页面级 组件级 任意祖先层级
单位 vw/vh/vmin cqw/cqh/cqi -
浏览器支持 全支持 现代浏览器 Chrome/Safari/Firefox

最佳实践

不要滥用 :has() 嵌套过深,避免 :has(*:hover) 这类全量匹配。容器查询配合 container-name 防多实例冲突。

X微博Telegram

本文作者

投票

你最希望 Rosetta 优先加入哪项功能?

社区投票(演示数据,可后台删除)

留言 (2)

0 / 3000
代码幽灵
代码幽灵ghostdev.blog2026年9月29日

作为一个后端转全栈的,看你的前端文章从来不会觉得难懂,讲得特别接地气,谢谢!

云端漫步
云端漫步cloud-notes.cloud2026年9月28日

这个组件封装得太优雅了,拿走直接用在项目里了,省了我半天时间,给博主点个大大的赞!

相關文章

Tailwind CSS v4 新特性:Zero-config + CSS-native 變數

Tailwind CSS v4 新特性:Zero-config + CSS-native 變數

Tailwind CSS v4 是一次架構級升級:徹底拋棄 tailwind.config.js,用 @theme 塊在原生 CSS 文件聲明設計令牌;新增 @import "tailwindcss" 單入口代替 postcss.config;內置 CSS 變量、容器查詢原生支持、oxc 引擎提速 10-40 倍、顏色函數簡化。

1 分鐘閱讀
React 18 Hooks 最佳實踐

React 18 Hooks 最佳實踐

React 18 引入了並發渲染、自動批處理、useTransition、useDeferredValue 等革命性特性。本文系統梳理 useState/useEffect 的正確用法、useMemo/useCallback 的優化邊界、自定義 Hook 的設計模式,以及並發模式下避免陳舊閉包、競態條件等陷阱的完整指南,幫助你寫出更健壯的 React 18 代碼。

1 分鐘閱讀
前端性能優化:Core Web Vitals 實戰

前端性能優化:Core Web Vitals 實戰

Google 搜索排名核心指標完全實戰:LCP 最大內容繪製(預連接/圖像優先級/CDN緩存)、CLS 累積佈局偏移(圖像尺寸/字體FOIT/動態佔位)、INP 交互響應(長任務拆分/防抖節流)全面落地。

1 分鐘閱讀
Vue 3 組合式 API 實戰

Vue 3 組合式 API 實戰

Vue 3 的組合式 API (Composition API) 徹底改變了 Vue 組件的組織方式。本文通過構建一個複雜的電商篩選器組件,演示 ref/reactive 的選擇、computed/watch 的合理使用、自定義組合函數 (Composable) 的抽離原則、生命週期鉤子的時機以及 provide/inject 進行跨層級狀態傳遞的正確姿勢。

1 分鐘閱讀
Astro 靜態站點深度:群島架構 & 內容集合

Astro 靜態站點深度:群島架構 & 內容集合

深入理解 Astro 核心創新:群島架構實現最小化 JS 注入,僅交互元件按需水合;內容集合提供類型安全的 Markdown/MDX 管理,構建零 JS 的高性能靜態站點。

1 分鐘閱讀
PWA 離線應用實戰:Service Worker + IndexedDB + Background Sync

PWA 離線應用實戰:Service Worker + IndexedDB + Background Sync

逐步構建可安裝、可離線運行、網絡恢復自動同步的 Progressive Web App:Service Worker 緩存策略(Cache First / Stale-While-Revalidate)、IndexedDB 封裝結構化本地數據、Background Sync 後台隊列在用戶離線操作後網絡恢復時自動提交變更,附完整 TS 代碼。

1 分鐘閱讀