Angenommen, Sie haben fünf Schaltflächen. Jede Schaltfläche ist ein Schritt. Wenn Sie auf die vierte Schaltfläche klicken, befinden Sie sich bei Schritt 4 von 5 und möchten dies anzeigen.
Diese Art von Zählung und Anzeige könnte hartkodiert sein, aber das macht keinen Spaß. JavaScript könnte diese Aufgabe ebenfalls erledigen. Aber CSS? Hmmmm. Kann es das? CSS hat Zähler, also können wir sicherlich die Anzahl der Buttons zählen. Aber wie berechnen wir nur bis zu einem bestimmten Button? Es stellt sich heraus, dass es gemacht werden kann.
HTML
Es müssen keine Buttons sein; es müssen nur Geschwisterelemente sein, die wir zählen können. Aber wir werden hier Buttons verwenden
<div class="steps">
<button class="active">Shop</button>
<button>Cart</button>
<button>Shipping</button>
<button>Checkout</button>
<button>Thank You</button>
<div class="message"></div>
</div>
Das leere .message Div dort wird der Ort sein, an dem wir unsere Schritt-Nachrichten mit CSS-Inhalt ausgeben.
CSS
Der Trick ist, dass wir tatsächlich drei Zähler verwenden werden
- Eine Gesamtzahl aller Buttons
- Eine Zählung des aktuellen Schritts
- Eine Zählung, wie viele Schritte nach dem aktuellen Schritt verbleiben
.steps {
counter-reset:
currentStep 0
remainder 0
totalStep 0;
}
Jetzt machen wir die Zählung. Das Zählen aller Buttons ist unkompliziert
button {
counter-increment: totalStep;
}
Als Nächstes brauchen wir etwas anderes zum Zählen, das auch die Buttons zählt. Wir können ein Pseudoelement verwenden, dessen einziger Zweck es ist, Buttons zu zählen
button::before {
content: "";
counter-increment: currentStep;
}
Der Trick ist, das Zählen dieses Pseudoelements für alle Elemente nach dem aktiven Element zu stoppen. Wenn wir eine .active Klasse verwenden, die so aussieht
button.active ~ button::before {
/* prevents currentStep from being incremented! */
counter-increment: remainder;
}
Wir zählen hier den remainder (Rest), was auch nützlich sein könnte, aber weil wir nur den Rest inkrementieren, bedeutet das, dass wir den currentStep (aktueller Schritt) Zähler nicht zählen. Raffiniert, raffiniert.
Dann können wir die Zähler verwenden, um unsere Nachrichten auszugeben
message::before {
content: "Step: " counter(currentStep) " / " counter(totalStep);
}
Hier ist es!
Es gibt ein wenig JavaScript, damit Sie mit dem Verschieben des aktiven Zustands des Buttons spielen können, aber die Zählung und die Nachrichten sind komplett CSS.
Vielleicht ist das verrückt, aber könnte man hier „ Elemente und den `:checked`-Pseudoselektor-Trick anstelle des Aktualisierens der `active`-Klasse verwenden? Vielleicht wird das zu unklar, da man bereits mit Geschwisterselektoren arbeitet. Mein Gehirn schmerzt...
Danke.
Ich verstehe nicht, warum „counter-increment: currentStep;“ für das Pseudoelement „before“ einzeln funktioniert und nicht wie ein kumulativer Zähler wie bei einem „button“-Element.
Grüße
Vielleicht Radio-Buttons und :checked anstelle der aktiven Klasse verwenden, um es vollständig in CSS zu machen? Ich habe es nicht ausprobiert. Guter Trick!
Hallo Chris,
Die Verwendung von Radio-Buttons anstelle von Buttons ermöglicht es, dies nur mit CSS zu tun (kein JS erforderlich).
Ich verstehe, dass dies eine Demo ist und in Wirklichkeit diese Buttons Links oder Umschalter sein könnten. Ein Screenreader-Benutzer wird wahrscheinlich `Tab` verwenden, um durch die Steuerelemente zu navigieren, und wird die sichtbaren Zähleränderungen nicht sehen. Aber mit
aria-currentkönnen Sie den aktuellen Schritt programmatisch an sie übermitteln und ihn anstelle einer Klasse zur Zuweisung von Stilen verwenden. Wenn Ihr programmatischer Zustand nicht übereinstimmt, wird dies für den Entwickler visuell erkennbar sein.Ich habe mir dasselbe gedacht, dass CSS-generierter Inhalt, entweder :before oder :after, nur für dekorative Zwecke verwendet werden darf. Dies ist eine Verletzung, da assistierende Technologien möglicherweise nicht auf den mit CSS eingefügten Inhalt zugreifen können. Daher müssen wir einige Ideen hinzufügen, um die Benutzer darüber zu informieren, was vor sich geht.
Hallo Adrian,
Bekommen wir das nicht „for free“ (kostenlos), wenn wir Radio-Buttons anstelle von Buttons verwenden?
Ist es nicht besser, Markup zu verwenden, das kein ARIA benötigt (noch mehr, wenn diese Attribute auf JavaScript angewiesen sind)?
@Martin, alle modernen Browser (und IE11 oder sogar zurück bis IE9) geben CSS-generierten Inhalt / Pseudo-Inhalt (
::beforeund::after) an assistierende Technologien weiter. Sie sind nur zusätzliche Textknoten / Blätter in der Zugänglichkeitsstruktur.@Thierry, im ursprünglichen Beispiel scheinen die
<button>s dazu bestimmt zu sein, den Benutzer durch Ansichten zu navigieren. Die Verwendung von Radio-Buttons zur Navigation von Benutzern durch einen Ablauf wäre ein Missbrauch, da sie für die Dateneingabe gedacht sind.Das Ändern des Bildschirms beim Auswählen eines Radio-Buttons wäre ebenfalls eine 3.2.2 On Input WCAG-Verletzung. Wenn überhaupt, könnte es sich lohnen, die Buttons mit
aria-pressedzu aktualisieren, um sie in Schalter zu verwandeln (was ich in meinem Kommentar bemerkt habe), aber für den Kontext der Demo sind einfache<button>s in Ordnung.Ich habe meine von oben geforkt und
aria-pressedgesetzt; sie ist ausführlicher und passt daher möglicherweise nicht für alle Anwendungsfälle.@Adrian
Guter Punkt bezüglich des „Navigierens von Benutzern durch einen Ablauf“; ich hatte es zuerst nicht so gesehen.