Skip to content

bug: iOS Safari など狭幅画面でスプライト/コスチューム追加が画面外になり操作不能 (responsive 対応) #572

@takaokouji

Description

@takaokouji

概要

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.

再現手順

  1. Playwright (Chrome DevTools) で viewport を 390x844 (iPhone 14) に設定
  2. https://smalruby.app/ を開く
  3. コードタブで「スプライトを選ぶ」ボタン (画面右下) の座標を確認
// 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.cssmin-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 の初期値をビューポート幅で分岐

段階的に進める提案

  1. Phase 1 (このIssue で対応): 戦略 A — スマホで開いたら警告バナー、操作はできる範囲で許容
  2. Phase 2: 戦略 B — min-width をメディアクエリ化、横スクロールで操作可能にする
  3. Phase 3 (別 Issue): 戦略 C — タブ切替型レイアウトで本格対応

関連 Discussion

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions