概要
iOS Safari など狭幅画面 (iPhone: 390px / iPhone SE: 375px / iPad portrait: 768px) で body { min-width: 1024px } のためページ全体が横にあふれ、「スプライトを選ぶ」ボタン (画面右端) が画面外に出てタップ不能になる。
ユーザーフィードバック (Discussion smalruby/smalruby3-develop#80):
English user here, I can't add sprites nor costumes on safari on iOS.
No programs, just the editor itself has this problem. I don't know what causes it, but pls fix this.
再現手順
- Playwright (Chrome DevTools) で viewport を 390x844 (iPhone 14) に設定
- https://smalruby.app/ を開く
- コードタブで「スプライトを選ぶ」ボタン (画面右下) の座標を確認
// document.body.scrollWidth → 1024
// [aria-label="スプライトを選ぶ"] の getBoundingClientRect()
// → { x: 875, y: 773 } // viewport は 390x844
// → 画面右端 (x=390) より遥か右にあり、タップで到達不能
iPad portrait (768x1024) でも同様で、x=875 のスプライトボタンが画面外。
コスチュームタブの「コスチュームを選ぶ」ボタンは左下 (x=19) にあるため iPhone でもクリック可能。
ただし狭幅では右側の Stage/Sprite ペインが切れて見えづらい。
(再現スクリーンショット 2 枚を後でこのコメントに添付予定)
原因
packages/scratch-gui/src/playground/index.css (upstream Scratch のファイル):
html,
body,
.app {
width: 100%;
height: 100%;
margin: 0;
/* Setting min height/width makes the UI scroll below those sizes */
min-width: 1024px;
min-height: 600px;
}
upstream Scratch 側でも長年放置されている既知の前提 (下記リサーチ参照)。
関連ファイル
packages/scratch-gui/src/playground/index.css — min-width: 1024px 設定箇所 (upstream)
packages/scratch-gui/src/components/sprite-selector/ — 右下のスプライト追加 FAB
packages/scratch-gui/src/components/stage-selector/ — ステージ背景追加ボタン
packages/scratch-gui/src/components/menu-bar/ — メニューバー (狭幅で要簡略化)
packages/scratch-gui/src/reducers/stage-size.js — ステージサイズモード (small/large)
Scratch mod のレスポンシブ対応 リサーチ結果
主な scratch-gui ベースの mod で iPhone 程度の狭幅画面で「全機能」をまともに操作できる実装は事実上存在しない。
| Mod |
モバイル対応 |
備考 |
| Scratch 公式 |
❌ |
Wiki が「phones では virtually unusable」と明言 |
| TurboWarp |
❌ (再生のみ) |
仮想キーボード等は再生時の話。エディタ UI は upstream のまま |
| PenguinMod |
❌ (再生のみ) |
TurboWarp 派生で min-width 制約も継承 |
| Adacraft |
❌ |
フォーラムでも未解決 |
| Snap! |
△ (タブレット中心) |
長押しメニュー、ブロックズーム、PWA。スマホは clunky |
| OctoStudio (MIT Media Lab) |
✅ |
scratch-gui を捨てて新規ネイティブ実装。クローズドソース |
| ScratchJr / Hopscotch |
✅ |
モバイル専用ネイティブ、scratch-gui 不使用 |
重要な示唆: Scratch を作った MIT Media Lab 自身が「スマホ向けは scratch-gui の改修ではなく新規アプリ (OctoStudio) で」と判断したことが、scratch-gui のレスポンシブ化が極めて難しいことを物語っている。
関連 upstream Issue (いずれも未解決)
公開されている mod のソース (参考用)
推奨対応戦略
参考実装が乏しいため、smalruby が最初の大規模ケースになる可能性が高い。短期の現実解 → 段階的に本格対応の順で。
★★★ 戦略 A (短期・最小コスト): 「閲覧/再生は OK、編集は PC 推奨」を案内
スマホで開いたとき、警告バナーで「編集は PC・タブレットを推奨」と表示。?play=1 でフルスクリーン再生のみ可能にする。OctoStudio が新規実装を選んだ理由がここにある。
★★★★ 戦略 B (中期): min-width: 1024px をメディアクエリ化 (Smalruby マーカー上書き)
packages/scratch-gui/src/playground/index.css を Smalruby 独自 CSS で上書き:
@media (min-width: 1024px) {
html, body, .app { min-width: 1024px; }
}
@media (max-width: 1023px) {
html, body, .app {
width: 100vw;
overflow-x: auto; /* または hidden + 横スクロール案内 */
}
}
これだけで「画面外でクリック不能」は解消するが、レイアウト最適化は別問題として残る。
★★★★★ 戦略 C (本格対応・長期): タブ切替型レイアウト
@media (max-width: 768px) で 下部タブバー (ステージ / コード / スプライト / コスチューム / 音) に切り替え、各タブが画面ほぼ全体を占有。OctoStudio が採用するパターン。
合わせて:
- スプライト/コスチューム追加を FAB (
position: fixed; bottom: 16px; right: 16px) に変更
- メニューバーをハンバーガー化
- ステージは小型固定 (240x180) で stage-size-mode の初期値をビューポート幅で分岐
段階的に進める提案
- Phase 1 (このIssue で対応): 戦略 A — スマホで開いたら警告バナー、操作はできる範囲で許容
- Phase 2: 戦略 B — min-width をメディアクエリ化、横スクロールで操作可能にする
- Phase 3 (別 Issue): 戦略 C — タブ切替型レイアウトで本格対応
関連 Discussion
概要
iOS Safari など狭幅画面 (iPhone: 390px / iPhone SE: 375px / iPad portrait: 768px) で
body { min-width: 1024px }のためページ全体が横にあふれ、「スプライトを選ぶ」ボタン (画面右端) が画面外に出てタップ不能になる。ユーザーフィードバック (Discussion smalruby/smalruby3-develop#80):
再現手順
iPad portrait (768x1024) でも同様で、x=875 のスプライトボタンが画面外。
コスチュームタブの「コスチュームを選ぶ」ボタンは左下 (x=19) にあるため iPhone でもクリック可能。
ただし狭幅では右側の Stage/Sprite ペインが切れて見えづらい。
(再現スクリーンショット 2 枚を後でこのコメントに添付予定)
原因
packages/scratch-gui/src/playground/index.css(upstream Scratch のファイル):upstream Scratch 側でも長年放置されている既知の前提 (下記リサーチ参照)。
関連ファイル
packages/scratch-gui/src/playground/index.css—min-width: 1024px設定箇所 (upstream)packages/scratch-gui/src/components/sprite-selector/— 右下のスプライト追加 FABpackages/scratch-gui/src/components/stage-selector/— ステージ背景追加ボタンpackages/scratch-gui/src/components/menu-bar/— メニューバー (狭幅で要簡略化)packages/scratch-gui/src/reducers/stage-size.js— ステージサイズモード (small/large)Scratch mod のレスポンシブ対応 リサーチ結果
主な scratch-gui ベースの mod で iPhone 程度の狭幅画面で「全機能」をまともに操作できる実装は事実上存在しない。
重要な示唆: Scratch を作った MIT Media Lab 自身が「スマホ向けは scratch-gui の改修ではなく新規アプリ (OctoStudio) で」と判断したことが、scratch-gui のレスポンシブ化が極めて難しいことを物語っている。
関連 upstream Issue (いずれも未解決)
公開されている mod のソース (参考用)
推奨対応戦略
参考実装が乏しいため、smalruby が最初の大規模ケースになる可能性が高い。短期の現実解 → 段階的に本格対応の順で。
★★★ 戦略 A (短期・最小コスト): 「閲覧/再生は OK、編集は PC 推奨」を案内
スマホで開いたとき、警告バナーで「編集は PC・タブレットを推奨」と表示。
?play=1でフルスクリーン再生のみ可能にする。OctoStudio が新規実装を選んだ理由がここにある。★★★★ 戦略 B (中期):
min-width: 1024pxをメディアクエリ化 (Smalruby マーカー上書き)packages/scratch-gui/src/playground/index.cssを Smalruby 独自 CSS で上書き:これだけで「画面外でクリック不能」は解消するが、レイアウト最適化は別問題として残る。
★★★★★ 戦略 C (本格対応・長期): タブ切替型レイアウト
@media (max-width: 768px)で 下部タブバー (ステージ / コード / スプライト / コスチューム / 音) に切り替え、各タブが画面ほぼ全体を占有。OctoStudio が採用するパターン。合わせて:
position: fixed; bottom: 16px; right: 16px) に変更段階的に進める提案
関連 Discussion