-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathslider.js
116 lines (89 loc) · 2.99 KB
/
slider.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import petsData from "./pets.json" assert { type: "json" };
import { showPetModal } from "./pages/script.js";
const sliderTrack = document.querySelector(".slider-track");
const leftArrow = document.querySelector(".left-arrow");
const rightArrow = document.querySelector(".right-arrow");
let availableCards = [];
let currentCardIndex = 0;
document.addEventListener("DOMContentLoaded", () => {
const rightArrowButton = document.querySelector(".slider-right-arrow");
rightArrowButton.addEventListener("click", () => {
updateSlider();
});
});
document.addEventListener("DOMContentLoaded", () => {
const leftArrowButton = document.querySelector(".slider-left-arrow");
leftArrowButton.addEventListener("click", () => {
updateSlider();
});
});
const shuffleArray = (array) => {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
};
const generateCard = (data) => {
const card = document.createElement("div");
card.classList.add("slider-card");
const cardImageContainer = document.createElement("div");
cardImageContainer.classList.add("slider-card-image");
card.appendChild(cardImageContainer);
const image = document.createElement("img");
image.src = data.img;
image.alt = data.name;
cardImageContainer.appendChild(image);
const petTitle = document.createElement("span");
petTitle.classList.add("slider-pet-title");
petTitle.textContent = data.name;
card.appendChild(petTitle);
const learnMoreButton = document.createElement("button");
learnMoreButton.classList.add("button_secondary");
card.appendChild(learnMoreButton);
const learnMoreSpan = document.createElement("span");
learnMoreSpan.classList.add("learn-more");
learnMoreSpan.textContent = "Learn more";
learnMoreButton.appendChild(learnMoreSpan);
card.addEventListener("click", () => {
showPetModal(data);
});
return card;
};
let resizeTimeout;
const debounce = (func, delay) => {
clearTimeout(resizeTimeout);
resizeTimeout = setTimeout(func, delay);
};
const updateSlider = () => {
if (availableCards.length === 0) {
availableCards = petsData.slice();
shuffleArray(availableCards);
}
const screenWidth = window.innerWidth;
let numCardsToShow = 3;
if (screenWidth < 1278) {
numCardsToShow = 2;
}
if (screenWidth < 768) {
numCardsToShow = 1;
}
const currentSlideCards = availableCards.slice(
currentCardIndex,
currentCardIndex + numCardsToShow
);
if (currentSlideCards.length < numCardsToShow) {
const remainingCards = 3 - currentSlideCards.length;
currentSlideCards.push(...availableCards.slice(0, remainingCards));
}
currentCardIndex =
(currentCardIndex + numCardsToShow) % availableCards.length;
sliderTrack.innerHTML = "";
currentSlideCards.forEach((data) => {
const card = generateCard(data);
sliderTrack.appendChild(card);
});
};
updateSlider();
window.addEventListener("resize", () => {
debounce(updateSlider, 300);
});