1. 概要
ロビーに設置したiPad(縦置き2台)に表示する、タッチ操作式の館内案内です。来場者がボタンを押すと該当の案内が表示され、しばらく操作がなければ自動でトップに戻り、さらに続けば待機画面になります。
設計の前提
- 掲載内容の更新はすべて遠隔で完結します。現地に行くのは初期設置と機器故障時のみです。
- 画面階層はトップと各項目の往復のみ。深い階層は作りません。
- ネットワークが切れても白画面にはせず、案内文を表示します。
- 設定ファイルが壊れていても既定値で表示を続けます。案内が止まらないことを最優先にしています。
3プランの違い
| プラン | 掲載内容 | 画面の器 | 営業カレンダー |
|---|---|---|---|
| ライト | 提供データを画像で掲載 | 共通 | なし |
| スタンダード | Canvaで制作し埋め込み | 共通 | なし |
| プレミアム | Canva+データ連携 | 拡張版 | あり(自動生成) |
ライトとスタンダードは同じファイル
index.html style.css app.js は両者で内容が同一です。違いは config.json が画像を指すか Canva の URL を指すかだけです。片方を修正したら、もう片方にも同じファイルをコピーしてください。
2. ファイル構成
更新時はフォルダごとアップロードしてください
ファイルを分割したため、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 | 空欄 |
| holidaysUrl | 祝日データの外部URL。空欄なら holidays.csv | 空欄 |
| scheduleRefreshMinutes | カレンダーを取り直す間隔(分)。0 で無効 | 30 |
| lastBallMinutes | 球貸最終を営業終了の何分前とするか | 50 |
| slides | 待機画面のスライド。url(Canva)/image(画像)/{"type":"logo"} を指定。混在可 | 4枚 |
| slideSeconds | スライドの切替秒数 | 6 |
| logEndpoint | タップ集計の送信先。空欄なら画面内集計のみ | 空欄 |
5. schedule.csv 仕様(プレミアム)
上段に曜日ごとの通常営業、下段に変更・例外を書きます。日常の入力は下段だけです。
[通常営業(曜日ごと)] 曜日,開始,終了 日,連続,24:00 月,06:00,24:00 火,09:00,24:00 金,06:00,連続 土,連続,連続 祝日,連続,24: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日だけの指定になります。対象曜日に金土日のように書くと、期間内のその曜日だけに適用されます。空欄なら全日。- 書式が不正な行は無視され、残りの行で表示が続きます。無視した行数は動作状況画面で確認できます。
祝日の扱い
祝日は holidays.csv をもとに自動判定します。個別に登録する必要はありません。曜日と並べて 祝日 と 祝前日 の行を書いておきます。
| 行 | 適用されるとき | 動き |
|---|---|---|
| 祝日 | その日が祝日 | 開始・終了とも上書き |
| 祝前日 | 翌日が祝日 | 空欄の項目は元の設定を引き継ぐ |
祝前日 は「閉店を遅らせる」ためのルールです。開始を空欄にしておくことで、土曜のようにすでに前日から連続営業している日でも、開始時刻が上書きされません。
適用の優先順位
曜日ごとの通常営業 ↓ その日が祝日なら 祝日の行 ↓ 翌日が祝日なら 祝前日の行 ↓ 日付を指定した行があれば 変更・例外(最も強い)
祝日でも臨時休業する場合は、変更・例外に日付を書けば上書きされます。
holidays.csv は年1回の更新が必要です
祝日は前年に確定するため、収録は有限です。同梱のファイルは2030年分まで収録しています。残りが120日を切ると、ダッシュボードに警告色で表示されます。元データは内閣府が公開している「国民の祝日について」のCSV(CC-BY)です。holidaysUrl に外部URLを設定して自動取得させることもできますが、外部に依存すると通信断や仕様変更の影響を受けるため、同梱ファイルを年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)四方以上を確保しています。
待機画面のスライド(オプション02)
スライドは Canva参照 と 画像ファイル のどちらでも指定できます。1つの待機画面に混在させることも可能です。
// Canvaを参照する { "url": "https://www.canva.com/design/XXXX/view?embed", "kicker": "GOLF LESSON", "title": "レッスンのご案内" } // 画像ファイルを使う { "image": "assets/slide-lesson.jpg", "kicker": "GOLF LESSON", "title": "レッスンのご案内" } // ロゴ画面 { "type": "logo" }
| Canva参照 | 画像ファイル | |
|---|---|---|
| 差し替えの手順 | Canvaで修正して保存するだけ | 書き出し → assets に配置 → config.json を編集 → アップロード |
| 表示の安定性 | 通信断の影響を受ける | 初回に読み込めば以降は安定 |
| 端末の負荷 | 常時プレイヤーが動作する | 軽い |
| 向いている頻度 | 月次など頻繁に入れ替える場合 | 季節ごとなど年数回 |
切り替えのラグは起こりません
Canva参照でも、スライドは起動時にすべて読み込んでおき、表示だけを切り替えます。6秒ごとに読み込み直す実装ではないため、切り替え時に空白が挟まることはありません。Canva参照を使う場合の注意
- 読み込めなかったスライドは巡回から自動的に除外されます。待機画面が白くなることはありません。1枚も読み込めない場合はロゴ画面を表示します。
- スライドの枚数だけCanvaのプレイヤーが常時動作します。4枚程度までを推奨します。それ以上に増やす場合は実機で動作を確認してください。
- 待機画面は営業時間中ずっと映り続けます。Wi-Fiが不安定な環境では、画像ファイル方式のほうが安全です。
- デザインサイズは待機画面全体に合わせて 横820 × 縦1180px を推奨します。コンテンツ用(820×980)を流用すると上下に余白が出ます。
Canva側のデザインサイズ
コンテンツエリアの比率に合わせて 横820 × 縦980px で作成してください。この比率で作ると、拡大せずに全体が読めます。
8. よくある作業
config.json の items にある該当項目の ja(日本語)と en(英字)を書き換え、フォルダごとアップロードします。翌朝5時に自動反映されます。すぐ反映したい場合はiPadで再読込してください。assets/ に置き、config.json の image にパスを書きます。横幅1200〜1600px、1枚500KB以内が目安です。同じファイル名で上書きすると古い画像が残る場合があるため、ファイル名を変えるのが確実です。schedule.csv の下段の末尾に1行足します。例:
2027-03-10,,,,,設備点検のため休業カレンダー・本日の営業時間・球貸最終時間が同時に更新されます。
holidays.csv の末尾に 日付,名称 の形式で追記します。ダッシュボードに「祝日の収録期限」が表示されるので、残り日数を目安にしてください。振替休日・国民の休日も含めて追記が必要です。新しいスライドを追加するときは
config.json の slides に1行足します。{ "url": "https://www.canva.com/design/XXXX/view?embed", "kicker": "GOLF LESSON", "title": "はじめての方も安心" }画像ファイルを使う場合は
assets/ に置き、image で指定します。kicker と title は省略できます。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 に入ってしまいます)
- 「ファイルをドラッグアンドドロップする」→「始める」
- プロジェクト名を入力
- フォルダごとドラッグ&ドロップ
本番サーバー(お名前.com)
FTPで /kiosk/ を作り、ファイル一式を置きます。WordPress の固定ページとしては作らないでください。テーマやプラグインの更新で表示が壊れます。
設置前に、契約しているサービスが .htaccess と PHP に対応しているかを確認してください。.htaccess が使えないとキャッシュの制御ができず、PHP が使えないとオプション03(タップ集計)の記録先を別途用意する必要があります。
/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. 利用状況ダッシュボード
オプション03で記録したタップ数を、期間を指定して確認する画面です(status/)。運用担当者専用で、iPad側にこの画面への入口はありません。
iPadに管理画面を置かない理由
ロビーのiPadは無人で放置されます。管理画面への入口を残すと、清掃などで偶然表示され、そのまま朝まで残る可能性があります。同じ情報はPCからこのページを開けば確認できるため、来場者が到達する経路をゼロにする設計にしています。できること
| 機能 | 内容 |
|---|---|
| 期間指定 | 直近7日/30日/90日/全期間のボタン、または開始日・終了日の指定 |
| 作業日で区切る | annotations.csv に登録した作業日を境に、前後の期間を切り替え |
| 日別の推移 | 縦棒グラフ。作業日には縦線と見出しが入る |
| 項目別 | 横棒グラフ。回数と全体に占める割合 |
| 時間帯別 | 縦棒グラフ。どの時間に案内が求められているか |
| データの状態 | 営業カレンダー・祝日データ・タップログの読み込み結果 |
グラフは外部ライブラリを使わずSVGで描いています。保守対象を増やさないためです。
タップログの形式
2026-08-18 14:32:05 料金のご案内 2026-08-18 14:33:41 送迎バス時刻表
タブ区切り(カンマ区切りも可)。日時は先頭10文字を日付、12〜13文字目を「時」として読みます。この形式で追記されていれば、記録の仕組みは何でも構いません。
作業履歴の登録
日付,内容 2026-06-01,初期設置・運用開始 2026-07-20,料金表を改定・掲載順を変更
掲載内容を変更したら、その都度 annotations.csv に1行追記してください。グラフに縦線が入り、作業日ごとの期間切り替えボタンが増えます。月次レポートで差し替えの効果を説明する材料になります。
公開時の注意
このページはURLを知っていれば誰でも閲覧できます。先方に見せたくない場合は、ディレクトリ名を推測されにくいものに変更するか、Cloudflare Zero Trust または.htaccess のBasic認証で保護してください。
月次レポート
- 期間を「先月1日〜末日」に指定する
- 画面を印刷(PDF出力)する。期間指定のボタン類は印刷されません
- 作業日で区切ったビューを添えると、掲載変更の効果を示せます
11. トラブル対応
| 症状 | 確認すること |
|---|---|
| 更新したのに変わらない | 翌朝5時の自動再読込を過ぎているか。急ぐ場合はアクセスガイドを終了し画面を下に引いて再読込。それでも変わらなければ、ホーム画面のアイコンを削除して再追加。 |
| コンテンツエリアが白い/案内文が出る | Wi-Fi接続。Canvaのデザインが公開状態になっているか。config.json の url が正しいか。 |
| ボタンが点線表示のまま | config.json の url または image が空。またはJSONの書式エラー(既定値で表示されている状態)。 |
| レイアウトが崩れた | style.css だけ、または index.html だけを差し替えていないか。フォルダごとアップロードし直してください。 |
| カレンダーが更新されない(プレミアム) | status/ の「データの状態」で、読み込んだ行数・書式が不正な行を確認。 |
| カレンダーの一部の日だけ反映されない | schedule.csv の日付書式(2027-03-10 形式)。全角の記号が混ざっていないか。ダッシュボードの「書式が不正な行」を確認。 |
| 待機画面で特定のスライドが出ない | そのスライドが読み込めていない可能性があります(自動で巡回から除外されます)。Canvaのデザインが公開状態か、url が正しいかを確認。 |
| 祝日なのに通常営業で表示される | schedule.csv に 祝日 の行があるか。holidays.csv にその日付が含まれているか。ダッシュボードの「祝日データ」「祝日の収録期限」を確認。 |
| 拡大できない | 未設定項目や案内文の表示中は拡大できません(対象がないため)。右上のボタンが表示されていれば拡大可能な状態です。 |
切り分けの起点はダッシュボードです
status/ の「データの状態」に、営業カレンダー・祝日データ・タップログの読み込み結果が表示されます。現地に行かずに、原因がデータ側か表示側かを判断できます。iPad側に管理画面への入口はありません。無人のロビーに設置するため、誤って表示される経路を残さない設計にしています。