Skip to content

:deep()

在 Vue 3 中,:deep() 是一个样式穿透修饰符,用于在单文件组件(.vue)的 <style> 中修改子组件或第三方组件的内部样式,解决因 CSS 作用域(scoped)导致的样式无法穿透到子组件的问题。

为什么需要 :deep()

<style> 标签添加 scoped 属性时(推荐使用,避免样式污染),Vue 会通过添加唯一属性(如 data-v-xxx)为样式自动增加作用域,确保样式只作用于当前组件的元素。

但这种机制会导致一个问题:当前组件的样式无法影响子组件(或第三方组件)的内部元素。例如,你在父组件中想修改子组件的 .child-class 类,直接写样式会失效,因为子组件的元素没有父组件的 data-v-xxx 属性。

此时就需要 :deep() 来 “穿透” 作用域限制,让样式作用到子组件内部。

基本用法

语法:将需要穿透的选择器包裹在 :deep(...) 中。

javascript
<template>
  <div class="parent">
    <!-- 子组件 -->
    <ChildComponent />
  </div>
</template>

<style scoped>
/* 普通样式:只作用于当前组件的 .parent 元素 */
.parent {
  padding: 20px;
}

/* 穿透样式:作用于子组件内部的 .child-class 元素 */
:deep(.child-class) {
  color: red;
  font-size: 16px;
}

/* 复杂选择器:穿透后结合父组件选择器 */
.parent :deep(.child-inner .text) {
  font-weight: bold;
}
</style>

深层理解

它的作用是在保持父组件样式作用域的前提下,有条件地穿透到子组件,而不是让样式变成全局生效。

只移除 “被包裹选择器” 的作用域属性,保留父组件自身的作用域限制

javascript
<style scoped>
:deep(.child-class) {
  color: red;
}
</style>
javascript
/* 父组件的唯一属性 + 穿透的子选择器 */
[data - v - abc123].child -
    class {
        color: red;
    };

made with ❤️ by ankang