Qualité des photos : 5/10 · évaluée par IA
Ghandi, Casablanca
2 530 000 MAD
16 013 MAD/m²
Positionnement prix
Dans le prix du quartier
Médian Ghandi : 16 013 MAD/m² · 41 annonces analysées
Rendement locatif estimé ≈ 8,6 % brut/an · Où investir à Casablanca ?
Voir les prix du quartierCaractéristiques
Annonces similaires
2 530 000 MAD
16 013 MAD/m²
Surface
158 m²
Chambres
2
Description
QUARTIER DES HÔPITAUX – Bien d’exception de 158 m² au 6ᵉ étage – Calme absolu & intimité rare Situé au cœur du très recherché quartier des Hôpitaux, ce magnifique appartement de 158 m² représente une opportunité rare pour les amateurs de confort, de tranquillité et d’élégance urbaine. Niché au 6ᵉ étage d’une résidence bien entretenue de 7 niveaux, ce bien offre un cadre de vie privilégié alliant luminosité, volumes généreux et sérénité absolue. L’un des principaux atouts de cet appartement réside dans sa configuration exclusive : un seul appartement par étage, garantissant une intimité totale ainsi qu’une absence quasi complète de nuisances sonores liées au voisinage ou aux parties communes. Son étage élevé permet également d’être parfaitement préservé des bruits de la ville, tout en profitant d’une atmosphère résidentielle paisible et raffinée. Traversant et sans aucun vis-à-vis, l’appartement bénéficie d’une double exposition Est/Ouest, offrant un ensoleillement naturel permanent tout au long de la journée. Les espaces de vie sont lumineux, aérés et parfaitement agencés pour un confort optimal. Le bien se compose de :• Un vaste double salon de réception avec balcon et espace salle à manger.• Une suite parentale confortable avec salle de bain privative.• Deux chambres supplémentaires avec une seconde salle de bain.• Une grande cuisine fonctionnelle et spacieuse.• Une chambre de service avec douche et WC intégrés.• Une place de parking titrée. La copropriété, majoritairement habitée par des couples sans enfants, assure un environnement discret, stable et particulièrement agréable à vivre. Prix de vente : 2 530 000 DH Un appartement rare sur le marché, idéal pour une résidence principale haut de gamme ou un investissement patrimonial de qualité, au sein de l’un des quartiers les plus stratégiques et recherchés de Casablanca. document.addEventListener(`DOMContentLoaded`,function(){let e=document.getElementById(`voir-plus`),t=document.querySelector(`.label`);e.addEventListener(`change`,function(){e.checked||t.scrollIntoView({behavior:`smooth`})})}); proposée par : Cantarel Immobilier Agence immobilière à Casablanca Information financières --> --> Annonces Similaires Il y a 17 heures 1 500 000 DH 2 Ch 1 sdb 108 m² Appartement à vendre Casablanca -Maârif Extension Annonce par : Sélection agenz Il y a 19 heures 1 400 000 DH 2 Ch 1 sdb 116 m² Appartement à vendre Casablanca -Les Hôpitaux Annonce par : Sélection agenz (function(){const id = ""; const similarLen = 2; document.addEventListener("DOMContentLoaded", function () { const carousel = document.getElementById(`Cards-Container${id}`); const arrows = document.getElementById(`arrowsId${id}`); const indicators = document.getElementById(`indicators${id}`); // const prevStroke = document.getElementById(`prev-stroke${id}`); const nextButtons = document.querySelectorAll(`.next-btn${id}`); const prevButtons = document.querySelectorAll(`.prev-btn${id}`); if (!carousel) return; /* Card #4103 — measure the real card "step" (card width + gap) * by reading the two first children's offsetLeft. Falls back to * the first child's offsetWidth if there's only one card. This is * what makes the arrow navigation actually land on card edges * instead of being off by the gap. */ let currentIndex = 0; const firstCard = carousel.firstElementChild; const cardWidth = firstCard instanceof HTMLElement ? firstCard.offsetWidth || 320 : 320; const measureStep = () => { const first = carousel.children[0]; const second = carousel.children[1]; if (!first || !(first instanceof HTMLElement)) return cardWidth; if (second && second instanceof HTMLElement) { const delta = second.offsetLeft - first.offsetLeft; if (delta > 0) return delta; } return first.offsetWidth || cardWidth; }; let step = measureStep(); /* maxScroll is the true end of the scroll container. The card- * counted maxIndex is derived from it so the last "next" click * lands at scrollLeft = maxScroll and the final card sits fully * inside the viewport, no partial visibility. */ const getMaxScroll = () => Math.max(0, carousel.scrollWidth - carousel.clientWidth); let maxScroll = getMaxScroll(); let maxIndex = step > 0 ? Math.ceil(maxScroll / step) : 0; const maxDots = 5; const isRTL = getComputedStyle(carousel).direction === "rtl"; const recompute = () => { step = measureStep(); maxScroll = getMaxScroll(); maxIndex = step > 0 ? Math.ceil(maxScroll / step) : 0; }; const updateArrowsVisibility = () => { if (!arrows || !carousel) return; arrows.style.visibility = maxScroll > 0 ? "visible" : "hidden"; }; /* Dots window over the VALID scroll positions [0, maxIndex], * not over similarLen. Showing more dots than reachable positions * was the source of the "active dot stuck on an earlier position" * bug for cards = N where N - visibleCards maxDots and there's more content beyond an edge, * the dots closest to that edge shrink (1.0 → 0.7 → 0.5) so the * user gets a visual "there's more in this direction" cue without * the dot strip itself growing. */ const updateIndicators = () => { if (!indicators) return; const dots = indicators.querySelectorAll(".dot-indicator"); const pageCount = maxIndex + 1; // number of valid scroll positions let startDot = 0; if (pageCount > maxDots) { const half = Math.floor(maxDots / 2); if (currentIndex = pageCount - half - 1) { startDot = pageCount - maxDots; } else { startDot = currentIndex - half; } } const endDot = startDot + maxDots - 1; const overflowsAtStart = pageCount > maxDots && startDot > 0; const overflowsAtEnd = pageCount > maxDots && endDot { const actualIndex = startDot + dotPosition; const isVisible = actualIndex { if (!carousel) return; recompute(); currentIndex = Math.max(0, Math.min(index, maxIndex)); /* The container has `scroll-snap-type: x mandatory` and the cards * default to start-aligned snap. If we just scrollTo(maxScroll) * the browser snaps back to the PREVIOUS card's left edge when * maxScroll isn't an exact multiple of `step` — that's what * leaves the last card partially hidden behind the gap. * * For the final index, pin the LAST card's inline-end edge to * the container's inline-end edge via scrollIntoView. That * overrides snap proximity and guarantees full visibility of * the last card, no matter the gap or padding-right. */ if ( currentIndex >= maxIndex && maxIndex > 0 && carousel.children.length > 0 ) { const lastCard = carousel.children[carousel.children.length - 1]; if (lastCard instanceof HTMLElement) { lastCard.scrollIntoView({ inline: isRTL ? "start" : "end", block: "nearest", behavior: smooth ? "smooth" : "auto", }); } else { carousel.scrollTo({ left: maxScroll, behavior: smooth ? "smooth" : "auto", }); } } else { const scrollLeft = Math.min(currentIndex * step, maxScroll); carousel.scrollTo({ left: scrollLeft, behavior: smooth ? "smooth" : "auto", }); } updateIndicators(); prevButtons.forEach((btn) => { btn.style.display = currentIndex > 0 ? 'flex' : 'none'; }); // Hide next button when there are no more cards to scroll to. nextButtons.forEach((btn) => { btn.style.display = currentIndex { if (!carousel) return; // In RTL, browsers report scrollLeft as a negative value (or inverted), // so take the absolute distance from the start edge. const scrollPosition = Math.abs(carousel.scrollLeft); /* If the user dragged all the way to maxScroll, snap the index * to maxIndex even if scrollPosition / step rounds short. */ if (maxScroll > 0 && scrollPosition >= maxScroll - 1) { currentIndex = maxIndex; } else { currentIndex = step > 0 ? Math.round(scrollPosition / step) : 0; } currentIndex = Math.max(0, Math.min(currentIndex, maxIndex)); updateIndicators(); prevButtons.forEach((btn) => { btn.style.display = currentIndex > 0 ? 'flex' : 'none'; }); // Hide next button when there are no more cards to scroll to. nextButtons.forEach((btn) => { btn.style.display = currentIndex { if (resizeRaf) return; resizeRaf = requestAnimat
Localisation
Position approximative