Sternbewertungen sind eines dieser klassischen UX-Muster, mit denen jeder schon einmal herumgespielt hat. Ich hatte die Idee, den UX-Teil mit sehr wenig Code und ohne JavaScript zu erledigen.

Die Markup-Datei verwendet die Unicode-Entität für einen Stern (☆) direkt darin. Wenn Sie eine UTF-8-Zeichensatz haben, sollte das kein Problem sein. Alternativ könnten Sie ☆ verwenden (Rechner für diese Art von Dingen). Sie könnten so viele Sterne verwenden, wie Sie möchten
<div class="rating">
<span>☆</span><span>☆</span><span>☆</span><span>☆</span><span>☆</span>
</div>
Jetzt müssen wir den „hohlen“ Stern durch einen „soliden“ Stern beim Hovern ersetzen (Galerie zum Finden solcher Zeichen). Einfach, legen Sie ein Pseudo-Element eines soliden Sterns (★) darüber, wenn Sie mit der Maus darüber fahren (`:hover`)
.rating > span:hover:before {
content: "\2605";
position: absolute;
}
Allein durch die Tatsache, dass es absolut positioniert ist, sind top: 0; left: 0; impliziert (in modernen Browsern jedenfalls). Der solide Stern sitzt also direkt über dem hohlen Stern. Sie könnten sogar die Farbe oder Größe ändern, wenn Sie möchten.
Aber was wir bisher haben, funktioniert nur für einzelne Sterne. Das UX-Muster verlangt, dass alle Sterne gefüllt sind. Zum Beispiel, wenn wir über den 4. Stern fahren, wird der 4. Stern solide, aber auch der 1., 2. und 3.
Über CSS kann kein *vorheriges* Kindelement ausgewählt werden. Es gibt jedoch eine Möglichkeit, *nachfolgende* Kindelemente auszuwählen, über die benachbarten oder allgemeinen Geschwisterkombinatoren. Wenn wir die Reihenfolge der Zeichen buchstäblich umkehren, können wir den allgemeinen Geschwisterkombinator verwenden, um alle Sterne auszuwählen, die visuell *vor* dem Stern erscheinen, über den gehovert wird, aber im HTML *nach* dem Stern, über den gehovert wird.
.rating {
unicode-bidi: bidi-override;
direction: rtl;
}
.rating > span:hover:before,
.rating > span:hover ~ span:before {
content: "\2605";
position: absolute;
}
Das ist alles! Das gesamte Sternbewertungs-UX-Muster mit sehr wenig Code. Hier ist der gesamte CSS-Code, um es zum Laufen zu bringen
.rating {
unicode-bidi: bidi-override;
direction: rtl;
}
.rating > span {
display: inline-block;
position: relative;
width: 1.1em;
}
.rating > span:hover:before,
.rating > span:hover ~ span:before {
content: "\2605";
position: absolute;
}
Und hier ist ein Dabblet, wenn Sie damit herumspielen möchten.
Tatsächliche Verwendung
Wahrscheinlich wird bei Bewertungssternen sowieso JavaScript beteiligt sein. Wenn ein Benutzer auf einen Stern klickt, wird die Bewertung per Ajax zurückgemeldet und das Widget selbst erhält eine Klasse, um die ausgewählte Anzahl von Sternen dauerhaft anzuzeigen. Da bereits JavaScript beteiligt ist, wäre es dann in Ordnung, es zum Umschalten von Klassen auf den Sternen zu verwenden, um sie funktionsfähig zu machen? Wenn Ihre Anwendung absolut auf JavaScript angewiesen ist, dann ist das in Ordnung. Wenn Sie daran interessiert sind, eine Website zu erstellen, die auch ohne JavaScript funktioniert, dann benötigen diese Sternbewertungen mehr Arbeit. Sie sollten sich Leas Verous Beispiel ansehen, das Radio-Buttons verwendet, was Teil eines Formulars sein könnte, das eingereicht werden kann, um zu „bewerten“, was auch immer es ist, ohne JavaScript.
Andere
Nachdem dies auf Twitter geteilt wurde, haben sich ein paar andere Leute auf leicht unterschiedliche Weise daran versucht. @dmfilipenkos Dabblet. @mproganos Dabblet
teilweise kaputt in Safari 5.1.2: http://cl.ly/DqpH
Hmm…
https://img.skitch.com/20120202-tdahxwtcyf1fdag65uwh2iybmd.jpg
Außerdem denke ich, es ist semantisch besser, oder?
<ul>, entschuldigung
Für dieses spezielle Problem stellt sich heraus, dass es am besten ist, zumindest
left: 0;für den absolut positionierten gefüllten Stern zu verwenden.Und ich würde nein zu einer ungeordneten Liste sagen. Wenn überhaupt, dann eine geordnete, aber ich würde sagen, es sind nur ein paar Sterne, auf die man klicken kann, es ist keine „Liste“.
Ich liebe diese Idee!
Wenn es nach mir ginge, würde ich „cursor:pointer“ zum :hover-Zustand hinzufügen.
Ja, das wäre großartig!
Es ist tatsächlich ein paar Pixel daneben in Chrome (Mac) auch.
Schöner Artikel. Das ist sehr gut, diesen nützlichen Beitrag zu teilen. Danke fürs Teilen.
Ich glaube, es funktioniert nicht mit Mobile Safari per Touch, wie es bei mir funktioniert
Es ist eine großartige Technik, aber ich habe auch diesen Pixel-Offset in Firefox 10 auf OS X.
Dasselbe hier. Ich benutze Firefox 10 unter Ubuntu (Linux)
FYI:
top: 0; left: 0;sind *nie* impliziert. Wenn ein Element absolut positioniert ist, aber eine horizontale oder vertikale Position nicht angegeben ist, nimmt das Element die horizontale oder vertikale Position ein, die es hätte, wenn das Element statisch positioniert wäre (d. h. im Fluss).Das ist bei *allen* aktuellen Browsern der Fall. (Es funktioniert auch für alte IE-Versionen, aber nicht vollständig: alte IE-Versionen haben Probleme mit absolut positionierten Inline-Elementen.)
Siehe auch: CSS 2.1: Details zum visuellen Formatierungsmodell – 10.6.4 : Absolut positionierte, nicht ersetzte Elemente
Erweitert, um transparente Radio-Buttons zu verwenden, um den Zustand zu erfassen und zu erhalten, ohne JavaScript zu benötigen
http://dabblet.com/gist/1709019
Ich habe das nur in Chrome getestet, aber betrachten Sie es als Proof-of-Concept. Wird wahrscheinlich etwas JavaScript für ältere Browser benötigen, aber es ist ein Anfang.
Ich habe es gerade in Firefox 9 getestet und es funktioniert dort auch perfekt. Hat es jemand woanders getestet?
Sie müssen es als neues Dabblet speichern
Ah – ich habe es geschafft, die falsche URL zu kopieren. Ich habe es als neues Dabblet gespeichert
http://dabblet.com/gist/1722368
Guter Tipp! Aber weißt du, warum die Sterne in Chrome unter Windows so hässlich sind?
Wie mache ich einen halben Stern aktiv? Wenn ich 3,5 Sterne geben möchte?
ein Geschenk ;)
Unicode-Symbolkarten-Bookmarklet ähnlich wie „Copypaste“
http://panmental.de/symbols/info.htm
Jemand erwähnte Semantik früher, und das wird IMO nur semantisch, wenn es beteiligt ist.
Ansonsten ist das großartig, wenn Sie keine Sternenbehandlung außerhalb dessen benötigen, was eine verfügbare Schriftart bietet!
ugh.. wenn <select> beteiligt ist
sieht für mich aus wie fünf Quadrate. Chrome 15
Dies wäre der perfekte Anwendungsfall für das noch nicht verfügbare
:nth-letter(n)anstelle all dieser Spans.Wenn Sie Quadrate sehen, bedeutet dies, dass die Systemschriftart, die in Ihrem Browser gerendert wird, die Glyphen an diesen Code-Punkten, die im Artikel erwähnt werden, nicht unterstützt.
Ich bin relativ neu in der Webentwicklung und habe Schwierigkeiten zu verstehen, warum es wichtig ist, JavaScript mit CSS zu vermeiden. Laufen Benutzer mit deaktiviertem JavaScript im Browser? Das erscheint mir sehr unwahrscheinlich, aber auch hier bin ich unerfahren in diesem Bereich.
Ich werde es auf meiner Seite verwenden. Danke!
Das wäre sehr einfach mit SVG.
Wie das?
Es gibt keinen Grund, die Richtung nach RTL umzukehren.
Siehe dieses Dabblet.
Könnten Sie bitte erklären, wie Sie Chris' Beispiel replizieren konnten, ohne die Richtung nach „Rechts nach Links“ umzukehren? Ich habe das Dabblet gelesen, aber ich verstehe nicht ganz, was Sie dort getan haben, Kumpel.
Schöne Lösung ohne RTL!
Das einzige Problem ist, dass, da .rating ein Blockelement ist, das Überfahren eines Teils des DIVs, der kein Stern ist (z. B. Wenn Sie Ihre Maus vertikal auf gleicher Höhe mit den Sternen, aber am weitesten linken Rand der Seite positionieren), dazu führt, dass alle Sterne golden werden.
Toller Artikel. Diese sind gut zum Experimentieren, aber ich bleibe bei den jQuery-Versionen.
Wenn das Ziel lediglich minimales CSS ist, könnten Sie den .rating-Selektor und dessen Elemente entfernen und float: right zu jedem span hinzufügen. Eine andere Möglichkeit, die Reihenfolge umzudrehen. Ein Nebeneffekt ist, dass Sie die Zentrierung verlieren würden….
Schöne Technik!
Respekt Chris, du bist so verdammt kreativ mit CSS. Auf diese Lösung wäre ich nie gekommen.
Allerdings, wie in den Kommentaren erwähnt. Gibt es keine Browserkompatibilitätsprobleme, wenn Sie das Unicode-Symbol für einen Stern verwenden, anstatt ein Bild zu verwenden?
– Rick
Es ist ein wenig störend, dass der Cursor beim Überfahren der Sterne zwischen Text und Zeiger flackert (ich benutze Chrome). Vielleicht jede mit einem DIV umschließen und den Cursor auf etwas Konsistentes setzen?
Es funktioniert nicht unter Windows XP. Es funktioniert jedoch unter Windows Vista und Windows 7, da diese größere / aktuellere Zeichensätze haben.
Danke für die fantastischen Beiträge, sehr informativ und sehr nützlich für uns. Danke fürs Teilen, machen Sie weiter so.
Sehr gut..
Vielen Dank
Hallo,
Ich sehe keine Sterne. :)
Schön! Das ist wirklich leichtgewichtig!
Ich mag es, ich versuche es zu benutzen.
danke
Hier ist meine Implementierung: http://pressedweb.com/sandbox/star_ratings
Alles CSS. Speichert Zustände. Fällt bis IE6 zurück. Fügen Sie problemlos beliebig viele oder wenige Sterne hinzu, wie Sie möchten.
Das ist eine nette Verwendung von :target. Eine Sache, die man beachten sollte, die mich immer wieder beißt, wenn ich etwas Cooles funktionsbezogenes mit :target machen will, ist, dass man das Springen der Seite verhindern kann, wenn sich der URL-Hash ändert, nur mit CSS (zumindest soweit ich weiß). Wenn also genug Seiteninhalt vorhanden ist, so dass die Seite scrollt, springt die Seite beim Klicken, so dass der Stern bündig am oberen Rand liegt.
Wenn ich versuche, Klick-/Toggle-Funktionalität über CSS zu implementieren, bin ich ein größerer Fan des Checkbox/Radio-Button-Hacks. Lea Verou benutzt es: http://lea.verou.me/2011/08/accessible-star-rating-widget-with-pure-css/
Und ich würde ihres nicht mal als Hack bezeichnen, da die Auswahl von Sternen im Grunde das ist, was Radio-Buttons tun.
Ah, verdammt. Sie haben absolut Recht. Danke, dass Sie mich daran erinnern. Ich merke nicht, dass es zu diesem Seitenanker springt, wenn ich es teste, ohne dass es von Inhalt umgeben ist.
Ihre Lösung ist gut für die Zukunft (besonders sobald IE9/10 den Leuten aufgezwungen werden), aber der Fallback in 8 und darunter sind hässliche Radio-Buttons und ein Text-Label.
Es scheint, dass ihre Lösung + die Verwendung eines Bildes im Label + das Maskieren des Radio-Buttons mit dem Label + das Verknüpfen des Labels mit dem Radio-Button = Lösung. Ich bin mir zu 99% sicher, dass das die beste Lösung wäre und mit etwas Positionierungs-Feinabstimmung für IE6+ würde es zu einem Standard werden.
Sehr coole Technik, die wir auf unserer Website verwenden können. Danke!
Ich hätte nie an so etwas gedacht – tolle Lösung dafür!
Habe meine eigenen kleinen Mods unter http://dabblet.com/gist/1817473 vorgenommen, die hauptsächlich aus einigen Designänderungen (anfangs Punkte statt Sterne) und auch der Entfernung von „unicode-bidi“ bestehen, da ich keine Ahnung habe, was es tut.
Diese Tricks sind sehr gut, ich benutze sie auf meiner Website, danke, dass Sie sie mit uns teilen
es unterstützt nicht für ie6, richtig? denn auf meinem PC, ich habe es in ie6 getestet, aber es hat versagt. Welche Version des IE-Browsers kann verwendet werden?
Coole Idee, aber die Zugänglichkeit ist etwas eingeschränkt. Screenreader werden nicht sagen: Bewertung 4 Sterne, sondern: Stern Stern Stern Stern hohler Stern (wenn sie überhaupt wissen, wie sie mit dem Unterschied zwischen verschiedenen Sternzeichen umgehen sollen, was ich bezweifle). Bots können damit auch nichts anfangen. Und für menschliche Besucher, können Sie sicher sein, dass diese Sterne immer noch Sinn ergeben, auch wenn ihr Layout kaputt geht, z. B. wenn CSS ausgeschaltet ist oder der Bildschirm sehr klein ist?
Ich bevorzuge das alte Muster, Zahlen für die Bewertung zu verwenden und sie dann im laufenden Betrieb durch die richtige Anzahl von Sternen zu ersetzen, und das ist mit Hintergrundbildern einfacher zu machen.
Eine weitere Alternative zu Radio-Buttons ist einfach ein Anker auf jedem Stern, der eine Query-String-Variable für PHP enthält, um die Bewertung in der Datenbank zu speichern. Tatsächlich denke ich, dass Anker anstelle von Spans verwendet werden sollten und JavaScript das Standard-Klickereignis verhindern kann.
Wie vergrößere ich den Stern? Ich habe es mit
<h1>versucht, aber es macht einen Zeilenumbruch. Bitte vorschlagenSie können die Schriftgröße in der .rating-Klasse angeben
Wie bekomme ich einen roten Stern??
fügen Sie einfach ein Farbattribut zu .rating > span:hover:before, .rating > span:hover ~ span:before hinzu
Wie wäre es damit, Radio-Buttons in Labels zu legen: http://codepen.io/thelucid/pen/JacHC
Ich verstehe es immer noch nicht
Wie kann ich die Farbe im Stern ändern?
Wie kann ich die Farbe im Stern ändern?