PWAは、Webサイトをスマホのホーム画面に追加して、アプリのように使える仕組みです。
ただ、実際に作ってみるとわかります。
ホーム画面に置けるだけでは、まだアプリっぽくはなりません。
アイコンをタップした瞬間に白い画面が出る。上のバーだけブラウザっぽい。スクロールした時の動きがWebっぽい。戻る操作で急にSafariやChromeの気配が出る。
こういう小さな違和感が積み重なると、ユーザーは無意識に「これはアプリじゃなくてWebだな」と感じます。
僕もPWA LABやOJapp、Petalを作りながら、iPhoneとAndroidでホーム画面追加の挙動を何度も試してきました。
そこで感じたのは、PWAをネイティブアプリっぽく見せるには、派手な機能よりも起動直後・余白・色・スクロール・戻る挙動のような細かい部分が大事だということです。
この記事では、PWAをよりアプリらしく見せるためのUX改善ポイントを、実際の挙動ベースで整理します。
- 1 最初に知っておきたいこと:iPhoneとAndroidではPWAの見え方が違う
- 2 1. 起動直後の白い画面を減らす
- 3 2. theme-colorでシステムUIをなじませる
- 4 3. safe-areaを意識して、上端と下端の違和感を消す
- 5 4. 100vhではなく100dvhを使う
- 6 5. スクロールの引っ張りすぎを抑える
- 7 6. 不要なテキスト選択と長押しメニューを抑える
- 8 7. タップした瞬間の反応を作る
- 9 8. 戻る挙動を雑にしない
- 10 9. display-modeを検出して、PWA時だけUIを変える
- 11 10. アイコンはany maskableを意識する
- 12 11. キャッシュ更新まで含めてUXとして考える
- 13 まとめ:PWAをアプリっぽくする正体は、細部の違和感を消すこと
最初に知っておきたいこと:iPhoneとAndroidではPWAの見え方が違う
PWAの記事ではよく「ホーム画面に追加するとアプリのように見える」と説明されます。
これは間違いではありません。
ただし、iPhoneとAndroidで同じように見えるわけではありません。
Android Chromeは、manifest.jsonの指定がかなり反映されやすいです。
display、theme_color、background_color、icons などが、見た目にわかりやすく効きます。
一方でiPhone Safariは、PWAとしてホーム画面に追加できても、Androidほどmanifestの指定が素直に反映されません。
特に display: fullscreen や orientation のような指定は、Androidでは効いてもiPhoneでは期待通りにならないことがあります。
なので、PWAのUX設計では最初からこう考えた方がいいです。
Androidはmanifestでアプリ感を作る。iPhoneはHTML/CSS側で違和感を減らす。
ここを分けて考えると、かなり設計しやすくなります。
1. 起動直後の白い画面を減らす
PWAで一番アプリっぽさを壊しやすいのは、起動直後です。
アイコンをタップした瞬間に真っ白な画面が出ると、それだけでWeb感が出ます。
昔はiOS向けに apple-touch-startup-image を細かく指定する方法がよく紹介されていました。
ただ、今からPWA記事でそれを中心に書くのはあまりおすすめしません。
デバイスごとの画像管理が重く、今の実装としても扱いづらく、汎用的な改善策としては弱いです。
それよりも、まずは次の3つを整える方が現実的です。
background_colorをアプリの背景色に合わせるtheme_colorを画面上部の色に合わせる- HTML/CSSの初期表示をできるだけ軽くする
manifest.jsonでは、次のように指定します。
{
"name": "My PWA",
"short_name": "My PWA",
"start_url": ".",
"display": "standalone",
"background_color": "#f7f7f7",
"theme_color": "#f7f7f7",
"icons": [
{
"src": "/icon.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "any maskable"
}
]
}
大事なのは、起動直後に見える色と、実際のページ背景色をズラさないことです。
たとえばmanifestの background_color が白で、実際のページが黒っぽいデザインだと、起動直後に一瞬白く光ったように見えます。
この一瞬の違和感が、かなりWebっぽく見えます。
スプラッシュ画像でごまかすより、最初から背景色と初期表示を整える方が安定します。
👉 PWAの作り方|manifest.json・Service Worker・ホーム画面対応を丁寧に解説 の解説が役に立ちます。
2. theme-colorでシステムUIをなじませる
PWAの見た目を整えるなら、theme-color はかなり重要です。
Androidでは特に、上部バーの色に影響します。
ページの背景やヘッダーと theme-color が合っていると、画面全体がひとつのアプリのように見えます。
<meta name="theme-color" content="#f7f7f7">
manifest.json側にも入れておくと安心です。
{
"theme_color": "#f7f7f7",
"background_color": "#f7f7f7"
}
Petalのように、やわらかい世界観を大事にするサービスでは、上部バーだけが黒かったり白く浮いたりすると、それだけで雰囲気が壊れます。
逆に、背景色、ヘッダー、theme-color が自然につながっていると、かなりアプリ感が出ます。
ただし、iPhoneではAndroidほど theme-color の効果がわかりやすく出ないこともあります。
だからこそ、Androidではmanifestを活かし、iPhoneではページ内の余白や背景色で違和感を減らす設計が大事になります。
3. safe-areaを意識して、上端と下端の違和感を消す
スマホ画面でアプリっぽさを出すには、画面の端の扱いがかなり重要です。
特にiPhoneでは、ノッチやホームインジケーターがあります。
ここを無視してデザインすると、上が詰まりすぎたり、下のボタンがホームバーに近すぎたりして、急にWebページっぽく見えます。
そこで使うのが env(safe-area-inset-*) です。
.app-shell {
min-height: 100dvh;
padding-top: env(safe-area-inset-top);
padding-bottom: env(safe-area-inset-bottom);
}
固定フッターがある場合は、下側に余白を足します。
.bottom-nav {
padding-bottom: calc(12px + env(safe-area-inset-bottom));
}
これだけでも、かなり「ちゃんとスマホ向けに作られている」感じが出ます。
PWAはWebですが、ホーム画面から開かれる以上、ユーザーはアプリのつもりで触ります。
だから、Webページの余白ではなく、スマホアプリの余白として考えた方が自然です。
4. 100vhではなく100dvhを使う
スマホ向けの全画面UIでよくハマるのが、100vh です。
PCでは問題なくても、スマホブラウザではアドレスバーや下部バーの影響で、高さがズレることがあります。
PWAやホーム画面追加後のUIでは、できれば 100dvh を使う方が安定しやすいです。
.app-shell {
min-height: 100dvh;
}
特にオンボーディング画面、スプラッシュ風の初期画面、固定フッター付きのUIでは、高さのズレがかなり目立ちます。
画面下のボタンが少し隠れる。スクロールしないはずなのに微妙に揺れる。こういう細かい挙動は、ユーザーにとってかなりストレスです。
アプリっぽさは、見た目の派手さよりも「変なズレがないこと」で決まります。
5. スクロールの引っ張りすぎを抑える
Webっぽさが出やすい動きのひとつが、スクロールの引っ張りすぎです。
画面を上や下に引っ張ったときに、背景が見えたり、画面全体がびよんと動いたりすると、アプリというよりWebページの感覚になります。
完全に消せる場面ばかりではありませんが、CSSである程度コントロールできます。
html,
body {
overscroll-behavior-y: none;
}
ただし、すべてのページでスクロールを殺すのは危険です。
記事ページや長い設定画面では、自然にスクロールできる方が大事です。
使うなら、アプリUIのような画面に限定するのがおすすめです。
.app-screen {
overscroll-behavior: contain;
}
Petalのオンボーディングや名刺画面のように、1画面で見せたいUIでは、この差がかなり効きます。
6. 不要なテキスト選択と長押しメニューを抑える
ボタンやタブを押したときに、文字が選択されたり、長押しメニューが出たりすると、一気にWebっぽくなります。
特にアプリ風UIでは、操作パーツに対してテキスト選択を無効にしておくと触り心地がよくなります。
.app-ui,
.app-ui button,
.app-ui a {
-webkit-user-select: none;
user-select: none;
-webkit-touch-callout: none;
}
ただし、本文や説明文まで全部選択不可にするのはおすすめしません。
ユーザーがコピーしたい文章まで選べなくなると、逆に不便です。
無効にするのは、ボタン、ナビゲーション、カードUIなど、アプリの操作部分だけで十分です。
7. タップした瞬間の反応を作る
ネイティブアプリっぽさは、タップした瞬間にも出ます。
Webページのリンクは、何も反応がないまま一瞬待たされることがあります。
これだと、ユーザーは「押せたのかな?」と感じます。
ボタンには、軽い押し込みや透明度変化を入れておくと、かなり触り心地がよくなります。
.app-button {
transition: transform 0.12s ease, opacity 0.12s ease;
}
.app-button:active {
transform: scale(0.98);
opacity: 0.75;
}
やりすぎる必要はありません。
大事なのは、押した瞬間にちゃんと反応が返ることです。
アプリっぽさは、見た目よりも反応速度で感じることがあります。
8. 戻る挙動を雑にしない
PWAで意外と大事なのが、戻る挙動です。
ホーム画面から開いたPWAでは、ブラウザの戻るボタンが見えにくい場合があります。
そのため、画面内に戻る導線を用意するか、戻ったときに迷子にならない構成にする必要があります。
特に、オンボーディング、設定画面、詳細画面などでは大事です。
- 戻るボタンを画面内に置く
- 閉じるボタンを用意する
- トップへ戻れる導線を作る
- 履歴がない時の戻り先を決めておく
Webではブラウザに任せがちな部分ですが、PWAではアプリのように扱われます。
だからこそ、戻る導線をUIとして設計した方が自然です。
9. display-modeを検出して、PWA時だけUIを変える
PWAは、ブラウザで開かれている時と、ホーム画面から開かれている時で見え方が変わります。
そのため、display-modeを検出して、PWA時だけ表示を少し変えるのも有効です。
const isPWA =
window.matchMedia("(display-mode: standalone)").matches ||
window.navigator.standalone === true;
if (isPWA) {
document.documentElement.classList.add("is-pwa");
}
たとえば、ブラウザで見ている時だけ「ホーム画面に追加」ボタンを出し、PWAで開いた時は消す。
PWAで開いた時だけ、余白やヘッダーを調整する。
こういう出し分けができます。
.is-pwa .install-guide {
display: none;
}
これは地味ですが、かなり実用的です。
ブラウザで見ている人と、ホーム画面から開いている人では、必要な案内が違います。
PWAを本気でアプリっぽくするなら、ここは分けて考えた方がいいです。
10. アイコンはany maskableを意識する
ホーム画面に置いた時の印象は、アイコンでかなり決まります。
特にAndroidでは、maskableアイコンの扱いが重要です。
ただし、purpose: "maskable" だけを指定すると、環境によっては意図しない挙動になることがあります。
実際に検証した中では、次のように any maskable を指定する方が安定しやすいと感じました。
{
"src": "/icon.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "any maskable"
}
また、iPhoneでは apple-touch-icon が強く効くことがあります。
単一のWebアプリなら問題になりにくいですが、OJappやPetalのようにページごと・ユーザーごとにアイコンを変えたい場合は、固定の apple-touch-icon が邪魔になることもあります。
manifestのiconsとapple-touch-iconの優先関係は、かなり注意した方がいいです。
11. キャッシュ更新まで含めてUXとして考える
PWAのUXで避けて通れないのがキャッシュです。
Service Workerを使うと、オフライン対応や高速表示ができます。
でも、設定を間違えると古い画面が残り続けます。
ユーザーから見ると、これはただの不具合です。
作る側は「キャッシュが残っているだけ」とわかっていても、使う側には関係ありません。
なので、PWAではキャッシュ戦略もUXの一部です。
- 更新頻度が低いツールならCache First
- 新しい情報が大事なページならNetwork First
- すぐ表示しつつ裏で更新したいならStale While Revalidate
特に、見た目やアイコンを何度も調整している開発中は、キャッシュでかなりハマります。
僕もPWA LABで、直したはずのmanifestやアイコンが反映されず、かなり時間を溶かしました。
アプリっぽく見せるには、表面のデザインだけでなく、更新のされ方まで含めて設計する必要があります。
キャッシュ戦略については、PWAのキャッシュ戦略でも詳しく整理しています。
まとめ:PWAをアプリっぽくする正体は、細部の違和感を消すこと
PWAをネイティブアプリのように見せるために、特別な魔法はありません。
大事なのは、ユーザーが触った瞬間に感じる小さな違和感を減らすことです。
- 起動直後の白い画面を減らす
theme-colorと背景色をそろえるsafe-areaを意識する100dvhで高さのズレを減らす- 不要なスクロールや選択を抑える
- タップ時の反応を作る
- 戻る導線を用意する
- PWA時だけUIを出し分ける
- アイコンとキャッシュまで気を配る
PWAは、Webをアプリに変える魔法ではありません。
でも、かなり近づけることはできます。
特にAndroidでは、manifestをきちんと整えるだけでもアプリ感が出ます。
iPhoneでは制限が多い分、CSSや画面設計で違和感を減らすことが大事です。
つまり、PWAのUX改善は「Webであることを隠す」というより、Webでも自然に使える形へ整える作業です。
そこまでできると、ユーザーにとってはもう技術名は関係ありません。
ただ、ホーム画面に置いた小さな入口として、自然に使えるものになります。