Skip to content

Commit 7d38e42

Browse files
committed
docs: fix marquee bug on safari
1 parent e5ddeb3 commit 7d38e42

File tree

1 file changed

+31
-11
lines changed

1 file changed

+31
-11
lines changed

docs/.vitepress/theme/components/Marquee.vue

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,42 @@
11
<script setup lang="ts">
22
import { ref, onMounted } from 'vue';
33
4+
const reflow = (element: HTMLElement) => {
5+
element.style.display = 'none';
6+
element.offsetHeight;
7+
element.style.display = '';
8+
};
9+
10+
const waitImageLoad = (
11+
img: HTMLImageElement,
12+
) => new Promise<void>(
13+
(resolve) => {
14+
if (img.complete) {
15+
return resolve();
16+
}
17+
18+
img.addEventListener('load', () => resolve());
19+
img.addEventListener('error', () => resolve());
20+
}
21+
);
22+
423
const waitImages = (
524
element: HTMLElement,
625
) => {
726
const images = element.querySelectorAll('img');
827
return Promise.all(
9-
Array.from(images).map((image) => (
10-
new Promise<void>((resolve) => {
11-
if (image.complete) {
12-
resolve();
13-
return;
14-
}
15-
16-
image.addEventListener('load', () => resolve());
17-
image.addEventListener('error', () => resolve());
18-
})
19-
))
28+
Array.from(images).map(async (image) => {
29+
await waitImageLoad(image);
30+
/**
31+
* Bug in Safari where preloaded image causes the image to have
32+
* 0 width.
33+
* Load the FAQ page then navigating to the index page.
34+
* Solution is to trigger reflow.
35+
*/
36+
if (image.offsetWidth === 0) {
37+
reflow(image);
38+
}
39+
})
2040
);
2141
};
2242

0 commit comments

Comments
 (0)