クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

モバイルウェブの基本

レッスン全文をここで読めます。無料アカウントを作成すると、実際のラボで実践できます。

コンテナラボ読了目安 16分コマンド7個

どうしてスマホだとページが小さく見えるのだろう

スマホでウェブページを開いたら、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. マニフェストとサービスワーカーで、インストールできてオフラインでも動くウェブアプリになる。よくある思い込み:パソコンの狭いウィンドウをスマホの試験と取り違える。用意するもの:ラボとブラウザー、できればスマホ。ヒント:実行を押す前に、それぞれの結果を予想させてください。ファイルは決まった文章から作られるので、どのコピーでも同じ結果になります。ご自分のモジュールにコピーして変更するか、レッスンビルダーのラボメニューから一から作ってください。

このラボとソースについて: モバイルウェブのラボ:ブラウザーで作るレスポンシブでインストールできるウェブアプリ

授業で教えていますか?これらのレッスンを生徒に割り当て、採点と生徒ごとのラボを使えます。