多行省略 + 中英文换行
适合文章卡片、商品标题、日志描述。
.title { display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; word-break:break-word; }CSS 是一门看似简单实则深奥的语言。掌握这些实用技巧,让你的样式代码更优雅、更高效、更强大——从入门到精通的 28 个实用技巧。
使用 Flexbox 的三行代码实现水平垂直居中,告别古老的 margin:auto + position 方案。
使用 CSS Grid 实现经典的"圣杯布局":页眉、页脚、三栏内容,中间自适应。比 Flexbox 更简洁。
CSS Grid 的 masonry 布局(Firefox 已支持),无需 JavaScript 库即可实现 Pinterest 式瀑布流。
子网格继承父网格的轨道大小,实现完美对齐的嵌套布局,特别适合卡片列表和表单。
使用自定义 cubic-bezier 实现自然流畅的动画。推荐几个实用的缓动曲线。
CSS Scroll-driven Animations 让动画与滚动进度绑定,无需 JavaScript 即可实现视差和入场动画。
利用 steps() 实现逐帧动画,适合精灵图动画和打字机效果。结合 animation-delay 实现序列动画。
利用 perspective 和 transform-style: preserve-3d 实现卡片翻转、立方体等 3D 效果。
根据容器尺寸而非视口尺寸调整样式,真正实现组件级别的响应式设计。
使用 clamp() 实现无需媒体查询的流体排版,字体大小随视口平滑变化。
使用范围语法和逻辑运算符编写更清晰的媒体查询。支持交互类型检测。
利用 auto-fill 和 minmax 实现自动适应容器的网格,无需任何媒体查询。
backdrop-filter 实现毛玻璃效果,配合 rgba 背景营造高级的玻璃拟态卡片。
CSS 渐变可以创造丰富的背景效果,从简单的线性渐变到复杂的锥形渐变和图案纹理。
clip-path 可以将元素裁剪为任意形状,结合动画实现炫酷的过渡效果。
CSS mask 结合渐变实现图片的边缘淡出、文字遮罩和高光扫动效果。
提前告知浏览器哪些属性将变化,让浏览器做好优化准备。但不要滥用,否则会浪费内存。
contain 限制浏览器的布局/样式/绘制的计算范围,content-visibility 延迟渲染屏幕外的元素。
知道哪些 CSS 属性触发布局/绘制/合成,优先使用仅触发合成的属性(transform、opacity)。
批量读取 DOM 属性、使用 class 切换替代内联样式、通过 requestAnimationFrame 批量更新。
单行和多行文本溢出显示省略号的纯 CSS 实现。多行省略仍需要 -webkit-line-clamp。
使用 aspect-ratio 轻松保持元素宽高比,告别 padding-bottom hack。
一行 CSS 实现页面内的平滑滚动锚点跳转,无需任何 JavaScript。
使用新标准 scrollbar-color / scrollbar-width 简化自定义滚动条,兼容现代浏览器。
利用 CSS 自定义属性(变量)实现一键换肤,结合 JS 动态切换主题。
使用 :has()、:is()、:where() 现代选择器编写更简洁、更强大的样式规则。
水平垂直居中按场景选写法:常规内容用 flex / grid,浮层弹窗用 absolute,定宽高元素用 margin:auto,单行文本用 line-height。
一行解决的高频小需求,每条都带一个易踩的坑位提示,可直接粘进项目。
适合文章卡片、商品标题、日志描述。
.title { display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; word-break:break-word; }页面内容不足一屏时页脚仍贴底。
body { min-height:100vh; display:flex; flex-direction:column; }
main { flex:1; }科技感卡片边框,避免额外 DOM。
.card { border:1px solid transparent; background:linear-gradient(#111,#111) padding-box, linear-gradient(135deg,#5d9743,#60a5fa) border-box; }长列表/长文档首屏性能优化。
.below-fold { content-visibility:auto; contain-intrinsic-size: 400px; }适合父级根据子元素状态变化样式。旧浏览器需要 JS class 兜底,避免用于核心流程。
适合组件级响应式。需要给容器声明 container-type,否则查询不生效。
适合渐进增强。未支持时应保留普通 transition 或 IntersectionObserver 方案。
兼容性仍需验证。生产环境建议准备 CSS Grid/Flex fallback。
根据后代/后续节点的状态选中父元素,表单校验高亮、卡片含图布局不再依赖 JS。避免在子树高频变化的区域使用,防止样式反复重算。
.card:has(img) { padding-top: 0; }
.form-item:has(input:user-invalid) { border-color: #dc2626; }
label:has(input:checked) { color: var(--primary); }组件按自身容器宽度响应,同一组件放进侧栏或主区域自动切换形态,比媒体查询更贴合组件化开发。
.card-wrap { container-type: inline-size; }
@container card (min-width: 480px) {
.card { display: grid; grid-template-columns: 120px 1fr; }
}子元素继承父网格的轨道尺寸,多卡片里的标题、正文、按钮跨卡片天然对齐,是解决"卡片底部不对齐"的最优解。
.cards {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
gap: 16px;
}
.card {
grid-row: span 3;
display: grid;
grid-template-rows: subgrid;
}一行代码让复选框、单选框、进度条等原生控件和输入光标跟随品牌色,无需再自定义控件。
:root { accent-color: #5d9743; caret-color: #60a5fa; }
input[type="checkbox"],
input[type="radio"],
progress { accent-color: #5d9743; }用层级显式声明样式优先级:reset、base、components、utilities 各归其层,先声明的层优先级低,不再堆 !important 和选择器权重。
@layer reset, base, components, utilities;
@layer reset { * { margin: 0; box-sizing: border-box; } }
@layer components { .btn { padding: 8px 16px; } }
@layer utilities { .mt-8 { margin-top: 8px; } }这两个属性由合成器线程直接处理,跳过布局与绘制、不占用主线程——这是动画保持 60fps 的根本原则。
/* ❌ 触发重排 */
.box { transition: left .3s, width .3s; }
/* ✅ 仅合成 */
.box { transition: transform .3s, opacity .3s; }只给"马上要动画"的元素添加,动画结束后移除;对大量元素常驻 will-change 会占用大量显存,反而更慢。
.modal.animating { will-change: transform, opacity; }
.modal.done { will-change: auto; }尊重系统"减弱动态效果"设置,为眩晕症等用户关闭装饰性动画,是动画上线前的无障碍底线。
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: .01ms !important;
transition-duration: .01ms !important;
}
}First 记录起点位置 → Last 变更后记录终点 → Invert 用 transform 反向偏移 → Play 过渡归零,实现列表重排的丝滑动画。
const first = el.getBoundingClientRect();
/* ...数据变更、DOM 重排... */
const last = el.getBoundingClientRect();
const dy = first.top - last.top;
el.style.transform = `translateY(${dy}px)`;
requestAnimationFrame(() => {
el.style.transition = 'transform .3s';
el.style.transform = '';
});现代浏览器对主流特性已基本免前缀,仅 backdrop-filter 等少数属性仍需 -webkit-。统一交给 Autoprefixer + browserslist 自动处理,不要手写维护前缀。
data-theme 属性驱动变量覆盖,一行 JS 切换主题,再用媒体查询兜底跟随系统。
:root { --bg: #ffffff; --text: #1e293b; --primary: #5d9743; }
[data-theme="dark"] { --bg: #0c1220; --text: #f1f5f9; --primary: #6a9f52; }
body { background: var(--bg); color: var(--text); }
/* JS 切换 */
document.documentElement.dataset.theme = 'dark';
/* 跟随系统兜底 */
@media (prefers-color-scheme: dark) {
:root:not([data-theme]) { --bg: #0c1220; --text: #f1f5f9; }
}