“3モード設計”と言いながら、実質は2系統。そこにこだわった理由。
モバイルファーストで“逃げた”その後──3モードUIへの再挑戦
前回、iPad Proの横画面レイアウトに苦戦して「PC以外はモバイルファーストで統一」という方針に落ち着いたとお話ししました。
当時は「逃げた」と感じる部分もありましたが、実際には合理的で安定した判断だったと思っています。
ただその後、実運用とフィードバックの中で、次の課題が見えてきました。
PCで見ると「物足りない」
- 画面が広いのに1カラム表示は情報密度が低く感じる
- 補足画像や演出が活かしきれない
- PCユーザーが多いなら、専用の見せ方をした方が効果的
そうして、もう一度UI設計を見直すことにしました。
3モード制御、でもUIは2系統で再設計
今回採用したのは「PC」「タブレット」「モバイル」の3モード判定をベースにしながらも、
レイアウトは“PC専用”と“タッチ端末用”の2系統に分ける方式です。
ブレークポイントと判定方式
CSSではメディアクエリで以下のように分岐しています:
- PC:画面幅 1401px 以上
- タブレット:769〜1400px
- モバイル:768px 以下
JavaScriptでは DeviceDetector.js
を使い、以下のように判定しています:
isDesktop()
:PCisTablet()
:タブレットisMobile()
:モバイルisMobileOrTablet()
:タッチ端末全般
また、±16pxのヒステリシス処理と100ms以内の変化無視を入れて、安定した切り替えを実現しています。
レイアウト構成の違い
PCモードでは:
- 左右2カラムの“見開きレイアウト”を採用(
.book-spread-container
) - 左に本文、右に補足画像や図解
- 固定のサイドメニューも常時表示
- アニメーションや演出を含めたフルUI
タブレット・モバイルモードでは:
- 単一カラムの縦スクロール型レイアウト(
.detail-panel
) - 補足画像や演出は省略
- メニューはフッターからオーバーレイで開く方式
- スクロール中心のシンプルで軽量な設計
コンテンツの表示方式
PCでは showDetailCards()
を使って、1枚ずつ章を切り替える形式を採用しています。
切り替えは400msのフェード効果で、没入感を意識した静かな演出です。
モバイル・タブレットでは showMobileCards()
を使い、すべての章を縦に並べて一括表示。
アニメーションは控えめにして、表示速度と操作性を優先しています。
ナビゲーション操作の違い
- PCではホイールでページをめくる「スマートスクロール」を実装
ページ番号も画面に表示され、進行状況がわかりやすくなっています。 - モバイル / タブレットでは通常の縦スクロールで章を移動
ページ番号表示はなく、直感的な読み進めに対応しています。
フッターUIの調整
- PCでは「前章・次章」ボタンを固定位置(position: fixed)に表示
- タブレットではボタンを本文内に配置し、サイズも少し小さめに
- モバイルではさらにサイズを抑え、テキストも短縮表示(例:「前章」「次章」)
視覚効果と演出
PCモードでは、補足画像や背景画像、カットインアニメーション(GSAP)なども含めて、
情報とビジュアルの両方を活かせる設計になっています。
一方、タブレット・モバイルではこれらをすべて省略。
読みやすさと軽量さを優先した作りです。
タブレットとモバイルは、レイアウトは同じです
今回の設計でポイントだったのは、「コード上はタブレットとモバイルを判別しているが、UIは共通にしている」という点です。
その理由は:
- タブレットでも操作性はほぼモバイルと同じ(タッチ中心、縦スクロール)
- 中途半端にPC要素を残すと崩れやすくなる
- iPad Proのように“見た目はPC”でも中身はタブレットという例外が多すぎる
結果として、UIは以下の2系統で整理しました:
- PCモード:左右2カラム、補足画像、演出あり
- タッチモード(タブレット+モバイル):縦スクロール型、軽量設計
コード上はタブレットとモバイルを区別していますが、
UIレイアウトとしては両者を共通にしています。
理由は:
- 操作感はほぼ同じ(縦スクロール+タッチ中心)
- iPad Proなど「見た目はPC」のタブレットが増えている
- PCと完全に切り分ける方が保守もしやすい
ちなみにこんな工夫もしています(開発の裏話)
画面幅でスマホ/タブレット/PCを切り替える処理って、
「768px超えたら即タブレット」にしてしまうと、画面をちょっと動かしただけで表示がガタガタ変わってしまうことがあります。
そこで±16pxの“ゆらぎ”を許すヒステリシス処理を入れて安定させました。
```js
if (width <= 768 + 16) {
return 'mobile';
} else if (width <= 1400 + 16) {
return 'tablet';
} else {
return 'desktop';
}
まとめ
一度は“モバイルファーストで逃げた”UI問題。
でもその先で得た気づきが、
「2系統のUI」+「3モードの判定」という柔軟な設計に進化させてくれました。
無理に完全分岐を目指すよりも、
ユーザーの操作感に合わせてUIを整理した方が、結果的に読みやすく、使いやすくなったと感じています。