From 4e681d08cc813291439774530c9e484fb20aa05a Mon Sep 17 00:00:00 2001 From: taekyoungc Date: Tue, 16 Jun 2026 15:39:02 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=97=85=EB=AC=B4=ED=98=84=ED=99=A9=20?= =?UTF-8?q?=EC=A7=80=EB=8F=84=20=EC=B2=AB=20=EC=A7=84=EC=9E=85=20=EC=8B=9C?= =?UTF-8?q?=20=ED=8C=90=EB=A7=A4=EC=86=8C=20=EB=AF=B8=ED=91=9C=EC=8B=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20(ResizeObserver=20relayout)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 워크스페이스 탭(iframe) 안에서 컨테이너 크기 확정 전 지도가 초기화돼 반만/일본으로 보이던 문제. 크기 변화마다 relayout+setBounds 재적용. Co-Authored-By: Claude Opus 4.8 --- app/Views/bag/_dashboard_kakao_map.php | 27 ++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/app/Views/bag/_dashboard_kakao_map.php b/app/Views/bag/_dashboard_kakao_map.php index cff8360..b3a71b5 100644 --- a/app/Views/bag/_dashboard_kakao_map.php +++ b/app/Views/bag/_dashboard_kakao_map.php @@ -158,9 +158,32 @@ $mapId = 'mainKakaoMap'; var bounds = new kakao.maps.LatLngBounds(); var placed = 0, pending = SHOPS.length; + // 컨테이너 크기에 맞춰 지도를 다시 그리고 영역을 재설정한다. + function refit() { + if (!mapRef) return; + mapRef.relayout(); + if (placed > 0) { mapRef.setBounds(bounds); } + else { mapRef.setCenter(new kakao.maps.LatLng(DEFAULT_CENTER.lat, DEFAULT_CENTER.lng)); } + } + var refitScheduled = false; + function scheduleRefit() { + if (refitScheduled) return; + refitScheduled = true; + (window.requestAnimationFrame || window.setTimeout)(function () { refitScheduled = false; refit(); }); + } + + // 탭(iframe) 안에서 컨테이너 크기가 늦게 확정되거나 바뀌면(표시 전환·창 크기 변경 등) + // 지도가 반만 그려지거나 엉뚱한 위치(일본 등)로 보이므로, 크기 변화 때마다 다시 맞춘다. + try { + if (typeof ResizeObserver !== 'undefined') { new ResizeObserver(scheduleRefit).observe(el); } + } catch (e) {} + window.addEventListener('resize', scheduleRefit); + window.addEventListener('pageshow', function () { setTimeout(refit, 50); }); + function done() { - if (placed > 0) map.setBounds(bounds); - setTimeout(function () { map.relayout(); if (placed > 0) map.setBounds(bounds); }, 150); + refit(); + setTimeout(refit, 150); + setTimeout(refit, 600); } if (pending === 0) { done(); return; }