Vacation Apartments in Costa Blanca

Vacation Apartments in Costa Blanca

Central, practical, and equipped with everything you need to move around freely. Managed by those who know the area like the back of their hand.

Search accommodations
Destination

Do you want to go to a specific accommodation?

When?
Close
Dates
Flexible dates
We're sorry, some of the selected dates are no longer available. Please try other dates or check our similar accommodations.
Ok
We're sorry, some of the selected dates are no longer available. Please try other dates or check our similar accommodations.
Ok
Who is coming with you?
Adults
Adults 13 years or older
Children
Children From 2 to 12 years
0
Pets
Pets
Close

Calpe / Calp

Apartment for rent in first line of Calpe, CANTAL

People 6 pers. Beds 3 bed. Stars 4.71

From 154,00 € /night

Moraira

Apartment for rent in Moraira, CAP DOR

People 6 pers. Beds 3 bed. Beach 0,2 km Stars 4.66

From 110,00 € /night

Calpe / Calp

Apartment for rent in Calpe PARAISO MAR

People 6 pers. Beds 3 bed. Beach 0,1 km Stars 5

From 147,00 € /night

Calpe / Calp

Holiday rental in Calpe JOYA

People 6 pers. Beds 3 bed. Beach 0,5 km Stars 4.73

From 154,00 € /night

Calpe / Calp

TRAMONTANA, Tramontana apartment in front of the Levante beach in Calp, Alicante

People 6 pers. Beds 3 bed. Beach 0,1 km Stars 4.55

From 123,00 € /night

Calpe / Calp

Front line sea apartament for rent in Calpe, EVOLUTION

People 4 pers. Beds 2 bed. Beach 0,2 km Stars 5

From 232,00 € /night

Moraira

Appartment for rent in Moraira, Castell

People 4 pers. Beds 2 bed. Beach 0,3 km

From 138,00 € /night

Moraira

Aparment for rent in El Portet, BELLISSIMO for 6 pax

People 6 pers. Beds 3 bed. Beach 1,5 km Stars 4.4

From 120,00 € /night

Moraira

MARJALETA, Beautiful apartment in the centre of Moraira for 4 pax free wifi.

People 4 pers. Beds 2 bed. Beach 0,8 km Stars 4.61

From 94,00 € /night

Calpe / Calp

TOPACIO IV, beautiful apartment on the Levante de Calp beach, Alicante

People 6 pers. Beds 2 bed. Beach 0,1 km Stars 4.64

From 79,00 € /night

Calpe / Calp

Paraiso Mar apartments in first line of the beach of Calpe, TROND

People 5 pers. Beds 2 bed. Beach 0,1 km Stars 4.64

From 106,00 € /night

Calpe / Calp

Apartment for rent in Calpe BRIGITTE

People 4 pers. Beds 2 bed. Beach 0,3 km Stars 4.59

From 80,00 € /night

link.href === href); if (existing) { resolve(); return; } const link = document.createElement('link'); link.rel = 'stylesheet'; link.href = href; link.onload = resolve; link.onerror = reject; document.head.appendChild(link); }); }, highlightMarker(accommodationId) { // Primero limpiar todos los marcadores para evitar estados inconsistentes this.markers.forEach(m => { const el = m.getElement(); const priceEl = el.querySelector('.simple-price-marker'); if (priceEl) { priceEl.classList.remove('highlighted'); } // Restaurar z-index original if (el.dataset.originalZindex !== undefined) { el.style.zIndex = el.dataset.originalZindex; } else { el.style.zIndex = ''; } el.classList.remove('marker-highlighted'); }); // Ahora destacar el marcador específico const marker = this.markers.find(m => { const el = m.getElement(); return el && String(el.getAttribute('data-accommodation-id')) === String(accommodationId); }); if (marker) { const el = marker.getElement(); const priceEl = el.querySelector('.simple-price-marker'); if (priceEl) { priceEl.classList.add('highlighted'); } // Guardar z-index original si no está guardado if (!el.dataset.originalZindex) { el.dataset.originalZindex = el.style.zIndex || ''; } el.style.zIndex = '9999'; el.classList.add('marker-highlighted'); // Mover la cámara del mapa hasta el marcador manteniendo el zoom actual const lngLat = marker.getLngLat(); this.map.flyTo({ center: [lngLat.lng, lngLat.lat], duration: 1000, // Duración de la animación en ms essential: true // Esta animación es considerada esencial }); } }, unhighlightMarker(accommodationId) { const marker = this.markers.find(m => { const el = m.getElement(); return el && String(el.getAttribute('data-accommodation-id')) === String(accommodationId); }); if (marker) { const el = marker.getElement(); const priceEl = el.querySelector('.simple-price-marker'); if (priceEl) { // Limpiar todas las clases relacionadas con el estado de hover priceEl.classList.remove('highlighted'); // También limpiar cualquier estado de hover nativo que pueda haber quedado priceEl.classList.remove('show-price'); // Solo restaurar el texto si no está en estado clicked if (!priceEl.classList.contains('clicked')) { // Para marcadores con precio oculto, limpiar el texto if (priceEl.classList.contains('hidden-price')) { priceEl.textContent = ''; } } } // Restaurar z-index original if (el.dataset.originalZindex !== undefined) { el.style.zIndex = el.dataset.originalZindex; } else { el.style.zIndex = ''; } el.classList.remove('marker-highlighted'); } }, updateMarkers(accommodations) { // Verificar que el mapa esté inicializado if (!this.map || !this.mapInitialized) { return; } // Limpiar marcadores existentes this.markers.forEach(marker => marker.remove()); this.markers = []; accommodations.forEach(accommodation => { const lat = accommodation.lat; const lng = accommodation.lng; const price = accommodation.totalPrice; const shouldDisplayPrice = accommodation.display === true; const el = document.createElement('div'); // Aplicar clase condicional basada en la propiedad display const markerClass = shouldDisplayPrice ? 'simple-price-marker' : 'simple-price-marker hidden-price'; const displayText = shouldDisplayPrice ? price : ''; el.innerHTML = `
${displayText}
`; try { // Usar la URL ya construida desde PHP que incluye todos los parámetros necesarios const accommodationUrl = accommodation.url; // Crear el popup const fromLabel = 'From'; const popupContent = document.createElement('div'); popupContent.className = 'card card--map'; const link = document.createElement('a'); link.href = accommodationUrl; link.className = 'card__link'; popupContent.appendChild(link); if (accommodation.picture) { const img = document.createElement('img'); img.src = accommodation.picture; img.className = 'card__image'; img.alt = accommodation.name || 'Alojamiento'; img.addEventListener('error', () => { img.style.display = 'none'; }); popupContent.appendChild(img); } const content = document.createElement('div'); content.className = 'card__content'; const title = document.createElement('h3'); title.className = 'card__title'; title.textContent = accommodation.name || 'Alojamiento'; content.appendChild(title); const priceWrap = document.createElement('div'); priceWrap.className = 'card__price'; priceWrap.appendChild(document.createTextNode(fromLabel + ' ')); const priceMoney = document.createElement('span'); priceMoney.className = 'card__price-money'; priceMoney.textContent = price; priceWrap.appendChild(priceMoney); priceWrap.appendChild(document.createTextNode(' ' + (accommodation.priceSuffix || ''))); content.appendChild(priceWrap); popupContent.appendChild(content); const popup = new mapboxgl.Popup({ offset: 45, closeButton: true }); if (typeof popup.setDOMContent === 'function') { popup.setDOMContent(popupContent); } else { popup.setHTML(popupContent.outerHTML); } // Crear el marcador const marker = new mapboxgl.Marker(el) .setLngLat([lng, lat]) .setPopup(popup) .addTo(this.map); // Asignar el atributo al contenedor real del marker const markerElement = marker.getElement(); markerElement.setAttribute('data-accommodation-id', accommodation.id); // Añadir listeners para hover y click const priceEl = el.querySelector('.simple-price-marker'); if (priceEl) { // Funcionalidad estándar de hover para todos los marcadores priceEl.addEventListener('mouseenter', () => { markerElement.dataset.originalZindex = markerElement.style.zIndex || ''; markerElement.style.zIndex = '99999'; markerElement.classList.add('marker-highlighted'); }); priceEl.addEventListener('mouseleave', () => { markerElement.style.zIndex = markerElement.dataset.originalZindex || ''; markerElement.classList.remove('marker-highlighted'); }); // Funcionalidad especial para marcadores con precio oculto if (!shouldDisplayPrice) { // Mostrar precio al hacer hover priceEl.addEventListener('mouseenter', () => { priceEl.classList.add('show-price'); priceEl.textContent = price; }); priceEl.addEventListener('mouseleave', () => { if (!priceEl.classList.contains('clicked')) { priceEl.classList.remove('show-price'); priceEl.textContent = ''; } }); // Manejar click en marcadores ocultos priceEl.addEventListener('click', (e) => { // No prevenir la propagación para permitir que el popup se abra // Remover clase clicked de todos los otros marcadores this.markers.forEach(otherMarker => { const otherPriceEl = otherMarker.getElement().querySelector('.simple-price-marker'); if (otherPriceEl && otherPriceEl !== priceEl) { otherPriceEl.classList.remove('clicked', 'show-price'); otherPriceEl.textContent = ''; } }); // Toggle del estado clicked en el marcador actual if (priceEl.classList.contains('clicked')) { priceEl.classList.remove('clicked', 'show-price'); priceEl.textContent = ''; } else { priceEl.classList.add('clicked', 'show-price'); priceEl.textContent = price; } }); } } this.markers.push(marker); } catch (e) { console.error('Error creating marker element:', e); } }); // Solo ajustar bounds automáticamente si: // 1. Hay marcadores // 2. No ha habido interacción del usuario // 3. Es la primera carga (no hay centro inicial establecido por alojamientos) if (this.markers.length > 0 && !this.userAct) { const bounds = new mapboxgl.LngLatBounds(); this.markers.forEach(marker => bounds.extend(marker.getLngLat())); // Solo hacer fitBounds si no hay un alojamiento específico como centro inicial const hasSpecificCenter = this.accommodations && this.accommodations.length > 0 && this.accommodations[0].lat && this.accommodations[0].lng && this.accommodations[0].lat !== 0 && this.accommodations[0].lng !== 0; if (!hasSpecificCenter) { this.map.fitBounds(bounds, { padding: 100, maxZoom: 15 }); } } } }">
Updating map...
Filtros Filters 1 Mapa Map Listado Listing

Destinations in Costa Blanca for your upcoming holidays

Benissa
Benissa

Benissa

Calpe / Calp
Calpe / Calp

Calpe / Calp

Moraira
Moraira

Moraira

Benitachell
Benitachell

Benitachell

Discover other stays

Every trip calls for something different. Find your ideal accommodation without sacrificing anything.
Villas
Villas Spaces with soul, views worth the experience, and good kind of tranquility.
Bungalows
Bungalows With a terrace, charm, and such a cozy atmosphere that you won't want to leave.
Beachfront Villas
Beachfront Villas Close to everything, comfortable and perfect for moving at your own pace.

100% reliable accommodations

Registered with the Tourism Board under Nº EGVT-183A, verified and local.
You know where you’re arriving and who’s waiting for you!

Registered with the Tourism Board under Nº EGVT-183A, verified and local. You know where you’re arriving and who’s waiting for you!

Free cancellation

We know that plans change.
Here you can cancel without costs or hidden conditions.

We know that plans change. Here you can cancel without costs or hidden conditions.

Damage deposit-free reservation

Trust comes first, that's why we do not block money on your card or ask for deposits.

Trust comes first, that's why we do not block money on your card or ask for deposits.