在 Vue 3 的 Scoped CSS 中,:deep() 用于穿透样式作用域(样式穿透),其括号的使用有明确区别:
1. 有括号::deep(selector)(推荐写法)
css
复制
下载
:deep(.child-class) {
color: red;
}
-
✅ 正确用法:将需要穿透的选择器放入括号内
-
✅ 编译后生成类似
[data-v-xxx] .child-class的选择器 -
✅ Vue 3.3+ 官方推荐写法(无括号写法已被标记为废弃)
2. 无括号::deep selector(废弃写法)
css
复制
下载
:deep .child-class {
color: red;
}
-
⚠️ 已被废弃(Vue 3.3+ 会警告)
-
❌ 编译后生成
[data-v-xxx] .child-class(效果相同但语法不标准) -
❌ 未来版本可能被移除
3. ⚠️ 历史写法:::v-deep(Vue 2 兼容)
css
复制
下载
/* Vue 2 方式 (已废弃) */
::v-deep .el-dialog__body {
padding: 15px;
}
-
在 Vue 3 中仍可用但已被标记为废弃
-
推荐迁移到
:deep()语法
关键区别总结:
| 特性 | :deep(selector)(有括号) | :deep selector(无括号) |
|---|---|---|
| 语法正确性 | ✅ Vue 3.3+ 官方推荐 | ⚠️ 已被废弃(兼容旧项目) |
| 编译结果 | 相同([data-v-xxx] selector) | 相同(但会触发警告) |
| 未来兼容性 | 安全 | 可能在未来版本失效 |
| 代码规范 | 符合 CSS 伪类标准(如 :not()) | 不符合标准伪类写法 |
正确用法示例:
vue
复制
下载
<style scoped>
/* 穿透到子组件内的元素 */
.parent :deep(.child-element) {
padding: 10px;
}
/* 穿透到插槽内容 */
:deep(slot-content) {
background: yellow;
}
</style>
迁移建议:
-
新项目一律使用
:deep(selector) -
旧项目升级 Vue 3.3+ 后,用 ESLint 的
vue/no-deprecated-deep-selector规则自动替换无括号写法
💡 其他穿透语法:
插槽内容穿透 →
:slotted(.slot-class)全局样式 →
:global(.global-class)

2万+

被折叠的 条评论
为什么被折叠?



