Vakantievillas  
in Costa Blanca

Vakantievillas
in Costa Blanca

Villas met zwembad, dicht bij de zee of verscholen tussen de wijngaarden. Gecontroleerd, goed gelegen en beheerd door mensen die elk hoekje kennen.

Accommodaties zoeken
Bestemming

Wil je naar een specifieke accommodatie gaan?

Wanneer?
Sluiten
Fechas
Fechas flexibles
Het spijt ons, sommige van de geselecteerde data zijn niet langer beschikbaar. Probeer andere data of bekijk onze vergelijkbare accommodaties.
Oke
Het spijt ons, sommige van de geselecteerde data zijn niet langer beschikbaar. Probeer andere data of bekijk onze vergelijkbare accommodaties.
Oke
Wie gaat er met je mee?
Volwassenen
Volwassenen 13 jaar of ouder
Kinderen
Kinderen Van 2 tot 12 jaar
0
Huisdieren
Huisdieren
Sluiten

Moraira

Villa te huur in El Portet de Moraira, SAN VICENTE, 50 meter van het water en privé zwembad.

Personen 12 pers. Bedden 6 kam. Strand 0,1 km Sterren 4.61

Vanaf 368,00 € /nacht

Calpe

Villa te huur in Calpe BELLISSIMA 14 pax en privé zwembad

Personen 14 pers. Bedden 7 kam. Strand 1,9 km Sterren 4.93

Vanaf 10,00 € /nacht

Calpe

Villa te huur in Calpe GRANDIOSA

Personen 14 pers. Bedden 7 kam. Strand 1,9 km Sterren 4.66

Vanaf 10,00 € /nacht

Moraira

Villa te huur in Moraira ANDURINA

Personen 10 pers. Bedden 6 kam. Strand 0,7 km Sterren 4.54

Vanaf 163,00 € /nacht

Benissa

villa te huur in Benissa ARC voor 12 personen, privé zwembad en zeezicht

Personen 12 pers. Bedden 6 kam. Strand 2,7 km Sterren 5

Vanaf 352,00 € /nacht

Benissa

villa te huur in Benissa, MARIO

Personen 12 pers. Bedden 6 kam. Strand 1,5 km Sterren 4.78

Vanaf 253,00 € /nacht

Calpe

Villa te huur in Calpe STEFKA

Personen 16 pers. Bedden 8 kam. Strand 1,7 km Sterren 4.59

Vanaf 246,00 € /nacht

Calpe

Villa te huur in Calpe, SENIETA

Personen 10 pers. Bedden 5 kam. Strand 1,5 km Sterren 4.88

Vanaf 276,00 € /nacht

Moraira

Villa te huur in Moraira, FLORIDA.

Personen 12 pers. Bedden 6 kam. Strand 1,7 km Sterren 4.61

Vanaf 336,00 € /nacht

Calpe

XENIA, villa te huur in Calpe voor 12 pax met privé zwembad

Personen 12 pers. Bedden 6 kam. Strand 1,7 km Sterren 4.84

Vanaf 312,00 € /nacht

Calpe

Villa te huur IFACH

Personen 12 pers. Bedden 6 kam. Strand 2,0 km Sterren 4.67

Vanaf 241,00 € /nacht

Benissa

RAPHAEL, Mooie villa voor 6 pax met spectaculair uitzicht op zee in Benissa.free wifi

Personen 6 pers. Bedden 3 kam. Strand 1,0 km Sterren 4.75

Vanaf 209,00 € /nacht

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 = 'Van'; 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 }); } } } }">
Kaart bijwerken...
Filtros Filters 1 Mapa Kaart Listado Lijst

Bestemmingen aan de Costa Blanca voor je volgende vakantie

Benissa
Benissa

Benissa

Calpe
Calpe

Calpe

Moraira
Moraira

Moraira

Benitachell
Benitachell

Benitachell

Ontdek andere verblijven

Elke reis vraagt ​​iets anders. Vind jouw ideale accommodatie zonder iets te missen.

Betrouwbare accommodaties voor 100%

Geregistreerd bij het Toeristenbureau met Nº EGVT-183A, gecontroleerd en lokaal.
Je weet waar je aankomt en wie je verwacht!

Geregistreerd bij het Toeristenbureau met Nº EGVT-183A, gecontroleerd en lokaal. Je weet waar je aankomt en wie je verwacht!

Gratis annulering

We weten dat plannen kunnen veranderen.
Hier kun je kosteloos annuleren zonder verborgen kosten of voorwaarden.

We weten dat plannen kunnen veranderen. Hier kun je kosteloos annuleren zonder verborgen kosten of voorwaarden.

Boek zonder borg voor schade

Het vertrouwen gaat voor, daarom blokkeren we geen geld op je kaart en vragen we geen borg.

Het vertrouwen gaat voor, daarom blokkeren we geen geld op je kaart en vragen we geen borg.