Diamo finalmente un'occhiata alla fonte del problema
Le caselle di controllo vengono visualizzate utilizzando le immagini (è possibile impostare quelle personalizzate tramite CSS). Ecco una casella (non selezionata) in FireFox, evidenziata con la finestra di ispezione DOM:
Ed ecco la stessa casella di controllo non modificata in Chrome:
Puoi vedere il margine (arancione); l'imbottitura non è presente (sarebbe mostrata in verde). Cos'è questo pseudo-margine a destra e in fondo alla casella di controllo? Queste sono parti dell'immagine utilizzata per la casella di controllo . Ecco perché l'utilizzo vertical-align: middle
non è sufficiente e questa è la fonte dei problemi tra browser.
Quindi cosa possiamo fare al riguardo?
Un'opzione ovvia è: sostituire le immagini! Fortunatamente, è possibile farlo tramite CSS e sostituire quelli con immagini esterne, immagini base64 (in-CSS), svg in-CSS o semplicemente pseudo-elementi. È un approccio solido (cross-browser!), Ed ecco un esempio di tale regolazione sottratta a questa domanda :
.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>
Potresti voler leggere alcuni articoli più approfonditi su tale stile come alcuni elencati qui ; è fuori dalla portata di questa risposta.
Ok, cosa ne pensi della soluzione no-custom-images-or-pseudo-elements?
TL; DR: sembra che non funzionerà, usa invece la casella di controllo personalizzata
Innanzitutto, notiamo che se in altri browser quelle pseudo-margini all'interno dell'icona della casella di controllo fossero arbitrarie, non ci sarebbe soluzione coerente. Per costruirne una, dobbiamo esplorare l'anatomia di tali immagini nei browser esistenti.
Quindi quali browser hanno gli pseudo-margini nelle caselle di controllo? Ho verificato Chrome 75, Vivaldi 2.5 (basato su Chromium), FireFox 54 (non chiedermi perché non è aggiornato), IE 11, Edge 42, Safari ?? (preso in prestito uno per un minuto, ho dimenticato di controllare la versione). Solo Chrome e Vivaldi hanno tali pseudo-margini (sospetto che anche tutti i browser basati su Chromium, come Opera).
Qual è la dimensione di quegli pseudo-margini? Per capirlo è possibile utilizzare una casella di controllo ingrandita:
input {
zoom: 10;
box-shadow: 0 0 1px inset #999;
}
<input type=checkbox>
il mio risultato è ~ 7% di larghezza / altezza e quindi 0,9-1,0 px in unità assolute. L'accuratezza può essere messa in discussione, tuttavia: provare diversi valori di zoom
per la casella di controllo. Nei miei test sia su Chrome che su Vivaldi la dimensione relativa dello pseudo-margine è molto diversa ai zoom
valori 10, 20 e ai valori 11-19 (??):
scale
sembra essere più coerente:
input {
transform: scale(10) translate(50%, 50%);
box-shadow: 0 0 1px inset #999;
}
<input type=checkbox>
quindi probabilmente ~ 14% e 2px sono i valori corretti.
Ora che conosciamo (?) La dimensione dello pseudo-margine, notiamo che questo non è abbastanza. Le dimensioni delle icone della casella di controllo sono le stesse per tutti i browser? Ahimè! Ecco cosa mostra l'ispettore DOM per le caselle di controllo non stilate:
- FireFox: 13.3px
- A base di cromo: 12,8 px per tutto, quindi 12,8 (100% - 14%) = px per ciò che è visivamente percepito come casella di controllo
- IE 11, Edge: 13px
- Safari: n / a (questi dovrebbero essere confrontati sullo stesso schermo, credo)
Ora, prima di discutere qualsiasi soluzione o trucco, chiediamo: cos'è un corretto allineamento ? Cosa stiamo cercando di ottenere? A un certo punto è una questione di gusti, ma fondamentalmente posso pensare ai seguenti aspetti di "simpatici" allineamenti:
testo e casella di controllo sulla stessa linea di base (non modifico deliberatamente le dimensioni della casella di controllo qui):
o hanno la stessa linea mediana in termini di lettere minuscole:
o la stessa linea di mezzo in termini di lettere maiuscole (è più facile vedere la differenza per le diverse dimensioni del carattere):
e dobbiamo anche decidere se la dimensione della casella di controllo deve essere uguale all'altezza di una lettera minuscola, una lettera maiuscola o qualcos'altro (più grande, più piccolo o tra lettere minuscole e maiuscole).
Per questa discussione chiamiamo un allineamento piacevole se la casella di controllo si trova sulla stessa linea di base del testo e ha le dimensioni di una lettera maiuscola (una scelta altamente discutibile):
Ora quali strumenti dobbiamo:
- regola le dimensioni della casella di controllo
- riconoscere Chromium con la sua casella di controllo pseudo-marginata e impostare stili specifici
- regola la casella di controllo / etichetta allineamento verticale
?
Per quanto riguarda la regolazione delle dimensioni casella di controllo : ci sono width
, height
, size
, zoom
, scale
(ho ho perso qualcosa?). zoom
e scale
non consentono di impostare dimensioni assolute, quindi possono essere utili solo per adattarsi alle dimensioni del testo, non impostare le dimensioni tra browser (a meno che non possiamo scrivere regole specifiche per browser). size
non funziona con Chrome (ha funzionato con il vecchio IE? comunque, non è poi così interessante). width
eheight
funziona in Chrome e altri browser, quindi possiamo impostare una dimensione comune, ma di nuovo, in Chrome imposta la dimensione dell'intera immagine, non la casella stessa. Nota: è minimo (larghezza, altezza) che definisce le dimensioni di una casella di controllo (se larghezza ≠ altezza, l'area esterna al riquadro della casella di controllo viene aggiunta a "pseudo-margine").
Una cosa spiacevole è che la casella di controllo pseudo-margini in Chrome non è impostata su zero per qualsiasi larghezza e altezza, per quanto posso vedere.
Temo non ci sia un metodo affidabile solo CSS al giorno d'oggi.
Consideriamo l'allineamento verticale. vertical-align
non può fornire risultati coerenti quando impostato su middle
o a baseline
causa dello pseudo-margine di Chrome, l'unica vera opzione per ottenere lo stesso "sistema di coordinate" per tutti i browser è allineare l'etichetta e l'input a top
:
(nella foto: allineamento verticale: superiore, inferiore e inferiore senza ombra)
Quindi quale risultato otteniamo da questo?
input[type="checkbox"] {
height: 0.95em;
width: 0.95em;
}
label, input {
vertical-align: top;
}
<label><input type="checkbox">label</label>
Lo snippet sopra funziona con Chrome (browser basati su Chromium), ma altri browser richiedono una dimensione inferiore della casella di controllo. Sembra impossibile regolare sia le dimensioni sia l'allineamento verticale in modo da aggirare la stranezza dell'immagine della casella di controllo di Chromium. Il mio ultimo suggerimento è: usa invece caselle di controllo personalizzate - ed eviterai la frustrazione :)