加载笔记内容...
加载笔记内容...
CSS选择器的发展经历了从基础选择器到逻辑选择器的演进过程,形成了四大核心类别:
div
, p
等原生HTML标签.class-name
#elementId
*
div.active
(同时满足元素和类)h1, h2, .title
(多条件匹配)1/* 后代选择器 */
2article p { }
3
4/* 直接子代选择器 */
5ul > li { }
6
7/* 相邻兄弟选择器 */
8h2 + p { }
9
10/* 通用兄弟选择器 */
11h2 ~ p { }
:hover
, :checked
:nth-child()
, :empty
:is()
, :where()
::before
, ::selection
特性 | :is() | :where() |
---|---|---|
特异性 | 取参数最大值 | 0 |
浏览器支持 | 94%+ | 92%+ |
典型应用场景 | 组件样式封装 | 重置样式 |
可扩展性 | 支持嵌套 | 支持嵌套 |
实践案例:优化Bootstrap的按钮组样式
1/* 传统写法 */
2.btn-group .btn:first-child,
3.btn-group-vertical .btn:first-child {
4 border-top-right-radius: 0;
5}
6
7/* 使用:is()优化 */
8:is(.btn-group, .btn-group-vertical) .btn:first-child {
9 border-top-right-radius: 0;
10}
这个父选择器彻底改变了CSS的选择能力:
1/* 选择包含图片的卡片 */
2.card:has(img) {
3 border: 2px solid #f00;
4}
5
6/* 表单验证反馈 */
7.form-group:has(:invalid) {
8 background-color: #ffe6e6;
9}
技术局限:
:has(:has(...))
1/* 排除禁用状态的按钮 */
2button:not([disabled]) { }
3
4/* 复杂否定条件 */
5article:not(.archived, .draft) { }
特异性陷阱::not(p)
的特异性等于括号内选择器的特异性,而不是0
特异性由四个级别组成,从左到右权重递减:
计算示例:
1#nav .item:hover // 100 + 10 + 10 = 120
2div[data-type="primary"] // 1 + 10 = 11
1.override {
2 color: red !important;
3}
1/* ::part 选择器 */
2custom-element::part(inner) {
3 background: #fff;
4}
5
6/* ::slotted 选择器 */
7::slotted(.highlight) {
8 color: yellow;
9}
body div ul li a
→ 直接指定类名.nav > a
优于 a.nav
div *
会遍历所有子元素性能测试数据:
选择器类型 | 匹配耗时(10k次) |
---|---|
.class | 12ms |
div.class | 15ms |
div:nth-child(2n+1) | 45ms |
1/* 根据文档方向匹配 */
2:dir(ltr) {
3 padding-left: 1em;
4}
1/* 空值匹配 */
2input:user-invalid { }
3
4/* 输入框内容占位状态 */
5input:placeholder-shown { }
1@scope (.card) to (.footer) {
2 p {
3 color: #666;
4 }
5}
问题::hover
在移动端失效
解决方案:
1@media (hover: hover) {
2 button:hover { }
3}
问题::focus-visible
兼容性
Polyfill方案:
1import 'focus-visible'
1/* 高对比度模式适配 */
2@media (forced-colors: active) {
3 button {
4 forced-color-adjust: none;
5 }
6}
1/* 触屏设备优化 */
2@media (pointer: coarse) {
3 input[type="checkbox"] {
4 min-width: 24px;
5 }
6}
容器查询配套选择器:
1@container (width > 400px) {
2 .card :is(h2, h3) {
3 font-size: clamp(1.5rem, 2vw, 2rem);
4 }
5}
作用域样式革命:
1<style>
2 @scope (.dashboard) {
3 .widget { /* 局部样式 */ }
4 }
5</style>
选择器性能优化:
浏览器正在实现新的选择器匹配引擎,如Blink的StyleEngine优化了伪类匹配算法
CSS选择器的发展史就是Web开发效率的提升史。从最初的简单选择到如今的逻辑选择器,每一次进化都在解决实际工程问题。掌握选择器的核心原理,既能写出更优雅的CSS代码,也能在复杂场景中游刃有余。建议开发者持续关注W3C的Selectors Level 4规范进展,同时在实际项目中通过Chrome DevTools的Selector Profile功能进行性能调优。