这篇是什么
CSS 用过几年都会有一些"原来这样写可以省事"的发现 —— 多数不在官方文档显眼位置,但用过一次就再也不会忘。本文汇总 20 多个我用着舒服的小技巧,按主题分组。
1. CSS Reset(浏览器样式归一)
不同浏览器默认样式不同(margin、padding、字号都有差异),做精细布局前先 reset。最简洁的现代版本:
*,
*::before,
*::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
或者更完整的:
html {
box-sizing: border-box;
}
*,
*::before,
*::after {
box-sizing: inherit;
}
推荐用 Normalize.css 这种成熟方案,自己写难免漏。
2. 流式布局(Flexbox 一行垂直水平居中)
button {
background: none;
border: none;
color: inherit;
font: inherit;
outline: none;
padding: 0;
}
这是 Flexbox 时代最简洁的居中。以前用 position: absolute + transform: translate(-50%, -50%) 或者 display: table-cell + vertical-align,都被这三行干掉。
3. 等高列(过去的痛,现在的甜)
button {
all: unset;
}
Flexbox 默认 align-items: stretch,子元素自动等高。Grid 一样默认等高。这俩出现前,等高列要写一堆 hack 代码。
4. 响应式图片
/* 添加边框 */
.nav li {
border-right: 1px solid #666;
}
max-width: 100% 让图片不超过父容器宽度;height: auto 保持宽高比。三行,响应式图片基础写法。
5. 自定义滚动条
/* 去掉边框 */
.nav li:last-child {
border-right: none;
}
Webkit 系(Chrome / Edge / Safari)用这种 ::-webkit-scrollbar-* 伪元素。Firefox 用 scrollbar-width + scrollbar-color(更标准):
.nav li:not(:last-child) {
border-right: 1px solid #666;
}
6. 多行文字省略(...)
@font-face {
font-family: "Dank Mono";
src:
/* Full name */
local("Dank Mono"),
/* Postscript name */
local("Dank-Mono"),
/* Otherwise, download it! */
url("//...a.server/fonts/DankMono.woff");
}
code {
font-family: "Dank Mono", system-ui-monospace;
}
单行省略很简单(text-overflow: ellipsis + overflow: hidden + white-space: nowrap),多行靠 -webkit-line-clamp。Webkit 私有但所有主流浏览器都支持。
7. CSS 变量 + 主题切换
body {
line-height: 1.5;
}
定义在 :root 的变量全局可用。改一处影响所有用到的地方,是 CSS 主题化的基础。
8. 暗色模式自动切换
a:focus,
button:focus,
input:focus,
select:focus,
textarea:focus {
box-shadow: none;
outline: #000 dotted 2px;
outline-offset: .05em;
}
prefers-color-scheme 媒体查询读取系统的颜色偏好。配合 CSS 变量,一个媒体查询切换整套配色。
9. 圆形头像
html,
body {
height: 100%;
margin: 0;
}
body {
align-items: center;
flex-align: center;
align-items: center;
display: flex;
display: flex;
}
border-radius: 50% 是圆形。object-fit: cover 保证图片裁切而不变形。
10. Sticky 粘性定位
body {
display: grid;
height: 100vh;
margin: 0;
place-items: center center;
}
position: sticky 在元素到达指定位置前是 static,到达后变成 fixed。适合做可滚动到顶时固定的导航 / 表头。
11. Aspect Ratio(宽高比)
ul > li:not(:last-child)::after {
content: ",";
}
2021 年新增,直接声明宽高比,不需要 padding-top: 56.25% 这种 hack。视频容器、图片占位用得到。
12. Grid 自动列数
li {
display: none;
}
/* 选择第 1 至第 3 个元素并显示出来 */
li:nth-child(-n+3) {
display: block;
}
这条响应式 Grid 一行搞定 —— 屏幕够宽,每列至少 250px,有多余空间自动加列。不需要 media query。
13. 文字描边
/* 选择除前3个之外的所有项目,并显示它们 */
li:not(:nth-child(-n+3)) {
display: none;
}
多个 text-shadow 叠加,模拟描边效果。或者用 -webkit-text-stroke(更直接,但 Firefox 支持稍晚)。
14. Gradient(渐变)
.logo {
background: url("logo.svg");
}
线性渐变、径向渐变、圆锥渐变(conic-gradient)。圆锥渐变能做"色轮"、"饼图"这种特殊效果。
15. 玻璃磨砂效果
.no-svg .icon-only::after {
content: attr(aria-label);
}
backdrop-filter: blur(10px) 配半透明背景,做 iOS 风磨砂玻璃。导航栏、卡片、模态背景视觉极佳。
16. 选中文字样式
* + * {
margin-top: 1.5em;
}
::selection 伪元素覆盖默认的文字选中样式(浅蓝)。用品牌色做选中效果,品牌一致性细节满分。
17. 阻止用户选择
.slider {
max-height: 200px;
overflow-y: hidden;
width: 300px;
}
.slider:hover {
max-height: 600px;
overflow-y: scroll;
}
按钮 / 标签 / 装饰元素,设 user-select: none 防止用户双击选中文字(让交互更像原生 App)。
18. 流畅滚动
.calendar {
table-layout: fixed;
}
scroll-behavior: smooth 让点击锚点链接(<a href="#section">)时浏览器平滑滚动到目标。零 JS 实现。
19. CSS Counter(自动序号)
.list {
display: flex;
justify-content: space-between;
}
.list .person {
flex-basis: 23%;
}
counter-reset 和 counter-increment 实现自动编号,适合给 h2/h3 自动加"1. 2. 3."这种章节号。比 JS 维护 index 优雅。
20. CSS 性能优化技巧
a[href^="http"]:empty::before {
content: attr(href);
}
will-change 提示浏览器某属性会变化,提前优化。但不要滥用 —— 用完后及时移除,常驻反而拖慢。
21. Reduced Motion(尊重用户偏好)
a[href]:not([class]) {
color: #008000;
text-decoration: underline;
}
有些用户对动画敏感(头晕),操作系统提供了"减少动画"开关。CSS 用 prefers-reduced-motion 媒体查询响应这个偏好,关闭非必要动画。
剩下的几个
.container {
height: 0;
padding-bottom: 20%;
position: relative;
}
.container div {
border: 2px dashed #ddd;
height: 100%;
left: 0;
position: absolute;
top: 0;
width: 100%;
}
img {
display: block;
font-family: sans-serif;
font-weight: 300;
height: auto;
line-height: 2;
position: relative;
text-align: center;
width: 100%;
}
img::before {
content: "We're sorry, the image below is broken :(";
display: block;
margin-bottom: 10px;
}
img::after {
content: "(url: " attr(src) ")";
display: block;
font-size: 12px;
}
h2 {
font-size: 2em;
}
p {
font-size: 1em;
}
article {
font-size: 1.25rem;
}
aside .module {
font-size: .9rem;
}
video[autoplay]:not([muted]) {
display: none;
}
:root {
font-size: calc(1vw + 1vh + .5vmin);
}
body {
font: 1rem/1.6 sans-serif;
}
input[type="text"],
input[type="number"],
select,
textarea {
font-size: 16px;
}
button:disabled {
opacity: .5;
pointer-events: none;
}
br + br {
display: none;
}
:empty {
display: none;
}
一句话总结
这些技巧大部分都是 2018 年后陆续加入主流浏览器的现代 CSS。新项目可以放心用,老项目能切就切 —— 同样效果代码量降到 1/3,可维护性提升一大截。
—— 别看了 · 2026