From 09f37fc9e5d9c4b8cef7d28b7d53dd819ebcb967 Mon Sep 17 00:00:00 2001 From: tamaina Date: Wed, 26 Jul 2023 08:31:23 +0000 Subject: [PATCH] =?UTF-8?q?fix(frontend):=20#11386=20=E3=81=A7=E3=82=A6?= =?UTF-8?q?=E3=82=A3=E3=83=B3=E3=83=89=E3=82=A6=E3=81=AE=E5=A0=B4=E5=90=88?= =?UTF-8?q?=E3=81=AB=E6=AD=A3=E5=B8=B8=E3=81=AB=E8=A1=A8=E7=A4=BA=E3=81=95?= =?UTF-8?q?=E3=82=8C=E3=81=AA=E3=81=84=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/components/MkMediaList.vue | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/frontend/src/components/MkMediaList.vue b/packages/frontend/src/components/MkMediaList.vue index 57d24d82ee..661c0a9877 100644 --- a/packages/frontend/src/components/MkMediaList.vue +++ b/packages/frontend/src/components/MkMediaList.vue @@ -39,10 +39,18 @@ const ro = new ResizeObserver(entries => { } }); -function getClientWidthWithCache(targetEl: HTMLElement, containerEl: HTMLElement) { +async function getClientWidthWithCache(targetEl: HTMLElement, containerEl: HTMLElement, count = 0) { + if (_DEV_) console.log('getClientWidthWithCache', { targetEl, containerEl, count, cache: widthCache.get(containerEl) }); if (widthCache.has(containerEl)) return widthCache.get(containerEl)!; const width = targetEl.clientWidth; + + if (count <= 10 && width < 64) { + // widthが64未満はおかしいのでリトライする + await new Promise(resolve => setTimeout(resolve, 50)); + return getClientWidthWithCache(targetEl, containerEl, count + 1); + } + widthCache.set(containerEl, width); ro.observe(containerEl); return width; @@ -79,7 +87,7 @@ const count = $computed(() => props.mediaList.filter(media => previewable(media) * アスペクト比をmediaListWithOneImageAppearanceに基づいていい感じに調整する * aspect-ratioではなくheightを使う */ -function calcAspectRatio() { + async function calcAspectRatio() { if (!gallery.value || !root.value) return; let img = props.mediaList[0]; @@ -90,7 +98,7 @@ function calcAspectRatio() { } if (!container.value) container.value = getScrollContainer(root.value); - const width = container.value ? getClientWidthWithCache(root.value, container.value) : root.value.clientWidth; + const width = container.value ? await getClientWidthWithCache(root.value, container.value) : root.value.clientWidth; const heightMin = (ratio: number) => { const imgResizeRatio = width / img.properties.width;