Skip to main content

Tailwind CSSでVue 3コンポーネントを作成する

著者
Headshot of Mary Gathoni

Mary Gathoni

feature api

2023年2月21日

0 分で読めます

Vueは、汎用性の高いWebインターフェースを構築するための人気のJavaScriptフレームワークです。既存のコードベースに簡単に統合できること、そしてフレームワークが軽量であることが大きな特長で、開発者はフロントエンドプロジェクトにすぐに取り入れることができます。

Vueの中核となるのは、UI Webアプリケーションを構築するためのコンポーザブルなコンポーネントアプローチです。コンポーネントは、アプリケーションを構築する際の部品として使える再利用可能なコードです。Vueのコンポーネントモデルを使えば、ロジック、コンテンツ、スタイルを1か所にまとめた自己完結型のコンポーネントを作成できます。

コンポーネントのスタイル設定には、Tailwind CSSなどのフレームワークを使ってマークアップに直接スタイルを含めることで、コンポーネントをさらにカプセル化できます。Tailwind CSSは、ユーザーインターフェース(UI)要素のスタイル設定に使える再利用可能なクラスを備えたCSSフレームワークです。これらのクラスを使うと、フォント、色、パディング、マージン、アニメーション、トランジションなどのスタイルを適用できます。たとえば、text-black属性を使うと、要素内のテキストがすべて黒で表示されます。これらのクラスは組み合わせて使えるため、自由に組み合わせてデザインを実装できます。

このチュートリアルでは、レスポンシブな記事カードコンポーネントを作成しながら、Tailwind CSSでVue 3コンポーネントを構築する方法を学びます。プロジェクトの全コードはこちらから入手できます。

前提条件

手順を進めるには、以下が必要です。

  • 最新バージョンのNode.jsとnpmがインストールされていること

  • Visual Studio Code(VS Code)などのテキストエディター

  • コマンドラインの知識

  • VueとCSSの基本的な知識

Tailwindを使って独自のVue 3コンポーネントを作成する

まず、新しいVue 3プロジェクトを作成します。ターミナルで次のコマンドを実行し、create-vueをインストールして実行します。create-vueは、viteを活用したプロジェクトを構築するための、Vue公式のプロジェクトスキャフォールディングツールです。

npm init vue@latest

任意の機能を選択するプロンプトが表示されます。プロジェクト名にvue-tailwindcssを指定し、それ以外のオプションはすべてNoを選択します。

√ Project name: ... vue-tailwindcss
√ Add TypeScript? ... No / Yes
√ Add JSX Support? ... No / Yes
√ Add Vue Router for Single Page Application development? ... No / Yes
√ Add Pinia for state management? ... No / Yes
√ Add Vitest for Unit Testing? ... No / Yes
√ Add an End-to-End Testing Solution? » No
√ Add ESLint for code quality? ... No / Yes
√ Add Prettier for code formatting? ... No / Yes

次に、cd vue-tailwindcssを使ってプロジェクトフォルダーに移動し、npm installを実行してnpmからプロジェクトのオープンソース依存関係をインストールします。

npm run devを実行して、開発環境でアプリケーションを起動します。

このコマンドを実行すると、ローカルホストサーバー上でアプリが起動します。

Vite v4.0.4がhttp://localhost:5173/でローカル実行中であることを示すターミナル出力

表示されたローカルURLにアクセスして、アプリを確認します。

Vueの暗色テーマのプロジェクトウェルカムページ。Vueのロゴ、「You did it!」のメッセージ、ナビゲーションリンク、ドキュメント、ツール、エコシステム、コミュニティに関するセクションが表示されています

次に、VueアプリでTailwind CSSをセットアップします。

VueでTailwindをセットアップする方法

まず、ターミナルで次のコマンドを実行します。

npm install -D tailwindcss@latest postcss@latest autoprefixer@latest

このコマンドは、Tailwind CSSとピア依存関係(autoprefixerおよびpostcss)をnpm経由でインストールします。

次に、以下のコマンドを実行してtailwind.config.jsファイルとpostcss.config.jsファイルを生成します。これらのファイルを使ってTailwindを設定、カスタマイズします。

npx tailwindcss init -p

このコマンドを実行すると、プロジェクトのルートに次の内容のtailwind.config.jsが作成されます。

   module.exports = {
   content: [],
   theme: {
     extend: {},
   },
   plugins: [],
 }

さらにpostcss.config.jsを作成し、tailwindcssとautoprefixerのプラグインを設定しました。

  module.exports = {
   plugins: {
     tailwindcss: {},
     autoprefixer: {},
   },
 }

tailwind.config.jsでcontent配列を変更し、すべてのページとコンポーネントのパスを含めます。これによりTailwindが最終出力から未使用のCSSクラスを削除し、ファイルサイズを小さくできます。

tailwind.config.jsファイルは、次のようになります。

  module.exports = {
   content: ["./index.html", "./src/**/*.{vue,js,ts,jsx,tsx}"],
   theme: {
     extend: {},
   },
   plugins: [],
  };

次に、プロジェクトのsrcフォルダーにindex.cssという新しいファイルを作成し、以下を追加します。

@tailwind base;
@tailwind components;
@tailwind utilities;

@tailwindディレクティブを使って、Tailwindのベース、コンポーネント、ユーティリティのスタイルをプロジェクトに含めました。後でプロジェクトをビルドすると、Tailwindがこれらのディレクティブを指定したスタイルに自動で置き換えます。

次に、index.cssを./src/main.jsファイルにインポートして使えるようにします。

import './index.css'

assets/main.cssファイルをインポートする行は削除してください。これにより、通常のCSSを使用しないようにできます。

これで、Tailwindを使ってコンポーネントを作成できます。

Vueコンポーネントの作成方法

VueコンポーネントでTailwindを使う方法を学ぶために、記事用のカードコンポーネントを作成します。

次に、src/componentsフォルダーにArticleCard.vueという新しいファイルを作成し、以下のコードを追加します。

<template>
  <div>
    <div>
      <img src="../assets/coverimage.jpg" alt="Close-up of code" />
    </div>
    <div>
      <div>Vue</div>
      <a href="#">Building Vue 3 Components With Tailwind CSS</a>
      <p>
        Learn how to create visually stunning Vue components using the popular
        utility-first CSS framework Tailwind.
      </p>
    </div>
  </div>
</template>

上記のコードではArticleCardというテンプレートを作成し、画像と記事の概要からなるカードコンポーネントを定義しています。

ブラウザーに表示するには、App.vueファイルの内容をすべて削除してホームページを整理します。次に、App.vueのscriptセクションにArticleCardコンポーネントをインポートします。

<script setup>
import ArticleCard from "./components/ArticleCard.vue";
</script>

次に、テンプレート内で使用します。

<template>
  <ArticleCard />
</template>

次は、Tailwind CSSのユーティリティクラスを使ってカードのスタイルを設定します。

ユーティリティクラスとは

通常のCSSや一部の他のCSSフレームワークでは、カスタムCSSクラスを使ってページ上の要素のスタイルを設定できます。

link-wrapperクラスとlinkクラスを使ってスタイルを設定したリンク要素の例を見てみましょう。

<template>
  <div class="link-wrapper">
    <a href="#" class="link">Building Vue 3 Components With Tailwind CSS</a>
  </div>
</template>
<style>
.link-wrapper {
  padding: 8px;
}
.link {
  font-weight: 500;
  font-size: 1.125rem;
  line-height: 1.75rem;
  color: #000;
}
</style>

Tailwind CSSを使う理由は何ですか?

この方法の問題は、要素にスタイルを設定するたびに、意味のあるクラス名を考えなければならないことです。また、クラスを再利用するたびに、非常に長く説明的な名前を覚えておく必要があります。さらに、ページに追加するクラス名ごとにスタイルを記述するため、相当量のCSSを書く必要があります。そのため、アプリケーションが大きくなるにつれてCSSファイルも肥大化し、バンドルサイズが増加して読み込み速度が遅くなります。

一方、Tailwind CSSでは、ユーティリティクラスと呼ばれる定義済みのCSSクラスを使えます。ユーティリティクラスには、flex、テキストの配置、ボーダー、マージン、パディング、色など、一般的なスタイル設定が用意されています。これらを使えば、CSSを書かずにページのスタイルを設定できます。

先ほどのリンクの例をTailwind CSSでスタイル設定すると、次のようになります。

<div class="p-8">
    <a href="#" class="font-medium text-lg text-black">Vue + TailwindCSS</a>
</div>

styleオブジェクトとカスタムクラスを、以下のユーティリティクラスに置き換えました。

  • p-8はパディングを8pxに設定します。

  • font-mediumはフォントの太さを500pxに設定します。

  • text-xlはフォントサイズを1.125rem、行の高さを1.75remに設定します。

  • text-blackはテキストの色を黒に設定します。

ユーティリティクラスを使うとCSSの量を減らせます。また、スタイルシートを参照しなくても、コードを見る人がスタイル設定の意図を理解しやすくなります。

Tailwindにはさまざまなユーティリティクラスが用意されています。詳しくはユーティリティのドキュメントをご覧ください。

Tailwind CSSでカードコンポーネントのスタイルを設定する

ユーティリティクラスについて理解したところで、カードコンポーネントのスタイルを設定しましょう。

まず、src/components/ArticleCard.vueファイルを変更して、Tailwindのユーティリティクラスを使います。

<template>
  <div class="flex max-w-2xl mx-auto bg-white rounded-sm shadow-md">
    <div>
      <img
        class="h-full w-full object-cover"
        src="../assets/coverimage.jpg"
        alt="Closeup code"
      />
    </div>
    <div class="p-8">
      <div class="uppercase tracking-wide text-sm text-violet-500 font-medium">
        Vue
      </div>
      <a
        href="#"
        class="mt-1 text-lg tracking-tight font-medium text-black hover:underline"
        >Building Vue 3 Components With Tailwind CSS
      </a>
      <p class="mt-2 text-sm text-slate-500">
        Learn how to create visually stunning Vue components using the popular
        utility-first CSS framework Tailwind.
      </p>
    </div>
  </div>
</template>

新しいスタイルを適用すると、カードコンポーネントは次のようになります。

コードエディターと、「Tailwind CSSでVue 3コンポーネントを構築する」というタイトルのカード。Tailwindを使ったVueコンポーネントの作成について説明しています。

ユーティリティクラスに加え、カードのスタイル設定には修飾子も使いました。<a/>タグのhover:underlineクラスに注目してください。hoverが修飾子です。

Tailwindでは、対象にしたい状態を指定するため、ユーティリティクラス名の先頭に修飾子を付けます。上の例ではホバー状態を対象にしていますが、focus:text-violet-200クラスでフォーカス状態を、active:text-violet-600でアクティブ状態を対象にすることもできます。

対象とする条件に応じて、さまざまなTailwind CSS修飾子を使用できます。すべての修飾子についてはTailwind CSSドキュメントをご覧ください。

ここまでのカードコンポーネントは大きな画面では見栄えがよいものの、画面サイズを小さくすると、次第に窮屈に見えてきます。

「Tailwind CSSを使ったVue 3コンポーネントの構築」と題されたブログカード。左側にぼかしの入ったコードが表示されている

画面幅に応じてカードのレイアウトを変更すれば、この問題を解決できます。

Tailwind CSSでブレークポイントを扱う方法

Tailwind CSSでは、ブレークポイントに応じてユーティリティクラスを条件付きで適用できます。デフォルトでは5つのブレークポイントがあり、それぞれ特定の最小幅で適用されます。

  • sm — 640px

  • md — 768px

  • lg — 1024px

  • xl — 1280px

  • 2xl — 1536px

ブレークポイントを指定するには、ユーティリティクラスの前にブレークポイント名とコロン(:)を付けます。

breakpoint:utility-class

次のボタンを例に見てみましょう。

<button class="w-16 md:w-32 lg:w-48">
  Submit
</button>

Tailwindは、小さい画面ではw-16クラス、中サイズの画面ではw-32、大きい画面ではw-48を適用します。

ブレークポイントを使えば、メディアクエリを使わずにレイアウト、サイズ、色などのプロパティを変更できます。デフォルトのサイズがデザイン要件に合わない場合は、tailwind.config.jsで画面サイズをカスタマイズすることもできます。

たとえば、次のコードは画面サイズlgの設定を上書きします。

module.exports = {
  theme: {
    extend: {
      screens: {
        'lg': '960px',
      },
    },
  },
}

記事カードコンポーネントでは、ブレークポイントを使ってカードのレイアウトを変更し、画像のサイズを調整します。

変更後のコードを以下に示します。最初の<div/>タグと<img/>タグに注目してください。

<template>
  <div
    class="md:flex md:max-w-2xl max-w-md mx-auto bg-white rounded-sm shadow-md overflow-hidden"
  >
    <div>
      <img
        class="h-48 w-full object-cover md:h-full"
        src="../assets/coverimage.jpg"
        alt="Closeup code"
      />
    </div>
    <div class="p-8">
      <div class="uppercase tracking-wide text-sm text-violet-500 font-medium">
        Vue
      </div>
      <a
        href="#"
        class="mt-1 text-lg tracking-tight font-medium text-black hover:underline"
        >Building Vue 3 Components With Tailwind CSS</a
      >
      <p class="mt-2 text-sm text-slate-500">
        Learn how to create visually stunning Vue components using the popular
        utility-first CSS framework Tailwind.
      </p>
    </div>
  </div>
</template>

変更点は次のとおりです。

  • md:flexとmd:max-w-2xlの修飾子により、中サイズ以上の画面ではカードコンポーネントが最大幅48remのフレックスコンテナになります。小さい画面ではmax-w-mdクラスによって、幅が28remに設定されます。

  • <img/>要素では、md:h-fullによって中サイズ以上の画面で画像を高さ全体に表示し、h-48クラスによって小さい画面で高さを12remに設定します。

小さい画面では、作成したコンポーネントは次のように表示されます。

タイトル「Tailwind CSSを使ったVue 3コンポーネントの構築」と説明文の上にCSSコードが表示されたブログカード。Vueコンポーネントの作成について説明しています。

これで完了です。Tailwind CSSを使ってVueコンポーネントを構築できるようになりました。

Vueアプリケーションを作成したら、Snykによるセキュリティ更新を自動適用しながらNetlifyにデプロイする方法を学びましょう。無料アカウントを作成してプロジェクトをSnykにインポートすれば、依存関係に潜む脆弱性を見つけて修正し、XSSなどのセキュリティ脅威からアプリケーションを保護できます。

まとめ

このチュートリアルでは、Tailwind CSSを使ってVue 3コンポーネントを構築する方法を紹介しました。Tailwind CSSはユーティリティファーストのフレームワークで、UIコンポーネントを効率的かつスムーズに構築できます。ユーティリティクラスを使えば、外部スタイルシートを参照したり、何十ものクラス名を覚えたりすることなく、レスポンシブなデザインを作成できます。また、デフォルトのクラスをカスタマイズして独自のデザインシステムを作成できます。さらに、本番ビルドでは未使用のクラスがすべて自動的に削除されるため、最終成果物に含めるコード量を抑えられます。

カテゴリー:

続きを読む

Blog

Stadium Summer:Snyk Connect Fan Zone Tour

SnykのFan Zone Tourでは、8都市と3回のオンラインセッションで、AIセキュリティのワークショップやネットワーキング、楽しい競技を開催しました。参加者はスキルを磨き、アイデアを共有し、共に成長しました。

Blog

Snyk VulnBench JS 1.0:LLMは同じバグを2回見つけられるか?

Snyk VulnBench JS 1.0:300回の反復スキャンで、LLMのセキュリティ検出結果は実行ごとに異なる一方、SASTとモデルはそれぞれ異なる脆弱性の見落としを検出することが明らかに。

feature insights context
Blog

お客様と築くAIセキュリティ:Evoのデザインパートナープログラムから得た5つの教訓

SnykのEvoデザインパートナープログラムから得た5つの重要な教訓をご紹介します。AIの検出、リスクインテリジェンス、ポリシーの自動化によって、チームが生成AIを保護し、拡大するAI利用を大規模に統制する方法をご覧ください。