Die Spezifikation hört bewusst auf, bevor sie den Implementierungen (Browsern) vorschreibt, wie die Benutzeroberfläche zu handhaben ist. In diesem Artikel befassen wir uns speziell mit <input type="number">, und Sie werden vielleicht überrascht sein zu erfahren, dass die Spezifikation explizit besagt
Diese Spezifikation legt keine Benutzeroberfläche fest, die von den User Agents verwendet werden soll.
Sie erklärt weiter, dass verschiedene Sprachen, Kulturen und Regionen gute Gründe haben können, numerische Eingaben unterschiedlich zu behandeln. Daher sind die Browser hier auf sich allein gestellt, und vielleicht, wie nicht überraschend, gibt es recht viele unterschiedliche Ansätze für die Benutzeroberfläche. Lassen Sie uns einen Blick darauf werfen.
Der Markup
<form>
<label for="age">Enter your age</label>
<input type="number" id="age" name="age">
</form>
Dies erzeugt ein einfaches Formular mit einem einzigen Eingabefeld, das numerische Werte akzeptiert. Ich habe für die folgenden Demos etwas CSS für die Darstellung hinzugefügt, aber dies ist der grundlegende HTML-Markup, den wir uns ansehen.
Wie Internet Explorer damit umgeht

Internet Explorer bietet die einfachste Standarddarstellung unter den Desktop-Browsern. Das Eingabefeld sieht aus wie jedes andere Formularfeld, das Text akzeptiert. Tatsächlich trifft IE keinerlei Benutzeroberflächenentscheidungen für uns, außer der Möglichkeit, das Eingabefeld zu leeren, sobald etwas eingegeben wurde. Das ist eine praktische kleine Funktion, die andere Browser nicht bieten (obwohl sie manchmal bei type="search" Eingabefeldern zu sehen ist).
Wie Firefox damit umgeht

Firefox führt eine Benutzeroberfläche ein, die IE nicht hat: Spinner-Steuerelemente. Diese Steuerelemente enthalten Pfeile nach oben und unten, die den numerischen Wert des Feldes beim Klicken erhöhen bzw. verringern.
Das Entfernen der Steuerelemente kann mit etwas CSS mithilfe der appearance-Eigenschaft erreicht werden
/* Remove controls from Firefox */
input[type=number] {
-moz-appearance: textfield;
}
Während dies die Steuerelemente gut entfernt, scheinen wir keine Kontrolle über deren Design zu haben.
Wie Safari damit umgeht

Firefox und Safari ähneln sich in ihrer Behandlung numerischer Eingaben. Beide enthalten Spinner-Steuerelemente und beide verzichten auf die in IE gesehene Löschfunktion.
Wir können die Steuerelemente auch aus Safari entfernen, aber anders als bei Firefox, indem wir eine Methode verwenden, die den Shadow DOM anspricht
/* Remove controls from Safari and Chrome */
input[type=number]::-webkit-inner-spin-button,
input[type=number]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0; /* Removes leftover margin */
}
Ein weiteres Element, das wir im Shadow DOM gestalten können, ist die unsichtbare Box um die Zahl
/* Adds a box around the numeric value in Safari and Chrome */
input[type=number]::-webkit-textfield-decoration-container {
border: 1px #ccc solid;
background: #efefef;
}
Kann nützlich sein oder auch nicht. So oder so, es ist schön, in Safari (und Chrome) etwas mehr Designflexibilität zu haben als das, was wir bisher gesehen haben.
Wie Chrome damit umgeht

Chrome liegt irgendwie im Mittelfeld. Auf den ersten Blick sehen wir ein einfaches Formularfeld. Dann, sobald der Cursor über das Feld bewegt wird, werden die gleichen Steuerelemente wie in Firefox und Safari angezeigt.
Auch hier ist es interessant und erwähnenswert, dass Firefox, Safari, Chrome und Opera entschieden haben, dass Mengensteuerungen einen ausreichenden Nutzen für die Benutzererfahrung bieten, um sie einzubauen, wo IE sie weggelassen hat. Andererseits geht Chrome den Mittelweg, indem es die Steuerelemente beim Hovern anzeigt, anstatt sie standardmäßig anzuzeigen.
Was ist, wenn wir möchten, dass Firefox sich wie Chrome verhält und die Steuerelemente beim Hovern anzeigt? Wir können die Steuerelemente wie zuvor aus Firefox entfernen und sie dann auf :hover und :focus neu anwenden
/* Remove controls from Firefox */
input[type=number] {
-moz-appearance: textfield;
}
/* Re-applies the controls on :hover and :focus */
input[type="number"]:hover,
input[type="number"]:focus {
-moz-appearance: number-input;
}
Während Chrome und Safari vielleicht nicht so ähnlich sind, wie wir erwarten, teilen sie die Möglichkeit, das Eingabefeld mithilfe der Shadow DOM-Elemente zu gestalten und zu manipulieren. Tatsächlich gelten die gleichen Techniken, die im Safari-Abschnitt behandelt werden, auch für Chrome.
Wie Opera damit umgeht
Opera verhält sich bei numerischen Eingaben genau wie Chrome. Das sollte keine Überraschung sein, da Opera dieselbe Blink-Rendering-Engine wie Chrome übernimmt. Das bedeutet, dass dieselben CSS-Tricks zum Ausblenden und Gestalten der Eingabe in Safari und Chrome auch hier bei Opera angewendet werden können.
Da Opera erst vor kurzem auf Blink aktualisiert hat, ist es interessant zu sehen, wie seine letzte Version vor dem Update, Opera 12, mit numerischen Eingaben umgeht.

Der Unterschied hier ist, wie die Steuerelemente außerhalb des Eingabefeldes schweben. Wo Firefox, Safari, Chrome und das neueste Opera die Steuerelemente direkt im Eingabefeld platzieren, hat Opera 12 sie komplett außerhalb des Feldes. Noch bemerkenswerter ist, wie Opera entschieden hat, Rahmen um die Steuerelemente zu setzen. Dies erzeugt, was wie eine vollwertige Benutzeroberfläche aussieht, komplett mit Schaltflächen, die standardmäßig die Breite des Eingabefeldes einnehmen.
Das Entfernen der Steuerelemente aus Opera ist keine leichte Aufgabe und kann nur durch Ändern des Eingabetyps zu text im HTML und striktes Beschränken des Musters akzeptierter Zeichen auf Zahlen erfolgen
<form>
<label for="age">Enter your age</label>
<input type="text" pattern="[0-9]*" id="age" name="age">
</form>
Ein weiterer Unterschied ist, wie die Zahl rechtsbündig ausgerichtet ist. Das erinnert irgendwie daran, wie Excel numerische Tabellenzellen automatisch nach rechts ausrichtet. Alle anderen Browser halten den Text linksbündig, sodass wir Opera mit CSS dazu zwingen können
html:not([dir="rtl"]) input {
text-align: left;
}
Dieses Snippet durchsucht das DOM nach jeder Eingabe, die nicht von rechts nach links gesetzt ist, und erzwingt den Text nach links. Dies würde global angewendet werden, könnte aber bei Bedarf mit höherer Spezifität modifiziert werden.
Ein letztes Detail, das erwähnenswert ist, ist das Hervorheben bei :focus. Opera wendet die stärkste Formatierung an, wenn das Feld anvisiert wird, bis hin zu den Mengensteuerungen, die ihre eigenen aktiven Zustände haben, wenn sie angeklickt werden.
Wie Mobile Safari und Android damit umgehen


Mobile Safari und der Android-Browser verhalten sich im direkten Vergleich sehr ähnlich. Beide ähneln IE insofern, als sie keine direkten Steuerelemente auf dem Eingabefeld anbieten, aber sie weichen auch von IE ab, da sie keine zusätzliche Benutzeroberfläche zum Leeren des Eingabefeldes nach der Eingabe bieten. In diesem Sinne bieten die mobilen Browser die einfachste Standardimplementierung des gesamten Sets.
Diese Browser erkennen type="number" und zeigen sofort eine numerische Tastatur an, wenn das Eingabefeld den Fokus hat. Das ist ziemlich cool und eine hervorragende Erinnerung daran, dass die korrekte Angabe des type für jedes Formularfeld eine gute Praxis für eine gute Benutzererfahrung ist.
Die Ergebnisse
Hier ist eine Zusammenfassung der in diesem Beitrag behandelten Ergebnisse.
| Hat es? | IE | Safari | Firefox | Chrome | Opera | iOS | Android |
|---|---|---|---|---|---|---|---|
| Spinner-Steuerelemente | Nein | Ja | Ja | Beim Hovern | Beim Hovern | Nein | Nein |
| Löschfunktion | Ja | Nein | Nein | Nein | Nein | Nein | Nein |
| Linksbündige Ausrichtung | Ja | Ja | Ja | Ja | Ja | Ja | Ja |
| Fokus-Styling | Beim Hovern | Ja | Ja | Ja | Ja | Nein | Nein |
| Tastaturbefehle | Ja | Ja | Ja | Ja | Ja | Nein | Nein |
| Shadow DOM-Steuerung | Nein | Ja | Nein | Ja | Ja | Nein | Nein |
Fazit
Es kann frustrierend sein, wenn Browser sich unterschiedlich verhalten. Wir beschäftigen uns schon lange auf verschiedene Weise damit. So werden Hacks – äh, Tricks – entdeckt.
Das Interessante, das ein solcher Vergleich aufdeckt, ist, wie diese Unterschiede die Benutzererfahrung beeinflussen. Wenn wir ein numerisches Formularfeld erstellen und uns auf die Standardeinstellungen des Browsers für die Anzeige verlassen würden, ist es sehr gut möglich, dass zwei verschiedene Besucher der Website zwei völlig unterschiedliche Erfahrungen haben. Obwohl diese Erfahrung für sie möglicherweise auch *seitenübergreifend* konsistent ist, da dieser Benutzer wahrscheinlich bei einem Browser bleibt.
Wie stehen Sie zu diesen UI-Unterschieden? Haben Sie einen Favoriten? Haben Sie versucht, sie zu überschreiben? Was können wir hier mit JavaScript tun? Bitte teilen Sie Ihre Gedanken in den Kommentaren mit.
Überraschen Sie mich, aber ich denke, IE hat das richtig gemacht. Ich mag es wirklich nicht, ein Formularelement verwenden zu müssen, wenn ich einfach etwas eingeben kann. (Die Verwendung eines Dropdowns zum Ausfüllen des Bundesstaates in meiner Adresse ist ein besonderer Ärgernis.)
Chromes Implementierung ist am schlimmsten. Können diese Steuerelemente noch kleiner sein? Das ist schrecklich für die Barrierefreiheit.
In all den genannten Browsern kann man auch einfach eine Zahl eingeben.
Ich vermute, die Screenshots wurden auf einem Mac gemacht, die Spinner-Schaltflächen sind dort kleiner als auf meinen Windows-Versionen dieser Browser, aber auch konsistenter zwischen verschiedenen Browsern.
Sehr interessante Sache, danke für das Teilen :)
@RioBrewster 110% Zustimmung.
IE hat es hier richtig gemacht, das löschende 'X' ist alles, was in diesem Szenario benötigt wird. Mengensteuerungen sind unnötig, sie verlangen dem Benutzer zu viel Arbeit ab.
Die Mengensteuerungen von Firefox, Chrome und Safari sind einfach zu klein, fast unmöglich zu benutzen, zu viel Arbeit, um zu versuchen, den Zeiger auf den richtigen Pfeil zu richten.
Keine Liebe für Auf- und Abwärtspfeile? Eine Sache, die ich am Anzeigen von ihnen mag, ist, dass der Benutzer sehen kann, was die erwartete Eingabe ist, ohne den Kontext lesen oder kennen zu müssen (ich sehe den Fehler in der Argumentation, aber ich glaube immer noch, dass etwas dran ist).
Ich glaube nicht, dass viele sich gezwungen fühlen, die Pfeile tatsächlich zu benutzen.
Und ein Tipp für RioBrewster (Obwohl ich absolut zustimme, dass es lästig sein kann). Wenn Sie Ihren Staat schnell genug tippen, wird die richtige Option ausgewählt.
@Rene,
Das Tippen des Bundesstaates funktioniert nur, wenn Ihr Bundesstaat der erste ist, der mit diesem Buchstaben beginnt. Wenn ich also TX eingebe, bekomme ich TN. Als ich in CA lebte, war das kein großes Problem, da ich die Dropdown-Liste nicht scrollen musste und/oder das Eingeben von "C" mir CA gab.
Ich schätze, das ist einer der wenigen Vorteile, die Kalifornien gegenüber Texas hat. ;^)
Ich denke, das hängt vom Browser ab. Einige lassen Sie den Suchbegriff eingeben ("T", "X") und er springt zum Eintrag. Andere, das erste "T" bringt Sie zum ersten "T"-Eintrag und dann bringen nachfolgende "T"s (in kurzer Folge) Sie zu nachfolgenden "T"-Einträgen. Als TX-Bewohner habe ich mich daran gewöhnt, "TT" einzugeben, um zu meinem Staatseintrag zu gelangen. Zumindest in FF.
@RioBrewster, in der Bundesstaaten-Dropdown können Sie auch weiter T drücken, um durch andere Bundesstaaten zu blättern, die mit T beginnen.
Da müssen wir uns uneinig sein.
Wenn meine numerische Eingabe nur ganze Zahlen verwendet und das Schritt-Attribut auf 1 gesetzt ist, können die Steuerelemente überflüssig erscheinen. Wenn der Schritt größer als 1 ist, helfen die Steuerelemente wirklich zu kommunizieren, was dieses Feld als gültige Eingabe betrachtet.
Außerdem gibt uns die Tatsache, dass die Steuerelemente mit CSS leicht versteckt werden können, das Beste aus beiden Welten, also ein Hoch auf die Optionen!
Gibt es Gedanken zur Verwendung von type="tel", um die numerische Tastatur aufzurufen? Sie ist viel besser als nur die numerisch/symbolische Tastatur, aber ich möchte auch keine schlechte Markup schreiben.
Auch ich fühle mich dabei ein wenig "schmutzig", aber diese Auf- und Ab-Steuerelemente stören mich wirklich. Das Problem mit
numberist, dass eine Zahl Symbole enthalten kann, sodass Sie nicht nur Zahlen anzeigen können.Sie müssen
pattern="\d*"verwenden, um 0 oder mehr Ziffern anzugeben. Dies ruft die richtige Tastatur auf.Das "pattern"-Argument funktioniert nicht immer. Einmal habe ich ein Zahlenfeld entwickelt, in das der Benutzer eine Dezimalzahl eingeben musste. Einige Android-Versionen zeigen nicht die richtige Tastatur an. Sie zeigen die Telefontastatur an, aber ich wollte, dass sie eine Tastatur mit Punkten (oder Kommas, in einigen Sprachen) anzeigt. Selbst wenn das Gerät die neueste Version von Android hatte, kann der Hersteller (wie Samsung) die Standardtastaturen ändern und sie nicht richtig implementieren.
Da das System exklusiv für Android-Benutzer entwickelt wurde, war die Lösung seltsam. Ich muss type="tel" und JavaScript verwenden, um automatisch den Dezimaltrenner hinzuzufügen, nachdem der Benutzer 2 Ziffern eingegeben hat. http://jquerypriceformat.com/#examples
Sehr guter Vergleich, aber mir fehlt ein Screenshot von Android.
Was ist mit der Unterstützung von Auf-/Abwärtspfeilen zum Erhöhen/Verringern der Zahl?
Ich meine Auf-/Ab-Tasten
Mausrad hoch und runter funktioniert auch in einigen Browsern.
Chrome unterstützt sowohl Auf-/Ab-Pfeile als auch das Mausrad.
Noch ein Trick: wenn Sie
Mobile Safari gibt Ihnen eine 10-stellige Tastatur als Ihre Tastatur.
pattern="[0-9]*"funktioniert ebenfalls.Diese Pfeile ergeben für mich absolut keinen Sinn.
Was ist mit 0,06 oder +1,6e-2 oder 1,55 und so weiter.
Alles Zahlen, oder? Was sollte die Erhöhung sein?
Sie müssen step="any" verwenden und die Erhöhung erfolgt an der Stelle der Einsen und erhöht sich um 1. Wenn Sie versuchen, mit step="2" zu erhöhen, verlieren Sie die Gleitkommazahl (und Ihre erste Erhöhung rundet).
1.6e-2 ist eine Kurznotation, keine *technische* Zahl. Oder ist mein Verständnis von Mathematik falsch?
http://codepen.io/Stockings/pen/EarOPg
Oh, ich habe gerade gelernt, dass man Dezimalstellen mit step ansprechen kann... heh.
step="0.01" würde die Hundertstelstelle um 1 erhöhen. :)
Ich hoffe, ich konnte helfen!
Das step-Attribut definiert die Erhöhung/Verringerung, die von den Pfeilen durchgeführt wird. Min und Max können (und sollten wahrscheinlich) ebenfalls angegeben werden, um den Bereich der zulässigen Zahlen zu definieren.
Wenn der Schritt leer gelassen wird, greift er oft auf den Minimalwert zurück, um den Schritt zu bestimmen.
Nur zur Information;
Wenn Sie ein Literal wie +1.6e2 an ein FORTRAN-Backend übergeben, wird es interpretiert
als eine einfach präzise reelle Zahl.
3.1415926535d+0 als Gleitkommazahl und es gibt sogar
ein einfach präzises Komplex, wie (3.2767e+2,-0.65e-2).
Wie FORTRAN mit Kurznotation umgeht, macht Kurznotation nicht zu einer Zahl. Es ist eine Darstellung einer Zahl, die Browser nicht in eine Zahl parsen. Nur weil bestimmte Programmiersprachen sie parsen, ändert das nichts daran, was sie ist.
Nochmal, nach meinem Verständnis. Ich versuche nicht, unhöflich zu sein – ich versuche nur, das Verhalten zu erklären.
Genau deshalb sollten Browser-Standardeinstellungen in fast allen Szenarien nicht überschrieben werden, es sei denn, es ist trivialer (z. B. Farbe) oder praktischer für ein Szenario, das die Standardeinstellung von ±1 auf ±5 oder einen anderen Inkrement ändert (vielleicht Trinkgelder in 5-Dollar-Schritten zulässt).
Der Benutzer bleibt nicht nur wahrscheinlich bei einem Browser – er besucht auch andere Websites. Wenn er eine andere Website besucht und diese Funktionalität unverändert lässt und Sie sie *entfernen*, könnten Sie ein Problem bekommen. :)
Es sieht so aus, als ob Sie dies in Opera 12 testen, das Jahre alt ist… Warum? Warum nicht die aktuellste verfügbare Version verwenden, nämlich Opera 28? Bitte erwägen Sie, Ihre Tests zu wiederholen und die Kompatibilitätstabelle in diesem Beitrag entsprechend zu aktualisieren, da dies im Moment kein fairer Vergleich ist.
Ich stimme Mathias zu. Tests im alten Opera ähneln dem Wunsch einiger Entwickler, Safari auf ihren Windows-Maschinen zu testen und Safari 5 zu öffnen.
Es gibt auch keine Angabe zur Unterstützung dieser Eingabe im alten IE (caniuse berichtet, dass sie in IE10 implementiert wurde).
Guter Hinweis! Das war definitiv ein Versehen meinerseits und ich habe den Beitrag aktualisiert, um die neueste Version von Opera widerzuspiegeln. Danke!
Toller Artikel für diejenigen von uns, die auf dem neuesten Stand bleiben wollen, wie verschiedene Browser mit den neuen Eingabetypen umgehen, ohne die Arbeit selbst machen zu müssen. Ich würde mir mehr davon wünschen.
Ich glaube, es gibt einen kleinen Fehler im Text.
So wie ich das CSS interpretiere, wird ein HTML-Dokument, das nicht von rechts nach links gesetzt ist, für alle Eingabeelemente `text-align: left` erhalten. Rechts-nach-links-Dokumente, z. B. Seiten in arabischer Sprache, werden nicht beeinflusst.
Ah, guter Hinweis Martin. Ich hatte versehentlich das Wort *nicht* in diesem Satz weggelassen und es korrigiert – danke!
Falls es jemanden interessiert, so behandelt Windows Phone numerische Eingaben: http://i.imgur.com/8odp2Ig.png
Es ist fast dasselbe wie Android, aber etwas einfacher.
Wie entfernt man die Stile vom Datumseingabefeld in Chrome?
Keiner bietet groß genug Klick-/Tap-Ziele für die Auf-/Ab-Steuerung. Opera kommt dem am nächsten.
Ich denke, mit den Spinnern hängt es davon ab, wofür die Zahl verwendet wird. Es gab einmal etwas, das ich erstellt habe (einen Farbwähler), bei dem ich, bevor type="number" unterstützt wurde, versucht habe, meine eigenen Spinner zu erstellen, damit der Benutzer leichte Änderungen an den Rot-, Grün- und Blau-Feldern vornehmen konnte.
Ich denke, das Wichtigste, was diesen Benutzeroberflächen fehlt, ist etwas, das den Benutzer daran hindert, von vornherein einen falschen Wert einzugeben. Es ist eine Sache, sich über falsche Eingaben zu beschweren, wenn der Benutzer das Formular absendet, aber benutzerfreundlicher ist es, den Fehler von vornherein zu verhindern. Ich persönlich würde es vorziehen, keine Chance zu haben, einen Fehler zu machen, als dafür gescholten zu werden!
Wir haben uns kürzlich mit numerischen Eingaben beschäftigt und ein großes Problem ist, dass diese Eingaben den Wert häufig auf null setzen, wenn Sie etwas anderes als 0-9 eingeben. Wenn Sie dies also für eine Zahl verwenden möchten, die Leerzeichen oder andere Trennzeichen benötigt, funktioniert die Eingabe nicht. Unser aktueller Ansatz ist, alle Tastenanschläge außer 0-9 herauszufiltern, um eine Katastrophe zu verhindern, bevor sie passiert. Es wäre gut zu testen, wo dieser Trennzeichen-Fehler auftritt, in unseren anfänglichen Tests war es bei den meisten Browsern.