2013-08-23 11 views
11

Sto provando a creare caselle di controllo personalizzate con CSS3, che funziona perfettamente su Chrome. Su Firefox ... non così tanto.Caselle personalizzate non funzionanti su Firefox

Edit: sembra funzionare bene su Firefox 37.

La risposta che segue è ancora rilevante, ma le questioni legati agli stili da metà del 2013 sono stati risolti.

IE supporto non è menzionato qui ma le modifiche/risposte in merito sono ben accette.

demo

Il codice HTML:

<input type="checkbox" id="first"/> 
<label for="first">This is pretty awesome</label> 

Il CSS:

input[type=checkbox] { 
    appearance: none; 
    background: transparent; 
    position: relative; 
} 
input[type=checkbox]::after { 
    position: absolute; 
    top: 0; 
    left: 0; 
    content: ''; 
    text-align: center; 
    background: #aaa; 
    display: block; 
    pointer-events: none; 
    opacity: 1; 
    color: black; 
    border: 3px solid black; 
} 
input[type=checkbox] + label { 
    line-height: 48px; 
    margin: 0 15px 0 15px; 
} 
input[type=checkbox]:hover::after { 
    content: ''; 
    background: #32cd32; 
    opacity: .3; 
} 
input[type=checkbox]:checked::after { 
    content: '\2713'; 
    background: #32cd32; 
} 
input[type=checkbox]:checked:hover::after { 
    opacity: 1; 
} 
input[type=checkbox], 
input[type=checkbox]::after { 
    width: 48px; 
    height: 48px; 
    font-size: 46px; 
    line-height: 48px; 
    vertical-align: middle; 
    border-radius: 50%; 
} 
* { 
    box-sizing: border-box; 
    margin: 0; 
    padding: 0; 
} 

Nota: ho rimosso prefissi vendor, e le cose come user-select per brevità. Il codice completo è nella penna.

Cosa devo cambiare per avere lo stesso aspetto su Firefox come su Chrome?

desiderata:

chrome desired look

Non desiderare:

firefox bad look

+0

impossibile con puro CSS. url: http://stackoverflow.com/questions/2587669/css-after-pseudo-element-on-input-field –

+0

altro link di mozilla: http://forums.mozillazine.org/viewtopic.php?f=25&t= 291007 –

+0

Mi spiace, ho corretto l'immagine. Quindi il testo successivo * è * visualizzato su Firefox, ma non mostra il raggio del bordo o l'ombra della scatola. Sarei persino disposto a nascondere la casella in qualche modo. Sto cercando di nascondere la casella di controllo, e creo ':: after' a' :: before' dell'etichetta. – FakeRainBrigand

risposta

9

sono riuscito a risolvere il problema il più sembra possibile (avevo ancora l'amore una soluzione migliore, se ne esiste uno). Sono passato tutti i selettori da

input[type=checkbox]::after 

a

input[type=checkbox] + label::after 

Unico inconveniente:

  • richiede un'etichetta

Ma:

  • HTML richiede elementi di input per avere un'etichetta

Conclusione:

  • solo un male per HTML non valido
+0

Sto avendo esattamente lo stesso problema. Hai mai trovato un altro modo per non richiedere un'etichetta? – lightswitch05

+1

No, le uniche altre soluzioni richiedono JavaScript per imitare la funzionalità di un'etichetta. – FakeRainBrigand

1

doesnt tecnicamente necessita di un'etichetta, ma ha bisogno di controllo sul mark up a assicurati che ci sia un fratello target-capable immediatamente dopo la casella di controllo.

, ad es.

input[type=checkbox] + span::after{ 
 
    display:block; 
 
    width:50px; 
 
    height:50px; 
 
    background:yellow; 
 
    display:block; 
 

 
} 
 

 
input[type=checkbox]:checked + span::after{ 
 
    display:block; 
 
    width:50px; 
 
    height:50px; 
 
    background:yellow; 
 
    display:block; 
 

 
}
<input type="checkbox"></input> 
 
    <span class="targetMe"></span>

bersaglio campata utilizzando il selettore fratelli e: after elementi come sopra.

Potrebbe anche mettere in un tho un'etichetta a questo punto ...: P

1

Il problema è che :after e ::after creare tecnicamente un elemento come ultimo bambino dell'elemento del pseudoselector viene applicato. A Firefox non piace creare bambini all'interno delle sue caselle di controllo. Questo è in realtà parte di un argomento più ampio che è replaced elements.

Si vedrà lo stesso problema con le :before e ::before pseudoelements non funziona su caselle di controllo perché avrebbero creare elementi come un primo elemento bambino all'interno dell'elemento essere selezionato.