Zwevende contactkaart met gezicht New
Small bottom-right card with a real staff member photo, availability and WhatsApp and Call buttons. Appears once per session after a short pause (once the block is in view), closes with the X button or Esc and collapses to a round photo button. The choice is stored in sessionStorage (try/catch, works without it). Entry uses @starting-style and transition-behavior: allow-discrete; unsupported browsers show the card without animation.
Utrecht-West · zonder verwijzing
Rug, knie of schouder? Meestal binnen 2 werkdagen op de behandeltafel.
Zes fysiotherapeuten, waarvan twee sportfysio en een manueel therapeut. Vergoed vanuit je aanvullende verzekering.

Twijfel je of fysio iets voor je klacht is? App me, ik reageer meestal binnen een uur.
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.
<!-- Zwevende contactkaart met gezicht · NedDev · eigen werk. -->
<div class="jouw-container">
<div class="fyk">
<div class="fyk__page">
<div class="fyk__bar"><span class="fyk__logo"><svg viewBox="0 0 28 28" aria-hidden="true"><circle cx="14" cy="14" r="13" fill="#1f3b2d"/><path d="M9 20c2-6 4-9 10-11M11 8.5c1.6 0 2.8 1.2 2.8 2.8" fill="none" stroke="#e7efe4" stroke-width="2" stroke-linecap="round"/></svg>Fysio Lombok</span><span class="fyk__links"><a href="#">Klachten</a><a href="#">Behandelingen</a><a href="#">Vergoedingen</a><a href="#">Team</a></span><a class="fyk__cta" href="#">Afspraak maken</a></div>
<div class="fyk__hero">
<div class="fyk__txt">
<p class="fyk__kick">Utrecht-West · zonder verwijzing</p>
<h2 class="fyk__h">Rug, knie of schouder? Meestal binnen 2 werkdagen op de behandeltafel.</h2>
<p class="fyk__lead">Zes fysiotherapeuten, waarvan twee sportfysio en een manueel therapeut. Vergoed vanuit je aanvullende verzekering.</p>
<ul class="fyk__chips"><li><a href="#">Lage rugpijn</a></li><li><a href="#">Knieblessure</a></li><li><a href="#">Nek en schouder</a></li><li><a href="#">Na een operatie</a></li><li><a href="#">Hardloopblessure</a></li></ul>
</div>
<img class="fyk__img" src="https://neddev.com/lab-media/contactkaart-gezicht-2.webp" alt="Fysiotherapeut begeleidt een knieoefening op de behandelbank" loading="lazy">
</div>
</div>
<div class="fyk__card" role="complementary" aria-label="Vraag het een fysiotherapeut" hidden>
<button class="fyk__x" type="button" aria-label="Kaart sluiten"><svg viewBox="0 0 20 20" aria-hidden="true"><path d="M5 5l10 10M15 5L5 15"/></svg></button>
<div class="fyk__who"><img src="https://neddev.com/lab-media/contactkaart-gezicht-1.webp" alt="" width="56" height="56"><div><b>Sanne de Wit</b><span>Fysiotherapeut, 11 jaar in de praktijk</span><em class="fyk__on"><i aria-hidden="true"></i><span class="fyk__on-t">Nu bereikbaar</span></em></div></div>
<p class="fyk__msg">Twijfel je of fysio iets voor je klacht is? App me, ik reageer meestal binnen een uur.</p>
<div class="fyk__btns"><a class="fyk__b fyk__b--wa" href="#">WhatsApp Sanne</a><a class="fyk__b fyk__b--tel" href="tel:+31302012488">030 201 24 88</a></div>
</div>
<button class="fyk__mini" type="button" aria-label="Open de contactkaart van Sanne" aria-expanded="false" hidden><img src="https://neddev.com/lab-media/contactkaart-gezicht-1.webp" alt=""><i aria-hidden="true"></i></button>
<div class="fyk__demo"><span>Demo</span><button type="button" data-fyk="reset">Wis sessie en toon opnieuw</button><span class="fyk__state" aria-live="polite"></span></div>
</div>
</div>/* Zwevende contactkaart met gezicht · NedDev · eigen werk. */
/* fonts (Fontshare): plus-jakarta-sans@400,500,600,700 */
.fyk{--fyk-forest:#1f3b2d;--fyk-sage:#e7efe4;--fyk-sage2:#d3e0cf;--fyk-ink:#18241d;--fyk-mut:#56635b;--fyk-line:#dfe6dc;--fyk-wa:#1b7a44;position:relative;background:#fbfcfa;color:var(--fyk-ink);font-family:'Plus Jakarta Sans',sans-serif;box-sizing:border-box;min-height:560px;overflow:hidden}
.fyk *,.fyk *::before,.fyk *::after{box-sizing:border-box}
.fyk a:focus-visible,.fyk button:focus-visible{outline:2px solid #c46a2c;outline-offset:2px}
.fyk__bar{max-width:1200px;margin:0 auto;padding:16px 32px;display:flex;align-items:center;gap:28px;border-bottom:1px solid var(--fyk-line)}
.fyk__logo{display:flex;align-items:center;gap:9px;font-weight:700;font-size:17px;margin-right:auto;white-space:nowrap}
.fyk__logo svg{width:28px;height:28px}
.fyk__links{display:flex;gap:22px}
.fyk__links a{color:var(--fyk-ink);text-decoration:none;font-size:14.5px;font-weight:500}
.fyk__links a:hover{color:var(--fyk-forest);text-decoration:underline;text-underline-offset:4px}
.fyk__cta{background:var(--fyk-forest);color:#fff;text-decoration:none;font-weight:600;font-size:14px;padding:10px 16px;border-radius:999px;transition:background-color .18s}
.fyk__cta:hover{background:#2c5440}
.fyk__hero{max-width:1200px;margin:0 auto;padding:40px 32px 90px;display:grid;grid-template-columns:1fr 1fr;gap:44px;align-items:center}
.fyk__kick{margin:0 0 12px;font-size:13px;font-weight:600;color:var(--fyk-forest)}
.fyk__h{font-weight:700;font-size:clamp(28px,3.2vw,40px);line-height:1.1;letter-spacing:-.02em;margin:0 0 14px}
.fyk__lead{margin:0 0 20px;font-size:16px;line-height:1.6;color:var(--fyk-mut)}
.fyk__chips{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:8px}
.fyk__chips a{display:block;padding:8px 13px;border-radius:999px;background:var(--fyk-sage);color:var(--fyk-ink);text-decoration:none;font-size:14px;font-weight:500;transition:background-color .18s}
.fyk__chips a:hover{background:var(--fyk-sage2)}
.fyk__img{width:100%;aspect-ratio:4/3;object-fit:cover;border-radius:20px;display:block}
.fyk__card{position:absolute;right:24px;bottom:24px;z-index:5;width:330px;background:#fff;border-radius:16px;padding:16px;box-shadow:0 24px 50px -18px rgba(24,36,29,.4),0 0 0 1px rgba(24,36,29,.06);opacity:1;translate:0 0;transition:opacity .32s ease,translate .32s cubic-bezier(.2,.7,.2,1),display .32s allow-discrete}
.fyk__card[hidden]{display:none;opacity:0;translate:0 14px}
@starting-style{.fyk__card{opacity:0;translate:0 14px}}
.fyk__x{position:absolute;top:8px;right:8px;width:32px;height:32px;display:grid;place-items:center;border:0;background:transparent;border-radius:50%;cursor:pointer;color:var(--fyk-mut);transition:background-color .16s,color .16s}
.fyk__x:hover{background:var(--fyk-sage);color:var(--fyk-ink)}
.fyk__x svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round}
.fyk__who{display:flex;gap:12px;align-items:center;padding-right:28px}
.fyk__who img{width:56px;height:56px;border-radius:50%;object-fit:cover;flex:none}
.fyk__who b{display:block;font-size:15px}
.fyk__who span{display:block;font-size:12.5px;color:var(--fyk-mut);line-height:1.35}
.fyk__on{display:flex!important;align-items:center;gap:6px;font-style:normal;margin-top:3px}
.fyk__on i{width:8px;height:8px;border-radius:50%;background:#2f9e5c}
.fyk__on.is-off i{background:#a3aaa5}
.fyk__on .fyk__on-t{font-size:12px;font-weight:600;color:#23744a}
.fyk__on.is-off .fyk__on-t{color:var(--fyk-mut)}
.fyk__msg{margin:12px 0;font-size:14px;line-height:1.5}
.fyk__btns{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.fyk__b{display:flex;align-items:center;justify-content:center;height:42px;border-radius:999px;text-decoration:none;font-weight:600;font-size:14px;transition:background-color .16s,border-color .16s}
.fyk__b--wa{background:var(--fyk-wa);color:#fff}
.fyk__b--wa:hover{background:#156638}
.fyk__b--tel{border:1.5px solid var(--fyk-line);color:var(--fyk-ink);font-variant-numeric:tabular-nums}
.fyk__b--tel:hover{border-color:var(--fyk-ink)}
.fyk__b:active{transform:translateY(1px)}
.fyk__mini{position:absolute;right:24px;bottom:24px;z-index:5;width:60px;height:60px;padding:0;border:3px solid #fff;border-radius:50%;background:#fff;box-shadow:0 12px 30px -10px rgba(24,36,29,.5);cursor:pointer;transition:transform .18s}
.fyk__mini:hover{transform:translateY(-2px)}
.fyk__mini img{width:100%;height:100%;object-fit:cover;border-radius:50%;display:block}
.fyk__mini i{position:absolute;right:0;bottom:2px;width:13px;height:13px;border-radius:50%;background:#2f9e5c;border:2px solid #fff}
.fyk__demo{position:absolute;left:32px;bottom:20px;display:flex;flex-wrap:wrap;gap:8px;align-items:center;font-size:12px;color:var(--fyk-mut)}
.fyk__demo>span:first-child{font-weight:700}
.fyk__demo button{font:500 12px 'Plus Jakarta Sans',sans-serif;border:1px solid var(--fyk-line);background:#fff;border-radius:999px;padding:5px 11px;cursor:pointer;color:var(--fyk-ink)}
.fyk__demo button:hover{border-color:var(--fyk-ink)}
@media (max-width:900px){.fyk__links{display:none}.fyk__bar{padding:12px 16px}.fyk__hero{grid-template-columns:1fr;padding:22px 16px 230px;gap:18px}.fyk__img{aspect-ratio:16/9}.fyk__demo{left:auto;right:auto;bottom:auto;top:auto;position:relative;padding:0 80px 0 0;margin:-210px 16px 0}}
@media (max-width:560px){.fyk__card{left:12px;right:12px;bottom:12px;width:auto}.fyk__mini{right:14px;bottom:14px}.fyk__demo{margin-top:-200px}}
@media (prefers-reduced-motion:reduce){.fyk *{animation:none!important;transition:none!important}}// Zwevende contactkaart met gezicht · NedDev · eigen werk.
// root = het element waarin de HTML staat
function init(root){
var w=root.querySelector('.fyk');if(!w)return;
var card=w.querySelector('.fyk__card'),mini=w.querySelector('.fyk__mini'),x=w.querySelector('.fyk__x'),stEl=w.querySelector('.fyk__state'),on=w.querySelector('.fyk__on'),onT=w.querySelector('.fyk__on-t'),KEY='fyk-kaart';
function get(){try{return sessionStorage.getItem(KEY);}catch(e){return null;}}
function put(v){try{if(v)sessionStorage.setItem(KEY,v);else sessionStorage.removeItem(KEY);}catch(e){}}
var d=new Date(),h=d.getHours(),wd=d.getDay(),open=wd>0&&wd<6&&h>=8&&h<20;
if(!open){on.classList.add('is-off');onT.textContent='Reageert morgen vanaf 8:00';}
w.querySelector('.fyk__b--wa').href='https://wa.me/31302012488?text='+encodeURIComponent('Hoi Sanne, ik heb een vraag over mijn klacht:');
function show(focus){card.hidden=false;mini.hidden=true;mini.setAttribute('aria-expanded','true');if(focus)x.focus();}
function hide(focus){card.hidden=true;mini.hidden=false;mini.setAttribute('aria-expanded','false');put('dicht');stEl.textContent='Gesloten, onthouden voor deze sessie';if(focus)mini.focus();}
x.addEventListener('click',function(){hide(true);});
mini.addEventListener('click',function(){show(true);stEl.textContent='';});
card.addEventListener('keydown',function(e){if(e.key==='Escape')hide(true);});
w.querySelector('[data-fyk=reset]').addEventListener('click',function(){put(null);card.hidden=true;mini.hidden=true;stEl.textContent='Sessie gewist, kaart komt over 1 seconde';setTimeout(function(){show(false);stEl.textContent='';},1000);});
if(get()==='dicht'){mini.hidden=false;stEl.textContent='Eerder gesloten in deze sessie';}
else{var started=false;var go=function(){if(started)return;started=true;setTimeout(function(){if(get()!=='dicht')show(false);},1200);};
if('IntersectionObserver' in window){var io=new IntersectionObserver(function(en){if(en[0].isIntersecting){go();io.disconnect();}},{threshold:.4});io.observe(w);}else go();}
}
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 →