高效强悍的 CSS 技巧清单

作者: jie 分类: CSS 发布时间: 2025-11-11 17:58

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-sliceborder-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 提供了原生而优雅的方案。

::scroll-button() 

为可溢出容器直接添加可访问的滚动按钮。不再需要额外的 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 lchin 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;
	}
}

发表回复