首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >写了这么多年前端,这 15 个 CSS 技巧我几乎每个项目都在用

写了这么多年前端,这 15 个 CSS 技巧我几乎每个项目都在用

作者头像
前端达人
发布2026-07-23 19:39:05
发布2026-07-23 19:39:05
1670
举报
文章被收录于专栏:前端达人前端达人

先讲个真事。

有次接了个电商项目,商品列表页做的两列卡片,我在自己电脑上看得好好的,一提测就炸了——测试那边截图给我,卡片挤成了一坨,右边一列直接被挤到下一行去了。我盯着代码看了十分钟没看出问题,明明每列都是 width: 50%,怎么会溢出?

后来才反应过来:卡片加了 paddingborder,两个 50% 一加内边距,实际宽度早就超过 100% 了。改一行全局样式,问题瞬间消失。

那一刻我意识到,前端做久了,真正天天在用、真正救过命的,往往不是什么高级特性,而是这么一撮朴素到不起眼的小技巧。它们不炫技,但每个都对应着一个"我曾经在这里踩过坑"的真实场景。

这篇我就把这 15 个技巧摊开讲——不堆术语,尽量还原每个技巧是在什么业务场景下、解决了什么实际问题。你要是也做过类似的项目,应该会频频点头。

一、先把地基打稳:这几个习惯,决定你后面少熬几个夜

1. 全局 box-sizing: border-box——就是开头那个电商翻车救回来的一行

回到开头的故事。CSS 默认的盒模型是 content-box,意思是你写的 width 只算内容区,padding 和 border 都往外撑。所以两列 50% 的卡片一加内边距,实际就超宽了。

解法就是新项目第一件事,加上这三行:

代码语言:javascript
复制
*,
*::before,
*::after {
  box-sizing: border-box;
}

border-box 把逻辑反过来:你写的 width 就是元素最终占的宽度,padding 和 border 都算在里面、往里挤。所见即所得。

代码语言:javascript
复制
content-box(默认,会翻车)        border-box(推荐)
─────────────────────           ─────────────────────
width: 50%                       width: 50%
+ padding 20px×2  ← 往外撑        (padding、border 都算进 50% 里)
+ border 1px×2
= 实际 > 50%  → 溢出换行!       = 实际就是 50%  → 稳稳两列

一行成本,从此栅格、卡片、表单再也不会因为内边距莫名其妙撑破。这是我唯一一个"闭着眼睛也要写"的技巧。

2. CSS 变量:客户上线前一晚说"蓝色换成绿的",你还能笑得出来

做过外包的都懂这种恐惧。项目临上线,客户甩来一句"我们品牌色改了,全站的蓝换成墨绿"。要是主色散落在几十个文件里,那一晚基本别睡了,还大概率漏改几个地方第二天被抓。

被坑过一次之后,我现在所有会变的值,一律先收进 :root

代码语言:javascript
复制
:root {
  --primary: #2563eb;      /* 主色 */
  --primary-dark: #1d4ed8; /* hover 时的加深色 */
  --radius: 8px;           /* 全站统一圆角 */
  --gap: 20px;             /* 全站统一间距 */
}

.button {
  background: var(--primary);
  border-radius: var(--radius);
}
.button:hover {
  background: var(--primary-dark);
}

现在再遇到换配色,我只改 --primary 一个值,喝口水的功夫全站跟着变,从容得很。变量还有个隐藏好处:它把"设计规范"显式地钉死了。团队里再也不会出现有人用 6px 圆角、有人用 8px 的混乱——因为大家都得引用同一个 --radius

3. 留一小撮工具类:不多,但每个都是"高频救急"

我不是 Tailwind 那种"万物皆原子类"的信徒,但手边确实常备几个小工具类,都是那种每个页面都要用一次的:

代码语言:javascript
复制
.hidden { display: none; }
.text-center { text-align: center; }
.sr-only {                 /* 视觉上藏起来,但读屏软件还能读到 */
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

重点是克制。工具类一多就成了另一套要维护的系统,得不偿失。我的判断标准很简单:只留"几乎每个页面都会用到"的那几个。尤其 .sr-only——做无障碍、做 SEO 时给图标按钮补个隐藏文字标签几乎是刚需,很多人却根本不知道有这么个写法。

二、布局:Flexbox 和 Grid 分工干活,能省你一半代码

这两个是现代布局的两条腿。分清什么时候用哪个,你就能告别 float 和一堆 position 的年代。

4. Flexbox:那个曾经难倒一片人的"垂直居中",现在三行解决

还记得"怎么让一个 div 垂直水平居中"能在面试里筛掉一半人的年代吗?就是被这三行终结的:

代码语言:javascript
复制
.container {
  display: flex;
  justify-content: center;  /* 主轴(横向)居中 */
  align-items: center;      /* 交叉轴(纵向)居中 */
}

凡是沿一个方向排队的东西——一行按钮、一条顶部导航、一个要居中的登录框——我第一反应都是 Flex。导航栏想让 logo 靠左、菜单靠右?把 center 换成 space-between,一行搞定,不用任何浮动。

5. Grid:做后台仪表盘、商品墙,这一行顶半屏媒体查询

一旦行和列要同时管——电商的商品墙、后台的数据卡片、多栏的落地页——Grid 才是主角。而下面这一行,是我用得最多、也最想安利给你的"响应式咒语":

代码语言:javascript
复制
.grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: 20px;
}

翻译成人话:每列最少 250px,屏幕能塞几列就塞几列,剩余空间平分。大屏自动排四列、平板排两列、手机排一列,一句媒体查询都不用写

我上个后台项目的首页数据卡片就是这么排的,产品经理后来加了三张新卡片,我一行代码没动,布局自己就把新卡片安排得整整齐齐。那一刻真的会爱上 Grid。

具体选 Flex 还是 Grid,我一般这么判断:

代码语言:javascript
复制
                你要排的东西是……
                      │
        ┌─────────────┴─────────────┐
        ▼                           ▼
  沿一个方向排队               行、列都要对齐
 (导航 / 按钮组 / 居中)     (商品墙 / 后台卡片)
        │                           │
        ▼                           ▼
   👉 用 Flexbox              👉 用 Grid
        │                           │
        └──────────┬────────────────┘
                   ▼
         元素之间的间距,统统交给 gap

6. gap:删掉那些丑陋的 :last-child,代码像做了次大扫除

这是我这两年改得最爽的一个习惯。以前排一组标签、一行按钮,靠给每个元素加 margin-right,然后还得单独写 :last-child { margin-right: 0 } 把最后一个的多余间距抹掉,丑,还老漏。

现在 Flex、Grid 都支持 gap,容器上写一行就完事:

代码语言:javascript
复制
.tag-list {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;   /* 元素之间自动留 12px,首尾不多不少 */
}

gap 只管"元素与元素之间",容器边缘不会多出空白,也彻底不用惦记 :last-child。我上次重构一个老页面,光是删掉那些 :not(:last-child) 的边距选择器,就砍掉了几十行样式——那种清爽感,写过的人才懂。

三、响应式:别再手动改断点,让浏览器自己去适配

真正省心的响应式,是把"适配"这活儿外包给浏览器。下面这几个,就是干这个的。

7. clamp():活动落地页的大标题,别在小屏手机上炸出屏幕

做过活动落地页的都遇到过:设计稿给的主标题在 iPhone 上美美的,一到某款小屏安卓机,标题字太大直接换行、甚至溢出屏幕,丑得没眼看。以前的解法是配好几个断点手动改字号,媒体查询写一大串,中间尺寸还是会"卡"。

现在我只写一行:

代码语言:javascript
复制
h1 {
  font-size: clamp(2rem, 5vw, 4rem);
  /*          最小   跟随视口   最大 */
}

三个参数是"下限、跟着屏幕宽度走的值、上限"。字号会在 2rem 到 4rem 之间平滑地随屏幕缩放:再小的手机也不会大到溢出,再大的屏也不会小得可怜。标题、副标题、区块间距我现在都爱用它,落地页的响应式媒体查询直接砍掉一大半。

8. aspect-ratio:电商商品图参差不齐?一行锁死比例

电商、内容站最常见的糟心事:运营上传的图片尺寸五花八门,有的正方形有的长条,排进列表里高高低低像狗啃的。过去要用 padding-top 百分比那套 hack 撑比例,写起来别扭还难懂。现在原生属性一步到位:

代码语言:javascript
复制
.card img {
  width: 100%;
  aspect-ratio: 16 / 9;   /* 强制统一成 16:9 */
  object-fit: cover;      /* 裁剪填充,绝不拉伸变形 */
}

不管运营传来的是什么奇葩尺寸,都会被规整成整齐的 16:9,cover 保证画面填满又不变形。整个列表瞬间对齐——这一个属性,能帮你挡下无数次跟运营"能不能按规范传图"的扯皮。

9. 防"加载抖动":信息流广告图一跳,用户误点,投诉就来了

这个坑坑过我一次,印象特别深。内容信息流里插了张广告图,加载慢半拍,图片一出来把下面的正文和按钮往下一挤——用户手指正好点下去,点到了广告,投诉说"我明明想点别的"。这就是典型的累计布局偏移(CLS)

基础防护是给图片定好显示方式:

代码语言:javascript
复制
img {
  display: block;
  max-width: 100%;
  height: auto;
}

真正关键的一步,是在 HTML 里给图片写死 widthheight 属性(或者用上面第 8 条的 aspect-ratio)。浏览器提前知道图占多大,加载前就把坑位留好,图片填进来时下面的内容纹丝不动。顺带一提,CLS 还是 Google 核心网页指标之一,抠好了对 SEO 排名也有实打实的加分。

10. min() 卡正文宽度:企业官网在大屏上,别让人读一行要甩头

做企业官网、博客这类内容站时,如果段落在 27 寸大屏上横向铺满,一行文字长得读完要转头,眼睛特别累,专业度也掉一截。我习惯给内容容器加一层宽度限制:

代码语言:javascript
复制
.container {
  width: min(1100px, 90%);  /* 小屏占 90%,大屏最多 1100px */
  margin-inline: auto;      /* 水平居中 */
}

min(1100px, 90%) 会自动取两者里更小的那个:小屏幕用 90% 宽、留出舒服的边距;大屏幕顶到 1100px 就不再变宽,两侧自动留白居中。一行代码同时照顾大屏和小屏的阅读体验。(margin-inline 是逻辑属性,比老写法 margin: auto 更语义化,将来做多语言站、遇到从右往左的阿拉伯语排版还能自动适配。)

四、抠细节:功能都对了,"精致感"就差这几个地方

页面能不能让人觉得"这团队靠谱",往往就差这几个小地方。单拎出来都不起眼,缺了用户却能隐约觉得"这网站有点糙"。

11. hover 动效:B 端按钮"死板"和"有反馈",是两种专业度

做后台系统时,一个按钮鼠标移上去纹丝不动,和轻轻抬起来一点、透出个投影,给人的观感完全是两回事。加一点微妙的过渡,质感立刻上来:

代码语言:javascript
复制
.button {
  transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.button:hover {
  transform: translateY(-3px);            /* 轻轻抬起 */
  box-shadow: 0 6px 16px rgba(0,0,0,.12);  /* 顺带浮起个投影 */
}

原则是克制:位移别超过几个像素,时间 0.2~0.3 秒。动效是用来"暗示这里能交互"的,不是来抢戏的。再提醒一句:别偷懒写 transition: all,它会把所有属性都纳入过渡,偶尔会带来意料之外的卡顿,明确写出你要动的属性更稳。

12. cursor: pointer:用 div 假装按钮,最容易忘的一行

这条简单到有点好笑,但真的太容易忘。尤其当你图省事用 <div><span> 模拟一个按钮时,鼠标移上去还是个箭头,用户压根不知道它能点:

代码语言:javascript
复制
.clickable {
  cursor: pointer;
}

<button><a> 默认自带手型,但凡是你自己造的"假按钮",一定记得补上。一个光标形状,就是在悄悄告诉用户"这儿能点"。(当然,能用语义化的 <button> 就别用 <div> 硬凑,这是另一个话题了。)

13. 平滑滚动:落地页的"回到顶部""锚点导航",一行提升手感

营销落地页常有"锚点导航"——点一下"产品特性"就跳到对应区块。默认是"唰"地瞬移过去,很生硬;平滑滑过去就舒服多了。一行搞定:

代码语言:javascript
复制
html {
  scroll-behavior: smooth;
}

如果页面顶部还有个固定的吸顶导航,再补一句,避免跳过去时目标标题被导航挡住:

代码语言:javascript
复制
:target {
  scroll-margin-top: 80px;  /* 留出吸顶导航的高度 */
}

改动很小,用户却能明显感觉到"这页做得挺顺手"。

14. 收拾一下滚动条:后台侧边栏别顶着个"系统感"的粗条

做后台系统,侧边菜单一长就出滚动条,默认那个又粗又灰的条子,在精心设计的界面里特别突兀。稍微调一下就协调多了。现在标准属性已经能用,不用只靠 WebKit 私有写法:

代码语言:javascript
复制
/* 标准写法,Chrome 121+、Firefox 都支持 */
.sidebar {
  scrollbar-width: thin;
  scrollbar-color: #888 transparent;  /* 滑块色 轨道色 */
}

/* WebKit 老写法,需要更精细样式时用 */
.sidebar::-webkit-scrollbar {
  width: 8px;
}
.sidebar::-webkit-scrollbar-thumb {
  background: #888;
  border-radius: 10px;
}

我一般点到为止:细一点、颜色低调一点就够。它毕竟是配角,做得太花反而喧宾夺主。

15. 暗色模式:越来越多用户全天开着,靠第 2 条的变量顺手就支持了

现在挺多人手机、系统全天开暗色,你的站如果只有刺眼白底,一进来就想退出去。最省事的做法,是接着第 2 条那套 CSS 变量,用一个媒体查询整体切换:

代码语言:javascript
复制
:root {
  color-scheme: light dark;  /* 让表单控件、滚动条也跟着切主题 */
  --bg: #ffffff;
  --text: #1a1a1a;
}

@media (prefers-color-scheme: dark) {
  :root {
    --bg: #111111;
    --text: #f5f5f5;
  }
}

body {
  background: var(--bg);
  color: var(--text);
}

因为颜色全收在变量里,暗色模式只需要在媒体查询里重新赋值那几个变量,全站自动跟着变——这就是第 2 条那套习惯的"复利",前面偷的懒,这里连本带利还给你。别忘了加 color-scheme,它能让浏览器把默认的表单控件、滚动条也一起切成暗色,细节才算到位。

写在最后

你可能也发现了,这 15 个技巧没一个是复杂的。没有需要背的复杂 API,没有要引入的框架,大多就是一两行代码。但它们背后,都是一个个我真实踩过的坑:溢出的电商卡片、上线前要换色的深夜、参差不齐的商品图、被误点的信息流广告……

我一直觉得,CSS 写得好不好,不看你会多少冷门属性,而看你有没有把这些"稳的、可复用的"东西,沉淀成不用过脑子的习惯。地基(box-sizing、变量)打稳,布局(Flex / Grid / gap)分工明确,响应式(clamp / aspect-ratio / min)交给浏览器,再抠一抠细节,一个干净、耐看、好维护的站就成型了。

你要是正好在起新项目,挑几个抄进样式表试试。我敢打赌,用不了多久,它们也会变成你"每个项目都离不开"的那几行。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-07-22,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 一、先把地基打稳:这几个习惯,决定你后面少熬几个夜
    • 1. 全局 box-sizing: border-box——就是开头那个电商翻车救回来的一行
    • 2. CSS 变量:客户上线前一晚说"蓝色换成绿的",你还能笑得出来
    • 3. 留一小撮工具类:不多,但每个都是"高频救急"
  • 二、布局:Flexbox 和 Grid 分工干活,能省你一半代码
    • 4. Flexbox:那个曾经难倒一片人的"垂直居中",现在三行解决
    • 5. Grid:做后台仪表盘、商品墙,这一行顶半屏媒体查询
    • 6. gap:删掉那些丑陋的 :last-child,代码像做了次大扫除
  • 三、响应式:别再手动改断点,让浏览器自己去适配
    • 7. clamp():活动落地页的大标题,别在小屏手机上炸出屏幕
    • 8. aspect-ratio:电商商品图参差不齐?一行锁死比例
    • 9. 防"加载抖动":信息流广告图一跳,用户误点,投诉就来了
    • 10. min() 卡正文宽度:企业官网在大屏上,别让人读一行要甩头
  • 四、抠细节:功能都对了,"精致感"就差这几个地方
    • 11. hover 动效:B 端按钮"死板"和"有反馈",是两种专业度
    • 12. cursor: pointer:用 div 假装按钮,最容易忘的一行
    • 13. 平滑滚动:落地页的"回到顶部""锚点导航",一行提升手感
    • 14. 收拾一下滚动条:后台侧边栏别顶着个"系统感"的粗条
    • 15. 暗色模式:越来越多用户全天开着,靠第 2 条的变量顺手就支持了
  • 写在最后
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档