Skip to content

Commit 1d68091

Browse files
committed
Use shared instance of IntersectionObserver
1 parent 796661f commit 1d68091

File tree

2 files changed

+29
-18
lines changed

2 files changed

+29
-18
lines changed

src/lib/FxReveal.svelte

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<script>
22
import Img from './SvelteImg.svelte'
3+
import observe from './_observe.js'
34
import { onMount } from 'svelte'
45
56
export let src = []
@@ -11,21 +12,6 @@ let mounted = false
1112
let loaded = false
1213
let inview = false
1314
14-
function observe(node) {
15-
const observer = new IntersectionObserver((entries) => {
16-
if (entries[0].isIntersecting) {
17-
inview = true
18-
observer.disconnect()
19-
}
20-
})
21-
observer.observe(node)
22-
return {
23-
destroy() {
24-
observer.disconnect()
25-
}
26-
}
27-
}
28-
2915
$: if (src.length) {
3016
const { base64 } = src.find((i) => i.base64)
3117
background = base64 ? `url('${base64}') no-repeat center/cover` : undefined
@@ -39,7 +25,13 @@ onMount(() => {
3925
</script>
4026

4127
{#if src.length}
42-
<div class="wrap" class:mounted class:reveal={loaded && inview} use:observe>
28+
<div
29+
class="wrap"
30+
class:mounted
31+
class:reveal={loaded && inview}
32+
use:observe
33+
on:enter={() => (inview = true)}
34+
>
4335
<Img src={sources} bind:ref on:load={() => (loaded = true)} on:click {...$$restProps} />
4436
<div class="lqip" style:background />
4537
</div>
@@ -55,10 +47,11 @@ onMount(() => {
5547
}
5648
.mounted :global(img) {
5749
opacity: 0;
58-
transform: scale(1.02);
50+
transform: scale(var(--reveal-scale, 1.03));
5951
}
6052
.reveal :global(img) {
61-
transition: opacity 1s linear, transform 0.6s ease-out;
53+
transition: opacity var(--reveal-opacity-duration, 1s) linear,
54+
transform var(--reveal-transform-duration, 0.6s) ease-out;
6255
opacity: 1;
6356
transform: scale(1);
6457
}

src/lib/_observe.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
let observer
2+
3+
export default function (node) {
4+
observer =
5+
observer ||
6+
new IntersectionObserver((entries) => {
7+
for (const detail of entries) {
8+
const { isIntersecting, target } = detail
9+
target.dispatchEvent(new CustomEvent(isIntersecting ? 'enter' : 'leave', { detail }))
10+
}
11+
})
12+
observer.observe(node)
13+
return {
14+
destroy() {
15+
observer.unobserve(node)
16+
}
17+
}
18+
}

0 commit comments

Comments
 (0)