Vue中的CSS Deep

一、深入了解CSS Deep

CSS deep或者叫做/deep/、>>> 和 ::v-deep,用于给子组件的样式添加一个全局作用域。在Vue中,它被广泛运用在scoped CSS中,以扩大样式的作用范围。

举个例子,在Vue的组件中添加样式如下:

<template>
  <div class="parent">
    <div class="child">I am a child</div>
  </div>
</template>

<script>
export default {
  name: 'ParentComponent'
}
</script>

<style scoped>
.parent {
  color: blue;
}
.child {
  font-size: 20px;
}
</style>

样式在组件中会被编译成如下代码:

.parent[data-v-f3f3eg9] {
  color: blue;
}
.parent[data-v-f3f3eg9] .child {
  font-size: 20px;
}

这时候,如果要给子组件的样式添加和父组件同样的scoped样式,只需要在子组件中添加/deep/或者>>>,如下:

<template>
  <div class="parent">
    <ChildComponent />
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  name: 'ParentComponent',
  components: { ChildComponent }
}
</script>

<style scoped>
.parent {
  color: blue;
}
/deep/ .child {
  font-size: 20px;
}
</style>

这样,子组件的样式就会被编译成如下代码:

.parent[data-v-f3f3eg9] {
  color: blue;
}
.parent[data-v-f3f3eg9] .child[data-v-f3f3eg9] {
  font-size: 20px;
}

二、解决scoped CSS样式穿透问题

在Vue中,scoped CSS可以保证组件的样式不会影响到其他组件,但是也有可能会碰到需要影响到其他组件的情况。这时候,可以使用CSS deep来解决scoped CSS样式穿透问题。

例如,父组件和子组件都有自己的样式,但是需要影响到另一个组件。这时候使用CSS deep可以轻松实现,如下:

<template>
  <div class="parent">
    <p class="parent-text">I am a parent</p>
    <div class="child">
      <p class="child-text">I am a child</p>
      <GrandchildComponent />
    </div>
  </div>
</template>

<script>
import GrandchildComponent from './GrandchildComponent.vue'

export default {
  name: 'ParentComponent',
  components: { GrandchildComponent }
}
</script>

<style scoped>
.parent {
  color: blue;
}
.child {
  font-size: 20px;
}
/deep/ .grandchild {
  font-weight: bold;
}
</style>

<!--在GrandchildComponent.vue中-->

<template>
  <div class="grandchild">
    <p class="grandchild-text">I am a grandchild</p>
  </div>
</template>

<script>
export default {
  name: 'GrandchildComponent'
}
</script>

<style scoped>
.grandchild {
  color: red;
}
/deep/ .parent-text {
  font-style: italic;
}
</style>

这样,.grandchild样式就只会作用在GrandchildComponent组件内,而/deep/ .parent-text样式可以修改父组件的样式。

三、推荐使用CSS modules替换CSS deep

虽然CSS deep可以扩大组件中样式的作用范围,但是容易造成全局样式混乱和耦合,所以在实际开发中,推荐使用CSS modules替换CSS deep。

CSS Modules是一种基于CSS的加载器,在编写CSS时可以局部作用域,解决了全局作用域的冲突问题,避免了CSS混乱的情况。

在Vue项目中使用CSS modules非常方便,只需要在style标签中添加module即可:

<template>
  <div class="parent">
    <p class="parent-text">I am a parent</p>
    <div class="child">
      <p class="child-text">I am a child</p>
      <GrandchildComponent />
    </div>
  </div>
</template>

<script>
import GrandchildComponent from './GrandchildComponent.vue'

export default {
  name: 'ParentComponent',
  components: { GrandchildComponent }
}
</script>

<style module>
.parent {
  color: blue;
}
.child {
  font-size: 20px;
}
.grandchild {
  color: red;
}
.parentText {
  font-style: italic;
}
</style>

然后在组件中使用样式,只需要在样式后添加’$style’,如:

<template>
  <div :class="$style.parent">
    <p :class="$style.parentText">I am a parent</p>
    <div class="child">
      <p class="child-text">I am a child</p>
      <GrandchildComponent />
    </div>
  </div>
</template>

<script>
import GrandchildComponent from './GrandchildComponent.vue'

export default {
  name: 'ParentComponent',
  components: { GrandchildComponent }
}
</script>

<style module>
.child {
  font-size: 20px;
}
.grandchild {
  color: red;
}
.parentText {
  font-style: italic;
}
</style>

这样,在编写CSS时就不需要担心全局作用域问题,同时也提供了更好的可维护性。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/304244.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2025-01-01 11:05
下一篇 2025-01-01 11:05

相关推荐

  • 使用Vue实现前端AES加密并输出为十六进制的方法

    在前端开发中,数据传输的安全性问题十分重要,其中一种保护数据安全的方式是加密。本文将会介绍如何使用Vue框架实现前端AES加密并将加密结果输出为十六进制。 一、AES加密介绍 AE…

    编程 2025-04-29
  • Vue TS工程结构用法介绍

    在本篇文章中,我们将从多个方面对Vue TS工程结构进行详细的阐述,涵盖文件结构、路由配置、组件间通讯、状态管理等内容,并给出对应的代码示例。 一、文件结构 一个好的文件结构可以极…

    编程 2025-04-29
  • CSS sans字体家族

    CSS sans字体家族是一组基于CSS的无衬线字体,具有在不同设备和浏览器上保持一致的特性。本文将从优势、使用、自定义等多个方面对CSS sans字体家族进行详细介绍。 一、优势…

    编程 2025-04-28
  • Vue3的vue-resource使用教程

    本文将从以下几个方面详细阐述Vue3如何使用vue-resource。 一、安装Vue3和vue-resource 在使用vue-resource前,我们需要先安装Vue3和vue…

    编程 2025-04-27
  • ThinkPHP6 + Vue.js: 不使用Fetch的数据请求方法

    本文将介绍如何在ThinkPHP6和Vue.js中进行数据请求,同时避免使用Fetch函数。 一、AJAX:XMLHttpRequest的基础使用 在进行数据请求时,最基础的方式就…

    编程 2025-04-27
  • Vue模拟按键按下

    本文将从以下几个方面对Vue模拟按键按下进行详细阐述: 一、Vue 模拟按键按下的场景 在前端开发中,我们常常需要模拟按键按下的场景,比如在表单中填写内容后,按下“回车键”提交表单…

    编程 2025-04-27
  • 开发前端程序,Vue是否足够?

    Vue是一个轻量级,高效,渐进式的JavaScript框架,用于构建Web界面。开发人员可以使用Vue轻松完成前端编程,开发响应式应用程序。然而,当涉及到需要更大的生态系统,或利用…

    编程 2025-04-27
  • 如何在Vue中点击清除SetInterval

    在Vue中点击清除SetInterval是常见的需求之一。本文将介绍如何在Vue中进行这个操作。 一、使用setInterval和clearInterval 在Vue中,使用set…

    编程 2025-04-27
  • CSS教程:从入门到精通

    一、CSS是什么 CSS(Cascading Style Sheets)是一种用于定义网页样式的语言。由于网页内容和样式是分开保存的,因此CSS可以使设计者和开发者分离出样式与内容…

    编程 2025-04-25
  • VueClearable:实现易于清除的Vue输入框

    一、VueClearable基本介绍 VueClearable是一个基于Vue.js开发的易于清除的输入框组件,可以在输入框中添加“清除”按钮,使得用户可以一键清空已输入内容,提升…

    编程 2025-04-25

发表回复

登录后才能评论