Qualité des photos : 9/10 · évaluée par IA
Iberia, Tanger
1 830 000 MAD
17 429 MAD/m²
Positionnement prix
Dans le prix du quartier
Médian Iberia : 17 429 MAD/m² · 18 annonces analysées
Rendement locatif estimé ≈ 9,2 % brut/an · Où investir à Tanger ?
Voir les prix du quartierCaractéristiques
Annonces similaires
1 830 000 MAD
17 429 MAD/m²
Surface
105 m²
Chambres
3
Étage
1/6
Description
Découvrez un havre de paix en plein centre de Tanger, au sein d’une résidence exclusive réputée pour son élégance, sa modernité et son confort absolu. Nichée dans l’une des adresses les plus prisées de la ville, elle offre un cadre de vie incomparable où le luxe rencontre le bien-être. Cet appartement haut de gamme de 105 m² séduit par ses volumes généreux, sa luminosité naturelle et ses finitions raffinées. Chaque espace est pensé pour offrir harmonie, qualité et confort au quotidien. Prestations Premium : Finitions haut standing Cuisine équipée importée Carrelage 120×60 Plâtres modernes Douches à l’italienne & sanitaires suspendus Portes importées d’Espagne Chambres avec parquet en bois Climatisation centralisée Double vitrage Balcon ou terrasse Espaces & Commodités : Galeries commerciales chic Espaces de bureaux pour professionnels Jardin paysager Sécurité 24h/24 Ascenseurs modernes Parkings en sous-sol Emplacement d’Exception : Située sur l’Avenue Allal Ben Abdellah, à l’angle de la Rue de Fès, la résidence profite d’une proximité immédiate avec toutes les commodités : écoles, restaurants, commerces, centres commerciaux… tout est à portée de main. Modalités de paiement : 35% à la réservation Livraison : fin 2026 Parking : 150 000 DH Un appartement unique pour ceux qui recherchent confort, prestige et une adresse rare au cœur de Tanger. 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 : Terre&mer maroc Agence immobilière à Tanger-Assilah Information financières --> --> Annonces Similaires Il y a 3 jours 3 600 000 DH 3 Ch 2 sdb 206 m² Appartement à vendre Tanger -Quartier de la plage Annonce par : Sélection agenz Il y a 5 jours 2 140 000 DH 3 Ch 4 sdb 153 m² Appartement à vendre Tanger -De La Plage Annonce par : Sélection agenz Il y a 21 jours 2 500 000 DH 3 Ch 2 sdb 240 m² Appartement à vendre Tanger -De La Plage Annonce par : Sélection agenz (function(){const id = ""; const similarLen = 3; 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 = requestAnimationFrame(() => { resizeRaf = 0; recompute(); updateArrowsVisibility(); updateIndicators(); if (currentIndex > maxIndex) { scrollToIndex(maxIndex, false); } else { // Re-evaluate next/prev visibility against the fre
Localisation
Position approximative
1 320 000 MAD
Dans le prix du quartier≈ 6 969 MAD/mois de crédit
≈ 10,1 % brut/anAppartement · 83 m² · 2 ch
Iberia, Tangeril y a 3 mois