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表示することができるようになりました。

  • このエントリーをはてなブックマークに追加

PAGE TOP