高效强悍的 CSS 技巧清单
CSS 的进化速度令人咋舌。许多曾经需要复杂 JavaScript 库或图形工具才能实现的效果,如今只需几行样式即可拿下。全新的函数与伪元素让我们在性能、可访问性与交互性上同时起飞。下面就带你领略一批值得收入“前端兵工厂”的现代 CSS 工具。
⚡ 动态元素控制
过去,想根据兄弟元素的数量或顺序来定制样式,不得不写一堆 :nth-child() 选择器,甚至直接上 JavaScript。现在,CSS 本身就能处理这些“自适应”布局。
sibling-count()
返回同一层级下(包含自身)的元素总数。非常适合用于动态网格或菜单:宽度/间距随兄弟数量自动变化。
用例: 列表项自动平分可用宽度,数量多少都不影响布局。
/* 根据兄弟数量动态分配宽度 */
ul li {
width: calc(100% / sibling-count());
transition: width 0.3s ease;
}
/* 响应式间距 */
.grid-item {
flex: 1 1 calc(100% / sibling-count());
margin: calc(10px / sibling-count());
}
sibling-index()
返回当前元素在兄弟中的位置(从 1 开始)。与 :nth-child() 类似,但 sibling-index() 可嵌入 calc() 等函数,因此可以做更灵活的数学计算。
用例: 制作层层错位的“扇形”排布,或给序列动画自动生成延迟。
ul li {
position: relative;
/* 让每个 li 依次向右错位 */
transform: translateX(calc((sibling-index() - 1) * 15px));
/* 动画延迟自然递增,无需 JS */
animation-delay: calc(sibling-index() * 100ms);
}
下一代响应式图片与布局
现代 CSS 在图像与尺寸管理上越来越灵活,能够同时解决分辨率适配与元素自适应等问题。
image-set()
CSS 里的“背景版 srcset”。浏览器会按屏幕分辨率(1x/2x)或格式(type)选择最佳背景图。
为什么重要: 为 Retina 屏提供高分图;为现代浏览器优先用 AVIF/WebP,并为老浏览器优雅降级到 JPEG。
.hero-banner {
/* 浏览器会挑选最合适的资源 */
background-image: image-set(url("banner.avif") type("image/avif"),
url("banner.webp") type("image/webp"),
url("banner-high-res.jpg") 2x,
url("banner-low-res.jpg") 1x);
}
conic-gradient()
不同于线性/径向渐变,锥形渐变围绕中心点旋转过渡,像从上向下看圆锥。
用例: 不借助图片或 SVG,纯 CSS 画饼图、色轮、独特放射背景。
.pie-chart {
width: 200px;
height: 200px;
border-radius: 50%;
background: conic-gradient(gold 0% 40%,
/* 40% 区段为金色 */
deepskyblue 40% 75%,
/* 接着 35% 浅蓝 */
lightcoral 75% 100%
/* 剩余 25% 珊瑚色 */
);
}
fit-content()
将尺寸逻辑合为一个实用“公式”:min(max-content, max(min-content, <length-percentage>))。
直白说: “宽到刚好放下内容(max-content),但不超过指定上限(如 200px),也别比最小可能宽度(min-content)更小。”
在 CSS Grid 中定义灵活轨道大小尤其好用,用于侧栏或分区。
.container {
display: grid;
grid-template-columns:
1fr fit-content(200px)
/* 侧栏:够用即止,上限 200px */
1fr;
gap: 1rem;
}
/* 用例:只占所需空间的响应式侧栏 */
.layout {
grid-template-columns:
fit-content(300px) 1fr;
}
radial-gradient()
从某个起点向四周辐射过渡,可为圆形或椭圆。叠加多个径向渐变即可合成细腻而自然的光晕/极光背景。
用例: 生成动态背景、复杂投影效果,无需外部资源。
.aurora {
background: radial-gradient(circle at 20% 20%, #ff00cc, transparent 40%),
radial-gradient(circle at 80% 30%, #00f0ff, transparent 40%),
radial-gradient(circle at 50% 80%, #ffea00, transparent 40%);
background-color: #05010f;
background-size: 200% 200%;
animation: aurora 12s linear infinite;
}
@keyframes aurora {
0% {
background-position: 0% 0%;
}
50% {
background-position: 100% 100%;
}
100% {
background-position: 0% 0%;
}
}
repeating-linear-gradient()
自动重复线性渐变图案。打造条纹、棋盘格、动态加载条等既高效又易动画的背景。
用例: 高性能、可动画的条纹 Loader/进度条/装饰纹理。
.loader {
width: 200px;
height: 20px;
background: repeating-linear-gradient(45deg,
#23a6d5,
#23a6d5 10px,
#23d5ab 10px,
#23d5ab 20px);
background-size: 200% 200%;
animation: stripes 2s linear infinite;
}
border-image-source
允许用图片、SVG、渐变作为元素边框,远超单色描边,轻松实现华丽边框。
工作原理:border-image-source 指定源,配合 border-image-slice、border-image-width 控制切片与平铺。
/* 渐变边框 */
.fancy-box {
border: 10px solid transparent;
/* 必需 */
border-image-source: linear-gradient(to right, red, yellow, green);
border-image-slice: 1;
}
/* 使用自定义边框贴图 */
.framed-photo {
border: 20px solid transparent;
border-image-source: url("decorative-frame.jpg");
border-image-slice: 30;
border-image-repeat: repeat;
}
原生无缝的导航与滚动
多年来,为了轮播、滑块与自定义滚动,我们频繁依赖 JS,带来性能与可访问性负担。如今,CSS 提供了原生而优雅的方案。
为可溢出容器直接添加可访问的滚动按钮。不再需要额外的 div + 事件监听模拟按钮。
如何使用: 指定方向(up/down/left/right),设置按钮内容(文本/图标/符号)即可。
/* 水平容器示例 */
.carousel::scroll-button(left) {
content: "⬅";
/* 尺寸、色彩、背景自由定制 */
}
.carousel::scroll-button(right) {
content: "⮕";
}
::scroll-marker 与 scroll-marker-group
把滚动控制提升到新层级:可为容器的子元素生成指示标记(如轮播的圆点)。点击标记可平滑滚动至对应内容。
scroll-marker-group:为容器启用标记组,before/after指定标记组出现位置。::scroll-marker:样式化标记本身(圆点/方块/任意形态)。
/* 为轮播启用指示器 */
.scroll-container {
scroll-marker-group: after;
scroll-snap-type: x mandatory;
/* 体验更好 */
}
/* 标记样式 */
.scroll-container::scroll-marker {
content: "";
/* 必需 */
width: 12px;
height: 12px;
border-radius: 50%;
border: 2px solid grey;
background-color: white;
}
/* 激活态标记 */
.scroll-container::scroll-marker:active,
.scroll-container::scroll-marker:current {
background-color: dodgerblue;
border-color: dodgerblue;
}为什么重要: 原生即意味着高性能、连贯、无障碍友好(键盘/读屏器“开箱即用”)。

专业级排版与打印
CSS 早已不止面向屏幕。以下能力让你对打印样式与多色字体拥有精细控制。
@font-palette-values
为多色字体(COLR/SVG)定制/替换内置色板。你可选用字体预设色板,或自定义新调色。
怎么用: 声明自定义色板名(用 -- 前缀),指定 font-family,通过 override-colors 将色板索引(如 0、1)映射到新颜色(可用 lch/rgb 等)。最后用 font-palette 应用该色板。
@font-palette-values --corporate {
font-family: "Bungee Spice";
override-colors:
0 lch(50% 100 40),
1 lch(80% 90 290);
}
h1 {
font-family: "Bungee Spice";
font-palette: --corporate;
/* 应用自定义色板 */
}
palette-mix()
在自定义色板基础上,混合两个字体色板(内置或自定义),生成新的 font-palette 值。
强大之处: 结合用户偏好、明暗模式或品牌主题,做高保真字体配色。可控制混合比例与色彩空间(如 in lch、in srgb)。
/* 混合字体内置色板 */
h2 {
font-palette: palette-mix(in lch, normal, dark);
}
/* 混合作者自定义色板 */
.themed-header {
font-palette: palette-mix(in lch, --blues 70%, --yellows 30%);
}
orphans 与 widows 📄
打印时避免一段文字的单行被孤零零地留在分页边缘。
- Orphan(孤行):段落首行留在页底。
orphans设定页底至少保留的行数。 - Widow(寡行):段落末行留在新页顶部。
widows设定新页顶部至少保留的行数。
@media print {
p {
orphans: 3;
/* 页底至少保留 3 行 */
widows: 2;
/* 新页顶部至少保留 2 行 */
}
}Press enter or click to view image in full size
print-color-adjust
默认下,浏览器为“省墨”常忽略背景色/背景图。print-color-adjust 可强制还原屏幕效果。
economy(默认):浏览器可自行优化(通常忽略背景)。exact:严格按屏幕显示打印,包括背景与色彩。
@media print {
.important-section {
print-color-adjust: exact;
/* 背景照打 */
background-color: #f0f8ff;
}
}
