View のモバイル対応

Adventarを支える技術 Advent Calendar 2019 の21日目です。

このご時世には信じがたい話ですが、去年まで Adventar はスマホで見ると PC View を縮小するだけで、スマホでは非常に使いづらいサービスでした。今年のシステムリニューアルでは機能追加したりや見た目を変える余裕はなかったのですが、さすがに恥ずかしい、アクセスも iOS が一番多いという言い訳のできない証拠があったので、モバイル対応だけはやることにしました。

レスポンシブと出し分け

モバイル対応(というかマルチデバイス対応)は、大きく分けて2つの手法があって、HTML は同一で、画面の大きさによって CSS を変更することで対応するレスポンシブ(Webデザイン)と言われる手法、ユーザーエージェントなどの情報を元に、スマホ用や PC 用などの HTML を出し分ける方法があります。

機能やレイアウトがガラっと変わるのであれば出し分けのほうがよいですが、スタイルの変更だけで要件がまかなえるのであればレスポンシブのほうが楽な場合が多いです。

個人的には、スマホで見たときと PC で見たときにコンテンツの位置が全然違ったり、PC にあった機能がスマホだとなくなっているという体験が嫌いなので、今回はレスポンシブで対応しました。

ブレイクポイントを決める

ブレイクポイントは感覚がよくわからないので Twitter Bootstrap を参考にしました。

https://getbootstrap.com/docs/4.3/layout/overview/#responsive-breakpoints

// Extra small devices (portrait phones, less than 576px)
// No media query for `xs` since this is the default in Bootstrap

// Small devices (landscape phones, 576px and up)
@media (min-width: 576px) { ... }

// Medium devices (tablets, 768px and up)
@media (min-width: 768px) { ... }

// Large devices (desktops, 992px and up)
@media (min-width: 992px) { ... }

// Extra large devices (large desktops, 1200px and up)
@media (min-width: 1200px) { ... }

もともと Adventar の PC View は最大幅が 1000px で、992px, 1200px あたりは不要だったので、576px と 768px だけ採用し、以下の3パターンに絞りました。

サイズ
Smallwidth < 576px
Medium576px <= width < 768px
Large768px <= width

Small

f:id:hokaccha:20191219211632p:plain:w300

f:id:hokaccha:20191219211824p:plain:w300

Medium

f:id:hokaccha:20191219211854p:plain:w420

f:id:hokaccha:20191219211909p:plain:w420

Large

f:id:hokaccha:20191219211928p:plain:w600

f:id:hokaccha:20191219211941p:plain:w600

モバイルファーストで作る

PC 用のスタイルを画面の小さいスマホ向けに変更していくのはけっこう難しいのと、基本的に PC で開発するのでモバイルの確認が漏れがち、などの理由があり、モバイル向けの画面をプライマリで作り、そこから幅を広げた場合の画面を作っていくことにしました。

実装としては、メディアクエリに max-width でなく min-width を使うのがポイントです。例えば480pxをブレイクポイントにしてスタイルを変更するケースを考えてみます。max-width を使うとこうです。

// PC 用
.btn {
  font-size: 20px;
}

// スマホ用
@media (max-width: 480px) {
  .btn {
    font-size: 14px;
  }
}

min-width の場合はこう。

// スマホ用
.btn {
  font-size: 14px;
}

// PC 用
@media (min-width: 481px) {
  .btn {
    font-size: 20px;
  }
}

基本的には media query で元スタイルを上書きしていくほうがやりやすいので、min-width を使うと自然と画面が小さいサイズ向けのスタイルがプライマリになります。

まとめ

UI をモバイル対応した話を書きました。明日は細かすぎて伝わらない UI の工夫について書こうと思います(ネタ切れです)。