10个实用CSS技巧精选:从父选择器到毛玻璃效果
本文精选10个兼容性较好的现代CSS技巧,涵盖:has()、容器查询、scroll-snap、backdrop-filter、aspect-ratio、is()/where()、color-mix()、text-wrap balance、subgrid、layer。每个技巧都配有代码和效果说明,可直接用于项目。
一、:has() 父选择器
作用:根据子元素状态选择父元素,实现“父随子变”的效果。
效果:卡片内有图片时添加圆角,有链接时添加悬停效果;表单有错误输入时添加红框。
/* 有图片的卡片加圆角 */
.card:has(img) {
border-radius: 12px;
}
/* 有未填必填项的表单加红框 */
form:has(input:invalid:not(:placeholder-shown)) {
border: 2px solid #f56c6c;
}
/* 有选中项的列表项高亮 */
li:has(input:checked) {
background: #e6f7ff;
}二、容器查询 @container
作用:根据容器宽度而非视口宽度应用样式,更适合组件级响应式设计。
效果:侧边栏变窄时,内部卡片自动从横向布局切换为纵向布局。
.sidebar {
container-type: inline-size;
container-name: sidebar;
}
@container sidebar (max-width: 400px) {
.card {
flex-direction: column;
}
.card img {
width: 100%;
}
}<div class="sidebar">
<div class="card">
<img src="..." alt="" />
<div class="content">...</div>
</div>
</div>三、scroll-snap 滚动吸附
作用:实现轮播图、横向滚动列表“一屏一停”的吸附效果。
效果:横向滚动时,每次滚动结束后自动对齐到某一项。
.scroll-container {
display: flex;
overflow-x: auto;
scroll-snap-type: x mandatory;
gap: 16px;
}
.scroll-container > * {
scroll-snap-align: start;
flex-shrink: 0;
}四、backdrop-filter 毛玻璃效果
作用:对元素背后的内容进行模糊、亮度等滤镜处理,实现毛玻璃效果。
效果:导航栏、弹窗背景呈现半透明且模糊的效果,类似 iOS 毛玻璃风格。
.navbar {
background: rgba(255, 255, 255, 0.6);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
}
.modal-overlay {
background: rgba(0, 0, 0, 0.3);
backdrop-filter: blur(4px);
}五、aspect-ratio 宽高比
作用:直接指定元素的宽高比,无需使用 padding hack 方案。
效果:图片、视频、卡片统一为 16:9 或 1:1 比例,布局更整齐。
.video-wrapper {
aspect-ratio: 16 / 9;
width: 100%;
}
.avatar {
aspect-ratio: 1;
width: 48px;
border-radius: 50%;
}六、:is() 与 :where() 简化选择器
作用:合并多个选择器的公共部分。:where() 权重为 0,:is() 取列表中最高的权重。
效果:减少重复代码,:where() 适合编写低优先级覆盖样式。
/* 传统写法冗长 */
header h1, header h2, header h3,
main h1, main h2, main h3 {
margin-top: 0;
}
/* :is() 简化写法 */
:is(header, main) :is(h1, h2, h3) {
margin-top: 0;
}
/* :where() 权重为 0,便于覆盖 */
:where(.card) h2 {
font-size: 1rem;
}
.card h2 {
font-size: 1.25rem; /* 可轻松覆盖上方样式 */
}七、color-mix() 颜色混合
作用:在 CSS 中直接混合两种颜色,无需预处理器计算。
效果:主题色与白色或黑色混合得到浅色、深色变体;实现 hover 时颜色加深的效果。
:root {
--primary: #1890ff;
}
.button {
background: var(--primary);
}
.button:hover {
background: color-mix(in srgb, var(--primary) 80%, black);
}
.card {
background: color-mix(in srgb, var(--primary) 10%, white);
}八、text-wrap: balance 标题平衡换行
作用:让多行标题尽量平衡每行的字数,视觉上更整齐。
效果:标题为 2 到 3 行时,每行字数更接近,避免最后一行只有一两个字的情况。
h1, h2 {
text-wrap: balance;
max-width: 40ch;
}九、subgrid 子网格
作用:让子元素参与父级 grid 的轨道定义,实现跨项对齐。
效果:在卡片网格中,每张卡片内部的多列能够与其他卡片保持对齐。
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 24px;
}
.card {
display: grid;
grid-column: span 1;
grid-template-columns: subgrid;
}
.card-header { grid-column: 1 / -1; }
.card-body { grid-column: 1; }
.card-actions { grid-column: 2 / -1; }十、@layer 级联层
作用:控制样式优先级顺序,避免滥用 !important。
效果:将基础样式、组件样式、工具类分层管理,优先级清晰可控。
@layer base, components, utilities;
@layer base {
* { margin: 0; padding: 0; }
body { font-family: sans-serif; }
}
@layer components {
.button {
padding: 8px 16px;
border-radius: 4px;
}
}
@layer utilities {
.mt-4 { margin-top: 1rem; }
.text-center { text-align: center; }
}总结
| 技巧 | 典型场景 |
|---|---|
| :has() | 父随子变、表单校验样式 |
| @container | 组件级响应式 |
| scroll-snap | 轮播图、横向滚动列表 |
| backdrop-filter | 毛玻璃导航栏、弹窗 |
| aspect-ratio | 图片、视频、卡片比例控制 |
| :is() / :where() | 选择器简化、低权重覆盖 |
| color-mix() | 主题色变体、hover 效果 |
| text-wrap: balance | 多行标题平衡换行 |
| subgrid | 网格子项对齐 |
| @layer | 样式分层、优先级管理 |
这些特性在现代浏览器中支持良好,可在生产项目中按需选用。建议收藏本文,使用时直接查阅代码示例。
本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!