Hero met kaart die over de rand valt New
Contractor hero: large project photo with a "Plans to renovate?" card overlapping into the next section, with a short question, phone number and callback request. The textarea grows with field-sizing:content (fallback: fixed 3 rows); error, loading and success states included, announced via aria-live.
Bouwbedrijf Verhoef · Haarlem, sinds 1987
Verbouwen en renoveren in Haarlem en Zuid-Kennemerland
Uitbouw, dakopbouw en complete renovatie van jaren-dertigwoningen. Met een vaste prijs en een opleverdatum die in het contract staat.
Demo
How to use it
- Paste the HTML where the page sections should appear.
- Add the CSS to your stylesheet. All classes are prefixed, so nothing clashes with your own styles.
- Add the JavaScript and call init() with the element that contains the HTML.
<!-- Hero met kaart die over de rand valt · NedDev · eigen werk. -->
<div class="jouw-container">
<div class="bvh">
<div class="bvh__hero">
<img class="bvh__img" src="https://neddev.com/lab-media/hero-overlapkaart-1.webp" alt="Jaren-dertigwoning in Haarlem in de steigers tijdens een renovatie" loading="lazy">
<div class="bvh__hero-in">
<p class="bvh__kick">Bouwbedrijf Verhoef · Haarlem, sinds 1987</p>
<h2 class="bvh__h">Verbouwen en renoveren in Haarlem en Zuid-Kennemerland</h2>
<p class="bvh__lead">Uitbouw, dakopbouw en complete renovatie van jaren-dertigwoningen. Met een vaste prijs en een opleverdatum die in het contract staat.</p>
<div class="bvh__btns"><a class="bvh__btn bvh__btn--pri" href="#">Bekijk 48 projecten</a><a class="bvh__btn bvh__btn--ghost" href="#">Zo werken wij</a></div>
</div>
</div>
<div class="bvh__next">
<div class="bvh__next-in">
<div class="bvh__proof">
<p class="bvh__eyebrow">Wat je van ons mag verwachten</p>
<dl class="bvh__dl">
<div><dt>58 van 64</dt><dd>opleveringen sinds 2021 op of vóór de datum uit het contract. De andere zes liepen gemiddeld 4 werkdagen uit.</dd></div>
<div><dt>Vaste prijs</dt><dd>Meerwerk alleen met jouw handtekening vooraf, met prijs per post op papier.</dd></div>
<div><dt>1 uitvoerder</dt><dd>Van sloop tot oplevering dezelfde persoon op de bouw, met zijn eigen 06-nummer.</dd></div>
</dl>
</div>
<div class="bvh__card" role="region" aria-labelledby="bvh-ct">
<div class="bvh__maat" aria-hidden="true"><span>Offerte binnen 5 werkdagen</span></div>
<h3 id="bvh-ct" class="bvh__ct">Verbouwplannen?</h3>
<p class="bvh__cp">Vertel in een zin wat je wilt. Jeroen, onze calculator, belt je binnen een werkdag terug.</p>
<form class="bvh__form" novalidate>
<label class="bvh__lbl" for="bvh-q">Wat wil je verbouwen?</label>
<textarea id="bvh-q" class="bvh__ta" rows="3" maxlength="400" placeholder="Bijvoorbeeld: uitbouw van 3 meter aan de achterkant, keuken erin"></textarea>
<label class="bvh__lbl" for="bvh-t">Telefoonnummer</label>
<input id="bvh-t" class="bvh__in" type="tel" inputmode="tel" autocomplete="tel" placeholder="06 12 34 56 78">
<p class="bvh__msg" aria-live="polite"></p>
<button class="bvh__go" type="submit"><span class="bvh__spin" aria-hidden="true"></span><span class="bvh__go-t">Bel mij terug</span></button>
</form>
<div class="bvh__ok" hidden tabindex="-1"></div>
<p class="bvh__tel">Liever zelf bellen? <a href="tel:+31235314480">023 531 44 80</a></p>
</div>
</div>
<div class="bvh__demo"><span>Demo</span><button type="button" data-bvh="fout">Toon fout</button><button type="button" data-bvh="laden">Toon laden</button><button type="button" data-bvh="ok">Toon succes</button><button type="button" data-bvh="reset">Opnieuw</button></div>
</div>
</div>
</div>/* Hero met kaart die over de rand valt · NedDev · eigen werk. */
/* fonts (Fontshare): clash-grotesk@500,600 + switzer@400,500,600 */
.bvh{--bvh-ink:#1f1d1a;--bvh-coal:#2a2724;--bvh-ochre:#c8962e;--bvh-ochre2:#a87a1c;--bvh-kalk:#f2efe9;--bvh-line:#ddd6ca;--bvh-mut:#5e5850;--bvh-err:#a3341f;--bvh-ok:#2f6b3f;background:var(--bvh-kalk);color:var(--bvh-ink);font-family:'Switzer',sans-serif;box-sizing:border-box}
.bvh *,.bvh *::before,.bvh *::after{box-sizing:border-box}
.bvh a:focus-visible,.bvh button:focus-visible{outline:2px solid var(--bvh-ochre);outline-offset:3px}
.bvh__hero{position:relative;min-height:470px;display:flex;align-items:center;color:#fff;background:var(--bvh-coal);overflow:hidden}
.bvh__img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.bvh__hero::after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,rgba(24,22,20,.86) 0%,rgba(24,22,20,.62) 45%,rgba(24,22,20,.1) 80%)}
.bvh__hero-in{position:relative;z-index:1;max-width:1200px;width:100%;margin:0 auto;padding:48px 32px 120px}
.bvh__kick{margin:0 0 14px;font-size:13px;font-weight:500;letter-spacing:.04em;color:#e9cf93}
.bvh__h{font-family:'Clash Grotesk',sans-serif;font-weight:600;font-size:clamp(32px,4.2vw,54px);line-height:1;letter-spacing:-.01em;margin:0 0 16px;max-width:15ch}
.bvh__lead{font-size:17px;line-height:1.55;margin:0 0 26px;max-width:46ch;color:rgba(255,255,255,.86)}
.bvh__btns{display:flex;gap:10px;flex-wrap:wrap}
.bvh__btn{display:inline-flex;align-items:center;height:48px;padding:0 20px;font-weight:600;font-size:15px;text-decoration:none;border-radius:3px;transition:background-color .18s,color .18s,border-color .18s}
.bvh__btn--pri{background:var(--bvh-ochre);color:#1a1408}
.bvh__btn--pri:hover{background:#d9a93f}
.bvh__btn--ghost{color:#fff;border:1.5px solid rgba(255,255,255,.5)}
.bvh__btn--ghost:hover{border-color:#fff;background:rgba(255,255,255,.08)}
.bvh__btn:active{transform:translateY(1px)}
.bvh__next-in{max-width:1200px;margin:0 auto;padding:0 32px;display:grid;grid-template-columns:1fr 400px;gap:56px;align-items:start}
.bvh__proof{padding:40px 0 28px}
.bvh__eyebrow{margin:0 0 18px;font-size:12px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--bvh-mut)}
.bvh__dl{margin:0;display:grid;gap:0}
.bvh__dl div{display:grid;grid-template-columns:170px 1fr;gap:20px;padding:16px 0;border-top:1px solid var(--bvh-line)}
.bvh__dl dt{font-family:'Clash Grotesk',sans-serif;font-weight:600;font-size:22px;line-height:1.1;font-variant-numeric:tabular-nums}
.bvh__dl dd{margin:0;font-size:15px;line-height:1.55;color:var(--bvh-mut)}
.bvh__card{position:relative;z-index:2;margin-top:-250px;background:#fff;border-radius:4px;padding:30px 28px 22px;box-shadow:0 30px 60px -30px rgba(20,18,15,.5)}
.bvh__maat{position:relative;height:18px;margin:0 0 18px;border-left:1.5px solid var(--bvh-ochre);border-right:1.5px solid var(--bvh-ochre)}
.bvh__maat::before{content:"";position:absolute;left:0;right:0;top:50%;border-top:1.5px solid var(--bvh-ochre)}
.bvh__maat span{position:relative;display:table;margin:0 auto;background:#fff;padding:0 8px;font-size:11px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--bvh-ochre2);line-height:18px}
.bvh__ct{font-family:'Clash Grotesk',sans-serif;font-weight:600;font-size:28px;line-height:1.05;margin:0 0 8px}
.bvh__cp{margin:0 0 16px;font-size:15px;line-height:1.5;color:var(--bvh-mut)}
.bvh__lbl{display:block;font-size:13px;font-weight:600;margin:0 0 6px}
.bvh__ta,.bvh__in{width:100%;font:400 15px 'Switzer',sans-serif;color:var(--bvh-ink);background:#faf8f4;border:1.5px solid var(--bvh-line);border-radius:3px;padding:11px 12px;margin:0 0 14px;outline:none;transition:border-color .18s,box-shadow .18s}
.bvh__ta{resize:vertical;line-height:1.45;min-height:76px}
@supports (field-sizing:content){.bvh__ta{field-sizing:content;resize:none;min-height:52px;max-height:150px}}
.bvh__ta:hover,.bvh__in:hover{border-color:#c6bca9}
.bvh__ta:focus-visible,.bvh__in:focus-visible{border-color:var(--bvh-ink);box-shadow:0 0 0 3px rgba(200,150,46,.25)}
.bvh__ta[aria-invalid=true],.bvh__in[aria-invalid=true]{border-color:var(--bvh-err)}
.bvh__msg{margin:-6px 0 12px;font-size:13px;line-height:1.4;min-height:0;color:var(--bvh-err);font-weight:600}
.bvh__msg:empty{display:none}
.bvh__go{width:100%;height:50px;display:flex;align-items:center;justify-content:center;gap:10px;border:0;border-radius:3px;background:var(--bvh-ink);color:#fff;font:600 15px 'Switzer',sans-serif;cursor:pointer;transition:background-color .18s}
.bvh__go:hover{background:#3b3631}
.bvh__go:active{transform:translateY(1px)}
.bvh__go:disabled{background:#8b857c;cursor:progress}
.bvh__spin{display:none;width:16px;height:16px;border:2px solid rgba(255,255,255,.35);border-top-color:#fff;border-radius:50%;animation:bvh-spin .7s linear infinite}
.bvh__go[aria-busy=true] .bvh__spin{display:block}
@keyframes bvh-spin{to{transform:rotate(360deg)}}
.bvh__ok{border-left:3px solid var(--bvh-ok);background:#eef5ef;padding:14px 16px;font-size:15px;line-height:1.5;outline:none}
.bvh__ok b{display:block;font-family:'Clash Grotesk',sans-serif;font-size:19px;margin-bottom:4px;color:var(--bvh-ok)}
.bvh__tel{margin:16px 0 0;padding-top:14px;border-top:1px solid var(--bvh-line);font-size:14px;color:var(--bvh-mut)}
.bvh__tel a{color:var(--bvh-ink);font-weight:600;font-variant-numeric:tabular-nums;text-decoration-color:var(--bvh-ochre);text-underline-offset:3px}
.bvh__tel a:hover{color:var(--bvh-ochre2)}
.bvh__demo{max-width:1200px;margin:0 auto;padding:6px 32px 20px;display:flex;flex-wrap:wrap;gap:6px;align-items:center;font-size:12px;color:var(--bvh-mut)}
.bvh__demo span{font-weight:600;margin-right:4px}
.bvh__demo button{font:500 12px 'Switzer',sans-serif;border:1px solid var(--bvh-line);background:#fff;border-radius:999px;padding:5px 11px;cursor:pointer;color:var(--bvh-ink);transition:border-color .18s}
.bvh__demo button:hover{border-color:var(--bvh-ink)}
@media (max-width:900px){.bvh__hero::after{background:linear-gradient(180deg,rgba(24,22,20,.82) 0%,rgba(24,22,20,.7) 60%,rgba(24,22,20,.5) 100%)}.bvh__hero{min-height:400px}.bvh__hero-in{padding:36px 16px 90px}.bvh__next-in{grid-template-columns:1fr;gap:0;padding:0 16px}.bvh__card{margin-top:-60px;order:-1;padding:24px 20px 18px}.bvh__proof{padding:28px 0 12px}.bvh__dl div{grid-template-columns:1fr;gap:4px}.bvh__demo{padding:6px 16px 18px}}
@media (prefers-reduced-motion:reduce){.bvh *{animation:none!important;transition:none!important}}// Hero met kaart die over de rand valt · NedDev · eigen werk.
// root = het element waarin de HTML staat
function init(root){
var w=root.querySelector('.bvh');if(!w)return;
var f=w.querySelector('.bvh__form'),q=w.querySelector('#bvh-q'),t=w.querySelector('#bvh-t'),msg=w.querySelector('.bvh__msg'),go=w.querySelector('.bvh__go'),gt=w.querySelector('.bvh__go-t'),ok=w.querySelector('.bvh__ok');
var D=['zondag','maandag','dinsdag','woensdag','donderdag','vrijdag','zaterdag'],M=['jan','feb','mrt','apr','mei','jun','jul','aug','sep','okt','nov','dec'];
function bad(el,m){[q,t].forEach(function(x){x.removeAttribute('aria-invalid');});el.setAttribute('aria-invalid','true');msg.textContent=m;el.focus();}
function tel(v){var d=v.replace(/[^0-9+]/g,'').replace(/^\+31/,'0').replace(/^0031/,'0');return /^0[1-9][0-9]{8}$/.test(d)?d:null;}
function day(){var d=new Date();do{d.setDate(d.getDate()+1);}while(d.getDay()===0||d.getDay()===6);return D[d.getDay()]+' '+d.getDate()+' '+M[d.getMonth()];}
function nice(d){return d.slice(0,2)==='06'?d.slice(0,2)+' '+d.slice(2,4)+' '+d.slice(4,6)+' '+d.slice(6,8)+' '+d.slice(8):d.slice(0,3)+' '+d.slice(3,6)+' '+d.slice(6,8)+' '+d.slice(8);}
function send(delay){
msg.textContent='';[q,t].forEach(function(x){x.removeAttribute('aria-invalid');});
if(q.value.trim().length<6){bad(q,'Vertel in een paar woorden wat je wilt verbouwen.');return;}
var n=tel(t.value);if(!n){bad(t,'Dit nummer klopt niet. Gebruik 10 cijfers, bijvoorbeeld 06 12 34 56 78.');return;}
go.disabled=true;go.setAttribute('aria-busy','true');gt.textContent='Versturen';
setTimeout(function(){go.disabled=false;go.removeAttribute('aria-busy');gt.textContent='Bel mij terug';f.hidden=true;
ok.innerHTML='<b>Dank je, het is binnen.</b>Jeroen belt je '+day()+' tussen 9:00 en 12:00 op '+nice(n)+'. Je krijgt ook een bevestiging per sms.';ok.hidden=false;ok.focus();},delay||900);
}
f.addEventListener('submit',function(e){e.preventDefault();send();});
[q,t].forEach(function(x){x.addEventListener('input',function(){if(x.getAttribute('aria-invalid')){x.removeAttribute('aria-invalid');msg.textContent='';}});});
function reset(){f.hidden=false;ok.hidden=true;msg.textContent='';q.value='';t.value='';[q,t].forEach(function(x){x.removeAttribute('aria-invalid');});}
w.querySelector('.bvh__demo').addEventListener('click',function(e){var b=e.target.closest('[data-bvh]');if(!b)return;var k=b.getAttribute('data-bvh');reset();
if(k==='fout'){q.value='Dakkapel aan de voorkant';t.value='06 1234';send();}
if(k==='laden'){q.value='Dakkapel aan de voorkant';t.value='06 12 34 56 78';send(3000);}
if(k==='ok'){q.value='Dakkapel aan de voorkant';t.value='06 12 34 56 78';send(300);}
});
}
init(document.querySelector('.jouw-container'));
More page sections
Seen something you like?
Add it to your selection and send it over. We build your site around it, in your brand.
Get in touch →