🦹🏾‍♀️

VuetifyのテーマをCSS変数として使用する

2021/08/27に公開

結論

オプションとしてcustomProperties:trueを渡します。

import Vue from 'vue'
import Vuetify from 'vuetify/lib'

Vue.use(Vuetify)

export default new Vuetify({
  theme: {
    themes: {
      light: {
        main: '#D7F9F1',
        secondary: '#7AA095',
      }
    },
    options: { customProperties: true },
  },
})

後は、--v-{テーマ名}-baseという名前でCSS変数として利用できます。

<style scoped>
.bg {
  background-color: var(--v-main-base);
}

.text {
  color: var(--v-secondary-base);
}
</style>

Vuetifyのテーマとは

Vuetifyでは、カラーコードをテーマとして設定することができます。
テーマとして設定をしておけば、コード上で#D7F9F1のようにカラーコードを直接埋め込む代わりに、mainのようなわかりやすい名前で使うことができます。

また、アプリケーション内で使用可能なカラーをすべてテーマとして定義しておくことで、デザインの一貫性を保つことができます。

デフォルトの標準テーマとして、以下が設定されています。

{
  primary: '#1976D2',
  secondary: '#424242',
  accent: '#82B1FF',
  error: '#FF5252',
  info: '#2196F3',
  success: '#4CAF50',
  warning: '#FFC107',
}

これらのテーマ一部を上書きをすることができますし、新たなテーマ名を設定することもできます。
デフォルトのテーマから変更するには、Vuetifyのコンストラクタにオプションとして渡すことでおこなえます。

import Vue from 'vue';
import Vuetify from 'vuetify/lib';

Vue.use(Vuetify);

export default new Vuetify({
  theme: {
    themes: {
      light: {
        main: '#D7F9F1',
        secondary: '#7AA095',
      },
    },
  },
});

テーマを利用する

設定したテーマは、ほぼすべてのコンポーネントに対して利用することができます。

例えば、v-btnコンポーネントでは、colorpropsに対してテーマ名を渡すことでボタンの色を設定します。

<template>
  <v-btn color="main">ボタン</v-btn>
</template>

スクリーンショット 2021-08-22 21.41.49

また、スクリプトからは$vuetifyオブジェクトからアクセスすることができます。

<script lang="ts">
import Vue from 'vue';

export default Vue.extend({
  created() {
    console.log(this.$vuetify.theme.themes.light.main) // #D7F9F1;
  },
});
</script>

CSSから使用する

それでは、タイトルのとおりにVuetifyのテーマをCSSから使用してみましょう。

themeのオプションにcustomProperties:trueを渡すことですべてのテーマがCSS変数として生成されます。

import Vue from 'vue';
import Vuetify from 'vuetify/lib';

Vue.use(Vuetify);

export default new Vuetify({
  theme: {
    themes: {
      light: {
        main: '#D7F9F1',
        secondary: '#7AA095',
      },
    },
+   options: { customProperties: true },
  },
});

デバッグツールを開くと、ルート要素に確かに生成されていることがわかります。

スクリーンショット 2021-08-22 21.52.58

思ったよりもたくさん生成されていますが、これはVuetifyがテーマに渡したカラーコードに対してlighten4darken2のようにテーマの色のバリエーションを自動で生成するためです。

import Vue from 'vue';
import Vuetify from 'vuetify/lib';

Vue.use(Vuetify);

export default new Vuetify({
  theme: {
    themes: {
      light: {
        main: '#D7F9F1',
        secondary: '#7AA095',
      },
    },
-   options: { customProperties: true },
+   options: { customProperties: true, variations: false },
  },
});

もしこの機能がおせっかいだと感じるのであれば、variations: falseを渡すことでバリエーション自動生成を行わないようにできます。

先程よりも生成されたCSS変数が確かに減っていることがわかります。

スクリーンショット 2021-08-22 21.58.26

後は、通常のCSS変数と同じように利用できます。

<template>
  <div class="bg">
    <span class="text">こんにちは!</span>
  </div>
</template>

<style scoped>
.bg {
  background-color: var(--v-main-base);
  min-height: 100vh;
}

.text {
  color: var(--v-secondary-base);
  font-weight: 600;
  font-size: 16px;
}
</style>

スクリーンショット 2021-08-22 22.06.04

GitHubで編集を提案

Discussion