全国オンライン対応受付 平日 9:00-18:00
お問い合わせ

開発記録 / junka制作記 / Vol.25 junka制作記 Vol.2

記事 02

教室の数が変わっても崩れないUI——クラスルーム可変グリッドの設計

最初の入退室管理システムのUIは3教室を前提に作っていた。

2026-06-07 公開

最初の入退室管理システムのUIは3教室を前提に作っていた。

3列グリッドで3つのカードを並べる。綺麗に収まる。画面に映えた。しかし教室が4つになったとき、4列グリッドに切り替えるためにコードを修正しなければならない。5教室になればまた修正が必要だ。

教室の数を画面の設計に焼き込んでしまっていた。


グリッドを可変にすることにした。教室の数はスプレッドシートの教室マスタシートから取得する。APIで返ってきた件数に応じてカードを並べる。

CSSはauto-fillを使った。

.classroom-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 16px;
}

auto-fillは利用可能な幅の中に収まるだけカラムを作る。280px以上の幅があればカードを横に並べ、なければ折り返す。教室が3つでも7つでも、コードを変えずに見た目が整う。


ただし可変にするだけでは足りなかった。

入退室管理システムの入退室画面はiPadで使われることが多い。縦持ちで使うのか横持ちで使うのかも教室によって違う。カードの最小幅が大きすぎると縦持ちiPadで崩れる。小さすぎると横持ちで間延びする。

280pxというのは何度か調整した結果の数字だ。iPadのポートレート(縦持ち)では2列、ランドスケープ(横持ち)では3列になる。これが一番使いやすかった。


もう一つの問題が「カードの高さを揃える」ことだった。

教室名が長い教室と短い教室が混在する場合、テキスト量の違いでカードの高さが変わってしまう。縦に不揃いになったグリッドは見づらい。

CSS Gridにはalign-items: stretchがデフォルトで効いているので、同一行のカードは高さが揃う。ただし行をまたぐと揃わない。

対策として、カードの中身をflex-direction: columnのflexboxにして、ボタンをカードの下端に固定した。テキストが短くてもボタンの位置が統一される。


動的なデータとUIの相性は常に気を使う。

静的なモックを作るときは「3教室で3カード」として設計する。本番に繋いだとき1教室の状態でテストして動いた、次に5教室にしたら崩れた、という展開はよくある。

可変グリッドの考え方は「データの件数をUIが吸収する」ことだ。件数をUIが知らなくていい状態にする。そのためにauto-fillは便利な仕組みだ。

教室を増やす作業がスプレッドシートへの1行追加になった。フロントを触る必要がない。

次回は、スプレッドシートをDBとして設計し直した話を書く。

シンプルシステム株式会社 代表 伊藤勝彦