从事Vue开发之查漏补缺:深度选择器

从事Vue开发好几年一直都在使用深度选择器,但从来没有深究为什么要这么使用,产生的根本原因是什么?

1.深度选择器是什么?

了解深度选择器前我们需要晓得选择器是什么?

CSS 选择器 是用来给 HTML元素 添加样式的。常用的选择器:

  • 标签选择器: p 选择所有的 <p> 元素。
  • 类选择器:.my-class 选择所有具有 class="my-class" 的元素。
  • ID选择器:#my-id 选择具有 id="my-id" 的元素。
  • 更多选择器

深度选择器 是为了解决样式作用域问题而出现的特殊选择器。

样式作用域 <style scoped>

Vue等框架 中,为了保持组件的样式独立(不污染全局样式),我们通常使用样式作用域CSS

根本原因:组件化开发

在Vue、React等框架中,组件是独立的:

html 复制代码
<!-- 父组件 Parent.vue -->
<style scoped>
/* 这个样式只作用于父组件 */
.parent-content {
  font-size: 16px;
}

/* 这个选择器无法选中子组件内部的元素! */
.child-button {
  background: red; /* ❌ 不会生效 */
}
</style>

<template>
  <div class="parent-content">
    <ChildComponent />
  </div>
</template>
html 复制代码
<!-- 子组件 ChildComponent.vue -->
<template>
  <div class="child">
    <button class="child-button">子组件按钮</button>
  </div>
</template>

<style scoped>
/* 子组件有自己的样式作用域 */
.child-button {
  background: blue;
}
</style>

编译后:

html 复制代码
<!-- 编译后的HTML -->
<div class="parent-content" data-v-parent-123>
  父组件内容
  <div class="child" data-v-child-456>
    <button class="child-button" data-v-child-456>
      子组件按钮
    </button>
  </div>
</div>
css 复制代码
/* 编译后的CSS */
.parent-content[data-v-parent-123] { font-size: 16px; }

/* 父组件想选择子组件按钮,但选择器不匹配 */
.child-button[data-v-parent-123] { 
  background: red; /* ❌ 无法匹配 */
}

.child-button[data-v-child-456] {
  background: blue; /* ✅ 正常生效 */
}

深度选择器:解决作用域穿透

css 复制代码
/* 深度选择器让父组件样式穿透到子组件 */
.parent-content ::v-deep .child-button {
  background: red; /* ✅ 现在会生效了 */
}

编译后:

css 复制代码
.parent-content[data-v-parent-123] .child-button {
  background: red; /* ✅ 成功匹配 */
}

穿透前: 穿透后:

2.深度选择器有哪些?

Vue2深度选择器:::v-deep/deep/>>>

  • >>>: 主要用于原生CSS样式穿透
  • /deep/: 在CSS预处理器中可能存在问题(已弃用)
  • ::v-deep: vue 2.5以后推荐用法

Vue3深度选择器::deep()

css 复制代码
<style scoped>
.a :deep(.b) {
  /* ... */
}
</style>
相关推荐
军军君0116 小时前
Three.js基础功能学习十三:太阳系实例上
前端·javascript·vue.js·学习·3d·前端框架·three
Hi_kenyon17 小时前
理解vue中的ref
前端·javascript·vue.js
毎天要喝八杯水21 小时前
搭建vue前端后端环境
前端·javascript·vue.js
东东5161 天前
果园预售系统的设计与实现spingboot+vue
前端·javascript·vue.js·spring boot·个人开发
怪兽毕设1 天前
基于SpringBoot的选课调查系统
java·vue.js·spring boot·后端·node.js·选课调查系统
Amumu121381 天前
Vue Router(一)
前端·javascript·vue.js
切糕师学AI1 天前
VSCode 下如何检查 Vue 项目中未使用的依赖?
vue.js·vscode
我是伪码农1 天前
Vue 1.30
前端·javascript·vue.js
利刃大大1 天前
【Vue】默认插槽 && 具名插槽 && 作用域插槽
前端·javascript·vue.js
风之舞_yjf1 天前
Vue基础(27)_脚手架安装
vue.js