Ménage entre deux locations Marseille

Majordom Marseille

Ménage entre deux locations

à Marseille

Vous recherchez un service de ménage entre deux locations à Marseille pour garantir des logements toujours impeccables ? Majordom propose un service de ménage entre deux locations à Marseille adapté aux locations courte durée, avec des interventions rapides et fiables entre chaque séjour.

Un ménage entre deux locations à Marseille optimisé pour les rotations rapides

Le ménage entre deux locations à Marseille est essentiel pour assurer une transition parfaite entre chaque locataire. Dans un marché dynamique comme Marseille, chaque détail compte pour garantir une expérience irréprochable.

Notre service de ménage entre deux locations à Marseille s’adapte aux contraintes des check-out et check-in, avec une organisation précise et efficace.

Nos prestations de ménage entre deux locations à Marseille

Nettoyage logement Marseille

Ménage complet

Chaque ménage entre deux locations à Marseille inclut un nettoyage complet du logement pour garantir une propreté parfaite.

Gestion linge Marseille

Gestion du linge

Le ménage entre deux locations à Marseille inclut la rotation et la mise en place du linge.

Préparation logement Marseille

Préparation du logement

Votre ménage entre deux locations à Marseille garantit un logement prêt à accueillir vos voyageurs.

Comment fonctionne le ménage entre deux locations à Marseille ?

1

Analyse de vos besoins et de vos biens.

2

Planification des interventions selon vos réservations.

3

Réalisation du ménage entre deux locations à Marseille avec contrôle qualité.

Pourquoi choisir notre ménage entre deux locations à Marseille

Rotation fluide

Adapté aux locations Airbnb et courte durée.

Qualité constante

Un ménage entre deux locations à Marseille irréprochable.

Gain de temps

Vous déléguez totalement la gestion du ménage.

Demander un devis

FAQ – Ménage entre deux locations Marseille

Intervenez-vous entre chaque locataire ?

Oui, chaque ménage entre deux locations à Marseille est réalisé entre chaque séjour.

Est-ce adapté à Airbnb ?

Oui, ce service est spécialement conçu pour les locations courte durée.

document.addEventListener("DOMContentLoaded", function () { const hero = document.getElementById("majordomHeroSplit"); if (!hero) return; const cards = Array.from(hero.querySelectorAll("[data-card]")); const leftCard = hero.querySelector(".split-left"); const rightCard = hero.querySelector(".split-right"); const videos = Array.from(hero.querySelectorAll(".split-video")); const intervals = new Map(); const timeouts = new Map(); const isMobile = () => window.matchMedia("(max-width: 991px)").matches; const isDesktop = () => window.matchMedia("(hover:hover) and (pointer:fine)").matches; function getVideo(card) { return card ? card.querySelector(".split-video") : null; } function safePlay(video) { if (!video) return; video.muted = true; video.defaultMuted = true; video.playsInline = true; video.setAttribute("muted", ""); video.setAttribute("playsinline", ""); const p = video.play(); if (p && typeof p.catch === "function") p.catch(() => {}); } function safePause(video) { if (!video) return; try { video.pause(); } catch (e) {} } function preloadVideos() { videos.forEach((video) => { try { video.load(); } catch (e) {} }); } function clearTimers(card) { if (timeouts.has(card)) { timeouts.get(card).forEach((id) => clearTimeout(id)); timeouts.delete(card); } if (intervals.has(card)) { clearInterval(intervals.get(card)); intervals.delete(card); } } function resetRotator(card) { const title = card.querySelector(".split-main-title"); const args = Array.from(card.querySelectorAll(".split-arg")); clearTimers(card); if (title) title.classList.remove("is-hidden"); args.forEach((arg) => arg.classList.remove("is-visible")); } function startRotator(card) { const title = card.querySelector(".split-main-title"); const args = Array.from(card.querySelectorAll(".split-arg")); if (!title || !args.length) return; resetRotator(card); let current = 0; const localTimeouts = []; const hideTitleTimer = setTimeout(() => { if (!card.classList.contains("is-active")) return; title.classList.add("is-hidden"); }, 1800); const showArgsTimer = setTimeout(() => { if (!card.classList.contains("is-active")) return; args[0].classList.add("is-visible"); const loop = setInterval(() => { if (!card.classList.contains("is-active")) return; args[current].classList.remove("is-visible"); current = (current + 1) % args.length; args[current].classList.add("is-visible"); }, 2100); intervals.set(card, loop); }, 2450); localTimeouts.push(hideTitleTimer, showArgsTimer); timeouts.set(card, localTimeouts); } function stopRotator(card) { resetRotator(card); } function setActive(card) { cards.forEach((item) => { const active = item === card; item.classList.toggle("is-active", active); if (active) { startRotator(item); } else { stopRotator(item); } }); hero.classList.add("has-focus"); } function clearActive() { cards.forEach((item) => { item.classList.remove("is-active"); stopRotator(item); }); hero.classList.remove("has-focus"); } function playOnlyCard(card) { cards.forEach((item) => { const video = getVideo(item); if (item === card) { safePlay(video); } else { safePause(video); } }); } preloadVideos(); /* Desktop hover */ cards.forEach((card) => { card.addEventListener("mouseenter", function () { if (!isDesktop()) return; setActive(card); playOnlyCard(card); }); card.addEventListener("mouseleave", function () { if (!isDesktop()) return; const stillHover = cards.some(c => c.matches(":hover")); if (!stillHover) { clearActive(); videos.forEach((v) => safePause(v)); } }); }); /* Mobile initial: seule la gauche joue */ function activateLeftInitially() { if (!isMobile()) return; setActive(leftCard); playOnlyCard(leftCard); } /* Mobile: la 2e s'active seulement au scroll */ function updateMobileCardByScroll() { if (!isMobile()) return; const leftRect = leftCard.getBoundingClientRect(); const rightRect = rightCard.getBoundingClientRect(); const triggerY = window.innerHeight * 0.58; const leftCenter = leftRect.top + leftRect.height / 2; const rightCenter = rightRect.top + rightRect.height / 2; const leftDistance = Math.abs(leftCenter - triggerY); const rightDistance = Math.abs(rightCenter - triggerY); if (rightDistance + 8 < leftDistance) { setActive(rightCard); playOnlyCard(rightCard); } else { setActive(leftCard); playOnlyCard(leftCard); } } window.addEventListener("scroll", function () { if (isMobile()) updateMobileCardByScroll(); }, { passive: true }); cards.forEach((card) => { card.addEventListener("touchstart", function () { if (!isMobile()) return; setActive(card); playOnlyCard(card); }, { passive: true }); }); document.addEventListener("visibilitychange", function () { if (!document.hidden && isMobile()) { updateMobileCardByScroll(); } }); window.addEventListener("resize", function () { if (isMobile()) { updateMobileCardByScroll(); } else { clearActive(); videos.forEach((v) => safePause(v)); } }); if (isMobile()) { activateLeftInitially(); setTimeout(updateMobileCardByScroll, 120); } });