Skip to content

Commit b523cf2

Browse files
committed
周辺を探すの寄せ先を easeTo に変え、視差効果を減らす端末でも効かせる
パネルの行を押したときの寄せ先は offset でパネルに隠れていない側の中心へ 置いていたが、端末が「視差効果を減らす」設定のときだけ効いていなかった。 MapLibre の flyTo はこの設定で jumpTo へ落ち、そのとき引き継ぐのは center・zoom・bearing・pitch・roll・elevation・padding だけで、offset は 黙って捨てられる。落ちた先の寄せ先は地図のど真ん中で、下から敷く帯のときは そこがちょうどパネルの上端になるため、押した候補は上半分だけ見えて下半分が パネルに隠れる。easeTo は同じ設定で duration を 0 にするだけなので offset は効く。 手元のブラウザはこの設定を既定で持たないので、画面幅・縮尺・レイアウトを 変えて計測しても再現しなかった。確かめるには明示的に有効にすること (CDP の Emulation.setEmulatedMedia、DevTools の Rendering)。実測では、 同じ幅・同じ操作でも有効のときだけ候補がパネルの上端(y=416 / パネル境界=416)に 立ち、無効なら見えている側の中心(y=208)に来る。 位置を直したあとの移動も同じ扱いにする。こちらは offset を渡しておらず、 直した先が必ず地図の真ん中=パネルの上端に来ていた。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent 3721586 commit b523cf2

2 files changed

Lines changed: 44 additions & 10 deletions

File tree

CLAUDE.md

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -832,12 +832,26 @@ CLI(codex / antigravity)の起動を直列にするので、2人が同時に探
832832
- **パネルの行を押したとき**、その候補をそこへ寄せる(`focusDiscoveryRow`)。
833833
地図の中心へ運ぶと、**押した候補がパネルの下に入って見えない**
834834

835-
ずらし方は`flyTo`/`easeTo``offset`(最終的な中心を container の中心からずらす
836-
ピクセル数)。**`padding`は使わない** —— あちらは地図の transform に残り続け、
837-
以後の`fitBounds``flyTo`(訪問順の経路・現在地への移動)まで巻き込んでずれる。
835+
ずらし方は`offset`(最終的な中心を container の中心からずらすピクセル数)。
838836
下の帯か右の帯かは**パネルの実寸から判定する**(画面幅で決め打ちすると、
839837
パネル側の折り返しを変えたときにここが取り残される)。
840838

839+
**`offset`を渡す先は`easeTo`にすること。`flyTo`では効かないことがある。**
840+
MapLibreの`flyTo`は端末が「視差効果を減らす」設定のとき`jumpTo`へ落ち、
841+
そのとき引き継ぐのは`center``zoom``bearing``pitch``roll``elevation`
842+
`padding`だけで、**`offset`は黙って捨てられる**。落ちた先の寄せ先は地図のど真ん中で、
843+
下から敷く帯のときはそこがちょうどパネルの上端なので、**押した候補が上半分だけ見えて
844+
下半分が隠れる**`easeTo`は同じ設定で`duration`を0にするだけなので`offset`は効く。
845+
846+
**この設定は実機でしか踏まない。** 手元のブラウザは既定で持たないので、確かめるには
847+
明示的に有効にすること(Chromeなら DevTools の Rendering →
848+
`Emulate CSS prefers-reduced-motion`、CDPなら`Emulation.setEmulatedMedia`)。
849+
実測で、同じ画面幅・同じ操作でも 視差効果を減らす=有効のときだけ候補が
850+
パネルの上端(y=416 / パネル境界=416)に立ち、無効なら見えている側の中心(y=208)に来た。
851+
852+
**`padding`は使わない** —— あちらは地図の transform に残り続け、
853+
以後の`fitBounds`(訪問順の経路・現在地への移動)まで巻き込んでずれる。
854+
841855
**行は2段に分ける。** 1段目は「選ぶ(チェック)・読む(名前と印)・外す(×)」だけの横並び、
842856
2段目に行ごとの操作(ランク・位置を直す・参照・座標と店名を見比べる)を**幅いっぱいで
843857
折り返して**置く。操作まで同じ横並びに入れると1列が数十pxまで潰れ、そこでも縦書きになる

components/MapView.tsx

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,16 @@ function circlePolygon(
165165

166166
/**
167167
* 地図の上に敷いたパネルを避けて、**見えている側の中心**へ寄せるための`offset`
168-
* ([x, y]のピクセル。`flyTo`/`easeTo`の`offset`は「最終的な中心を container の
169-
* 中心からどれだけずらすか」を指す)。
168+
* ([x, y]のピクセル。`offset`は「最終的な中心を container の中心からどれだけ
169+
* ずらすか」を指す)。
170+
*
171+
* **渡す先は`easeTo`にすること。`flyTo`では効かないことがある** ——
172+
* MapLibreの`flyTo`は端末が「視差効果を減らす」設定のときに`jumpTo`へ落ち、
173+
* そのとき引き継ぐのは`center`・`zoom`・`bearing`・`pitch`・`roll`・`elevation`・
174+
* `padding`だけで、**`offset`は黙って捨てられる**。落ちた先では寄せ先が地図の
175+
* ど真ん中になり、下から敷く帯のときはそこがちょうどパネルの上端なので、
176+
* **押した候補が半分隠れる**(実機で再現。手元のブラウザはこの設定を持たないので出ない)。
177+
* `easeTo`は同じ設定で`duration`を0にするだけなので、`offset`はそのまま効く。
170178
*
171179
* パネルは狭い画面では下から敷く帯、広い画面では右の帯になる。**どちらかは
172180
* 画面幅で決め打ちせず実寸から判定する** —— 決め打ちすると、パネル側の
@@ -2807,25 +2815,28 @@ export default function MapView({
28072815
*
28082816
* **寄せ先は地図の中心ではなく、パネルに隠れていない側の中心**。パネルは画面の下半分
28092817
* (狭い画面)か右側を覆っているので、素直に中心へ運ぶと**押した候補がパネルの下に入って
2810-
* 見えない**。`flyTo`の`offset`(最終的な中心を container の中心からずらすピクセル数)で
2811-
* 見えている矩形の中心へ置く。
2818+
* 見えない**。`offset`(`visibleCenterOffset`)で見えている矩形の中心へ置く。
2819+
*
2820+
* **`flyTo`ではなく`easeTo`を使う** —— `flyTo`は「視差効果を減らす」設定の端末で
2821+
* `offset`を捨てる(`visibleCenterOffset`の注記)。
28122822
*
28132823
* **`padding`は使わない** —— あちらは地図の transform に残り続けるので、以後の
2814-
* `fitBounds`・`flyTo`(訪問順の経路や現在地への移動)まで巻き込んでずれる。
2824+
* `fitBounds`(訪問順の経路や現在地への移動)まで巻き込んでずれる。
28152825
*/
28162826
const focusDiscoveryRow = useCallback(
28172827
(no: number) => {
28182828
setDiscoveryFocusedNo(no);
28192829
const map = mapRef.current;
28202830
const row = discoveryRows.find((r) => r.no === no);
28212831
if (!map || !row) return;
2822-
map.flyTo({
2832+
map.easeTo({
28232833
center: [row.candidate.lng, row.candidate.lat],
28242834
zoom: Math.max(map.getZoom(), 15),
28252835
offset: visibleCenterOffset(
28262836
containerRef.current?.getBoundingClientRect(),
28272837
discoveryPanelRef.current?.getBoundingClientRect()
28282838
),
2839+
duration: 600,
28292840
});
28302841
},
28312842
[discoveryRows]
@@ -2901,7 +2912,16 @@ export default function MapView({
29012912
);
29022913
// 直した位置がすぐ見えるように、その行へ寄せる
29032914
setDiscoveryFocusedNo(no);
2904-
mapRef.current?.flyTo({ center: [hit.lng, hit.lat], zoom: Math.max(mapRef.current.getZoom(), 16) });
2915+
// 直した先もパネルに隠れていない側へ寄せる(行を押したときと同じ扱い)
2916+
mapRef.current?.easeTo({
2917+
center: [hit.lng, hit.lat],
2918+
zoom: Math.max(mapRef.current.getZoom(), 16),
2919+
offset: visibleCenterOffset(
2920+
containerRef.current?.getBoundingClientRect(),
2921+
discoveryPanelRef.current?.getBoundingClientRect()
2922+
),
2923+
duration: 600,
2924+
});
29052925
},
29062926
[discoveryRows, regionScope]
29072927
);

0 commit comments

Comments
 (0)