Make slider responsive

This commit is contained in:
marzban-dev
2025-03-04 23:14:17 +03:30
parent 04c4ef1ca9
commit fc7b17a5cb
+46 -12
View File
@@ -11,7 +11,7 @@ import useHomeData from "~/composables/api/home/useHomeData";
const { data: homeData } = useHomeData(); const { data: homeData } = useHomeData();
const { $gsap: gsap, $ScrollTrigger: ScrollTrigger } = useNuxtApp(); const { $gsap: gsap, $ScrollTrigger: ScrollTrigger } = useNuxtApp();
const swiper_instance = ref<SwiperClass | null>(null); const swiper_instance = ref<SwiperClass | null>(null);
const showLoadingOverlay = useState('showLoadingOverlay'); const showLoadingOverlay = useState("showLoadingOverlay");
const observerTarget = ref(null); const observerTarget = ref(null);
const shouldPauseVideos = ref(false); const shouldPauseVideos = ref(false);
@@ -27,6 +27,7 @@ const isMuted = ref(true);
const slidesPerView = ref(1); const slidesPerView = ref(1);
let gsapTimeline: gsap.core.Timeline; let gsapTimeline: gsap.core.Timeline;
let scrollTrigger: ScrollTrigger;
// methods // methods
@@ -55,11 +56,7 @@ watch(() => [shouldPauseVideos.value, swiper_instance.value?.realIndex], () => {
// lifecycle // lifecycle
onMounted(() => { const initializeGsapAnimation = () => {
updateVideoStates();
gsapTimeline = gsap.timeline();
gsap.to("#header-navbar", { gsap.to("#header-navbar", {
background: "transparent", background: "transparent",
filter: "invert(100%)" filter: "invert(100%)"
@@ -100,8 +97,27 @@ onMounted(() => {
}, },
scale: 1 scale: 1
}, "="); }, "=");
};
ScrollTrigger.create({ const resetTimelineForMobile = () => {
gsap.to("#header-navbar", {
background: "white",
filter: "invert(0%)"
});
gsap.set(".header-slider-item", {
borderRadius: "20px",
height: "450px"
});
};
onMounted(() => {
updateVideoStates();
gsapTimeline = gsap.timeline();
initializeGsapAnimation();
scrollTrigger = ScrollTrigger.create({
trigger: "#header-slider-container", trigger: "#header-slider-container",
animation: gsapTimeline, animation: gsapTimeline,
scrub: 1, scrub: 1,
@@ -110,6 +126,25 @@ onMounted(() => {
// markers: true, // markers: true,
end: "bottom top" end: "bottom top"
}); });
setTimeout(() => {
if (window.innerWidth > 768) {
scrollTrigger.enable();
} else {
resetTimelineForMobile();
scrollTrigger.disable();
}
}, 100);
window.addEventListener("resize", () => {
if (window.innerWidth > 768) {
scrollTrigger.enable();
} else {
resetTimelineForMobile();
scrollTrigger.disable();
}
});
}); });
onUnmounted(() => { onUnmounted(() => {
@@ -122,18 +157,16 @@ onUnmounted(() => {
<template> <template>
<div <div
id="header-slider-container" id="header-slider-container"
class="w-full mb-20 z-50" class="w-full mb-20 z-50 max-md:mt-[80px]"
> >
<div id="header-slider-wrapper" class="relative"> <div id="header-slider-wrapper" class="relative">
<Swiper <Swiper
ref="observerTarget" ref="observerTarget"
:slides-per-view="slidesPerView" :slides-per-view="slidesPerView"
:loop="true" :loop="true"
:space-between="20"
:centered-slides="true" :centered-slides="true"
:breakpoints="{ :breakpoints="{
1024 : { 768: {
spaceBetween : 40 spaceBetween : 40
} }
}" }"
@@ -142,9 +175,10 @@ onUnmounted(() => {
<SwiperSlide <SwiperSlide
v-for="(slide, index) in homeData!.sliders" v-for="(slide, index) in homeData!.sliders"
:key="slide.id" :key="slide.id"
class="max-md:container"
> >
<div <div
class="header-slider-item relative w-full overflow-hidden" class="header-slider-item relative w-full overflow-hidden max-md:rounded-[20px]"
> >
<template v-if="!!slide.video"> <template v-if="!!slide.video">
<video <video