Ich habe kürzlich bei The New Tropic eine interessante Variante der Off-Canvas-Navigation gesehen. Es war nicht so sehr der Off-Canvas-Teil. Es war, wie die Elemente innerhalb der Navigation Platz einnahmen. Sie dehnte sich aus, um den verfügbaren Platz zu nutzen, aber sie schrumpfte nie zu stark. Das sind Konzepte, die Flexbox ziemlich einfach umsetzen lässt! Tauchen wir ein wenig ein.
Hier ist die Navigation, ein Video, das zeigt, was ich meine
Mein Lieblingsteil sind die Untermenüs. Wenn ein Untermenü geöffnet wird, gelten die gleichen Regeln. Wenn etwas gedehnt wurde, schrumpfen die Navigationspunkte in der Höhe, um Platz für das Untermenü zu schaffen. Aber sie schrumpfen nie zu stark. Wenn nicht genügend Platz ist, scrollt das Menü einfach.
Standard Zweistufige Navigations-HTML
Ziemlich einfach mit Emmet zu mocken
<nav class="main-nav">
<ul class="nav-list">
<li><a href="">Lorem ipsum.</a></li>
<li>
<button class="submenu-toggle-button">+</button>
<a href="">Explicabo, perspiciatis.</a>
<ul class="submenu nav-list">
<li><a href="">Lorem ipsum.</a></li>
<li><a href="">Culpa, qui!</a></li>
<li><a href="">Repudiandae, eaque.</a></li>
</ul>
</li>
<li><a href="">Sit, dolor.</a></li>
<li><a href="">Dicta, possimus?</a></li>
<!-- etc -->
</ul>
</nav>
Flexbox die Spalte
Stellen wir sicher, dass die Liste so hoch wie das Browserfenster ist, was mit Viewport-Einheiten einfach ist. Dann stellen wir sicher, dass jeder der Listenelemente den Platz ausfüllt
.main-nav > ul {
height: 100vh;
display: flex;
flex-direction: column;
}
.main-nav > ul > li {
flex: 1;
}
Wir sind schon fast am Ziel! Das Dehnen funktioniert hervorragend, nur wenn Platz ist, wie wir es wollen
Schnelle Umschaltungen
Wir haben einen <button> eingefügt, um die Untermenüs umzuschalten (man könnte argumentieren, dass wir diese Buttons wahrscheinlich mit JavaScript platzieren sollten, da sie ohne sie nichts tun). Hier ist, wie sie funktionieren könnten. Die Untermenüs sind standardmäßig versteckt
.submenu {
max-height: 0;
transition: 0.5s;
overflow: hidden;
}
Wir können es mit einer Klasse öffnen
.submenu.open {
max-height: 200px; /* non-ideal magic number */
}
Wir animieren hier auf eine unbekannte Höhe, was schwierig ist. Wir hoffen, bald einen guten Artikel dazu zu haben (es gibt Optionen).
Das Umschalten von Klassen ist einfach genug:
var buttons = document.querySelectorAll('.submenu-toggle-button');
[].forEach.call(buttons, function(button) {
button.addEventListener('click', function() {
var submenu = button.parentNode.querySelector('.submenu');
submenu.classList.toggle('open');
});
});
Das sorgt dafür, dass sich diese Untermenüs so verhalten, wie wir es wollen
Demo
Sie müssen wahrscheinlich zum Pen springen, um mit dem vertikalen Dehnen zu spielen.
Sieh dir den Pen Squeezy Stretchy Nav von Chris Coyier (@chriscoyier) auf CodePen an.
Es ist eine coole Demo dessen, was mit Flex erreicht werden kann, aber die Untermenüs sind in ihrer jetzigen Form tatsächlich unbrauchbar, da sich der Umschaltknopf bewegt, wenn man darauf klickt. Trotzdem cool :)
Ich verstehe, was Sie über das Menü zum Umschalten meinen (manchmal) bewegt sich, wenn Sie ein Untermenü öffnen. Ich bin mir nicht sicher, ob das sie "tatsächlich unbrauchbar" macht.
Ich stimme alxscms zu – sie sind nicht unbrauchbar – aber sie sind schwieriger zu bedienen. Es ist ein wenig schockierend, wie sich auch der Seiteninhalt bewegt (wenn Sie gescrollt haben). Es ist eine wirklich coole Demo dessen, was mit Flexbox gemacht werden kann, aber ich bin mir nicht sicher, was die Benutzerfreundlichkeit angeht.
Tolle Idee! Vielleicht setze ich das ein, wenn ich auf ein Projekt stoße, bei dem es passen könnte.
Ich freue mich wirklich auf Ihren Artikel über die Animation zu einer unbekannten Höhe. Das ist ein Problem, auf das ich mehrmals gestoßen bin und es ist super nervig.
Wenn ich mich richtig erinnere, haben sie in Bootstrap 3 das scrollHeight des Null-Höhe-Containers verwendet. Aber keine reine CSS-Lösung.
Technisch sehr gut, aber ich sehe nicht, wie das Dehnen die Benutzerfreundlichkeit tatsächlich verbessert. Wenn die Menüpunkte hoch genug sind, um sie genau anzuklicken, müssen sie nicht höher sein. Vielleicht könnten sie sich zwischen einer "nutzbaren" Größe und einer "besseren" Größe ausdehnen? Das heißt, eine Obergrenze für das Dehnen haben.
Danke, dass Sie uns zeigen, wie Sie etwas Cooles bauen würden, das Sie im Web gefunden haben! Ich finde, dass das Lesen von Artikeln wie diesen mich zu einem besseren Designer und Coder macht. Dinge auseinanderzunehmen und neu aufzubauen ist der beste Weg, um herauszufinden, wie und warum sie funktionieren – und jedes Mal, wenn ich einen Artikel wie diesen lese, wachse ich! Danke, dass Sie diese coole Navigation gefunden und sich die Zeit genommen haben, uns zu zeigen, wie wir unsere eigene machen können. Ich finde das AWESOME!
Das funktioniert gut in Chrome, aber das Zurückschrumpfen funktioniert nicht in Safari 10.0.3.
Ich habe die Ursache nicht untersucht, aber ich habe festgestellt, dass Safari bei kaskadierenden Flexboxen manchmal etwas zickig ist – es könnte also damit zusammenhängen.
c