Vuetifyを導入したものの、使い方にクセがあって投げ出してしまった方もいるのではないでしょうか。ぼくも今だに試行錯誤しながら使っていますが、何を作る場合でも必要な基本的な知識があります。v-app、v-content、v-container、v-layout、v-flexあたりがそれかなと思います。この記事ではそれらの使い方について解説しています。
VueプロジェクトにVuetifyの導入をまだしていない方はこちらの記事(Vueプロジェクトへのインストール手順)でインストールをして、実際にコードを書きながら読みすすめていただいた方がわかりやすいと思います。
v-appについて
v-appはVeutifyを使うために必須の要素です。Vuetifyのコンポーネントは必ずv-app要素の内側に書く必要があります。v-appで囲まないでVuetifyのコンポーネントを使うと予期しない動作や表示になってしまいます。下記のようにVuetifyのコンポーネントをv-appで囲みます。
1 2 3 4 5 | <template> <v-app> <!-- ここにVuetifyのコンポーネントを入れます --> </v-app> </template> |
v-contentについて
Vuetifyを採用する場合、レイアウトシステムを使う方が多いのではないかと思うのですが、こちらのサンプルのようにサイドメニューの表示・非表示にメインコンテンツを連動させる場合はv-contentでコンテンツを囲む必要があります。v-contentで囲まなければメインコンテンツの動きはサイドメニューの動きに連動しなくなります。
1 2 3 4 5 6 7 | <template> <v-app> <v-content> <!-- v-content要素の中のコンテンツはサイドメニューの動作に連動します --> </v-content> </v-app> </template> |
v-containerについて
v-containerはその名の通りコンテナです。オプション属性がいろいろとあって、fluid属性を付与することで左右いっぱいにコンテナを広げたり、fill-height属性を付与することでv-containerの内部要素を上下中央寄せにしたりできます。
1 2 3 4 5 6 7 8 9 | <template> <v-app> <v-content> <v-container fluid fill-height> <!-- fluidを付けることで左右いっぱいにコンテナが広がります --> <!-- fill-heightを付けるとここに書いた要素は上下中央寄せで表示されます --> </v-container> </v-content> </v-app> </template> |
v-layoutについて
グリッドシステムを使うために必要です。意味としては<div style=”display: flex;”></div>と同じです。v-layoutの内側に次に紹介するv-flexを設置することでグリットデザインを実現できます。
v-layoutのポイントとしては、wrap属性を付けることです。wrap属性を付けないとグリットシステムが機能せず、要素が延々と横につながってしまいます。
1 2 3 4 5 6 7 8 9 10 | <template> <v-app> <v-content> <v-container> <v-layout wrap> <!-- wrap属性をつけるのがポイント --> </v-layout> </v-container> </v-content> </v-app> </template> |
v-flexについて
v-layoutの内側に設置することでグリッドデザインを実現できます。Vuetifyは12分割のグリッドシステムを採用しています。v-flexにxs12、sm6、md4のような属性を与えることでブラウザの幅で可変するようになります。xs12というのはブラウザ幅がxs(600px未満と定義されています)の時12個分のグリッドを使うという意味です。
属性ごとの幅指定は下記のとおりです。
xs | 600px未満 |
sm | 600px以上960px未満 |
md | 960px以上1264px未満 |
lg | 1264px以上1904px未満 |
xl | 1904px以上 |
下記のようにv-flexを設定した場合は、表示幅が600px未満のときはv-flex1つについき12カラムを使い、600px以上かつ960px未満のときはv-flex1つにつき6カラムを使い、960px以上1264px未満のときはv-flex1つにつき4カラムを使うという意味になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 | <template> <v-app> <v-content> <v-container> <v-layout wrap> <v-flex xs12 sm6 md4>コンテンツ</v-flex> <v-flex xs12 sm6 md4>コンテンツ</v-flex> <v-flex xs12 sm6 md4>コンテンツ</v-flex> </v-layout> </v-container> </v-content> </v-app> </template> |