Schauen wir uns zum Schluss die Ursache des Problems an
Die Kontrollkästchen werden mit Bildern gerendert (benutzerdefinierte können über CSS festgelegt werden). Hier ist ein (deaktiviertes) Kontrollkästchen in FireFox, das mit dem DOM-Inspektor hervorgehoben wird:
Und hier ist das gleiche nicht gestaltete Kontrollkästchen in Chrome:
Sie können den Rand sehen (orange); Polsterung ist nicht vorhanden (wird grün angezeigt). Was ist dieser Pseudorand rechts und unten im Kontrollkästchen? Dies sind Teile des Bildes, die für das Kontrollkästchen verwendet werden . Das ist der Grund, warum die Verwendung einfach vertical-align: middle
nicht ausreicht und die Ursache für die browserübergreifenden Probleme ist.
Was können wir dagegen tun?
Eine naheliegende Option ist - ersetzen Sie die Bilder! Glücklicherweise kann man dies über CSS tun und diese durch externe Bilder, Base64-Bilder (In-CSS-Bilder), In-CSS-SVG oder einfach nur Pseudoelemente ersetzen. Es ist ein robuster (browserübergreifender!) Ansatz, und hier ist ein Beispiel für eine solche Anpassung, die aus dieser Frage gestohlen wurde :
.checkbox-custom {
opacity: 0;
position: absolute;
}
.checkbox-custom,
.checkbox-custom-label {
display: inline-block;
vertical-align: middle;
margin: 5px;
cursor: pointer;
}
.checkbox-custom + .checkbox-custom-label:before {
content: '';
display: inline-block;
background: #fff;
border-radius: 5px;
border: 2px solid #ddd;
vertical-align: middle;
width: 10px;
height: 10px;
padding: 2px;
margin-right: 10px;
text-align: center;
}
.checkbox-custom:checked + .checkbox-custom-label:before {
width: 1px;
height: 5px;
border: solid blue;
border-width: 0 3px 3px 0;
transform: rotate(45deg);
-webkit-transform: rotate(45deg);
-ms-transform: rotate(45deg);
border-radius: 0px;
margin: 0px 15px 5px 5px;
}
<div>
<input id="checkbox-1" class="checkbox-custom" name="checkbox-1" type="checkbox">
<label for="checkbox-1" class="checkbox-custom-label">First Choice</label>
</div>
<div>
<input id="checkbox-2" class="checkbox-custom" name="checkbox-2" type="checkbox">
<label for="checkbox-2" class="checkbox-custom-label">Second Choice</label>
</div>
Vielleicht möchten Sie einige ausführlichere Artikel über solche Stile lesen, wie die hier aufgeführten . Es liegt außerhalb des Rahmens dieser Antwort.
Ok, was ist noch mit der Lösung ohne benutzerdefinierte Bilder oder Pseudoelemente?
TL; DR: Sieht so aus, als würde dies nicht funktionieren. Verwenden Sie stattdessen das benutzerdefinierte Kontrollkästchen
Beachten wir zunächst, dass es in anderen Browsern keine konsistente Lösung gab, wenn diese Pseudoränder innerhalb des Kontrollkästchensymbols willkürlich waren. Um eines zu erstellen, müssen wir die Anatomie solcher Bilder in vorhandenen Browsern untersuchen.
Welche Browser haben also die Pseudoränder in Kontrollkästchen? Ich habe Chrome 75, Vivaldi 2.5 (Chrom-basiert), FireFox 54 (fragen Sie nicht, warum so veraltet), IE 11, Edge 42, Safari? (für eine Minute ausgeliehen, vergessen, die Version zu überprüfen). Nur Chrome und Vivaldi haben solche Pseudoränder (ich vermute auch alle Chromium-basierten Browser wie Opera).
Wie groß sind diese Pseudoränder? Um dies herauszufinden, kann man ein gezoomtes Kontrollkästchen verwenden:
input {
zoom: 10;
box-shadow: 0 0 1px inset #999;
}
<input type=checkbox>
Mein Ergebnis ist ~ 7% der Breite / Höhe und damit 0,9-1,0 Pixel in absoluten Einheiten. Die Genauigkeit kann jedoch in Frage gestellt werden: Probieren Sie verschiedene Werte zoom
für das Kontrollkästchen aus. In meinen Tests in Chrome und Vivaldi ist die relative Größe des Pseudorandes bei den zoom
Werten 10, 20 und 11-19 (??) sehr unterschiedlich :
scale
scheint konsequenter zu sein:
input {
transform: scale(10) translate(50%, 50%);
box-shadow: 0 0 1px inset #999;
}
<input type=checkbox>
also sind wahrscheinlich ~ 14% und 2px die richtigen Werte.
Nachdem wir nun die Größe des Pseudorandes kennen (?), Beachten wir, dass dies nicht ausreicht. Sind die Größen der Kontrollkästchensymbole für alle Browser gleich? Ach! Folgendes zeigt der DOM-Inspektor für nicht gestaltete Kontrollkästchen:
- FireFox: 13,3 Pixel
- Chrombasiert : 12,8 Pixel für das Ganze, daher 12,8 (100% - 14%) = 11 Pixel für das, was visuell als Kontrollkästchen wahrgenommen wird
- IE 11, Edge: 13px
- Safari: n / a (diese sollten meiner Meinung nach auf demselben Bildschirm verglichen werden)
Bevor wir nun Lösungen oder Tricks diskutieren, fragen wir uns: Was ist eine korrekte Ausrichtung? Was versuchen wir zu erreichen? Bis zu einem gewissen Punkt ist es Geschmackssache, aber im Grunde kann ich mir die folgenden "schönen" Ausrichtungsaspekte vorstellen:
Text und Kontrollkästchen auf derselben Grundlinie (ich passe die Größe der Kontrollkästchen hier absichtlich nicht an):
oder haben die gleiche mittlere Zeile in Kleinbuchstaben:
oder dieselbe mittlere Zeile in Großbuchstaben (es ist einfacher, den Unterschied für verschiedene Schriftgrößen zu erkennen):
Außerdem müssen wir entscheiden, ob die Größe des Kontrollkästchens der Höhe eines Kleinbuchstabens, eines Großbuchstabens oder etwas anderem (größer, kleiner oder zwischen Kleinbuchstaben und Großbuchstaben) entsprechen soll.
Nennen wir für diese Diskussion eine Ausrichtung schön, wenn sich das Kontrollkästchen auf derselben Grundlinie wie der Text befindet und die Größe eines Großbuchstabens hat (eine sehr umstrittene Wahl):
Welche Werkzeuge müssen wir nun:
- Passen Sie die Größe des Kontrollkästchens an
- Erkennen Sie Chromium anhand seines Kontrollkästchens mit Pseudorand und legen Sie bestimmte Stile fest
- Passen Sie die vertikale Ausrichtung des Kontrollkästchens / Etiketts an
?
Die in Bezug auf Kontrollkästchen Größenanpassung : Es gibt width
, height
, size
, zoom
, scale
(habe ich etwas verpasst?). zoom
und scale
erlauben Sie nicht, die absolute Größe festzulegen, daher helfen sie möglicherweise nur beim Anpassen an die Textgröße, nicht beim Festlegen der browserübergreifenden Größe (es sei denn, wir können browserspezifische Regeln schreiben). size
funktioniert nicht mit Chrome (hat es mit altem IE funktioniert? sowieso ist es nicht so interessant). width
und height
arbeiten in Chrome und anderen Browsern, sodass wir eine gemeinsame Größe festlegen können, aber auch in Chrome wird die Größe des gesamten Bilds festgelegt, nicht das Kontrollkästchen selbst. Hinweis: Es ist das Minimum (Breite, Höhe), das die Größe eines Kontrollkästchens definiert (wenn Breite ≠ Höhe ist, wird der Bereich außerhalb des Kontrollkästchenquadrats zum "Pseudorand" hinzugefügt).
Leider werden die Pseudoränder im Chrome-Kontrollkästchen, soweit ich sehen kann, für keine Breite und Höhe auf Null gesetzt.
Ich fürchte, es gibt heutzutage keine zuverlässige Nur-CSS-Methode .
Betrachten wir die vertikale Ausrichtung. vertical-align
Wenn middle
oder baseline
aufgrund des Pseudorandes von Chrome nicht konsistente Ergebnisse erzielt werden können , besteht die einzige echte Option, um für alle Browser das gleiche "Koordinatensystem" zu erhalten, darin, Beschriftung und Eingabe auf Folgendes auszurichten top
:
(auf dem Bild: vertikal ausrichten: oben, unten und unten ohne Kastenschatten)
Welches Ergebnis erhalten wir daraus?
input[type="checkbox"] {
height: 0.95em;
width: 0.95em;
}
label, input {
vertical-align: top;
}
<label><input type="checkbox">label</label>
Das obige Snippet funktioniert mit Chrome (Chromium-basierte Browser), andere Browser erfordern jedoch eine kleinere Größe des Kontrollkästchens. Es scheint unmöglich zu sein, sowohl die Größe als auch die vertikale Ausrichtung so anzupassen, dass die Bild-Eigenart des Chromium-Kontrollkästchens umgangen wird. Mein letzter Vorschlag lautet: Verwenden Sie stattdessen benutzerdefinierte Kontrollkästchen - und Sie vermeiden Frustration :)