Vue.jsとBootstrapを組み合わせて効率的にUIを作る方法

はじめに

Vue.jsは画面の一部だけを切り替えながら動的に操作できるフレームワークとして、多くの人から注目されています。 一方で、Bootstrapは既に多くの開発者が慣れ親しんでいるCSSフレームワークとして人気を集めていますよね。

そこで、これからVue.jsとBootstrapを組み合わせて使いたい方のために、それぞれの特徴や活用方法を丁寧にお伝えしていこうと思います。 初心者の方にとっては、どう導入し、どのように部品を組み合わせるのかという部分がいちばん気になるのではないでしょうか。

この記事では、まずVue.jsとBootstrapがそれぞれどのような役割を担うのかを明確にし、実務と紐付いた視点で解説を進めます。 最終的には、手元のプロジェクトで両方を導入してみたくなるような具体例を紹介しながら、理解を深めていただければと思います。

Vue.jsとは何か

Vue.jsとは、フロントエンドのUI(ユーザーインターフェース)を手軽に構築できるJavaScriptフレームワークです。 コンポーネント指向という概念が取り入れられており、UIの部品を小さく分割して再利用できるところに大きな特徴があります。

実務では、社内向けの業務システムや外部向けの会員ページなど、複雑な画面遷移が求められる場面で使われることが多いです。 Vue.jsを利用すると、データの変更に伴って画面表示が自動で更新されるので、ページ全体を再読み込みする手間が少なくなります。

また、公式ドキュメントが比較的読みやすいと言われている点も、初心者にとって取り組みやすい理由のひとつです。 導入も容易で、CDNを使ってscriptタグ1つをHTMLに追加するだけでも手軽に始められます。

ここで重要となるのは、Vue.jsはあくまでもUIを動的に操作するフレームワークであり、スタイリングの部分は基本的には自分でCSSを記述するか、CSSフレームワークを利用する必要があるという点です。

Bootstrapとは何か

BootstrapはTwitter社の開発チームによって生み出されたCSSフレームワークです。 現在はコミュニティの力も大きく、バージョン5系ではJavaScript部分に依存する構造が見直されつつあります。

実務では、管理画面やダッシュボードなどの見た目を短期間で整えたいときにBootstrapがよく活用されます。 また、コンポーネントが豊富に揃っているので、レスポンシブ対応のナビゲーションバーやボタン、カードなどをすぐに使えるのが魅力です。

テンプレート化されたスタイルがあるため、自分でレイアウトをゼロから構築するよりも圧倒的にスピードを上げやすいでしょう。 さらに、Bootstrapを知っているエンジニアの数が多いため、チームで開発を進めやすいというメリットもあります。

ただし、標準的な見た目はかなり整っていますが、オリジナリティを出したい場合にはカスタマイズが必要です。 Bootstrapが提供している基本クラスを上書きしたり、独自のテーマを用意したりといった工夫によって、プロジェクトに合わせたデザインを実現します。

Vue.jsとBootstrapを組み合わせるメリット

両方を組み合わせるメリットを考えるには、実務の場面をイメージするのがよいかもしれません。 例えば、企業内の管理画面を作るケースを想像してみると、データの表示やフィルタリング、動的な更新が必要になりますね。

Vue.jsはUIの動きと状態管理を効率的に行い、Bootstrapはビジュアルやレイアウトを整える部分をサポートします。 それぞれを単独で使うよりも、ユーザーが操作しやすいアプリケーションを素早く開発できるのがポイントではないでしょうか。

特に初心者の方がデザインやレスポンシブ対応で苦戦してしまうのはよくある話です。 その点、Bootstrapを活用すれば、あらかじめ用意されたレスポンシブ対応の仕組みをベースに使えるため、画面を動的に操作しながらきれいなレイアウトを実現しやすくなります。

また、Vue.jsはコンポーネント単位で開発を進めるので、Bootstrapで準備されたUIパーツをコンポーネント化して必要な場所で再利用する、というやり方がスムーズにできるようになります。

プロジェクトへの導入方法

Vue.jsとBootstrapを同時に導入する方法はいくつかありますが、代表的なアプローチとしては、Vue CLI(あるいはViteなどのビルドツール)を用いたプロジェクト作成から始めるのが便利です。 CDNを使う手軽な方法もありますが、実務レベルでは依存関係をパッケージマネージャーで管理したいことが多いため、npmやyarnを使う形が一般的でしょう。

ここでは、Vue CLIではなく新しいワークフローにも対応しやすいViteを想定してインストール手順を示します。

Viteによる新規プロジェクト作成

まずはターミナルで、以下のコマンドを実行すると、Vue 3対応のプロジェクトを作成できます。

npm create vite@latest my-vue-bootstrap-app -- --template vue

上記コマンドを実行後、ディレクトリに移動して依存関係をインストールします。

cd my-vue-bootstrap-app
npm install

その後、以下のコマンドで開発用サーバーを立ち上げます。

npm run dev

ブラウザで表示できるようになった時点でVue.jsの開発環境が整ったことになります。

Bootstrapのインストール

次にBootstrapをインストールします。

npm install bootstrap

これでBootstrap 5のライブラリがプロジェクトに追加されました。 続いて、メインのエントリーポイントとなるファイル(たとえばmain.jsやmain.ts)で、BootstrapのCSSを読み込みます。

// main.js
import { createApp } from 'vue'
import App from './App.vue'

// BootstrapのCSSを読み込む
import 'bootstrap/dist/css/bootstrap.min.css'

// 任意でBootstrapのJSを読み込み
import 'bootstrap'

createApp(App).mount('#app')

このように書いておくと、アプリ内でBootstrapのスタイルやコンポーネント機能が使えるようになります。 ただし、BootstrapのJavaScript機能(モーダルやドロップダウンなど)を活用する場合は、上記のようにJSもimportする必要があります。

基本的な利用例:ボタンとアラート

では、どのようにBootstrapのクラスをVueで活用するのかを簡単に見てみましょう。 この例では、ボタンをクリックするとBootstrapのアラートを表示するコンポーネントを作成してみます。

<template>
  <div class="container mt-3">
    <button
      class="btn btn-primary"
      @click="showAlert = !showAlert"
    >
      Alertを表示
    </button>

    <div
      v-if="showAlert"
      class="alert alert-success mt-3"
      role="alert"
    >
      これはBootstrapのアラートです。
    </div>
  </div>
</template>

<script>
export default {
  name: 'AlertExample',
  data() {
    return {
      showAlert: false
    }
  }
}
</script>

<style scoped>
/* 必要に応じて追加のカスタマイズが可能 */
</style>

このように、Vueのデータバインディングやv-ifディレクティブを使いつつ、BootstrapのクラスをHTML要素に適用しているのがわかりますね。 ボタンをクリックすると、showAlertという変数の値が切り替わり、それに応じてBootstrapのアラートを表示・非表示にできます。

Bootstrapのグリッドシステムでレイアウトを組む

実務で特に便利なのが、Bootstrapが提供するグリッドシステムです。 画面幅に応じてカラムの幅を柔軟に変化させる機能は、レスポンシブ対応を容易にしてくれます。

例えば、カードを3列で並べたい場合を考えてみましょう。 ブラウザ幅が狭くなったら1列に、少し広がったら2列に、さらに広がれば3列に、というように自動調整させることが可能です。

<template>
  <div class="container mt-3">
    <div class="row">
      <div class="col-12 col-md-6 col-lg-4 mb-3" v-for="(item, index) in items" :key="index">
        <div class="card h-100">
          <img :src="item.image" class="card-img-top" alt="サンプル画像" />
          <div class="card-body">
            <h5 class="card-title">{{ item.title }}</h5>
            <p class="card-text">
              {{ item.description }}
            </p>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: 'CardGrid',
  data() {
    return {
      items: [
        {
          title: 'カードタイトル1',
          description: '説明文がここに入ります。',
          image: '/assets/sample1.jpg'
        },
        {
          title: 'カードタイトル2',
          description: '説明文がここに入ります。',
          image: '/assets/sample2.jpg'
        },
        {
          title: 'カードタイトル3',
          description: '説明文がここに入ります。',
          image: '/assets/sample3.jpg'
        },
      ]
    }
  }
}
</script>

col-12 col-md-6 col-lg-4のクラス指定により、画面サイズに合わせた列幅が自動で割り当てられます。 実務で扱うレイアウトを考えると、テーブルやカードがたくさん並ぶ場面は多いので、グリッドシステムを使いこなせるだけでも作業効率はずいぶん変わってくるでしょう。

カスタマイズとテーマ設定

Bootstrapの基本クラスは便利ですが、そのままだと見た目が他のサイトと似通ってしまいます。 そこで、業務で求められるブランドイメージなどを反映させたいときには、カスタマイズが必要です。

Bootstrap 5ではSassを活用したカスタマイズが行いやすくなっています。 具体的には、BootstrapのソースファイルをSassで上書きすることで、色やフォントを変更することができます。

Sassによるカスタマイズ例

まず、Sassの依存関係をインストールします。

npm install sass

次に、BootstrapのSassファイルをインポートするための専用ファイルを作成しておきます。 例えば、src/styles/custom.scssというファイル名で下記のように書くことが考えられます。

// Bootstrapの変数を上書きする前に設定
$body-bg: #f5f5f5;
$body-color: #333333;

// Bootstrap全体を取り込む
@import "bootstrap/scss/bootstrap";

そして、main.jsまたはApp.vueなどでこのcustom.scssを読み込みます。

import '@/styles/custom.scss'

この設定により、背景色や文字色などの基本変数を自分の好みに合わせて変更できます。 実務では、社内規定のブランドカラーやフォントを当てはめたいケースが多いので、ここで柔軟にカスタマイズしていくわけですね。

VueコンポーネントとBootstrapコンポーネントの連携

Vue.jsではテンプレート構文を用いてデータとビューを紐付けますが、Bootstrapのコンポーネント機能と組み合わせると、さらにインタラクティブなUIを構築できます。 たとえば、モーダルを開閉する仕組みをVueで制御し、見た目はBootstrapにおまかせする、といった使い方が典型的です。

モーダルの基本例

<template>
  <div class="container">
    <button
      class="btn btn-primary mt-3"
      @click="toggleModal"
    >
      モーダルを開く
    </button>

    <div
      class="modal fade"
      tabindex="-1"
      :class="{ show: isModalOpen }"
      style="display: block;"
      v-if="isModalOpen"
      role="dialog"
    >
      <div class="modal-dialog modal-dialog-centered" role="document">
        <div class="modal-content">
          <div class="modal-header">
            <h5 class="modal-title">モーダルタイトル</h5>
            <button type="button" class="btn-close" @click="toggleModal"></button>
          </div>
          <div class="modal-body">
            <p>モーダルの内容です。</p>
          </div>
          <div class="modal-footer">
            <button type="button" class="btn btn-secondary" @click="toggleModal">
              閉じる
            </button>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: 'ModalExample',
  data() {
    return {
      isModalOpen: false
    }
  },
  methods: {
    toggleModal() {
      this.isModalOpen = !this.isModalOpen
    }
  }
}
</script>

Bootstrapのモーダルは本来、JavaScriptの動きも利用して表示・非表示を管理します。 しかしVue.js側の状態管理を優先的に利用したい場合は、このようにv-ifなどを活用して動きを制御することが考えられます。 fadeshowといったクラスを切り替えることで、モーダル特有のアニメーションを表現できます。

実務での利用シーンとポイント

Vue.jsとBootstrapのコンビは、多くの場合、管理画面やダッシュボード系のUIを素早く作りたい場面に向いています。 以下のようなケースが代表的ではないでしょうか。

  • 社内システムのデータ管理画面
  • eコマースサイトの在庫管理ツール
  • 顧客情報を一覧できる管理ツール

上記のようなシステムには、テーブルやフォーム入力、確認モーダルなどが欠かせません。 BootstrapのリッチなUIコンポーネントを活用することで、最小限のスタイル調整で形を整えることができます。

一方で、実務で注意が必要なのはバージョン管理と依存関係です。 VueとBootstrapのバージョンが合わないと、ドキュメントにある機能が正常に動作しない場合があります。 また、BootstrapのJavaScript機能はVue.jsとは別で動く仕組みになっているので、Vueコンポーネント単位で制御を行いたい時には、上手に使い分ける工夫が必要です。

バージョン管理と今後のアップデート

Vue.jsもBootstrapもバージョンアップが比較的活発に行われています。 Vueは3系、Bootstrapは5系がそれぞれ最新の主流バージョンとなっているので、まずはこれらを基準に環境を整えてみるのがおすすめです。

将来的には、Bootstrap本体が持つJavaScript機能もさらに刷新される可能性があります。 Vue側のコンポーネントライブラリとして、Bootstrapをラップして使いやすくしたものがコミュニティで提供されることもあるため、そういった情報も逐次チェックするとよいでしょう。

よくあるトラブルシュート

BootstrapとVue.jsを初めて組み合わせると、思わぬところでつまずく場合があります。 ここでは、初心者の方が遭遇しがちなトラブルをいくつか挙げます。

CSSが反映されない

  • パスの指定ミス
  • CSSインポートの順序が間違っている

Vue CLIやViteのプロジェクトでは、ファイルの場所が異なるときに相対パスがずれてしまうことがあります。 また、自作のCSSをBootstrapより後に読み込むと上書きした内容が適切に反映されやすくなります。

JavaScriptの機能が動かない

  • BootstrapのJavaScriptをインポートしていない
  • Vue.jsのバージョンが古い/Bootstrapのバージョンが古い

Bootstrap 5のJS機能は、Popper.jsなどを内部で利用しています。 npmでインストールした場合は自動的に依存関係も導入されますが、import文を忘れると機能が働かないことがあります。

レスポンシブレイアウトが崩れる

  • コンテナクラスやrowクラスが足りない
  • colクラスの指定が正しくない
  • カスタムCSSの優先度に問題がある

基本的には、containerrowcolクラスをセットで使う必要があります。 また、メディアクエリをいじりすぎるとBootstrapのデフォルトスタイルが想定通りに効かなくなることがあるので注意しましょう。

テーブルとフォームの実装例

データ管理画面でよく見かけるテーブルとフォーム入力の例を確認してみましょう。 以下のコードでは、テーブルにユーザー情報を表示し、新規ユーザーを追加するためのフォームをモーダルで提供しています。

<template>
  <div class="container mt-5">
    <h3>ユーザー一覧</h3>
    <table class="table table-striped">
      <thead>
        <tr>
          <th>名前</th>
          <th>メールアドレス</th>
          <th>役職</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="(user, index) in users" :key="index">
          <td>{{ user.name }}</td>
          <td>{{ user.email }}</td>
          <td>{{ user.role }}</td>
        </tr>
      </tbody>
    </table>

    <button
      class="btn btn-primary"
      @click="toggleModal"
    >
      新規ユーザーを追加
    </button>

    <div
      class="modal fade"
      :class="{ show: isModalOpen }"
      v-if="isModalOpen"
      style="display: block;"
      role="dialog"
    >
      <div class="modal-dialog" role="document">
        <div class="modal-content">
          <div class="modal-header">
            <h5 class="modal-title">ユーザー追加</h5>
            <button type="button" class="btn-close" @click="toggleModal"></button>
          </div>
          <div class="modal-body">
            <div class="mb-3">
              <label class="form-label">名前</label>
              <input
                type="text"
                class="form-control"
                v-model="newUser.name"
              >
            </div>
            <div class="mb-3">
              <label class="form-label">メールアドレス</label>
              <input
                type="email"
                class="form-control"
                v-model="newUser.email"
              >
            </div>
            <div class="mb-3">
              <label class="form-label">役職</label>
              <input
                type="text"
                class="form-control"
                v-model="newUser.role"
              >
            </div>
          </div>
          <div class="modal-footer">
            <button
              type="button"
              class="btn btn-secondary"
              @click="toggleModal"
            >
              キャンセル
            </button>
            <button
              type="button"
              class="btn btn-primary"
              @click="addUser"
            >
              追加
            </button>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: 'UserList',
  data() {
    return {
      users: [
        { name: '田中太郎', email: 'taro@example.com', role: 'マネージャー' },
        { name: '山田花子', email: 'hanako@example.com', role: 'スタッフ' }
      ],
      newUser: {
        name: '',
        email: '',
        role: ''
      },
      isModalOpen: false
    }
  },
  methods: {
    toggleModal() {
      this.isModalOpen = !this.isModalOpen
    },
    addUser() {
      if (this.newUser.name && this.newUser.email && this.newUser.role) {
        this.users.push({
          name: this.newUser.name,
          email: this.newUser.email,
          role: this.newUser.role
        })
        this.newUser = { name: '', email: '', role: '' }
        this.toggleModal()
      }
    }
  }
}
</script>

このように、Bootstrapで定義されたクラスを使いながらVueの双方向データバインディング(v-model)でフォームの入力を管理できます。 ユーザーを追加したらテーブルの配列に新しい要素が追加され、画面は即座に更新される仕組みです。

独自コンポーネントと再利用

Vue.jsの大きな特長は、UI要素をコンポーネントとしてカプセル化できることです。 たとえば、Bootstrapのカードを使ったコンポーネントを共通部品化しておけば、どのページでも同じスタイル・機能を簡単に使い回すことができます。

実務では、共通のヘッダーやフッター、ボタンやフォームなどをコンポーネント化しておくと、保守性が高いプロジェクトになりやすいです。 また、複数人で開発を進める際に、デザイナーがBootstrapベースのパーツを用意し、エンジニアがVueのロジックを追加するといった形で役割分担しやすくなります。

コンポーネントを活用する際は、適度に分割しすぎないように注意してください。 細かく分割しすぎるとファイルが増えすぎて、管理が大変になることがあります。

ステート管理とフォームの複雑化

小規模なプロジェクトならdataオプションやprops、emitだけで十分に状態管理を行えます。 しかし、やがてフォームやテーブル、モーダルなどが増えてくると、コンポーネント間の通信が複雑になりがちです。

本格的な実務では、VuexやPiniaなどのステート管理ライブラリを導入するケースもありますが、初心者向けにはまずコンポーネント構造を意識しながら実装してみるのがおすすめです。 Bootstrapのフォームクラスで見栄えを整えつつ、Vueで状態管理やバリデーションを実装する流れを理解することで、ひとつずつ機能拡張がしやすくなります。

パフォーマンス面での注意

Vue.jsとBootstrapを組み合わせるだけで、極端にパフォーマンスが悪化することはあまりありません。 とはいえ、Bootstrapが提供する全てのスタイルやコンポーネントを読み込むので、プロジェクト規模が大きくなるにつれてビルド成果物が肥大化しがちです。

不要なCSSやJavaScriptが多く含まれると、初回ロード時間がやや長くなる可能性があります。 以下の点を押さえておくと、パフォーマンスへの悪影響を抑えやすいでしょう。

  • 必要なコンポーネントだけをインポートする
  • 圧縮やコードスプリットを積極的に活用する
  • キャッシュの制御を適切に行う

特に、Bootstrapから利用したい部分のSassファイルだけをimportすることで、不要なスタイルを省くテクニックもあります。 カスタマイズの自由度とパフォーマンスのバランスを意識して取り入れてみてください。

実装中に困ったらどうする?

実務でVue.jsとBootstrapを使って開発していると、思わぬバグやレイアウトの崩れに直面することがあります。 そのようなときは、まずコンソールエラーやブラウザのデベロッパーツールで状況を確認し、問題の箇所を特定するのが大切ですね。

また、BootstrapやVue.jsの公式ドキュメントには、基本的な使い方や注意点がよくまとまっています。 本記事の例をカスタマイズしながら、少しずつ自分のプロジェクトに合ったコードに仕上げてみましょう。

フォームのバリデーションやセキュリティ面の実装を後回しにしてしまうと、後からトラブルになりかねません。 先にフォームの基本的な動作を整え、その上でバリデーションと保護対策を加えるとよいでしょう。

実務との関連性

Vue.jsとBootstrapを使いこなせると、モックアップ段階から完成形に近い状態のUIをすばやく作ることができるようになります。 例えば、クライアントとの会話でざっくりとしたイメージをヒアリングして、その場でざっと見た目を組み立てることも可能です。

これによって、開発プロセスを効率化しながら、エンドユーザーの操作感覚を早期に確認できるというメリットがあります。 さらに、コンポーネントの再利用性を高めると、大規模案件でもコードをメンテナンスしやすくなります。

実際のところ、管理画面やダッシュボードはページ数こそ多くないものの、フィルタリングや検索条件、各種フォームが多いですよね。 Vue.jsのリアクティブな機能で入力チェックや表示切り替えをしながら、Bootstrapで視覚的な整合性を保つというワークフローは十分に現実的です。

トラブルを回避するためのコツ

バージョンの確認を徹底する

Vue 3対応なのか、Bootstrap 5対応なのかは必ずチェックしましょう。

最小限の依存関係から始める

いきなり多くのプラグインを導入すると、どこで不具合が発生しているかの切り分けが難しくなります。

コンポーネントのレイアウトを意識する

Bootstrapのグリッドシステムやカードを使う場合は、コンポーネント階層とCSSクラスの割り当てを明確にしておくと良いでしょう。

メンテナンス性を重視

一度組んだレイアウトが変更になる場合を想定して、CSSの分割やコンポーネントの分割を適度に行います。

まとめ

Vue.jsとBootstrapを組み合わせると、動的なUIと洗練された見た目を同時に手軽に実現できます。 管理画面やダッシュボードのような、素早い開発スピードと一定のデザイン品質が求められる場面で役立つでしょう。

初心者の方はまず、CDN経由などで簡単にセットアップしてみるところから始めて、コードを少しずつ書き換える経験を重ねるのがおすすめです。 プロジェクトが本格化してきたら、ViteやVue CLIを用いたビルド環境や、SassでのBootstrapカスタマイズなどにステップアップすると良いかもしれません。

今後さらにVue.jsやBootstrapがアップデートされても、基本的なコンセプトは変わりません。 ぜひコンポーネント指向とCSSフレームワークの組み合わせを楽しみながら、実践的なUIを構築してみてください。

Vue.jsをマスターしよう

この記事で学んだVue.jsの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。