VueJS 速習チュートリアル

Vue Scoped CSS

1. グローバルなスタイリング (Global Styling)

Vue コンポーネント内、あるいは App.vue 内の <style> タグで定義された スタイリング は、実はデフォルトですべてのコンポーネントに対して グローバル(Global) に適用されます。

特定のコンポーネント内だけに スタイリング を限定し、他のコンポーネントに影響を与えないようにするには、<style scoped> のように scoped 属性を使用する必要があります。

2. CSS のデフォルトの挙動

任意の *.vue ファイル内に記述された CSS は、プロジェクト全体で機能します。
例えば、一つの *.vue ファイルで <p> タグの背景色をピンクに設定した場合、そのプロジェクトに含まれるすべての *.vue ファイル内の <p> タグが影響を受け、背景がピンクになります。

2.1 実装例:スタイルの干渉(グローバル)

このアプリケーションには、App.vue、そして2つのコンポーネント CompOne.vueCompTwo.vue の合計3つのファイルがあると仮定します。
CompOne.vue 内で定義された CSS が、3つすべてのファイルの <p> タグに影響を与える様子を見てみましょう。

CompOne.vue のコード:

<template>
  <p>この p タグは 'CompOne.vue' に属しています</p>
</template>

<script></script>

<style>
  /* scoped がないため、プロジェクト全体の p タグに適用される */
  p {
    background-color: pink;
    width: 150px;
  }
</style>

3. スコープ付きスタイリング (Scoped Styling)

一つのコンポーネント内の スタイリング が他のコンポーネントの要素に影響を与えるのを避けるために、<style> タグに scoped 属性を付与します。

3.1 実装例:スタイルのカプセル化

CompOne.vue<style> タグに scoped 属性を追加することで、背景色の指定をこのコンポーネント内部の要素だけに限定できます。

scoped を適用した CompOne.vue:

<template>
  <p>この p タグは 'CompOne.vue' に属しています</p>
</template>

<script></script>

<style scoped>
  /* このコンポーネント内の p タグだけに限定される */
  p {
    background-color: pink;
    width: 150px;
  }
</style>

このように scoped を活用することで、コンポーネントごとに独立したデザインを定義できるようになり、意図しないデザイン崩れ(スタイルの汚染)を防ぐことができます。これは、大規模な Web アプリケーションを スケーラブル に保つための重要なテクニックです。