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/zh-hant/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

發表回復

登錄後才能評論