2017.06.30
Ionicでモバイルアプリを作ろう!(13)Gridレイアウトを作る
クロスプラットフォーム対応のモバイルアプリ開発フレームワークであるIonicの使い方を紹介していきます。
今回はIonicでGridレイアウトを作る方法を紹介します。
Grid
基本
Ionicには標準でion-gridというコンポーネントが用意されています。これを用いてGridレイアウトを実装します。
(もしCSSフレームワークのBootstrapを使ったことがあるのであれば同じ感覚で使えます)
次のようなレイアウトの実装を考えます。
早速ですがサンプルコードを載せて解説をします。基本実装は次のようになります。今回はレイアウトが見やすくなるように各セルにCardコンポーネントを入れています。
..省略 <ion-content padding> <ion-grid> <ion-row> <ion-col> <ion-card> 1 </ion-card> </ion-col> <ion-col> <ion-card> 2 </ion-card> </ion-col> <ion-col> <ion-card> 3 </ion-card> </ion-col> </ion-row> <ion-row> <ion-col> <ion-card> 4 </ion-card> </ion-col> <ion-col> <ion-card> 5 </ion-card> </ion-col> <ion-col> <ion-card> 6 </ion-card> </ion-col> </ion-row> </ion-grid> </ion-content>
page-home { ion-card { padding: 16px; text-align: center; } }
全体をion-gridで囲います。ion-rowは行を、ion-colは列に対応します。ion-col内に各アイテムの内容を入れます。デフォルトだとウィンドウサイズに合わせて等間隔で表示します。
カラムの幅割合指定
Gridコンポーネントは横方向を12等分割します。x/12分の割合を占めるカラムにはcol-x属性を指定します。
<ion-content padding> <ion-grid> <ion-row> <ion-col col-3> <ion-card> 1 </ion-card> </ion-col> <ion-col> <ion-card> 2 </ion-card> </ion-col> <ion-col> <ion-card> 3 </ion-card> </ion-col> </ion-row> <ion-row> <ion-col col-6> <ion-card> 4 </ion-card> </ion-col> <ion-col> <ion-card> 5 </ion-card> </ion-col> <ion-col> <ion-card> 6 </ion-card> </ion-col> </ion-row> </ion-grid> </ion-content>
1次元配列のデータをGrid表示
1次元配列の形で与えられたデータをGridで表示する方法を解説します。
「TypeScript側で元配列から2次元配列を作り、テンプレートからその配列を参照する」が方針になります。
今回は[“A”, “B”, “C”, “D”, “E”, “F”, “G”]と1次元文字列配列が与えられたとし、次のように表示することを考えます。
@Component({ selector: 'page-home', templateUrl: 'home.html' }) export class HomePage { data: Array<string>; grid: Array<Array<string>> = new Array<Array<string>>(); constructor(public navCtrl: NavController) { this.data = ["A", "B", "C", "D", "E", "F", "G"]; } ionViewDidLoad() { let coulumnNum = 3; //カラム数 for (let i = 0; i < this.data.length; i += coulumnNum) { let row = this.data.slice(i, i + coulumnNum); this.grid.push(row); } } }
Array.prototype.slice()を使って元配列から各行に対応する配列を切り出しています。配列gridに切り出した配列を要素追加します。
..省略 <ion-content padding> <ion-grid> <ion-row *ngFor="let row of grid"> <ion-col *ngFor="let item of row" col-4> <ion-card>{{item}}</ion-card> </ion-col> </ion-row> </ion-grid> </ion-content>
テンプレートではngForを使ってループさせます。
これでデータを元にGrid表示することができるようになりました。