Paneel dat over de hero schuift Nieuw
Sticky fotohero met een afgerond inhoudspaneel dat bij scrollen eroverheen schuift; de handgreep is een echte knop die het paneel omhoog of terug zet. De foto dimt via scroll-driven animation (animation-timeline: scroll(), achter @supports) met een kleine scroll-listener als terugval. In het paneel een filter in vier vragen met lege staat.
Coworking · Rotterdam · Kop van Zuid en Katendrecht
Werken aan het water, per dag of per jaar.
Wat werkt voor jou?
Pakhuiskade · Rijnhaven Oostzijde 14, Rotterdam · KvK 81234567 · ma t/m vr 8.00 tot 20.00 uur
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.
<!-- Paneel dat over de hero schuift · NedDev · eigen werk. -->
<div class="jouw-container">
<div class="poh">
<div class="poh__scroll" tabindex="0" role="region" aria-label="Pakhuiskade, scroll om het aanbod te zien">
<div class="poh__hero">
<img class="poh__img" src="https://neddev.com/lab-media/paneel-over-hero-1.webp" alt="Werkplekken met eikenhouten tafels achter stalen ramen aan de Maas" loading="lazy">
<div class="poh__top"><span class="poh__logo">Pakhuiskade</span><span class="poh__nav"><a href="#">Plekken</a><a href="#">Vergaderen</a><a href="#">Community</a></span><a class="poh__book" href="#">Boek een rondleiding</a></div>
<div class="poh__copy"><p class="poh__eyebrow">Coworking · Rotterdam · Kop van Zuid en Katendrecht</p><h2 class="poh__h">Werken aan het water, per dag of per jaar.</h2></div>
</div>
<div class="poh__panel" id="poh-panel">
<button type="button" class="poh__handle" aria-controls="poh-panel" aria-expanded="false"><span class="poh__grip" aria-hidden="true"></span><span class="poh__hl">Bekijk het aanbod</span></button>
<div class="poh__pin">
<h3 class="poh__ph">Wat werkt voor jou?</h3>
<form class="poh__f">
<label><span>Waar</span><select data-k="loc"><option value="">Beide locaties</option><option>Kop van Zuid</option><option>Katendrecht</option></select></label>
<label><span>Met hoeveel</span><select data-k="team"><option value="1">Alleen</option><option value="4">2 tot 5</option><option value="10">6 tot 12</option></select></label>
<label><span>Hoe lang</span><select data-k="dur"><option value="dag">Een dag</option><option value="maand" selected>Per maand</option><option value="jaar">Per jaar</option></select></label>
<label><span>Belangrijk</span><select data-k="feat"><option value="">Maakt niet uit</option><option value="stilte">Stilte</option><option value="vergader">Vergaderruimte</option><option value="parkeren">Parkeren</option></select></label>
</form>
<p class="poh__cnt" aria-live="polite"></p>
<ul class="poh__res"></ul>
<div class="poh__empty" hidden><p></p><button type="button" class="poh__clear">Wis filters</button></div>
<p class="poh__foot">Pakhuiskade · Rijnhaven Oostzijde 14, Rotterdam · KvK 81234567 · ma t/m vr 8.00 tot 20.00 uur</p>
</div>
</div>
</div>
</div>
</div>/* Paneel dat over de hero schuift · NedDev · eigen werk. */
/* fonts (Fontshare): clash-grotesk@500,600 + satoshi@400,500,700 */
.poh{--ink:#1f1d1a;--mut:#615b52;--panel:#efe8dc;--line:#d8cdbb;--yel:#f2c230;background:#1f1d1a;color:var(--ink);font-family:'Satoshi','Switzer',sans-serif;box-sizing:border-box}
.poh *,.poh *::before{box-sizing:border-box}
.poh [hidden]{display:none!important}
.poh__scroll{position:relative;height:600px;overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin;outline:none}
.poh__scroll:focus-visible{box-shadow:inset 0 0 0 3px var(--yel)}
.poh__hero{position:sticky;top:0;height:600px;overflow:hidden;color:#fff}
.poh__img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;transform-origin:50% 40%}
.poh__hero::after{content:'';position:absolute;inset:0;background:linear-gradient(180deg,rgba(20,18,15,.55) 0%,rgba(20,18,15,0) 28%),linear-gradient(90deg,rgba(20,18,15,.72) 0%,rgba(20,18,15,.35) 45%,rgba(20,18,15,0) 70%);pointer-events:none}
.poh__top{position:relative;z-index:1;display:flex;align-items:center;gap:26px;padding:18px 32px}
.poh__logo{font-family:'Clash Grotesk',sans-serif;font-weight:600;font-size:20px;letter-spacing:-.01em}
.poh__nav{display:flex;gap:20px;margin-left:auto}
.poh__nav a{color:#fff;font-size:14px;font-weight:500;text-decoration:none}
.poh__nav a:hover{text-decoration:underline;text-underline-offset:3px}
.poh__book{padding:10px 16px;border-radius:999px;background:var(--yel);color:var(--ink);font-weight:700;font-size:14px;text-decoration:none;transition:background-color .15s ease}
.poh__book:hover{background:#ffd75a}
.poh__nav a:focus-visible,.poh__book:focus-visible{outline:3px solid var(--yel);outline-offset:3px}
.poh__copy{position:absolute;z-index:1;left:32px;right:32px;top:250px;max-width:640px}
.poh__eyebrow{margin:0 0 12px;font:500 11px 'JetBrains Mono',monospace;letter-spacing:.12em;text-transform:uppercase;color:#f6e3a8}
.poh__h{margin:0;font-family:'Clash Grotesk',sans-serif;font-weight:600;font-size:clamp(32px,4.4vw,54px);line-height:1.02;letter-spacing:-.02em}
.poh__panel{position:relative;z-index:2;margin-top:-150px;min-height:600px;background:var(--panel);border-radius:22px 22px 0 0;box-shadow:0 -12px 30px -14px rgba(0,0,0,.5)}
.poh__handle{display:flex;flex-direction:column;align-items:center;gap:6px;width:100%;padding:12px 0 6px;border:0;background:transparent;border-radius:22px 22px 0 0;cursor:pointer;color:var(--mut);font:600 12.5px 'Satoshi',sans-serif}
.poh__grip{width:44px;height:5px;border-radius:3px;background:#b9ad99;transition:background-color .15s ease,width .15s ease}
.poh__handle:hover .poh__grip{background:var(--ink);width:56px}
.poh__handle:hover{color:var(--ink)}
.poh__handle:focus-visible{outline:3px solid var(--ink);outline-offset:-6px}
.poh__pin{max-width:1100px;margin:0 auto;padding:6px 32px 30px}
.poh__ph{margin:4px 0 14px;font-family:'Clash Grotesk',sans-serif;font-weight:600;font-size:28px;letter-spacing:-.01em}
.poh__f{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;background:#fff;border-radius:10px;padding:8px}
.poh__f label{display:flex;flex-direction:column;gap:2px;padding:6px 10px;border-radius:6px;transition:background-color .15s ease}
.poh__f label:hover{background:#f6f2ea}
.poh__f span{font:500 10.5px 'JetBrains Mono',monospace;letter-spacing:.08em;text-transform:uppercase;color:var(--mut)}
.poh__f select{font:600 15px 'Satoshi',sans-serif;color:var(--ink);border:0;background:transparent;padding:3px 0;cursor:pointer;outline:none;min-width:0}
.poh__f label:has(select:focus-visible){box-shadow:0 0 0 2px var(--ink)}
.poh__cnt{margin:14px 0 8px;font-size:13.5px;color:var(--mut)}
.poh__res{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(2,1fr);gap:8px}
.poh__card{display:grid;grid-template-columns:1fr auto;gap:2px 14px;align-items:center;padding:14px 16px;background:#fff;border-radius:8px;border:1px solid transparent;transition:border-color .15s ease}
.poh__card:hover{border-color:var(--line)}
.poh__card b{font-size:16px}
.poh__card span{font-size:13px;color:var(--mut)}
.poh__card strong{grid-row:1/3;grid-column:2;font-family:'Clash Grotesk',sans-serif;font-weight:600;font-size:18px;text-align:right;font-variant-numeric:tabular-nums}
.poh__card strong small{display:block;font-family:'Satoshi',sans-serif;font-weight:500;font-size:11.5px;color:var(--mut)}
.poh__empty{background:#fff;border:1px dashed #b9ad99;border-radius:8px;padding:16px}
.poh__empty p{margin:0 0 10px;font-size:14.5px;line-height:1.5}
.poh__clear{font:700 14px 'Satoshi',sans-serif;color:#fff;background:var(--ink);border:0;border-radius:999px;padding:9px 16px;cursor:pointer}
.poh__clear:hover{background:#000}
.poh__clear:focus-visible{outline:3px solid var(--yel);outline-offset:2px}
.poh__foot{margin:22px 0 0;padding-top:14px;border-top:1px solid var(--line);font-size:12.5px;color:var(--mut)}
@supports (animation-timeline:scroll()){
.poh__img{animation:poh-dim linear both;animation-timeline:scroll(nearest block);animation-range:0px 450px}
.poh__copy,.poh__top{animation:poh-fade linear both;animation-timeline:scroll(nearest block);animation-range:0px 350px}
}
@keyframes poh-dim{to{transform:scale(1.06);filter:brightness(.55)}}
@keyframes poh-fade{to{opacity:.15}}
.poh.is-js .poh__img{transform:scale(calc(1 + var(--p,0) * .06));filter:brightness(calc(1 - var(--p,0) * .45))}
.poh.is-js .poh__copy,.poh.is-js .poh__top{opacity:calc(1 - var(--p,0) * .85)}
@media (max-width:760px){
.poh__scroll,.poh__hero{height:640px}
.poh__top{padding:14px 16px;gap:12px}
.poh__nav{display:none}
.poh__book{margin-left:auto;padding:8px 12px;font-size:13px}
.poh__copy{left:16px;right:16px;top:290px}
.poh__hero::after{background:linear-gradient(180deg,rgba(20,18,15,.55) 0%,rgba(20,18,15,.2) 25%,rgba(20,18,15,.72) 60%,rgba(20,18,15,.6) 100%)}
.poh__panel{margin-top:-170px;min-height:640px}
.poh__pin{padding:4px 14px 24px}
.poh__f{grid-template-columns:1fr 1fr}
.poh__res{grid-template-columns:1fr}
}
@media (prefers-reduced-motion:reduce){.poh *{transition:none!important}.poh__img,.poh__copy,.poh__top{animation:none!important}}// Paneel dat over de hero schuift · NedDev · eigen werk.
// root = het element waarin de HTML staat
function init(root){
const w=root.querySelector('.poh'); if(!w) return;
const sc=w.querySelector('.poh__scroll'), panel=w.querySelector('.poh__panel'), h=w.querySelector('.poh__handle'), hl=w.querySelector('.poh__hl');
const rm=matchMedia('(prefers-reduced-motion: reduce)').matches;
const top=()=>panel.offsetTop;
const sync=()=>{const up=sc.scrollTop>=top()-12; h.setAttribute('aria-expanded',up?'true':'false'); hl.textContent=up?'Terug naar de foto':'Bekijk het aanbod';};
if(!(window.CSS&&CSS.supports&&CSS.supports('animation-timeline: scroll()'))&&!rm){w.classList.add('is-js');
const upd=()=>w.style.setProperty('--p',Math.min(1,sc.scrollTop/450).toFixed(3)); sc.addEventListener('scroll',upd,{passive:true}); upd();}
sc.addEventListener('scroll',sync,{passive:true});
h.addEventListener('click',()=>{const up=h.getAttribute('aria-expanded')==='true'; sc.scrollTo({top:up?0:top(),behavior:rm?'auto':'smooth'});});
const P=[
{n:'Flexplek',loc:'Kop van Zuid',min:1,max:1,dur:['dag','maand'],feat:['stilte'],p:{dag:'€ 19',maand:'€ 189'}},
{n:'Vaste plek',loc:'Kop van Zuid',min:1,max:1,dur:['maand','jaar'],feat:['stilte','parkeren'],p:{maand:'€ 295',jaar:'€ 3.240'}},
{n:'Flexplek',loc:'Katendrecht',min:1,max:1,dur:['dag','maand'],feat:['vergader'],p:{dag:'€ 17',maand:'€ 169'}},
{n:'Teamkamer 4p',loc:'Kop van Zuid',min:2,max:5,dur:['maand','jaar'],feat:['vergader','parkeren'],p:{maand:'€ 1.450',jaar:'€ 16.200'}},
{n:'Teamkamer 5p',loc:'Katendrecht',min:2,max:5,dur:['maand','jaar'],feat:['stilte','vergader'],p:{maand:'€ 1.390',jaar:'€ 15.600'}},
{n:'Projectruimte',loc:'Kop van Zuid',min:2,max:12,dur:['dag'],feat:['vergader','parkeren'],p:{dag:'€ 395'}},
{n:'Kantoor 10p',loc:'Kop van Zuid',min:6,max:12,dur:['jaar'],feat:['vergader','parkeren','stilte'],p:{jaar:'€ 38.400'}}];
const per={dag:'per dag',maand:'per maand',jaar:'per jaar'};
const sel=k=>w.querySelector('select[data-k="'+k+'"]');
const res=w.querySelector('.poh__res'), cnt=w.querySelector('.poh__cnt'), emp=w.querySelector('.poh__empty');
const render=()=>{const loc=sel('loc').value, team=+sel('team').value, dur=sel('dur').value, feat=sel('feat').value;
const hit=P.filter(x=>(!loc||x.loc===loc)&&team>=x.min&&team<=x.max&&x.dur.includes(dur)&&(!feat||x.feat.includes(feat)));
res.innerHTML=hit.map(x=>'<li class="poh__card"><b>'+x.n+'</b><span>'+x.loc+' · tot '+x.max+(x.max===1?' persoon':' personen')+'</span><strong>'+x.p[dur]+'<small>'+per[dur]+', excl. btw</small></strong></li>').join('');
emp.hidden=hit.length>0; res.hidden=!hit.length;
cnt.textContent=hit.length?(hit.length===1?'1 plek past':hit.length+' plekken passen')+' bij je keuze':'Niets gevonden';
if(!hit.length){const alt=P.filter(x=>team>=x.min&&team<=x.max&&x.dur.includes(dur)); emp.querySelector('p').textContent='Geen plek die op al je wensen past.'+(alt.length?' Zonder de andere filters wel: '+alt.map(x=>x.n+' op '+x.loc).join(', ')+'.':' Bel ons op 010 123 45 67, dan zoeken we samen.');}
};
w.querySelector('.poh__f').addEventListener('change',render);
w.querySelector('.poh__f').addEventListener('submit',e=>e.preventDefault());
w.querySelector('.poh__clear').addEventListener('click',()=>{sel('loc').value=''; sel('team').value='1'; sel('dur').value='maand'; sel('feat').value=''; render(); sel('loc').focus();});
w.querySelectorAll('a[href="#"]').forEach(a=>a.addEventListener('click',e=>e.preventDefault()));
render(); sync();
}
init(document.querySelector('.jouw-container'));
Meer uit paginasecties
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 →