Kaart-carrousel die uitklapt Nieuw
Horizontale kaartenrij (scroll-snap, pijlen die uitgeschakeld raken aan het eind) waarvan elke kaart uitklapt tot een verhaal-paneel in een echte modale
Atelier Kok · interieurbouw, Haarlem
Recente projecten
Keuken · Haarlem
Eiken keuken in een jaren-30 huis
De bewoners wilden de oude erker terug in de keuken. We tekenden het werkblad rond de bestaande radiator en maakten de fronten van massief eiken met een matte olie.
Het terrazzoblad is gegoten in een werkplaats in Haarlem-Noord. Montage duurde vier dagen; op vrijdag werd er weer gekookt.
Boekenwand · Heemstede
Boekenkast rond de schuifdeur
Een wand van vloer tot plafond met 2,7 meter boekenruimte, gebouwd om de schuifdeur naar de serre heen. De planken zijn verstelbaar en dragen 40 kilo per meter.
Alle onderdelen zijn in onze werkplaats gespoten, zodat er in huis alleen gemonteerd hoefde te worden.
Badmeubel · Zandvoort
Notenhout voor een kleine badkamer
De badkamer is 1,9 bij 2,2 meter. Het meubel is 38 cm diep in plaats van de gebruikelijke 46, met een greeploze lade die om de sifon heen loopt.
Het fineer is drie keer gelakt met een watervaste lak, geschikt voor de vochtige zeelucht.
Trapkast · Bloemendaal
Kast onder de trap met duwsluiting
Onder de trap zat een rommelhok met een losse deur. Nu zijn het vier vakken op maat: jassen, schoenen, stofzuiger en een uittrekbare la voor de tassen.
De deuren hebben geen grepen en sluiten met een zachte duwsluiting, zodat de hal rustig oogt.
Zo gebruik je het
- Plak de HTML op de plek waar het onderdeel moet komen.
- Zet de CSS in je stylesheet. Alle klassen hebben een eigen voorvoegsel, dus niets botst met je eigen opmaak.
- Voeg de JavaScript toe en roep init() aan met het element waar de HTML in staat.
<!-- Kaart-carrousel die uitklapt · NedDev · eigen werk. -->
<div class="jouw-container">
<div class="kcu"><div class="kcu__hd"><div><p class="kcu__k">Atelier Kok · interieurbouw, Haarlem</p><p class="kcu__t">Recente projecten</p></div><div class="kcu__nav"><button type="button" class="kcu__arw" data-dir="-1" aria-label="Vorige projecten" disabled><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M10 3.5 5.5 8l4.5 4.5"/></svg></button><button type="button" class="kcu__arw" data-dir="1" aria-label="Volgende projecten"><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M6 3.5 10.5 8 6 12.5"/></svg></button></div></div>
<ul class="kcu__track" aria-label="Projecten">
<li><button type="button" class="kcu__card" data-i="0" aria-haspopup="dialog"><img class="kcu__img" src="https://neddev.com/lab-media/kaart-carousel-uitklap-1.webp" alt="" width="900" height="900" loading="lazy"><span class="kcu__cap"><span class="kcu__ck">Keuken · Haarlem</span><span class="kcu__ct">Eiken keuken in een jaren-30 huis</span></span><span class="kcu__plus" aria-hidden="true"><svg viewBox="0 0 16 16"><path d="M8 3v10M3 8h10"/></svg></span></button></li>
<li><button type="button" class="kcu__card" data-i="1" aria-haspopup="dialog"><img class="kcu__img" src="https://neddev.com/lab-media/kaart-carousel-uitklap-2.webp" alt="" width="900" height="900" loading="lazy"><span class="kcu__cap"><span class="kcu__ck">Boekenwand · Heemstede</span><span class="kcu__ct">Boekenkast rond de schuifdeur</span></span><span class="kcu__plus" aria-hidden="true"><svg viewBox="0 0 16 16"><path d="M8 3v10M3 8h10"/></svg></span></button></li>
<li><button type="button" class="kcu__card" data-i="2" aria-haspopup="dialog"><img class="kcu__img" src="https://neddev.com/lab-media/kaart-carousel-uitklap-3.webp" alt="" width="900" height="900" loading="lazy"><span class="kcu__cap"><span class="kcu__ck">Badmeubel · Zandvoort</span><span class="kcu__ct">Notenhout voor een kleine badkamer</span></span><span class="kcu__plus" aria-hidden="true"><svg viewBox="0 0 16 16"><path d="M8 3v10M3 8h10"/></svg></span></button></li>
<li><button type="button" class="kcu__card" data-i="3" aria-haspopup="dialog"><img class="kcu__img" src="https://neddev.com/lab-media/kaart-carousel-uitklap-4.webp" alt="" width="900" height="900" loading="lazy"><span class="kcu__cap"><span class="kcu__ck">Trapkast · Bloemendaal</span><span class="kcu__ct">Kast onder de trap met duwsluiting</span></span><span class="kcu__plus" aria-hidden="true"><svg viewBox="0 0 16 16"><path d="M8 3v10M3 8h10"/></svg></span></button></li></ul>
<template class="kcu__tpl"><p class="kcu__dk">Keuken · Haarlem</p><h3 class="kcu__dt" id="kcu-dt">Eiken keuken in een jaren-30 huis</h3><dl class="kcu__meta"><div><dt>Doorlooptijd</dt><dd>6 weken</dd></div><div><dt>Budget</dt><dd>€ 18.400</dd></div><div><dt>Materiaal</dt><dd>massief eiken, terrazzo</dd></div></dl><p>De bewoners wilden de oude erker terug in de keuken. We tekenden het werkblad rond de bestaande radiator en maakten de fronten van massief eiken met een matte olie.</p><p>Het terrazzoblad is gegoten in een werkplaats in Haarlem-Noord. Montage duurde vier dagen; op vrijdag werd er weer gekookt.</p></template>
<template class="kcu__tpl"><p class="kcu__dk">Boekenwand · Heemstede</p><h3 class="kcu__dt" id="kcu-dt">Boekenkast rond de schuifdeur</h3><dl class="kcu__meta"><div><dt>Doorlooptijd</dt><dd>3 weken</dd></div><div><dt>Budget</dt><dd>€ 7.900</dd></div><div><dt>Materiaal</dt><dd>MDF, gelakt in rietgroen</dd></div></dl><p>Een wand van vloer tot plafond met 2,7 meter boekenruimte, gebouwd om de schuifdeur naar de serre heen. De planken zijn verstelbaar en dragen 40 kilo per meter.</p><p>Alle onderdelen zijn in onze werkplaats gespoten, zodat er in huis alleen gemonteerd hoefde te worden.</p></template>
<template class="kcu__tpl"><p class="kcu__dk">Badmeubel · Zandvoort</p><h3 class="kcu__dt" id="kcu-dt">Notenhout voor een kleine badkamer</h3><dl class="kcu__meta"><div><dt>Doorlooptijd</dt><dd>2 weken</dd></div><div><dt>Budget</dt><dd>€ 3.650</dd></div><div><dt>Materiaal</dt><dd>noten fineer, natuursteen</dd></div></dl><p>De badkamer is 1,9 bij 2,2 meter. Het meubel is 38 cm diep in plaats van de gebruikelijke 46, met een greeploze lade die om de sifon heen loopt.</p><p>Het fineer is drie keer gelakt met een watervaste lak, geschikt voor de vochtige zeelucht.</p></template>
<template class="kcu__tpl"><p class="kcu__dk">Trapkast · Bloemendaal</p><h3 class="kcu__dt" id="kcu-dt">Kast onder de trap met duwsluiting</h3><dl class="kcu__meta"><div><dt>Doorlooptijd</dt><dd>10 dagen</dd></div><div><dt>Budget</dt><dd>€ 4.200</dd></div><div><dt>Materiaal</dt><dd>essen, duw-open beslag</dd></div></dl><p>Onder de trap zat een rommelhok met een losse deur. Nu zijn het vier vakken op maat: jassen, schoenen, stofzuiger en een uittrekbare la voor de tassen.</p><p>De deuren hebben geen grepen en sluiten met een zachte duwsluiting, zodat de hal rustig oogt.</p></template>
<dialog class="kcu__dlg" aria-labelledby="kcu-dt"><div class="kcu__dw"><div class="kcu__dmedia"><img class="kcu__dimg" alt="" width="900" height="900"></div><button type="button" class="kcu__x" aria-label="Sluiten"><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M4 4l8 8M12 4l-8 8"/></svg></button><div class="kcu__body"></div><a class="kcu__cta" href="#">Plan een kennismaking</a></div></dialog></div>
</div>/* Kaart-carrousel die uitklapt · NedDev · eigen werk. */
.kcu{position:absolute;inset:0;box-sizing:border-box;padding:12px 0 14px;background:#f4f3f1;color:#0a0a0a;font-family:'Switzer',system-ui,sans-serif;display:flex;flex-direction:column;gap:10px}
.kcu__hd{display:flex;justify-content:space-between;align-items:flex-end;padding:0 16px}
.kcu__k{margin:0;font:500 9.5px 'JetBrains Mono',monospace;color:#5f5e5a}
.kcu__t{margin:2px 0 0;font-size:15px;font-weight:650}
.kcu__nav{display:flex;gap:6px}
.kcu__arw{width:30px;height:30px;display:grid;place-items:center;border-radius:50%;border:1px solid rgba(10,10,10,.2);background:#fff;color:#0a0a0a;cursor:pointer;transition:background .15s,color .15s,border-color .15s}
.kcu__arw svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.kcu__arw:hover:not(:disabled){background:#0a0a0a;color:#fff;border-color:#0a0a0a}
.kcu__arw:disabled{opacity:.35;cursor:default}
.kcu__arw:focus-visible,.kcu__card:focus-visible,.kcu__x:focus-visible,.kcu__cta:focus-visible{outline:2px solid #F5480F;outline-offset:2px}
.kcu__track{list-style:none;margin:0;padding:2px 16px 4px;flex:1;min-height:0;display:flex;gap:10px;overflow-x:auto;scroll-snap-type:x mandatory;scroll-padding:0 16px;scrollbar-width:none;overscroll-behavior-x:contain}
.kcu__track::-webkit-scrollbar{display:none}
.kcu__track li{flex:none;scroll-snap-align:start;display:flex}
.kcu__card{position:relative;width:146px;height:100%;padding:0;border:0;border-radius:8px;overflow:hidden;background:#d9d6d0;cursor:pointer;text-align:left;font:inherit;color:#fff}
.kcu__img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;transition:transform .5s cubic-bezier(.2,.7,.2,1)}
.kcu__card:hover .kcu__img{transform:scale(1.04)}
.kcu__cap{position:absolute;left:0;right:0;bottom:0;padding:28px 10px 10px;background:linear-gradient(transparent,rgba(10,10,10,.78));display:flex;flex-direction:column;gap:2px;padding-right:38px}
.kcu__ck{font:500 9px 'JetBrains Mono',monospace;color:#e8e6e1}
.kcu__ct{font-size:12.5px;font-weight:650;line-height:1.2}
.kcu__plus{position:absolute;right:8px;bottom:9px;width:24px;height:24px;border-radius:50%;background:#fff;display:grid;place-items:center;transition:background .15s,transform .2s}
.kcu__plus svg{width:12px;height:12px;stroke:#0a0a0a;stroke-width:2;stroke-linecap:round;fill:none}
.kcu__card:hover .kcu__plus{background:#F5480F;transform:rotate(90deg)}.kcu__card:hover .kcu__plus svg{stroke:#fff}
.kcu__dlg{width:min(520px,calc(100vw - 32px));max-height:min(86vh,680px);padding:0;border:0;border-radius:10px;background:#fff;color:#0a0a0a;font-family:'Switzer',system-ui,sans-serif;overflow:auto;box-shadow:0 30px 80px -20px rgba(10,10,10,.5);opacity:1;transform:none;transition:opacity .25s,transform .25s,display .25s allow-discrete,overlay .25s allow-discrete}
@starting-style{.kcu__dlg[open]{opacity:0;transform:translateY(12px) scale(.98)}}
.kcu__dlg::backdrop{background:rgba(10,10,10,.55)}
.kcu__dw{position:relative}
.kcu__dmedia{aspect-ratio:16/9;overflow:hidden;background:#d9d6d0}
.kcu__dimg{width:100%;height:100%;object-fit:cover;display:block}
.kcu__x{position:absolute;top:10px;right:10px;width:34px;height:34px;border-radius:50%;border:0;background:#fff;display:grid;place-items:center;cursor:pointer;box-shadow:0 2px 8px rgba(10,10,10,.2);transition:background .15s}
.kcu__x:hover{background:#0a0a0a}.kcu__x:hover svg{stroke:#fff}
.kcu__x svg{width:14px;height:14px;stroke:#0a0a0a;stroke-width:2;stroke-linecap:round}
.kcu__body{padding:18px 22px 4px}
.kcu__dk{margin:0;font:500 10px 'JetBrains Mono',monospace;color:#5f5e5a}
.kcu__dt{margin:4px 0 12px;font-size:22px;font-weight:700;line-height:1.15;letter-spacing:-.01em}
.kcu__meta{display:grid;grid-template-columns:repeat(3,auto);justify-content:start;gap:4px 22px;margin:0 0 14px;padding:10px 0;border-top:1px solid rgba(10,10,10,.12);border-bottom:1px solid rgba(10,10,10,.12)}
.kcu__meta dt{font:500 9.5px 'JetBrains Mono',monospace;color:#6b6a66}.kcu__meta dd{margin:2px 0 0;font-size:12.5px;font-weight:600}
.kcu__body p:not(.kcu__dk){margin:0 0 10px;font-size:14px;line-height:1.55;color:#2a2926}
.kcu__cta{display:inline-block;margin:6px 22px 22px;padding:10px 16px;border-radius:4px;background:#0a0a0a;color:#fff;text-decoration:none;font-size:13px;font-weight:600;transition:background .15s}
.kcu__cta:hover{background:#F5480F}
::view-transition-group(kcu-media){animation-duration:.42s;animation-timing-function:cubic-bezier(.3,.7,.2,1)}
@media(max-width:480px){.kcu__meta{grid-template-columns:1fr 1fr}.kcu__dt{font-size:19px}.kcu__body{padding:14px 16px 2px}.kcu__cta{margin:4px 16px 18px}}
@media(max-width:420px){.kcu{padding:10px 0 10px;gap:8px}.kcu__hd{padding:0 12px}.kcu__track{padding:2px 12px 2px;gap:8px}.kcu__card{width:124px}.kcu__ct{font-size:11.5px}}
@media(prefers-reduced-motion:reduce){.kcu__dlg,.kcu__img,.kcu__plus{transition:none}}// Kaart-carrousel die uitklapt · NedDev · eigen werk.
// root = het element waarin de HTML staat
function init(root){
var w=root.querySelector('.kcu');if(!w)return;var tr=w.querySelector('.kcu__track'),arws=w.querySelectorAll('.kcu__arw'),dlg=w.querySelector('.kcu__dlg'),body=w.querySelector('.kcu__body'),dimg=w.querySelector('.kcu__dimg'),tpls=w.querySelectorAll('.kcu__tpl'),cur=null;
var reduce=matchMedia('(prefers-reduced-motion:reduce)').matches,vt=!!document.startViewTransition&&!reduce;
function upd(){var max=tr.scrollWidth-tr.clientWidth-2;arws[0].disabled=tr.scrollLeft<=2;arws[1].disabled=tr.scrollLeft>=max;}
arws.forEach(function(b){b.addEventListener('click',function(){var c=tr.querySelector('li');tr.scrollBy({left:(+b.dataset.dir)*(c.offsetWidth+10),behavior:reduce?'auto':'smooth'});});});
tr.addEventListener('scroll',upd,{passive:true});upd();if('ResizeObserver' in window)new ResizeObserver(upd).observe(tr);
function fill(card){var i=+card.dataset.i;body.innerHTML='';body.appendChild(tpls[i].content.cloneNode(true));dimg.src=card.querySelector('.kcu__img').src;}
function open(card){cur=card;var img=card.querySelector('.kcu__img');if(!vt){fill(card);dlg.showModal();return;}
img.style.viewTransitionName='kcu-media';var t=document.startViewTransition(function(){img.style.viewTransitionName='';fill(card);dimg.style.viewTransitionName='kcu-media';dlg.showModal();});t.finished.finally(function(){dimg.style.viewTransitionName='';});}
function close(){if(!dlg.open)return;if(!vt||!cur){dlg.close();return;}var img=cur.querySelector('.kcu__img');dimg.style.viewTransitionName='kcu-media';
var t=document.startViewTransition(function(){dimg.style.viewTransitionName='';dlg.close();img.style.viewTransitionName='kcu-media';});t.finished.finally(function(){img.style.viewTransitionName='';});}
w.querySelectorAll('.kcu__card').forEach(function(c){c.addEventListener('click',function(){open(c);});});
w.querySelector('.kcu__x').addEventListener('click',close);
dlg.addEventListener('cancel',function(e){e.preventDefault();close();});
dlg.addEventListener('click',function(e){if(e.target===dlg)close();});
dlg.addEventListener('close',function(){if(cur)cur.focus();});
w.querySelector('.kcu__cta').addEventListener('click',function(e){e.preventDefault();close();});
}
init(document.querySelector('.jouw-container'));
Meer uit componenten
Iets gezien dat je mooi vindt?
Zet het in je selectie en stuur hem op. Dan bouwen we je site eromheen, in jouw huisstijl.
Neem contact op →