Menu met Meer-knop (priority+) Nieuw
Priority+ navigatie: zoveel menu-items als passen blijven in de balk, de rest schuift in een uitklapmenu achter "Meer" met het aantal erbij. De volgorde blijft gelijk, dus de belangrijkste links staan vooraan. Een ResizeObserver meet de echte breedte; met de schuif zie je items één voor één verhuizen. Het Meer-menu werkt met pijltjes en Esc. Beter dan een hamburger op tablets en smalle laptops, omdat de belangrijkste keuzes zichtbaar blijven.
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.
<!-- Menu met Meer-knop (priority+) · NedDev · eigen werk. -->
<div class="jouw-container">
<div class="mmp">
<label class="mmp__ctl"><span>Schermbreedte</span><input class="mmp__range" type="range" min="60" max="100" value="100" aria-valuetext="100 procent"></label>
<div class="mmp__frame">
<header class="mmp__bar">
<a class="mmp__logo" href="#mmp">Fysio Oost</a>
<nav class="mmp__nav" aria-label="Hoofdmenu">
<ul class="mmp__list">
<li><a href="#mmp-1">Afspraak</a></li>
<li><a href="#mmp-2">Behandelingen</a></li>
<li><a href="#mmp-3">Tarieven</a></li>
<li><a href="#mmp-4">Team</a></li>
<li><a href="#mmp-5">Locaties</a></li>
<li><a href="#mmp-6">Vacatures</a></li>
<li><a href="#mmp-7">Contact</a></li>
</ul>
<div class="mmp__more" hidden>
<button class="mmp__btn" type="button" aria-expanded="false" aria-controls="mmp-drop"><span class="mmp__bl">Meer</span><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M4 6l4 4 4-4"/></svg></button>
<ul class="mmp__drop" id="mmp-drop" hidden></ul>
</div>
</nav>
</header>
<p class="mmp__note"></p>
</div>
</div>
</div>/* Menu met Meer-knop (priority+) · NedDev · eigen werk. */
.mmp{position:absolute;inset:0;display:flex;flex-direction:column;gap:10px;padding:12px 14px;background:#f4f3f1;color:#0a0a0a;font-family:'Switzer',sans-serif;text-align:left;overflow:hidden}
.mmp *,.mmp *::before,.mmp *::after{box-sizing:border-box}
.mmp__ctl{display:flex;align-items:center;gap:10px;font:500 13px/1 'Switzer',sans-serif;color:#3a3733}
.mmp__range{flex:1;max-width:220px;height:24px;margin:0;accent-color:#F5480F;cursor:pointer}
.mmp__range:focus-visible{outline:2px solid #F5480F;outline-offset:2px}
.mmp__frame{position:relative;width:100%;min-width:min(230px,100%);flex:1;min-height:0;background:#fff;border:1px solid rgba(10,10,10,.12);border-radius:8px}
.mmp__bar{display:flex;align-items:center;gap:12px;height:50px;padding:0 10px 0 14px;border-bottom:1px solid rgba(10,10,10,.08)}
.mmp__logo{flex:none;font:700 15px/1 'Switzer',sans-serif;color:#0a0a0a;text-decoration:none;white-space:nowrap;padding:5px 0}
.mmp__nav{flex:1;min-width:0;display:flex;align-items:center;justify-content:flex-end}
.mmp__list{display:flex;margin:0;padding:0;list-style:none;overflow:hidden;min-width:0}
.mmp__list li{flex:none}
.mmp__list li[hidden]{display:none}
.mmp__list a{display:flex;align-items:center;min-height:30px;padding:0 8px;border-radius:4px;color:#3a3733;text-decoration:none;font:500 13px/1 'Switzer',sans-serif;white-space:nowrap}
.mmp__list a:hover{background:#f4f3f1;color:#0a0a0a}
.mmp a:focus-visible,.mmp__btn:focus-visible{outline:2px solid #F5480F;outline-offset:2px}
.mmp__list li.is-new{animation:mmpBack .3s ease}
@keyframes mmpBack{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
.mmp__more{position:relative;flex:none}
.mmp__more[hidden]{display:none}
.mmp__btn{display:flex;align-items:center;gap:4px;min-height:30px;margin:0;padding:0 9px;border:1px solid #0a0a0a;border-radius:4px;background:#fff;color:#0a0a0a;font:600 13px/1 'Switzer',sans-serif;cursor:pointer;white-space:nowrap}
.mmp__btn svg{width:12px;height:12px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;transition:transform .2s}
.mmp__btn[aria-expanded="true"]{background:#0a0a0a;color:#fff}
.mmp__btn[aria-expanded="true"] svg{transform:rotate(180deg)}
.mmp__drop{position:absolute;right:0;top:calc(100% + 6px);z-index:3;min-width:160px;max-height:150px;overflow:auto;margin:0;padding:4px;list-style:none;background:#fff;border:1px solid rgba(10,10,10,.14);border-radius:8px;box-shadow:0 14px 30px -12px rgba(10,10,10,.35);animation:mmpIn .14s ease-out}
.mmp__drop[hidden]{display:none}
@keyframes mmpIn{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
.mmp__drop a{display:flex;align-items:center;min-height:30px;padding:4px 10px;border-radius:4px;color:#0a0a0a;text-decoration:none;font:400 14px/1.1 'Switzer',sans-serif}
.mmp__drop a:hover,.mmp__drop a:focus{background:#f4f3f1;outline:none}
.mmp__drop a:focus-visible{box-shadow:inset 0 0 0 2px #F5480F}
.mmp__note{margin:0;padding:12px 14px;font:400 13px/1.4 'Switzer',sans-serif;color:#57534e}
@media (prefers-reduced-motion:reduce){.mmp__list li.is-new,.mmp__drop{animation:none}.mmp__btn svg{transition:none}}// Menu met Meer-knop (priority+) · NedDev · eigen werk.
// root = het element waarin de HTML staat
function init(root){
var w=root.querySelector('.mmp');if(!w)return;
var frame=w.querySelector('.mmp__frame'),nav=w.querySelector('.mmp__nav'),items=[].slice.call(w.querySelectorAll('.mmp__list li')),moreW=w.querySelector('.mmp__more'),btn=w.querySelector('.mmp__btn'),bl=w.querySelector('.mmp__bl'),drop=w.querySelector('.mmp__drop'),note=w.querySelector('.mmp__note'),range=w.querySelector('.mmp__range');
var widths=[],moreWidth=0,lastN=-1;
function measure(){items.forEach(function(li){li.hidden=false;});moreW.hidden=false;bl.textContent='Meer (7)';widths=items.map(function(li){return li.getBoundingClientRect().width;});moreWidth=moreW.getBoundingClientRect().width+6;}
function closeD(back){if(drop.hidden)return;drop.hidden=true;btn.setAttribute('aria-expanded','false');if(back)btn.focus();}
function layout(){if(!widths.length||!widths[0])measure();var room=nav.clientWidth,total=widths.reduce(function(a,b){return a+b;},0),n=items.length;
if(total>room){var used=moreWidth;n=0;while(n<items.length&&used+widths[n]<=room){used+=widths[n];n++;}}
if(n===lastN)return;var grew=n>lastN&&lastN>=0;
items.forEach(function(li,i){var hid=i>=n;if(!hid&&li.hidden&&grew)li.classList.add('is-new');else li.classList.remove('is-new');li.hidden=hid;});
var rest=items.slice(n);moreW.hidden=!rest.length;bl.textContent='Meer ('+rest.length+')';btn.setAttribute('aria-label','Meer menu-items, '+rest.length+' verborgen');
var was=!drop.hidden;drop.innerHTML=rest.map(function(li){return li.outerHTML.replace(' hidden=""','').replace(' class="is-new"','');}).join('');if(!rest.length)closeD(false);else if(was)drop.hidden=false;
note.textContent=n===items.length?'Alle 7 menu-items passen in de balk.':n+' van de 7 items '+(n===1?'staat':'staan')+' in de balk, '+rest.length+' achter Meer.';lastN=n;}
measure();lastN=-1;layout();
if(document.fonts&&document.fonts.ready)document.fonts.ready.then(function(){measure();lastN=-1;layout();});
if('ResizeObserver' in window)new ResizeObserver(function(){layout();}).observe(nav);
range.addEventListener('input',function(){frame.style.width=range.value+'%';range.setAttribute('aria-valuetext',range.value+' procent');});
btn.addEventListener('click',function(){if(drop.hidden){drop.hidden=false;btn.setAttribute('aria-expanded','true');var room=w.getBoundingClientRect().bottom-drop.getBoundingClientRect().top-8;drop.style.maxHeight=Math.max(64,room)+'px';var a=drop.querySelector('a');if(a)a.focus();}else closeD(true);});
btn.addEventListener('keydown',function(e){if(e.key==='ArrowDown'&&drop.hidden){e.preventDefault();btn.click();}});
drop.addEventListener('keydown',function(e){var ls=[].slice.call(drop.querySelectorAll('a')),i=ls.indexOf(document.activeElement);if(e.key==='ArrowDown'){e.preventDefault();(ls[i+1]||ls[0]).focus();}else if(e.key==='ArrowUp'){e.preventDefault();(ls[i-1]||ls[ls.length-1]).focus();}else if(e.key==='Escape'){e.preventDefault();closeD(true);}else if(e.key==='Home'){e.preventDefault();ls[0].focus();}else if(e.key==='End'){e.preventDefault();ls[ls.length-1].focus();}});
drop.addEventListener('focusout',function(e){if(!moreW.contains(e.relatedTarget))closeD(false);});
w.addEventListener('click',function(e){var a=e.target.closest('a');if(!a)return;e.preventDefault();if(drop.contains(a))closeD(true);});
document.addEventListener('pointerdown',function(e){if(!drop.hidden&&!moreW.contains(e.target))closeD(false);});
}
init(document.querySelector('.jouw-container'));
Meer uit navigatie & menu's
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 →