Novolux Perú — Cortinas y Persianas a Medida en Lima
Agenda tu visita técnica gratuita |
Cotización gratuita · Novolux Perú

Formulario · Novolux Perú

persiana vertical

Lo último en control de luz y privacidad en Miraflores

 
 
 

Explore nuestra selección de cortinas

'; return a; } CARDS.forEach(function(d){ track.appendChild(buildCard(d)); }); CARDS.forEach(function(d){ track.appendChild(buildCard(d)); }); /* clon 1 */ CARDS.forEach(function(d){ track.appendChild(buildCard(d)); }); /* clon 2 */ /* ── Dots (solo para los reales) ── */ for (var i = 0; i < N; i++) { var d = document.createElement('button'); d.className = 'nv-dot' + (i===0?' on':''); d.setAttribute('aria-label','Ir a '+(i+1)); d.dataset.i = i; d.addEventListener('click', function(){ jumpTo(parseInt(this.dataset.i)); resetAuto(); }); dotsEl.appendChild(d); } /* ── Helpers ── */ function cardW() { var c = track.querySelector('.nv-card'); return c ? c.offsetWidth : 200; } function gapW() { var w = window.innerWidth; return w<=480?9:w<=768?12:16; } function stepPx() { return cardW() + gapW(); } function offsetFor(idx) { return idx * stepPx(); } function setTransform(px, animate) { track.style.transition = animate ? 'transform .5s cubic-bezier(0.25,0.46,0.45,0.94)' : 'none'; track.style.transform = 'translateX(-' + px + 'px)'; } function updateVisual() { var ds = dotsEl.querySelectorAll('.nv-dot'); ds.forEach(function(d,i){ d.classList.toggle('on', i===current); }); var all = track.querySelectorAll('.nv-card'); all.forEach(function(c,i){ c.classList.toggle('active-c', i===current); }); } /* ── Ir a índice directo (desde dots) ── */ function jumpTo(idx) { if (busy) return; current = ((idx%N)+N)%N; setTransform(offsetFor(current), true); updateVisual(); } /* ── Avanzar 1 paso con loop infinito ── */ function advance() { if (busy) return; var next = current + 1; if (next < N) { /* Normal */ current = next; setTransform(offsetFor(current), true); updateVisual(); } else { /* Último real → animar hacia clon[0] (posición N) y volver sin animación */ busy = true; setTransform(offsetFor(N), true); setTimeout(function(){ current = 0; setTransform(offsetFor(0), false); updateVisual(); busy = false; }, 520); } } /* ── Retroceder 1 paso ── */ function retreat() { if (busy) return; if (current > 0) { current--; setTransform(offsetFor(current), true); updateVisual(); } else { /* Primer real → saltar a clon del final y volver */ busy = true; setTransform(offsetFor(N - 1 + N), true); /* último clon */ setTimeout(function(){ current = N - 1; setTransform(offsetFor(current), false); updateVisual(); busy = false; }, 520); } } /* ── Autoplay ── */ function startAuto() { autoTimer = setInterval(advance, AUTO_MS); } function resetAuto() { clearInterval(autoTimer); startAuto(); } /* ── Drag mouse ── */ var dragX = 0, dragging = false; window.nvDragStart = function(e) { if (busy) return; dragX = e.clientX; dragging = true; document.addEventListener('mousemove', nvDragMove); document.addEventListener('mouseup', nvDragEnd); }; function nvDragMove(e) { if (!dragging) return; if (Math.abs(e.clientX - dragX) > 5) track.style.pointerEvents = 'none'; } function nvDragEnd(e) { if (!dragging) return; dragging = false; track.style.pointerEvents = ''; var diff = e.clientX - dragX; if (diff < -50) advance(); else if (diff > 50) retreat(); document.removeEventListener('mousemove', nvDragMove); document.removeEventListener('mouseup', nvDragEnd); resetAuto(); } /* ── Touch móvil ── */ var tX = 0; window.nvTouchStart = function(e){ tX = e.touches[0].clientX; }; window.nvTouchMove = function(e){ e.preventDefault(); }; window.nvTouchEnd = function(e){ var diff = e.changedTouches[0].clientX - tX; if (diff < -45) advance(); else if (diff > 45) retreat(); resetAuto(); }; /* ── Resize ── */ window.addEventListener('resize', function(){ setTransform(offsetFor(current), false); }); /* ── Init ── */ setTransform(0, false); updateVisual(); startAuto(); })();

Lo más Solicitados en Cortinas

Professional persiana vertical in Miraflores

Find a persiana vertical in Miraflores. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam varius nec ex fermentum vehicula. Cras sodales est nec gravida pretium. Integer libero arcu, pulvinar vitae tempus eget, convallis ut nulla.

Meet our persianas verticales at our salon

Our persianas verticales are the best persiana vertical in Miraflores. Meet our team now!

Get a haircut from one of our persianas verticales in Miraflores

Donec ac tortor vitae purus cursus tempor. Duis non hendrerit augue, ut consectetur erat. Suspendisse persiana vertical, magna at lobortis pharetra, massa orci lacinia massa, non tempus turpis nisl nec libero. Sed sed enim lorem. Cras et orci sapien.

Book now

Wide variety of persiana vertical services in Miraflores

Suspendisse fermentum lacus vitae tristique consectetur. Nunc luctus volutpat arcu, eu tempor odio pulvinar in. Sed urna nulla, finibus ut lorem Miraflores, consectetur finibus orci.
  • Hair coloring in Miraflores
  • Eyebrow styling in Miraflores
  • Washing hair in Miraflores

Book a persiana vertical in Miraflores

Nulla sagittis urna ultrices tortor viverra hendrerit. Phasellus sit amet luctus mauris, eu finibus mauris. Sed blandit nulla in diam porta, ac viverra arcu pretium. Nulla facilisi. Suspendisse ut nisl consequat, maximus enim ut, congue augue. Vivamus eget vehicula augue. Aenean eget ligula sed lacus mollis congue.

Book now

Las 6 cortinas de moda en 2026 para Lima

Estas son las tendencias que están definiendo la decoración de interiores este año, basadas en las solicitudes reales de nuestros clientes en distritos como Miraflores, La Molina, San Isidro y Surco:

' + '
' + item.title + '
' + '
' + item.desc + '
' + '' + item.cta + ' →' + '
'; return a; } /* ════════════════════════════ Init ════════════════════════════ */ function init () { var grid = document.getElementById('nvlxTGrid'); var slider = document.getElementById('nvlxTSlider'); var track = document.getElementById('nvlxTTrack'); var dotsEl = document.getElementById('nvlxTDots'); if (!grid || !track) return; if (grid.dataset.nvlxInit === '1') return; /* evitar doble init en editor Elementor */ grid.dataset.nvlxInit = '1'; var N = ITEMS.length; var cur = 0; var busy = false; var autoTm = null; var dragX = 0; var isDrag = false; var tX = 0; /* ── Poblar GRILLA desktop ── */ ITEMS.forEach(function (item) { grid.appendChild(makeCard(item)); }); /* ── Poblar TRACK del slider: reales + clones ── */ ITEMS.forEach(function (item) { track.appendChild(makeCard(item)); }); for (var r = 0; r < CFG.clones; r++) { ITEMS.forEach(function (item) { track.appendChild(makeCard(item)); }); } /* ── Dots ── */ for (var i = 0; i < N; i++) { var d = document.createElement('button'); d.className = 'nvlx-t-dot' + (i === 0 ? ' nvlx-on' : ''); d.setAttribute('aria-label', 'Ver tendencia ' + (i + 1)); d.dataset.idx = i; d.addEventListener('click', function () { jumpTo(+this.dataset.idx); resetAuto(); }); dotsEl.appendChild(d); } /* ── Medidas ── */ function cw () { var c = track.querySelector('.nvlx-t-card'); return c ? c.offsetWidth : 285; } function gap () { return window.innerWidth <= 480 ? 14 : 18; } function step () { return cw() + gap(); } function off (i) { return i * step(); } /* ── Aplicar posición ── */ function applyPos (px, animate) { track.style.transition = animate ? 'transform ' + CFG.animMs + 'ms ' + CFG.easing : 'none'; track.style.transform = 'translateX(-' + px + 'px)'; } /* ── Actualizar dots y opacidad de cards ── */ function updateUI () { /* dots */ var ds = dotsEl.querySelectorAll('.nvlx-t-dot'); ds.forEach(function (d, i) { d.classList.toggle('nvlx-on', i === cur); }); /* opacidad sutil en cards del slider */ var cs = track.querySelectorAll('.nvlx-t-card'); cs.forEach(function (c, i) { c.style.opacity = (i === cur) ? '1' : '0.85'; }); } /* ── jumpTo: ir directo sin animación (dots, resize) ── */ function jumpTo (idx) { cur = ((idx % N) + N) % N; applyPos(off(cur), false); updateUI(); } /* ── advance: siguiente card con loop infinito ── */ function advance () { if (busy) return; busy = true; if (cur < N - 1) { cur++; applyPos(off(cur), true); updateUI(); setTimeout(function () { busy = false; }, CFG.animMs + 40); } else { /* Último real → anima hacia clon[0] en posición N, luego salta invisible a 0 */ applyPos(off(N), true); cur = 0; updateUI(); setTimeout(function () { applyPos(off(0), false); busy = false; }, CFG.animMs + 40); } } /* ── retreat: card anterior con loop ── */ function retreat () { if (busy) return; busy = true; if (cur > 0) { cur--; applyPos(off(cur), true); updateUI(); setTimeout(function () { busy = false; }, CFG.animMs + 40); } else { /* Primero → salta instantáneo al clon del último, luego anima hacia atrás */ applyPos(off(N + N - 1), false); track.getBoundingClientRect(); /* forzar reflow */ cur = N - 1; applyPos(off(cur), true); updateUI(); setTimeout(function () { busy = false; }, CFG.animMs + 40); } } /* ── Autoplay ── */ function startAuto () { autoTm = setInterval(advance, CFG.autoMs); } function stopAuto () { clearInterval(autoTm); } function resetAuto () { stopAuto(); startAuto(); } /* Pausa en hover */ slider.addEventListener('mouseenter', stopAuto); slider.addEventListener('mouseleave', startAuto); /* ── Drag mouse ── */ track.addEventListener('mousedown', function (e) { if (busy) return; dragX = e.clientX; isDrag = true; }); document.addEventListener('mousemove', function (e) { if (!isDrag) return; if (Math.abs(e.clientX - dragX) > 6) track.style.cursor = 'grabbing'; }); document.addEventListener('mouseup', function (e) { if (!isDrag) return; isDrag = false; track.style.cursor = ''; var d = e.clientX - dragX; if (d < -50) advance(); else if (d > 50) retreat(); resetAuto(); }); /* ── Touch móvil ── */ track.addEventListener('touchstart', function (e) { tX = e.touches[0].clientX; }, { passive: true }); track.addEventListener('touchmove', function (e) { e.preventDefault(); }, { passive: false }); track.addEventListener('touchend', function (e) { var d = e.changedTouches[0].clientX - tX; if (d < -45) advance(); else if (d > 45) retreat(); resetAuto(); }); /* ── Resize ── */ var rTm; window.addEventListener('resize', function () { clearTimeout(rTm); rTm = setTimeout(function () { applyPos(off(cur), false); }, 120); }); /* ── Inicio ── */ applyPos(0, false); updateUI(); startAuto(); } /* ── Compatibilidad Elementor Pro: - jQuery ready: garantiza que el DOM del widget esté listo - elementor/frontend/init: re-init al previsualizar en el editor ── */ $(document).ready(function () { init(); $(window).on('elementor/frontend/init', function () { init(); }); }); }(jQuery));

Transforma tus Espacios

Descubre proyectos reales de cortinas y persianas diseñadas para brindar elegancia, confort y estilo en cada ambiente.

 

No se limite a confiar en nuestras palabras,
lea lo que dicen nuestros clientes

“Realmente estas cortinas cambiaron la estética de mi casa,  y la compra online fue super fácil y segura”

Daniela Quintana Arequipa

He tenido varias persianas de esta empresa a lo largo de los años y nunca elegiría otra. La calidad, la variedad, la entrega y el servicio de atención al cliente son siempre excepcionales.

Maria Lima-Perú

Esta es la tercera cortina roller que compro en esta empresa. Llegó bien embalada y, como estaba reemplazando una cortina roller del mismo tamaño, solo tuve que colocarla en los herrajes que ya estaban en la pared.

Sally Arequipa-Perú