Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

vue入門06(クラスとスタイルのバインディングを使う)

Last updated at Posted at 2024-06-05

クラスのデータバインディングの基本を知る

  • v-bind:classに動的にクラスを切り替えるオブジェクトを渡すことをやってみる
<div id="app">
  <p>Hello <span v-bind:class="{ large: isLarge }">Vue.js!</span></p>
</div>
.large{
    font-size: 36px;
}
const app = Vue.createApp({
  data: () => ({
    isLarge: true
  })
})
app.mount('#app')

スクリーンショット 2024-06-05 223421.png

  • isLarge: trueによってクラスが適用され文字が大きくなる
const app = Vue.createApp({
  data: () => ({
    isLarge: false
  })
})
app.mount('#app')

スクリーンショット 2024-06-05 223803.png

  • isLarge: falseでクラスが適用されなくなる

複数のクラスを動的に切り替える

  • v-bind:classに対してはクラスは複数指定することができる
<div id="app">
    <p>Hello <span v-bind:class="{ large: isLarge, 'text-danger': hasError }">Vue.js!</span></p>
</div>
.large{
    font-size: 36px;
}
.text-danger{
    color: red;
}
const app = Vue.createApp({
  data: () => ({
    isLarge: false
    hasError: true
  })
})
app.mount('#app')

スクリーンショット 2024-06-05 225621.png

  • <span v-bind:class="{ large: isLarge, 'text-danger': hasError }">Vue.js!</span>
    →複数クラス指定可能
  • 'text-danger': hasError
    →クラス名にハイフンを含む場合はシングルクォートで囲う必要あり

プレーンなクラス属性と共存させる

  • v-bind:classディレクティブはプレーンなクラス属性と組み合わせることができる
<div id="app">
    <p>Hello
      <span class="bg-gray text-blue"
      v-bind:class="{ large: isLarge, 'text-danger': hasError }">Vue.js!</span></p>
</div>
.large{
    font-size: 36px;
}

.text-danger{
    color: red;
}

.bg-gray{
    background-color: gray;
}

.text-blue{
    color: blue;
}
const app = Vue.createApp({
  data: () => ({
    isLarge: true,
    hasError: true
  })
})
app.mount('#app')

スクリーンショット 2024-06-05 230659.png

  • spanに直接指定したスタイルとv-bindで指定したスタイルがどちらも設定されている
  • 赤文字に関しては競合しているので後ろに記述した青文字が反映されている

配列構文によるクラスのデータバインディングをする

  • v-bind;classにクラスのリストを適用する配列を渡すことができる
<div id="app">
    <p>Hello! <span v-bind:class="largeClass">Vue.js!</span></p>
    <p>Hello! <span v-bind:class="[largeClass, dangerClass]">Vue.js!</span></p>
</div>
.large{
    font-size: 36px;
}

.text-danger{
    color: red;
}

.bg-gray{
    background-color: gray;
}

.text-blue{
    color: blue;
}
const app = Vue.createApp({
  data: () => ({
    largeClass: 'large',
    dangerClass: 'text-danger'
  })
})
app.mount('#app')

スクリーンショット 2024-06-05 231447.png

  • <span v-bind:class="[largeClass, dangerClass]">
    ←配列構文のデータバインディング
  • 配列構文により複数のクラスをバインディングすることができる

オブジェクトデータを利用する

  • dataオプションにオブジェクトを定義してv-bind;classに渡すことができる
<div id="app">
    <p>Hello <span v-bind:class="classObject">Vue.js!</span></p>
</div>
.large{
    font-size: 36px;
}

.text-danger{
    color: red;
}

.bg-gray{
    background-color: gray;
}

.text-blue{
    color: blue;
}
const app = Vue.createApp({
  data: () => ({
    classObject:{
      large: true,
      'text-danger': true
    }
  })
})
app.mount('#app')

スクリーンショット 2024-06-05 232537.png

クラスの条件に三項演算子を使う

  • condition ? expr1 : expr2
  • conditionがtrueならexpr1を実行
  • conditionがfalseならexpr2を実行

<div id="app">
    <p>Hello <span v-bind:class="isLarge ? largeClass: ''">Vue.js!</span></p>
  </div>
.large{
    font-size: 36px;
}

.text-danger{
    color: red;
}

.bg-gray{
    background-color: gray;
}
const app = Vue.createApp({
  data: () => ({
    largeClass:{
      'large': true,
      'bg-gray': true
    },
    dangerClass:{
      'text-danger': true
    },
    isLarge: true
  })
})
app.mount('#app')

スクリーンショット 2024-06-08 213729.png

  • jsのdataオプション内、isLarge: trueとなっているのでhtml側での三項演算子がtrueとなる
    <span v-bind:class="isLarge ? largeClass: ''">Vue.js!</span>
  • trueで実行されるlargeClass内のlargebg-grayのスタイルが効いている状態

配列にしてカンマ区切りでオブジェクト名を渡す方法

<div id="app">
    <p>Hello <span v-bind:class="[isLarge ? largeClass: '', dangerClass]">Vue.js!</span></p>
  </div>
.large{
    font-size: 36px;
}

.text-danger{
    color: red;
}

.bg-gray{
    background-color: gray;
}
const app = Vue.createApp({
  data: () => ({
    largeClass:{
      'large': true,
      'bg-gray': true
    },
    dangerClass:{
      'text-danger': true
    },
    isLarge: true
  })
})
app.mount('#app')
  • htmlのみ変更
  • <span v-bind:class="[isLarge ? largeClass: '', dangerClass]">Vue.js!</span>
  • dangerClassは常に反映と、三項演算子が2つ入った配列になっている
    スクリーンショット 2024-06-08 214526.png

インラインスタイルのデータバインディングを使う

インラインスタイルとは

  • <p style="color: red;">Hello</p>
  • ↑↑↑HTMLで直書きすると上記のイメージ
<div id="app">
    <p>Hello <span v-bind:style="{ color: color, fontSize: fontSize + 'px'}">Vue.js</span></p>
  </div>
const app = Vue.createApp({
  data: () => ({
    color: 'blue',
    fontSize: 36
  })
})
app.mount('#app')

スクリーンショット 2024-06-08 220805.png

インラインスタイルのデータバインディングにオブジェクトデータを使う

<div id="app">
    <p>Hello <span v-bind:style="styleObject">Vue.js</span></p>
  </div>
const app = Vue.createApp({
  data: () => ({
    styleObject: {
      color: 'blue',
      fontSize: '48px'
    }
  })
})
app.mount('#app')

スクリーンショット 2024-06-08 221208.png

0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?