Ich hatte neulich einen **sehr peinlichen** CSS-Moment.
Ich arbeitete am Frontend-Code eines Designs, das eine schmale Seitenleiste mit Symbolen hatte. Dort ist nicht genug Platz, um Text anzuzeigen, der die Symbole erklärt. Die Idee ist, dass wir zugänglichen (aber standardmäßig visuell versteckten) Text verwenden, der bereits vorhanden ist, als Tooltip bei einem „langen Hover“. Das heißt, bei einem Gerät mit einem Cursor, der über dem Element verweilt, zum Beispiel drei Sekunden lang.
Daher dachte ich mir Folgendes...
- Ich kann den Zustand verwenden: Der Tooltip ist entweder sichtbar oder nicht sichtbar. Ich werde den Zustand verwalten, der sich im DOM als Klassenname auf einem HTML-Element manifestiert.
- Dann kümmere ich mich um die Logik zur Änderung dieses Zustands.
- Der Standardzustand ist nicht sichtbar, aber wenn die Maus länger als drei Sekunden über dem Element verweilt, schalte ich den Zustand auf sichtbar.
- Wenn die Maus das Element jemals verlässt, bleibt der Zustand (oder wird) nicht sichtbar.
Dies war ein React-Projekt, daher war der Zustand einfach im Hinterkopf. Das Ergebnis sah dann so aus
Nicht schlecht, oder? Naja. Die Zustandsverwaltung in JavaScript eröffnet zwar potenziell einige Möglichkeiten, aber in diesem Fall war es völlig übertrieben. Abgesehen davon, dass ich mouseenter und mouseleave etwas heikel finde, hätte CSS das Ganze auch mit weniger Code erledigen können.
Das ist der peinliche Teil… warum sollte ich auf eine JavaScript-Bibliothek zurückgreifen, um das zu tun, wenn das CSS, das ich bereits schreibe, es erledigen kann?
Ich lasse die UI in React, aber reiße das gesamte Zustandsverwaltungszeug heraus. Alles, was ich tun werde, ist, ein transition-delay: 3s hinzuzufügen, wenn das .icon :hover ist, sodass es null Sekunden dauert, wenn es nicht angefahren wird, und dann sofort verschwindet, wenn der Mauszeiger wegfährt).
Ein langes Hovern ist im Grunde eine Einzeiler-Lösung in CSS
.thing {
transition: 0.2s;
}
.thing:hover {
transition-delay: 3s; /* delay hover animation only ON, not OFF */
}
Funktioniert großartig.
Ein Problem, das hier nicht angesprochen wird, ist das Problem mit Touchscreens. Man könnte argumentieren, dass Screenreader mit dem zugänglichen Text zurechtkommen und Desktop-Browser wegen der benutzerdefinierten Tooltips, aber Benutzer mit reinen Touchscreens könnten die Icon-Beschriftungen möglicherweise nicht entdecken. In meinem Fall baute ich für ein Szenario mit großen Bildschirmen, das Cursor annimmt, aber ich glaube nicht, dass es für Touchscreens hoffnungslos ist. Wenn das Element ein Link ist, wird der :hover möglicherweise ohnehin beim ersten Tippen ausgelöst. Wenn der Link Sie irgendwohin mit einem klaren Titel führt, reicht das vielleicht als Kontext. Und Sie können immer wieder zu mehr JavaScript zurückkehren und Touch-Events behandeln.
Wenn Sie sich nicht um die Formatierung kümmern würden, könnten Sie dann nicht einfach das
title-Attribut verwenden?Ja, das könnten Sie. Keine Stilkontrolle, wie Sie erwähnten, ODER Zeitsteuerung. Und es löst auch keine Barrierefreiheitsprobleme oder Touchscreen-Probleme.
Danke Chris, ich nahm an, dass es aufgrund seines Alters in HTML für Screenreader und Touch-Geräte zugänglich war. Legen Sie das unter „Heute habe ich gelernt…“ ab.
Zur Information, das
title-Attribut ist zugänglich; tatsächlich bildet es den „zugänglichen Namen“ eines Elements, auf dem das Attribut erscheint, es sei denn, es gibt andere Attribute (aria-labeloderaria-labelledby), die es überschreiben.Ich glaube, Chris meinte vielleicht ein anderes Barrierefreiheitsproblem (vielleicht fehlende Hover-Unterstützung auf bestimmten Browser-Geräten?).
Es ist seltsam, wie wir dazu neigen, Dinge zu überdenken, je mehr Wissen wir erwerben.
CSS ist von Grund auf einfach und doch knifflig, aber JS ist der Hype, warum also nicht dafür entscheiden, oder?
Ich habe einige JS-Entwicklerfreunde, die vom Backend kamen und die Macht von CSS völlig verabscheuen. Auf der anderen Seite ist CSS für mich als Frontend-Entwickler, der im visuellen Design geboren wurde, wie mein Frühstück. Wir hatten in letzter Zeit einige produktive Gespräche über CSS x JS.
Am Ende des Tages müssen wir es einfach halten :)
Danke für die Reflexion, Chris
Ich habe über den Hover-Zustand auf einem Touch-Gerät nachgedacht und kam zu folgendem Ergebnis: https://codepen.io/petergoes/pen/BaQezGm
I
* habe den Div in einen Button geändert
* role=”presentational” hinzugefügt
* die :hover CSS dupliziert und zu :active hinzugefügt
* die Übergangsverzögerung entfernt
Auf diese Weise kann ein Touch-Gerät den Tooltip anzeigen, wenn der Button gedrückt wird.
Es ist nicht perfekt, aber vielleicht ein Schritt in die richtige Richtung?
Ich wollte schon seit einiger Zeit ein solches Hover-Feature erstellen, habe aber nie wirklich herausgefunden, wie. Danke dafür!
Vielleicht den Hover-Code wrappen in
@media (hover: hover) {
}
So werden Touch-Geräte nicht beeinträchtigt
Es ist leicht, die Grundlagen zu vergessen. Ich stelle fest, dass die Teilnahme an einem Forum zu einem Thema oft von großem Nutzen für mich ist, da ich immer wieder Anfängerfragen beantworte und sie so frisch im Gedächtnis behalte.
Das ist die „React-Epidemie“, niemand will CSS lernen und die Community ermutigt es nicht, tatsächlich wird es durch die ständige Unterstützung von Styling-Alternativen über JSX entmutigt. Infolgedessen schreiben wir Code, der jedes Mal langsamer wird. Die Globalisierung des Codings ist groß, aber wir machen einen noch größeren Rückschritt.
Jedes Mal, wenn Sie so etwas sehen
link
Wir schreiben nicht nur 3 unnötige Komponenten, die initialisiert werden müssen und dutzende Funktionen im Hintergrund ausführen, sondern wir tun der Programmier-Community auch einen Bärendienst, indem wir vorschlagen, dass dies eine akzeptable Lösung wäre, wenn es eine perfekte CSS-Lösung gäbe, die vielleicht 5 Eigenschaften und praktisch null Overhead beinhaltet, aber leider sind die Leute zu faul/ängstlich, sie zu lernen.
Der Link dort drüben sollte gewesen sein
Ich habe ein winziges Skript (und CSS) geschrieben, das „title“-Attribute in schönere Tooltips umwandelt und auch benutzerdefinierte Verzögerungen unterstützt
https://github.com/yairEO/title-tooltip
Diese Lösung wurde entwickelt, um unabhängig von Frameworks oder anderen Dingen zu funktionieren. Importieren Sie einfach das Skript und CSS und vergessen Sie es :)
Sie können es in Aktion auf einer Website sehen, die ich kürzlich erstellt habe, für die ich dieses Skript gerade erstellt und dann Open-Source habe
https://future-fortune.com