
写了这么多年前端,这 15 个 CSS 技巧我几乎每个项目都在用
先讲个真事。
有次接了个电商项目,商品列表页做的两列卡片,我在自己电脑上看得好好的,一提测就炸了——测试那边截图给我,卡片挤成了一坨,右边一列直接被挤到下一行去了。我盯着代码看了十分钟没看出问题,明明每列都是 width: 50%,怎么会溢出?
后来才反应过来:卡片加了 padding 和 border,两个 50% 一加内边距,实际宽度早就超过 100% 了。改一行全局样式,问题瞬间消失。
那一刻我意识到,前端做久了,真正天天在用、真正救过命的,往往不是什么高级特性,而是这么一撮朴素到不起眼的小技巧。它们不炫技,但每个都对应着一个"我曾经在这里踩过坑"的真实场景。
这篇我就把这 15 个技巧摊开讲——不堆术语,尽量还原每个技巧是在什么业务场景下、解决了什么实际问题。你要是也做过类似的项目,应该会频频点头。
一、先把地基打稳:这几个习惯,决定你后面少熬几个夜
1. 全局 box-sizing: border-box——就是开头那个电商翻车救回来的一行
回到开头的故事。CSS 默认的盒模型是 content-box,意思是你写的 width 只算内容区,padding 和 border 都往外撑。所以两列 50% 的卡片一加内边距,实际就超宽了。
解法就是新项目第一件事,加上这三行:
css*,
*::before,
*::after {
box-sizing: border-box;
}border-box 把逻辑反过来:你写的 width 就是元素最终占的宽度,padding 和 border 都算在里面、往里挤。所见即所得。
codecontent-box(默认,会翻车) border-box(推荐)
───────────────────── ─────────────────────
width: 50% width: 50%
+ padding 20px×2 ← 往外撑 (padding、border 都算进 50% 里)
+ border 1px×2
= 实际 > 50% → 溢出换行! = 实际就是 50% → 稳稳两列一行成本,从此栅格、卡片、表单再也不会因为内边距莫名其妙撑破。这是我唯一一个"闭着眼睛也要写"的技巧。
2. CSS 变量:客户上线前一晚说"蓝色换成绿的",你还能笑得出来
做过外包的都懂这种恐惧。项目临上线,客户甩来一句"我们品牌色改了,全站的蓝换成墨绿"。要是主色散落在几十个文件里,那一晚基本别睡了,还大概率漏改几个地方第二天被抓。
被坑过一次之后,我现在所有会变的值,一律先收进 :root:
css: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 那种"万物皆原子类"的信徒,但手边确实常备几个小工具类,都是那种每个页面都要用一次的:
css.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 垂直水平居中"能在面试里筛掉一半人的年代吗?就是被这三行终结的:
css.container {
display: flex;
justify-content: center; /* 主轴(横向)居中 */
align-items: center; /* 交叉轴(纵向)居中 */
}凡是沿一个方向排队的东西——一行按钮、一条顶部导航、一个要居中的登录框——我第一反应都是 Flex。导航栏想让 logo 靠左、菜单靠右?把 center 换成 space-between,一行搞定,不用任何浮动。
5. Grid:做后台仪表盘、商品墙,这一行顶半屏媒体查询
一旦行和列要同时管——电商的商品墙、后台的数据卡片、多栏的落地页——Grid 才是主角。而下面这一行,是我用得最多、也最想安利给你的"响应式咒语":
css.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
}翻译成人话:每列最少 250px,屏幕能塞几列就塞几列,剩余空间平分。大屏自动排四列、平板排两列、手机排一列,一句媒体查询都不用写。
我上个后台项目的首页数据卡片就是这么排的,产品经理后来加了三张新卡片,我一行代码没动,布局自己就把新卡片安排得整整齐齐。那一刻真的会爱上 Grid。
具体选 Flex 还是 Grid,我一般这么判断:
code 你要排的东西是……
│
┌─────────────┴─────────────┐
▼ ▼
沿一个方向排队 行、列都要对齐
(导航 / 按钮组 / 居中) (商品墙 / 后台卡片)
│ │
▼ ▼
👉 用 Flexbox 👉 用 Grid
│ │
└──────────┬────────────────┘
▼
元素之间的间距,统统交给 gap6. gap:删掉那些丑陋的 :last-child,代码像做了次大扫除
这是我这两年改得最爽的一个习惯。以前排一组标签、一行按钮,靠给每个元素加 margin-right,然后还得单独写 :last-child { margin-right: 0 } 把最后一个的多余间距抹掉,丑,还老漏。
现在 Flex、Grid 都支持 gap,容器上写一行就完事:
css.tag-list {
display: flex;
flex-wrap: wrap;
gap: 12px; /* 元素之间自动留 12px,首尾不多不少 */
}gap 只管"元素与元素之间",容器边缘不会多出空白,也彻底不用惦记 :last-child。我上次重构一个老页面,光是删掉那些 :not(:last-child) 的边距选择器,就砍掉了几十行样式——那种清爽感,写过的人才懂。
三、响应式:别再手动改断点,让浏览器自己去适配
真正省心的响应式,是把"适配"这活儿外包给浏览器。下面这几个,就是干这个的。
7. clamp():活动落地页的大标题,别在小屏手机上炸出屏幕
做过活动落地页的都遇到过:设计稿给的主标题在 iPhone 上美美的,一到某款小屏安卓机,标题字太大直接换行、甚至溢出屏幕,丑得没眼看。以前的解法是配好几个断点手动改字号,媒体查询写一大串,中间尺寸还是会"卡"。
现在我只写一行:
cssh1 {
font-size: clamp(2rem, 5vw, 4rem);
/* 最小 跟随视口 最大 */
}三个参数是"下限、跟着屏幕宽度走的值、上限"。字号会在 2rem 到 4rem 之间平滑地随屏幕缩放:再小的手机也不会大到溢出,再大的屏也不会小得可怜。标题、副标题、区块间距我现在都爱用它,落地页的响应式媒体查询直接砍掉一大半。
8. aspect-ratio:电商商品图参差不齐?一行锁死比例
电商、内容站最常见的糟心事:运营上传的图片尺寸五花八门,有的正方形有的长条,排进列表里高高低低像狗啃的。过去要用 padding-top 百分比那套 hack 撑比例,写起来别扭还难懂。现在原生属性一步到位:
css.card img {
width: 100%;
aspect-ratio: 16 / 9; /* 强制统一成 16:9 */
object-fit: cover; /* 裁剪填充,绝不拉伸变形 */
}不管运营传来的是什么奇葩尺寸,都会被规整成整齐的 16:9,cover 保证画面填满又不变形。整个列表瞬间对齐——这一个属性,能帮你挡下无数次跟运营"能不能按规范传图"的扯皮。
9. 防"加载抖动":信息流广告图一跳,用户误点,投诉就来了
这个坑坑过我一次,印象特别深。内容信息流里插了张广告图,加载慢半拍,图片一出来把下面的正文和按钮往下一挤——用户手指正好点下去,点到了广告,投诉说"我明明想点别的"。这就是典型的累计布局偏移(CLS)。
基础防护是给图片定好显示方式:
cssimg {
display: block;
max-width: 100%;
height: auto;
}但真正关键的一步,是在 HTML 里给图片写死 width 和 height 属性(或者用上面第 8 条的 aspect-ratio)。浏览器提前知道图占多大,加载前就把坑位留好,图片填进来时下面的内容纹丝不动。顺带一提,CLS 还是 Google 核心网页指标之一,抠好了对 SEO 排名也有实打实的加分。
10. min() 卡正文宽度:企业官网在大屏上,别让人读一行要甩头
做企业官网、博客这类内容站时,如果段落在 27 寸大屏上横向铺满,一行文字长得读完要转头,眼睛特别累,专业度也掉一截。我习惯给内容容器加一层宽度限制:
css.container {
width: min(1100px, 90%); /* 小屏占 90%,大屏最多 1100px */
margin-inline: auto; /* 水平居中 */
}min(1100px, 90%) 会自动取两者里更小的那个:小屏幕用 90% 宽、留出舒服的边距;大屏幕顶到 1100px 就不再变宽,两侧自动留白居中。一行代码同时照顾大屏和小屏的阅读体验。(margin-inline 是逻辑属性,比老写法 margin: auto 更语义化,将来做多语言站、遇到从右往左的阿拉伯语排版还能自动适配。)
四、抠细节:功能都对了,"精致感"就差这几个地方
页面能不能让人觉得"这团队靠谱",往往就差这几个小地方。单拎出来都不起眼,缺了用户却能隐约觉得"这网站有点糙"。
11. hover 动效:B 端按钮"死板"和"有反馈",是两种专业度
做后台系统时,一个按钮鼠标移上去纹丝不动,和轻轻抬起来一点、透出个投影,给人的观感完全是两回事。加一点微妙的过渡,质感立刻上来:
css.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> 模拟一个按钮时,鼠标移上去还是个箭头,用户压根不知道它能点:
css.clickable {
cursor: pointer;
}<button>、<a> 默认自带手型,但凡是你自己造的"假按钮",一定记得补上。一个光标形状,就是在悄悄告诉用户"这儿能点"。(当然,能用语义化的 <button> 就别用 <div> 硬凑,这是另一个话题了。)
13. 平滑滚动:落地页的"回到顶部""锚点导航",一行提升手感
营销落地页常有"锚点导航"——点一下"产品特性"就跳到对应区块。默认是"唰"地瞬移过去,很生硬;平滑滑过去就舒服多了。一行搞定:
csshtml {
scroll-behavior: smooth;
}如果页面顶部还有个固定的吸顶导航,再补一句,避免跳过去时目标标题被导航挡住:
css:target {
scroll-margin-top: 80px; /* 留出吸顶导航的高度 */
}改动很小,用户却能明显感觉到"这页做得挺顺手"。
14. 收拾一下滚动条:后台侧边栏别顶着个"系统感"的粗条
做后台系统,侧边菜单一长就出滚动条,默认那个又粗又灰的条子,在精心设计的界面里特别突兀。稍微调一下就协调多了。现在标准属性已经能用,不用只靠 WebKit 私有写法:
css/* 标准写法,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 变量,用一个媒体查询整体切换:
css: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)交给浏览器,再抠一抠细节,一个干净、耐看、好维护的站就成型了。
你要是正好在起新项目,挑几个抄进样式表试试。我敢打赌,用不了多久,它们也会变成你"每个项目都离不开"的那几行。
如果这篇对你有帮助,欢迎关注公众号「前端达人」,每周更新实用前端干货。

