Skip to content

Commit bf91817

Browse files
committed
ADD: example for CSS slider
1 parent b522a69 commit bf91817

File tree

1 file changed

+69
-0
lines changed

1 file changed

+69
-0
lines changed

src/pages/index.astro

+69
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,77 @@ const title = "Fylgja";
55

66
<Layout title={title} hideSearch={true}>
77
<h1>{title}</h1>
8+
9+
<css-snap-slider>
10+
<div
11+
data-track
12+
class="snap scroll-x grid grid-flow gap flow-unset"
13+
style="--md_grid-cols: 2; --md_gap: 4rem;"
14+
>
15+
<figure class="stack align" style="--align-items: end center;">
16+
<img src="https://picsum.photos/id/19/2200/575" width="2200" height="575">
17+
<figcaption style="--px: var(--size-4)">Fylgja CSS Slider</figcaption>
18+
</figure>
19+
<img src="https://picsum.photos/id/34/2200/575" width="2200" height="575">
20+
<img src="https://picsum.photos/id/42/2200/575" width="2200" height="575">
21+
<img src="https://picsum.photos/id/72/2200/575" width="2200" height="575">
22+
<img src="https://picsum.photos/id/94/2200/575" width="2200" height="575">
23+
</div>
24+
<button data-next hidden>➡️</button>
25+
<button data-prev hidden>⬅️</button>
26+
</css-snap-slider>
827
</Layout>
928

29+
<script>
30+
// @ts-nocheck
31+
class CssSnapSlider extends HTMLElement {
32+
constructor() {
33+
self = super();
34+
}
35+
36+
connectedCallback() {
37+
const track = self.querySelector('[data-track]');
38+
const prevBtn = self.querySelector('[data-prev]');
39+
const nextBtn = self.querySelector('[data-next]');
40+
41+
const activeSliderObserver = new IntersectionObserver((entries, observer) => {
42+
entries.forEach(entry => {
43+
const slide = entry.target;
44+
45+
if (entry.isIntersecting) {
46+
// Add the `data-active` attribute when the slide is in view
47+
slide.setAttribute('data-active', 'true');
48+
} else {
49+
// Remove the `data-active` attribute when the slide is out of view
50+
slide.removeAttribute('data-active');
51+
}
52+
});
53+
}, {
54+
root: null, // Use the viewport as the root
55+
threshold: 0.5, // Slide is considered "in view" when 50% of it is visible
56+
});
57+
58+
if (!track) {
59+
console.error('No Slider track defined');
60+
return;
61+
}
62+
63+
Array.from(track.children).forEach(slide => activeSliderObserver.observe(slide));
64+
65+
if (prevBtn) {
66+
prevBtn.removeAttribute('hidden');
67+
}
68+
69+
if (nextBtn) {
70+
nextBtn.removeAttribute('hidden');
71+
}
72+
}
73+
}
74+
75+
customElements.define("css-snap-slider", CssSnapSlider);
76+
</script>
77+
78+
1079
<style is:global>
1180
.page-header {
1281
--page-header-bg: transparent;

0 commit comments

Comments
 (0)