最近重构老项目,把以前用浮动、定位堆出来的布局,全换成了现代 CSS 方案 ——Grid、Flexbox、Container Queries 这些,写完直接感叹:原来布局可以这么省心!今天就聊聊实战里最常用的几个技巧,以及那些 “早知道早省事” 的经验~
首先必须吹爆 Grid 布局,尤其是做整体页面框架的时候,以前用 “header+main+footer” 还要算 margin、清浮动,现在几行代码就能搞定。比如经典的 “三栏布局”(导航 + 内容 + 侧边栏),用grid-template-areas直接 “画” 结构,谁在哪个位置一目了然:
.layout {
  display: grid;
  grid-template-areas: 
  "header header header"
  "nav content sidebar"
  "footer footer footer";
  grid-template-columns: 200px 1fr 200px; /\* 中间内容自适应 \*/
  gap: 1rem; /\* 自带间距,不用算margin \*/
}
最香的是响应式调整,比如移动端要把三栏叠成一栏,只要改下grid-template-areas和grid-template-columns,不用动 HTML 结构,比以前写 N 个媒体查询改浮动方便太多。
然后是 Flexbox,做卡片列表、组件内部对齐的时候简直是神器。以前写卡片布局,要算 “一行能放几个”“不够宽时换行”,现在用flex: 1 1 300px就能实现 “卡片最小 300px,够宽就平分空间”,再加上flex-wrap: wrap自动换行,省了一堆计算:
.card-container {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
}
.card {
  flex: 1 1 300px; /\* 伸缩性+基准宽度,完美适配不同屏幕 \*/
}
还有个小细节:用flex-direction: column+flex: 1能让卡片内容 “撑满剩余高度”,比如卡片里的文字区不管内容多少,都和其他卡片对齐,以前要靠 JS 算高度,现在 CSS 一行搞定,太爽了!
今年新学的 Container Queries 更是颠覆认知 —— 以前响应式只能 “看屏幕宽度”,现在能 “看父容器宽度” 了!比如卡片在窄容器里是上下布局,放到宽容器里自动变成左右布局,不用再纠结 “屏幕多大时改样式”,直接盯着父容器写规则:
.card-container {
  container-type: inline-size; /\* 开启容器查询 \*/
}
@container (min-width: 400px) {
  .card {
  flex-direction: row; /\* 父容器够宽,卡片横排 \*/
  }
}
比如在侧边栏里的卡片是竖排,放到主内容区自动横排,完全不用写媒体查询,适配逻辑更直观了。
不过也踩过两个小坑:一是刚开始用 Grid 的时候,总忘了gap和margin的区别,加了gap又加margin导致间距翻倍;二是 Container Queries 目前还需要给父容器加container-type,忘了加就没效果,后来养成了 “写容器查询先开容器类型” 的习惯。
另外,CSS 变量一定要用!把间距、颜色、基准宽度定义成变量,比如--spacing-unit: 8px,后面改样式的时候不用到处找数值,直接改变量就行。我还会用clamp()做自适应宽度,比如--card-width: clamp(300px, 30vw, 400px),卡片宽度既不会太小也不会太大,适配各种屏幕刚好。
最后想说,现在写 CSS 真的不用再 “委屈自己” 了,别再依赖浮动和定位堆布局,试试 Grid、Flexbox 这些现代方案,效率能提一倍不止。如果你们有 “用 CSS 变量做主题切换”“Grid 嵌套布局” 的经验,也欢迎评论区分享,一起少写冗余代码~ ✨

