どうしてスマホだとページが小さく見えるのだろう
スマホでウェブページを開いたら、1行を読むのにも指で広げて拡大しなければならなかった、という経験はありませんか。そのページは広い画面向けに作られていて、スマホがそれを小さく描いたのです。数行のコードで、スマホにきちんと描かせることができます。このレッスンでは、その部分を見ていきます。
このレッスンが終わると
メモ
スマホで正しく動くウェブページの仕組みになっている部分を、見つけることができる。
キーワード
- ビューポート:ページが描かれる画面の範囲。
- レスポンシブ:画面の幅に合わせて形を変えるレイアウト。
- メディアクエリ:「幅が一定以上」のような条件が成り立つときだけ適用される CSS の規則。
- マニフェスト:ウェブアプリの名前、アイコン、色をスマホに伝える小さなファイル。
- サービスワーカー:ブラウザーが持っておく、保存したコピーから要求に答えられるスクリプト。
- キャッシュ:ファイルのコピーをしまっておく場所。
はじめに:すでに知っていること
メモ
頭の中で答えてみましょう。1. ウェブページで CSS は何をしますか。2. 指はマウスのポインターより大きいですか、小さいですか。3. ネットワークがないとき、ウェブページはどうなりますか。答え: ページの見た目を決める。大きい。たいてい読み込めない。最後の手順はこの問題を解きます。
始める前に
メモ
レッスンの上のバーにある ラボを開始 を押し、動いていると表示されるまで待ちます。コンテナはひとつ、jupyter だけで、ターミナルからは docker exec jupyter でその中の Python を使います。これはコンテナの中でコマンドをひとつ実行する命令です。JupyterLab のリンクを押すとポート 8888 の画面が開き、Preview(プレビュー)のリンクを押すと、ポート 8000 で習慣記録アプリが表示されます。下の 実行 ボタンは、それぞれのコマンドをラボのターミナルに、同じセッションの中で順番に入力します。様子を見たいときや自分で入力したいときは、バーの ターミナルを開く(新しいタブ) を押します。
ウェブアプリはフォルダーで、小さなサーバーが見せてくれる
ls app でウェブアプリの中身が並びます。ページ、スタイル、スクリプト、マニフェスト、サービスワーカー、アイコン2つです。2つ目のスクリプトは、そのうち3つをプレビューサーバーに頼んで、答えを表示します。どれも 200、つまり見つかったという答えで、マニフェストだけは専用の種類 application/manifest+json です。次に、自分のブラウザーで Preview のリンクを開き、ウィンドウを狭くして、レイアウトが変わるのを見てください。
docker exec jupyter ls appここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
docker exec jupyter python3 steps/serve.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
viewport タグは、スマホにどの幅で描くかを伝える
このスクリプトは index.html を読み、viewport という名前の meta タグを探します。見つかり、中身は width=device-width, initial-scale=1 です。ページを画面と同じ幅で、ふつうの大きさで描く、という意味です。試してみましょう。JupyterLab でその行を消して保存し、スクリプトをもう一度実行すると、MISSING(ない)と表示されます。すると、スマホは画面がずっと広いかのようにページを描き、それを縮めてしまいます。
docker exec jupyter python3 steps/viewport.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ブレークポイントは、ある幅でレイアウトを変える
このスタイルシートはモバイルファーストです。ふつうの規則がスマホ用で、画面が広くなるにつれてメディアクエリが規則を足していきます。スクリプトは3つ見つけます。2つは幅で、600 px と 900 px です。3つ目は幅ではなく、ダークモードの好みです。ブラウザーのウィンドウを 600 px より広げると、フォームが横1列になります。900 px より広げると、リストが2列になります。
docker exec jupyter python3 steps/breakpoints.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
親指には広さが必要
指先はマウスのポインターよりずっと大きく、押しているものを隠してしまいます。このラボでは、ボタンが届くべき線を 44 ピクセルにしています。スクリプトはスタイルシートのすべての大きさを並べます。Add ボタンは高さ 32 px、フィルターのボタンは 36 px、丸い「完了」ボタンは 30 × 30 で、44 より小さいものが4つあります。わざと少し小さくしてあり、直すのがあなたの課題です。
docker exec jupyter python3 steps/touch.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
確かめよう
ヒント
リストを2列にするブレークポイントはどれで、44 ピクセルより小さい大きさはいくつありますか。答え: 900 px、そして4つ。
マニフェストがあると、スマホはページをアプリとして扱える
マニフェストは JSON ファイルです。スクリプトは7つの項目を調べます。6つはあります。名前、アイコンの下に出す短い名前、最初に開くページ、表示のしかた(standalone、ブラウザー自身のバーなしという意味)、アイコン、上のバーの色です。1つは MISSING(ない)で、background_color、アプリが起動するあいだに見える色です。アイコンのファイルは2つとも存在します。スマホがアプリのインストールを勧めるかどうかはブラウザーしだいなので、自分のブラウザーのメニューで探してください。
docker exec jupyter python3 steps/manifest.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
サービスワーカーがあると、ネットワークなしでアプリを開ける
サービスワーカーは habits-v1 というキャッシュの名前と、インストールのときに保存する8つのファイルの一覧を持っています。スクリプトは、それぞれのファイルがあるかを調べ、7つはあります。8つ目の /offline.html はありません。これは本物の不具合です。一覧のファイルがひとつでも保存できないと、インストール全体が失敗し、オフラインでは何も動きません。ブラウザーは安全なアドレスでしかサービスワーカーを許さないので、プレビューのリンクでは断られるかもしれません。どちらなのかは、ブラウザーのコンソールに出ます。
docker exec jupyter python3 steps/offline.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある思い込み
注意
パソコンで狭くしたウィンドウできれいに見えれば、スマホでも動く、と思う人は多いです。狭いウィンドウが見せてくれるのはレイアウトだけです。親指の大きさも、モバイル回線の遅さも、スマホ自身のブラウザーの動きも見せてくれません。狭いウィンドウはレイアウトの確認に使い、できれば本物のスマホでもページを開いてみましょう。
モバイルウェブアプリとネイティブアプリ
ネイティブアプリは、ひとつの種類のスマホ向けに作られ、ストアからインストールします。モバイルウェブアプリはウェブページです。コードはすべてのスマホで共通で、ファイルを変えればすぐに更新され、リンクがあれば開けます。スマホにデータを保存でき、サービスワーカーでオフラインでも動き、多くのブラウザーではホーム画面に追加できます。ただし、スマホの機能に届く範囲はせまめです。通知やバックグラウンドでの動作など、何が使えるかはブラウザーとスマホしだいで、ブラウザーが保存データを消すこともあります。どちらを選ぶかは勝ち負けではなく、得るものと失うもののかね合いです。
最後の確認
ヒント
見返さずに答えましょう。1. ページを画面と同じ幅で描くようスマホに伝えるタグはどれですか。2. モバイルファーストとはどういう意味ですか。3. アプリの名前とアイコンを決めるファイルはどれですか。4. 一覧のファイルがひとつ足りないと、サービスワーカーがインストールできないのはなぜですか。答え: viewport の meta タグ。ふつうの規則がスマホ用で、メディアクエリが広い画面向けに足していく。マニフェスト。一覧はまとめて保存されるので、ひとつの失敗でインストール全体が止まる。
先生へ
ヒント
このレッスンは、ラボで進めるレッスンの小さな例です。手順と実行ボタンがレッスンで、ラボは生徒ひとりひとりのコピーです。ラボはサービスがひとつで、JupyterLab に、生徒のウェブアプリを表示する2つ目のポートがついています。自動採点はありません。生徒は小さなボタンを 44 ピクセル以上にした app/style.css を、何を変えて自分のブラウザーでどう確かめたかの一文といっしょに提出します。学習のポイント:1. viewport タグがあると、スマホでページがレスポンシブになる。2. モバイルファーストの CSS は、画面が広くなるにつれてメディアクエリを足す。3. マニフェストとサービスワーカーで、インストールできてオフラインでも動くウェブアプリになる。よくある思い込み:パソコンの狭いウィンドウをスマホの試験と取り違える。用意するもの:ラボとブラウザー、できればスマホ。ヒント:実行を押す前に、それぞれの結果を予想させてください。ファイルは決まった文章から作られるので、どのコピーでも同じ結果になります。ご自分のモジュールにコピーして変更するか、レッスンビルダーのラボメニューから一から作ってください。