Ich habe vor einiger Zeit eine E-Mail von Dirk Tucholski erhalten, der mir eine Website namens FLOWmarket gezeigt hat. Er fragte sich, wie das Menüsystem funktionierte. Ich fand es raffiniert und beschloss, es so zu bauen, wie ich es tun würde. Die Idee ist, dass es ein langes vertikales Menü von Links gibt, von denen nicht alle sichtbar sind. Wenn Sie Ihre Maus nach oben und unten über den sichtbaren Bereich bewegen, scrollt das Menü selbst, um weitere Menüpunkte anzuzeigen und den Link hervorzuheben, über dem sich die Maus gerade befindet.

Demo ansehen Dateien herunterladen
HTML
Ein typisches Menü
<div id="menu">
<ul>
<li><a href="#">Nature</a></li>
<li><a href="#">Receivability</a></li>
<li><a href="#">Alone time</a></li>
<!-- etc -->
</ul>
</div>
Starter CSS
Wir setzen eine feste Höhe, also stellen wir sicher, dass der `overflow`-Wert vorerst auf `overflow: auto;` gesetzt ist. So wird das Menü gescrollt und ist unabhängig von JavaScript zugänglich. Ansonsten nur grundlegendes Styling.
#menu {
height: 360px;
overflow: auto;
}
#menu ul {
list-style: none;
}
#menu a {
text-decoration: none;
display: block;
color: black;
}
Starter JavaScript
Die Idee ist hier, darauf zu warten, dass über die Menülinks gefahren wird, und entsprechend zu reagieren. Wir wenden eine Hover-Klasse für das Styling an, bewegen dann ein inneres Div (das wir anhängen werden) nach oben oder unten, um den Effekt zu erzielen. Aber wie weit nach oben oder unten? Dafür müssen wir genau wissen, über welchen Link wir fahren. Ein höher positionierter Link (weiter unten in der Liste) muss die Liste weiter scrollen als ein tiefer positionierter Link. Wir nehmen diese Position und wenden einen Geschwindigkeitsmultiplikator an, um die Distanz zu erhalten, um die wir verschieben. Um die Position zu erhalten, werden wir einfach durch sie iterieren und ein Datenattribut anwenden.
$("#menu").css("overflow", "hidden").wrapInner("<div id='mover' />");
var $el,
speed = 13.5, // needs to be manually tinkered with
items = $("#menu a");
items
.each(function(i) {
$(this).attr("data-pos", i);
})
.hover(function() {
$el = $(this);
$el.addClass("hover");
$("#mover").css("top", -($el.data("pos") * speed - 40));
// 40 is the top padding for the fadeout
}, function() {
$(this).removeClass("hover");
});
Beachten Sie, dass Sie auf HTML5-Datenattribute (z. B. `<div data-pos=1>`) wie `$("div").data("pos");` zugreifen können, was prägnant und cool ist.
Ausblendungen
Wenn Sie die Demo in einem WebKit-Browser betrachten, sehen Sie, wie das Menü oben und unten beim Scrollen ausblendet. Das habe ich einfach erreicht, indem ich :before und :after Pseudoelemente verwendet habe, die oben und unten am Menü absolut positioniert sind und weiße zu transparente Farbverläufe haben.
#menu:before {
content: " ";
position: absolute;
top: 0;
left: 0;
height: 50px;
width: 100%;
z-index: 2;
background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255,255,255,100)),color-stop(1, rgba(255,255,255,0)));
}
#menu:after {
content: " ";
position: absolute;
bottom: 0;
left: 0;
height: 50px;
width: 100%;
z-index: 2;
background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255,255,255,0)),color-stop(1, rgba(255,255,255,100))); }
Verwenden Sie bei Bedarf andere Browser-Präfixe.
Dieses „Geschwindigkeits“-Geschäft
Die Menge, um die das Menü pro Menüpunkt verschoben wird, wird von einem Geschwindigkeitsmultiplikator beeinflusst. Sie sehen in der obigen JavaScript-Datei, dass dieser auf einen eher willkürlich aussehenden Wert von 13,5 gesetzt ist. Ich habe eine Weile damit verbracht, eine mathematische Methode zu finden, um den perfekten Geschwindigkeitsmultiplikator basierend auf der Anzahl der Menüpunkte und Höhen usw. zu berechnen, aber nichts Gutes gefunden. Wenn Ihnen etwas einfällt, lassen Sie es mich wissen. Es wäre definitiv besser, diesen Multiplikator nicht jedes Mal anpassen zu müssen, wenn sich das Menü ändert.
Tastaturnavigation
Dieses Menü ist bei der aktuellen Geschwindigkeit etwas schwierig, um einen bestimmten Menüpunkt präzise auszuwählen. Um dies zu unterstützen, können wir eine kleine Tastaturnavigation hinzufügen. Dies geschieht, indem wir auf `keydown`-Ereignisse auf dem `document` lauschen und eine Funktion auslösen. Um das Umschreiben von Code zu reduzieren, verfolgen wir einfach den aktuell aktiven Menüpunkt, passen ihn je nachdem, ob die Pfeiltaste nach oben oder unten gedrückt wurde, nach oben oder unten an, und lösen dann die `mouseenter`- oder `mouseleave`-Ereignisse entsprechend aus, die bereits eingerichtet sind, um die Menüfunktionalität zu handhaben.
$(document).keydown(function(event) {
cur = $(".hover").attr("data-pos");
// Down arrow
if (event.keyCode == 40) {
$("[data-pos=" + cur + "]").trigger("mouseleave");
if (cur != max) { cur++; }
$("[data-pos=" + cur + "]").trigger("mouseenter");
}
// Up arrow
if (event.keyCode == 38) {
$("[data-pos=" + cur + "]").trigger("mouseleave");
if (cur > 0) { cur--; }
$("[data-pos=" + cur + "]").trigger("mouseenter");
}
});
Die einzigen Teile, die hier nicht gezeigt werden, sind, wo wir die Variable `cur` einrichten und sie in der Hover-Funktion setzen, aber all das ist in der Live-Demo vorhanden.
Demo ansehen Dateien herunterladen
Rabble rabble usability!
Der Kern dieser Idee, ein Menü schneller zu scrollen, als ein Benutzer es erwarten würde, ist schlecht für die Benutzerfreundlichkeit. Es ist schwieriger, den genauen Link, den man ansteuern möchte, auszuwählen, wegen der ungewohnten und empfindlichen Bewegung. Mir ist das bewusst. Die Tastaturnavigation hilft da etwas, aber das ist auch potenziell eine ungewohnte Idee.
Dies ist keine Lösung für jedes lange Menü der Welt (siehe auch hier). Dies ist eher ein lustiger Effekt. Vielleicht für eine Website, bei der das Menü nicht allzu wichtig ist. Vielleicht als Möglichkeit, ein Gedicht darzustellen. Es ist eine nette Erfahrung, es zu benutzen, also wenn diese Erfahrung wirklich für die Website funktioniert, ist vielleicht ein kleiner Zugeständnis an die Zugänglichkeit in Ordnung. Ich finde die FLOWmarket-Website, von der dies stammt, großartig.
Das sieht ziemlich cool aus, Chris. Ich stimme dir zu, dass es definitiv einige Usability-Bedenken gibt, aber alles in allem ist es eine ziemlich gute Technik.
Vielen Dank fürs Teilen!
Spaßig!
Angenommen, Sie hätten eine alphabetische Liste (offensichtlich nicht in diesem Beispiel, aber...), könnten Sie einige der Usability-Probleme durch Hinzufügen einer Alphabet-Verknüpfung daneben, wie bei der Kontaktliste auf dem iPhone, beheben?
Ich weiß nicht, wie es bei anderen ist, aber diese Seite läuft bei mir wie eine vollständige Krücke, stürzt den Browser fast ab. Deine Demo funktioniert aber gut.
Es sieht sehr schön aus, aber die Benutzerfreundlichkeit ist schlecht :)
Ziemlich nett, aber es ist ein bisschen ... schnell?
Sieht aus wie eine schlanke Version dieser Navigation
http://www.queness.com/resources/html/scrollmenu/index.html
Ich werde versuchen, diese zu mischen, um es sanfter zu machen.
Danke trotzdem : >
Wie üblich ein toller Effekt.
Entschuldigung für meine dumme Frage, aber ist es möglich, diesen Effekt nur mit CSS3-Übergängen zu erzielen?
Danke Chris!
Ich kann mir im Moment keine Möglichkeit vorstellen.
Danke für deine Antwort, Chris.
Meiner Meinung nach ist es unmöglich, dies ohne die Verwendung von dynamischen Variablen wie Mausposition usw. zu erreichen. (Sie könnten versuchen, die "Expressions" von IE zu verwenden ;-) )
Das Nächstliegende, das ich einem Nicht-JS-Ansatz nahekam, war die Vergrößerung des gehoverten Elements und seines direkten Nachbarn.
li {
font-size:1em;
-webkit-transition:all .2s
}
li:hover {
font-size:2em
}
li:hover + li {
font-size:1.5em
}
‘”–>window.location=’http://www.google.com’
Das ist eine interessante Funktion. Ich bin bei weitem kein JS-Guru, aber ich bin überrascht, dass es keine Möglichkeit gibt, das Scrollen auf diese Weise zu verlangsamen.
Heute habe ich deine Seite mit FF 3.6.13 angesehen und als ich die "Tastaturnavigation" betrachte, erhalte ich einige seltsame Ergebnisse. Es scheint 2, 3 und manchmal sogar 4 Elemente in der Liste auszuwählen, wenn man sich mit den Pfeiltasten bewegt.
Ich bin weiterhin erfreut und erstaunt über die Hilfe, die Sie hier leisten. Machen Sie weiter so im neuen Jahr!
Ich hatte das gleiche Problem mit der Tastaturnavigation, und es wäre schön, wenn sich die Höhe von #mover automatisch an Ränder, Zeilenhöhe und Geschwindigkeit anpassen würde.
Meiner Meinung nach funktioniert das hier viel besser und wird bei deaktiviertem JavaScript zu manuellen Scrollbalken (für diejenigen unter Ihnen mit Usability-Bedenken)
http://valums.com/files/2009/vertical-menu/final.htm
Ich schätze die Tatsache, dass dies ein neuartiger Artikel im Bereich CSS ist. Aber ist es nicht wichtig, den Leuten beizubringen, Dinge unter Beachtung von Best Practices zu erstellen?
Ach ja, schöner Beitrag trotzdem, Chris, trotz der Usability-Probleme habe ich mehrere gute Techniken zum Anwenden gefunden.
Vielen Dank.
Eines der Details, das mir am Original gefällt und hier nicht wiederzufinden ist, ist die Möglichkeit, nicht nur zum rechten Rand der Liste zu hovern, sondern auch zum linken Rand der Liste, und dass es ebenfalls scrollt.
Ein WebKit-Punkt: Angenommen, man hat ungefähr die Hälfte der Liste gescrollt, die Maus verlässt den Listenbereich, kehrt dann von oben zurück – zu diesem Zeitpunkt kann ich aufgrund des überlagernden "Fade" die ersten paar Elemente weder hovern noch anklicken.
Wirklich schön, Frohes Neues Jahr, Chris!
Das ist Mist. Absoluter nutzloser Mist.
Das hat deine Mama gestern Abend nicht gesagt
Ich weiß nichts über das Menü... vielleicht weniger Elemente und es etwas verlangsamen.
Aber was für eine clevere Seite!!
Danke für die Idee und dafür, dass du etwas außerhalb der "Dose" geteilt hast.
Ich bin mir nicht sicher, wie sehr die Leute wirklich in eine Diskussion darüber einsteigen wollen. Aber ich möchte darauf hinweisen, dass es ein Fehler ist, die Benutzerfreundlichkeit einer Idee aufgrund ihrer Implementierung zu verwerfen. Denken Sie daran, einen Knopf zu klein zu machen oder viele unterscheidbare Bereiche eines Layouts zu haben: Keines davon macht die Idee eines Knopfes oder Layouts zu einem Usability-Problem, sondern ihre Implementierung wird zum Problem. Wie andere bereits angemerkt haben, können Geschwindigkeit, Affordanzen usw. angepasst werden, um dies aus Usability-Sicht zu einer sehr praktikablen Lösung zu machen.
Ich bin da leider nicht ganz überzeugt, sobald sich die Augen auf die Option fixieren, die man anklicken möchte, bewegt man die Maus, um dorthin zu gelangen, und sie beginnt sich zu bewegen, doch das Auge kann ihrer Bewegung nicht leicht folgen, es sei denn, man bewegt sich langsam, es braucht etwas Gewöhnung, wenn man versucht, es wirklich zu benutzen.
Toller Artikel. Entschuldigen Sie, dass ich pingelig bin, aber "succicient" ist kein echtes Wort. Ich denke, Sie meinten "succinct". :)
Danke für die Korrektur. Ich werde diesen Kommentar verbergen, da er jetzt irrelevant ist.
bezüglich: Geschwindigkeit und Präzision der Bewegungen...
Könnten Sie einen größeren Rand zu den `<li>` über und unter dem aktiven Element hinzufügen? Das könnte die Fehlertoleranz etwas erhöhen, wenn man versucht, nur ein oder zwei Elemente zu scrollen.
Das Menü ist cool, aber ich stimme zu, dass es zu schnell ist. Vielleicht hat es andere Verwendungszwecke als Menüs. Ich werde darüber nachdenken.
Viel, viel zu empfindlich und nervös. Es springt zwei oder drei Elemente auf einmal und ist extrem schwer zu bedienen. Allerdings weiß ich nicht genug über den Code, nehme ich an, um herauszufinden, warum oder wie man es anpassen kann, damit es benutzbar wird.
Das `html`-Element hat in allen hier zitierten Beispielen eine Höhe von 100%. Das funktioniert in diesem Fall gut, aber es treten Probleme auf, wenn diese Scroll-Liste in einem längeren Dokument verwendet wird. Die Liste scrollt nicht bis zum Ende. Ich konnte es in Webkit lösen, aber in FF hat es nicht funktioniert.
Es ist etwas irritierend, einen bestimmten Menülink auf der theflowmarket-Website auszuwählen. Und es scheint rutschig zu sein... Ich weiß nicht, was Sie denken
Ein Wort: unbenutzbar
Rabble rabble!
Ja, lies den ganzen Artikel, bevor du jemanden angreifst!
Ich finde es urkomisch, dass fast jeder Kommentar im Grunde Usability-Bashing betreibt. Abgesehen davon, dass Chris darauf hingewiesen hat, dass er es bereits weiß, ist es überraschend, dass nur wenige erkennen, wie raffiniert ein Designelement dies sein könnte.
Die Grundidee – dem Element, das den Fokus des Benutzers hat, einen "Herausstellungs"-Stil zu geben, ohne es von seinem Platz im Inhalt zu trennen – hat ein großes Usability-Potenzial. Es ist ein textliches Äquivalent zu den Apple-Style-Menüs ( Ding am unteren Rand ), und die scheinen alle zu lieben.
Nein, es ist kein fertiges Produkt und noch nicht wirklich einsatzbereit. (Es ist jedoch ziemlich nah an der ursprünglichen Implementierung – jedes Bashing sollte in Richtung FLOWmarket gerichtet sein (sie können es ab, sie haben viel "Courage to Fail").) Ich denke wirklich, es verdient Entwicklung. Ich werde es mir ansehen. Ich bin immer wegen cooler Ideen hierher gekommen, anstatt nach Plug-and-Play-Sachen (obwohl ich beides reichlich gefunden habe – danke, Chris!).
Sehr nicht benutzerfreundlich
Würde nicht etwas wie das besser funktionieren?
http://www.philosophydesign.com/examples/scroll.html
In diesem Beispiel prüfe ich, wo sich die Maus gerade in der Navigation befindet, und bewege die Position der Navigation basierend darauf. Ich habe noch keine der schicken Stile hinzugefügt, aber schon jetzt scheint es mir viel einfacher zu sein, das Menüelement auszuwählen, das ich möchte. Außerdem können Sie mehr oder weniger Menüelemente zum Menü hinzufügen, ohne Variablen in der JS ändern zu müssen.
Was denkst du?
Ziemlich süßes Menü, das andere Problem ist die mobile Usability... das Ding wäre meiner Meinung nach auf einem Mobiltelefon ziemlich unmöglich zu benutzen.
Obwohl ich kein großer Fan von minimalistischem Design bin, gefiel mir die Idee dieses Menüs. Ich bin mir nicht sicher, ob es SEO-freundlich ist, wegen der verwendeten Skripte... Ich habe Ihre Seite als Lesezeichen gespeichert, es ist schön, ein paar Tricks von Ihnen zu lernen :)
gutes Teilen.
Es ist sehr gutes Teilen