1. 概要
ロビーに設置したiPad(縦置き2台)に表示する、タッチ操作式の館内案内です。来場者がボタンを押すと該当の案内が表示され、しばらく操作がなければ自動でトップに戻り、さらに続けば待機画面になります。
設計の前提
- 掲載内容の更新はすべて遠隔で完結します。現地に行くのは初期設置と機器故障時のみです。
- 画面階層はトップと各項目の往復のみ。深い階層は作りません。
- ネットワークが切れても白画面にはせず、案内文を表示します。
- 設定ファイルが壊れていても既定値で表示を続けます。案内が止まらないことを最優先にしています。
3プランの違い
| プラン | 掲載内容 | 画面の器 | 営業カレンダー |
|---|---|---|---|
| ライト | 提供データを画像で掲載 | 共通 | なし |
| スタンダード | Canvaで制作し埋め込み | 共通 | なし |
| プレミアム | Canva+データ連携 | 拡張版 | あり(自動生成) |
ライトとスタンダードは同じファイル
index.html style.css app.js は両者で内容が同一です。違いは config.json が画像を指すか Canva の URL を指すかだけです。片方を修正したら、もう片方にも同じファイルをコピーしてください。
2. ファイル構成
light/ ・ standard/
├─ index.html 画面の構造。id は app.js が参照するため変更しない
├─ style.css 見た目。冒頭の「01. 設定値」に色をまとめている
├─ app.js 動作
├─ config.json 文言・掲載内容・秒数などの設定
├─ README.md 運用手順
└─ assets/ ロゴ、掲載画像(ライトのみ)
premium/
├─ index.html
├─ style.css
├─ app.js カレンダー生成・スライド・集計を含む拡張版
├─ config.json
├─ schedule.csv 営業カレンダーのデータ元
├─ README.md
└─ assets/ ロゴ、待機画面のスライド画像
更新時はフォルダごとアップロードしてください
ファイルを分割したため、style.css だけ差し替えて index.html を古いまま残すと表示が崩れます。Cloudflare Pages はフォルダ単位のドラッグ&ドロップで上書きされるので、常にフォルダごと上げてください。
3. どこを編集するか
| 変えたいもの | 編集するファイル | 備考 |
|---|---|---|
| ボタンの名前 | config.json | items の ja / en |
| 掲載する内容 | config.json | image(画像)または url(Canva) |
| トップの案内文 | config.json | lead / footerNote |
| トップに戻る秒数 | config.json | idleSeconds |
| 営業日・営業時間 | schedule.csv | プレミアムのみ |
| 待機画面のスライド | config.json | プレミアムのみ。slides |
| 色 | style.css | 冒頭の :root ブロック |
| 文字サイズ・余白 | style.css | 該当セクション。単位は cqw |
| ボタンの並び順・数 | config.json | items の順序。2列で並ぶため偶数が収まりよい |
| 画面の構造そのもの | index.html | id は変更しない |
| 動作・挙動 | app.js | 冒頭の目次を参照 |
まず config.json を疑ってください
日常の変更のほとんどはconfig.json だけで完結します。style.css や app.js を触る必要があるのは、デザインや挙動そのものを変えるときだけです。
4. config.json 仕様
文字コードは UTF-8。末尾のカンマは付けないでください。編集後は jsonlint.com などで構文を確認すると安全です。壊れていても画面は白くならず、既定値で表示を続けます。
共通項目
| キー | 内容 | 初期値 |
|---|---|---|
| brandNote | ロゴ下と待機画面に出る施設名 | ゴルフドライビングレンジ |
| lead | トップ中央の案内文 | ご覧になりたい項目にお触れください |
| footerNote | トップ右下の一言 | — |
| unsetNote | 未設定項目に出す文言。\n で改行 | — |
| idleSeconds | 詳細画面からトップに戻るまでの秒数 | 60 |
| attractIdleSeconds | トップから待機画面になるまでの秒数 | 90 |
| lockIframe | true で Canva 画面内のタップを無効化 | true |
| reloadHour | 自動再読込を行う時刻(0〜23)。-1 で無効 | 5 |
| maxZoom | 拡大の上限倍率 | 3 |
| offlineTitle offlineNote | 通信断・読み込み失敗時の文言 | — |
| items | ボタン項目の配列 | 8項目 |
items の書き方
// 画像を掲載する(ライト) { "ja": "料金のご案内", "en": "FEES", "image": "assets/content-fee.jpg" } // Canva を埋め込む(スタンダード・プレミアム) { "ja": "料金のご案内", "en": "FEES", "url": "https://www.canva.com/design/XXXX/view?embed" } // 営業カレンダーを表示する(プレミアムのみ。1項目だけ) { "ja": "営業スケジュール", "en": "SCHEDULE", "type": "calendar" } // 未設定(点線の「コンテンツエリア」表示になる) { "ja": "ご利用約款", "en": "TERMS OF USE", "url": "" }
プレミアム固有
| キー | 内容 | 初期値 |
|---|---|---|
| scheduleUrl | カレンダーの外部データ元。空欄なら schedule.csv | 空欄 |
| scheduleRefreshMinutes | カレンダーを取り直す間隔(分)。0 で無効 | 30 |
| lastBallMinutes | 球貸最終を営業終了の何分前とするか | 50 |
| slides | 待機画面のスライド。{"type":"logo"} はロゴ画面 | 3枚 |
| slideSeconds | スライドの切替秒数 | 6 |
| adminPin | 動作状況画面のPIN(4桁) | 1234 |
| logEndpoint | タップ集計の送信先。空欄なら画面内集計のみ | 空欄 |
5. schedule.csv 仕様(プレミアム)
上段に曜日ごとの通常営業、下段に変更・例外を書きます。日常の入力は下段だけです。
[通常営業(曜日ごと)] 曜日,開始,終了 日,連続,24:00 月,06:00,24:00 火,09:00,24:00 金,06:00,連続 土,連続,連続 [変更・例外(下の行が優先)] 開始日,終了日,対象曜日,開始,終了,備考 2027-01-05,2027-02-26,金土日,06:00,24:00,オールナイト営業休止 2027-02-27,,,06:00,連続,オールナイト営業を再開 2027-03-10,,,,,設備点検のため休業
記法
| 書き方 | 意味 |
|---|---|
| 06:00 | 通常の時刻 |
| 24:00 | その日の終わり(深夜0時) |
| 29:00 | 翌朝5時。画面には「翌05:00」と表示 |
| 連続 | 前日から継続、または翌日へ継続。両方が「連続」なら終日営業 |
| 開始・終了とも空欄 | 休業日 |
変更・例外の考え方
- 下に書いた行が、上の行を上書きします。変更が決まったら末尾に1行足すだけです。過去の行を消したり直したりする必要はありません。
終了日を空欄にすると、その日1日だけの指定になります。対象曜日に金土日のように書くと、期間内のその曜日だけに適用されます。空欄なら全日。- 書式が不正な行は無視され、残りの行で表示が続きます。無視した行数は動作状況画面で確認できます。
Googleスプレッドシートを使う場合
同じ内容をA列から入力し、ファイル → 共有 → ウェブに公開 → カンマ区切り形式(.csv)で公開します。発行されたURLをconfig.json の scheduleUrl に設定してください。公開設定が正しくないと取得に失敗するため、設定後は必ず実機で表示を確認してください。
6. 画面の動作仕様
画面遷移
- トップのボタンを押すと詳細画面へ。「もどる」でトップへ戻ります。階層はこの1段のみです。
- 詳細画面で
idleSeconds秒(初期値60)操作がなければトップへ戻ります。 - トップで
attractIdleSeconds秒(初期値90)操作がなければ待機画面になります。 - 待機画面はどこを触ってもトップに戻ります。
コンテンツエリアの拡大
- 拡大されるのはコンテンツエリアだけで、メニューやヘッダーは変わりません。
- 操作は3通り。二本指のピンチ、二回続けてタップ(等倍と2倍の切替)、右上の + / − ボタン。
- 初回表示時に「二本指で広げると拡大できます」の案内が4秒間出ます。
- 拡大中は指1本でスクロールできます。トップに戻ると倍率は元に戻ります。
- Canva は拡大時に再描画されるため文字がぼやけません。画像も元データの解像度で拡大されます。
通信・データ取得の失敗時
- Canva の読み込みが8秒を超える、または通信断のときは、白画面ではなく案内文を表示します。
config.jsonが読めない場合は、app.js内の既定値で表示を続けます。- カレンダーの取得に失敗した場合は、直前に取得できた内容で表示を継続します。
更新の反映
- Canva は保存すると次回の画面読み込み時に反映されます。
- プレミアムのカレンダーは
scheduleRefreshMinutes(初期値30分)ごとに取り直します。トップ表示中のみ実行するため、閲覧中に画面が変わることはありません。 - 毎日
reloadHour(初期値5時)に一度だけ全体を再読込します。これにより、iPadに触れずに設定変更が反映されます。
キオスクとしての制御
- OS標準のピンチズーム・長押しメニューは無効化しています。
lockIframeがtrueのとき、Canva 画面内のタップを受け付けません。来場者が Canva のロゴに触れて外部サイトへ離脱する事故を防ぎます。
7. デザイン仕様
色
| 変数 | 値 | 使用箇所 |
|---|---|---|
| --brand | #9DAF88(Pantone 7494 C) | 上部の帯、罫線、英字表記、待機画面の地色 |
| --leaf | #74AA50(Pantone 7489 C) | カレンダーの本日枠のみ |
| --ink | #1B2119 | 画面の地色 |
| --ivory | #F2F1EA | コンテンツエリアの地色、本文の白 |
ブランドカラーの変更には確認が必要です
--brand は施設のロゴ規定色です。変更する場合は先方の了承を得てください。なお帯の上のロゴは白ヌキ、機能文字は濃色という使い分けにしています。ロゴのように大きい要素なら白で成立しますが、ボタンや見出しのサイズでは白だと視認性が不足するためです。
書体
- 見出し・項目名は明朝(
--serif)。欧文は Didot 系で、ロゴのワードマークと合わせています。 - 本文・UI はゴシック(
--sans)。 - いずれもiPadに標準搭載の書体のみを使用しており、Webフォントは読み込みません。通信が切れても文字化けしません。
寸法
- 基準はiPad縦置き 820 × 1180pt。
- 寸法の単位は
cqw(画面幅に対する割合)。1cqw ≒ 8.2px。px を直接書かないでください。機種が変わったときに比率が崩れます。 - 本文は最小でも 1.9cqw(実寸約16px)。高齢の来場者を想定し、通常は 2.1cqw 以上を使っています。
- タップ対象は最小 13.8cqw(実寸約113px)四方以上を確保しています。
Canva側のデザインサイズ
コンテンツエリアの比率に合わせて 横820 × 縦980px で作成してください。この比率で作ると、拡大せずに全体が読めます。
8. よくある作業
ボタンの名前を変えたい
config.json の items にある該当項目の ja(日本語)と en(英字)を書き換え、フォルダごとアップロードします。翌朝5時に自動反映されます。すぐ反映したい場合はiPadで再読込してください。掲載する画像を差し替えたい(ライト)
新しい画像を
assets/ に置き、config.json の image にパスを書きます。横幅1200〜1600px、1枚500KB以内が目安です。同じファイル名で上書きすると古い画像が残る場合があるため、ファイル名を変えるのが確実です。Canvaの内容を直したい(スタンダード・プレミアム)
Canvaで修正して保存するだけです。ファイルの操作は不要です。翌朝5時の自動再読込で画面に反映されます。
臨時休業を登録したい(プレミアム)
schedule.csv の下段の末尾に1行足します。例:
2027-03-10,,,,,設備点検のため休業カレンダー・本日の営業時間・球貸最終時間が同時に更新されます。
待機画面のスライドを差し替えたい(プレミアム)
画像を
assets/ に置き、config.json の slides に追記します。{ "image": "assets/slide-lesson.jpg", "kicker": "GOLF LESSON", "title": "はじめての方も安心" }kicker と title は省略できます。ボタンを7個や6個に減らしたい
config.json の items から要素ごと削除します。2列で並ぶため偶数のほうが収まりよく見えます。奇数にすると最終行に空きができます。トップに戻る秒数を変えたい
idleSeconds(詳細→トップ)と attractIdleSeconds(トップ→待機画面)を変更します。長文の掲載物がある場合は90〜120秒を推奨します。読んでいる最中に画面が戻ると混乱を招くためです。色を変えたい
style.css の冒頭「01. 設定値」にある :root ブロックだけを編集します。ここを変えると画面全体に反映されます。個別の箇所だけ変えたい場合は、該当セクションのコメントを目印に探してください。9. 公開手順
ローカルで確認する
index.html をダブルクリックで開くと、ブラウザの制限で config.json を読み込めません。簡易サーバーを立ててください。
cd standard python3 -m http.server 8000
ブラウザで http://localhost:8000 を開きます。
Cloudflare Pages
- 「Workers と Pages」→「アプリケーションを作成する」
- 画面下部の「Pages を導入しようとお考えですか? 始める」をクリック(上部の「Upload your static files」は Workers に入ってしまいます)
- 「ファイルをドラッグアンドドロップする」→「始める」
- プロジェクト名を入力
- フォルダごとドラッグ&ドロップ
さくらインターネット(本番想定)
FTPで /kiosk/ を作り、ファイル一式を置きます。WordPress の固定ページとしては作らないでください。テーマやプラグインの更新で表示が壊れます。
/kiosk/.htaccess
RewriteEngine Off
Header set X-Robots-Tag "noindex, nofollow"
<FilesMatch "\.(html|json|css|js|csv)$">
Header set Cache-Control "no-cache, must-revalidate"
</FilesMatch>
キャッシュ設定を忘れないでください
これがないと、設定を更新してもiPadが古い画面を表示し続けます。原因の特定に時間を取られる類の不具合です。iPadの設定
- Safariで公開URLを開く
- 共有ボタン →「ホーム画面に追加」
- 追加されたアイコンから起動(アドレスバーが消えます)
- 設定 → アクセシビリティ → アクセスガイド をオン
- 画面を表示した状態でトップボタンを3回押して開始
- 自動ロックを「なし」に、常時給電にする
停電や再起動でアクセスガイドは自動復帰しません。自動で固定したい場合は Apple Configurator のシングルアプリモードを使用してください。
10. トラブル対応
| 症状 | 確認すること |
|---|---|
| 更新したのに変わらない | 翌朝5時の自動再読込を過ぎているか。急ぐ場合はアクセスガイドを終了し画面を下に引いて再読込。それでも変わらなければ、ホーム画面のアイコンを削除して再追加。 |
| コンテンツエリアが白い/案内文が出る | Wi-Fi接続。Canvaのデザインが公開状態になっているか。config.json の url が正しいか。 |
| ボタンが点線表示のまま | config.json の url または image が空。またはJSONの書式エラー(既定値で表示されている状態)。 |
| レイアウトが崩れた | style.css だけ、または index.html だけを差し替えていないか。フォルダごとアップロードし直してください。 |
| カレンダーが更新されない(プレミアム) | トップのロゴを2秒長押しし、PIN入力で動作状況画面を開く。データ元・最終取得時刻・無視した行数を確認。 |
| カレンダーの一部の日だけ反映されない | schedule.csv の日付書式(2027-03-10 形式)。全角の記号が混ざっていないか。動作状況画面の「無視した行」を確認。 |
| 拡大できない | 未設定項目や案内文の表示中は拡大できません(対象がないため)。右上のボタンが表示されていれば拡大可能な状態です。 |