2013-11-22 12 views
50

Sto provando a scrivere un input disabilitato. Posso usare:Devo usare CSS: disabilitato pseudo-class o [disabilitato] selettore di attributi o è una questione di opinione?

.myInput[disabled] { } 

o

.myInput:disabled { } 

è l'attributo selettore il modo CSS3 moderno e il modo di andare avanti? Usavo la pseudo-classe, ma non riesco a trovare alcuna informazione sul fatto che siano alla vecchia maniera e non saranno supportati o se sono entrambi uguali e puoi usare quello che ti piace di più.

non ho necessità di sostenere i vecchi browser (è un'applicazione intranet), così è:

attributo
  • è più recente e migliore
  • pseudo-classe è ancora la strada da percorrere
  • qualunque ti piace di più
  • c'è una ragione tecnica per utilizzare uno sopra l'altro

risposta

55

Il selettore degli attributi è il modo in cui i CSS3 sono moderni e il modo di procedere? attributo

  • è più recente e migliore

No; in realtà, i selettori di attributo sono disponibili dal CSS2 e l'attributo disabled esiste già dal HTML 4. Per quanto ne so, la pseudo-classe :disabled è stata introdotta in Selectors 3, il che rende la pseudo-classe più recente.

  • c'è una ragione tecnica per utilizzare uno sopra l'altro

Sì, in una certa misura.

Con un selettore di attributo, si sta facendo affidamento sulla consapevolezza che il documento che si sta utilizzando fa uso di un attributo disabled per indicare campi disabilitati. Teoricamente, se stavi disegnando qualcosa che non era HTML, i campi disabilitati potrebbero non essere rappresentati usando un attributo disabled, ad es. potrebbe essere enabled="false" o qualcosa del genere. Anche le future edizioni di HTML potrebbero introdurre nuovi elementi che fanno uso di attributi diversi per rappresentare lo stato abilitato/disabilitato; tali elementi non corrisponderebbero al selettore di attributo [disabled].

La pseudo-classe :disabled disaccoppia il selettore dal documento con cui si sta lavorando. Le specifiche afferma semplicemente che esso si rivolge elementi che sono disabili, e che se un elemento è attivato, disattivato, o nessuno dei due, è defined by the document language instead:

Ciò che costituisce uno stato abilitato, uno stato disabilitato, e un elemento di interfaccia utente è dipendenti dalla lingua.In un documento tipico la maggior parte degli elementi non sarà né :enabled:disabled.

In altre parole, quando si utilizza la pseudo-classe, l'UA individua automaticamente gli elementi da abbinare in base al documento che si sta stilando, quindi non è necessario indicarlo.

In termini di DOM, Credo che impostando la proprietà disabled su un elemento DOM modifica anche attributo dell'elemento HTML disabled, che significa che non c'è differenza tra una selettore con la manipolazione DOM. Non sono sicuro se questo è il browser-dipendente, ma here's a fiddle che dimostra nelle ultime versioni di tutti i principali browser:

// The following statement removes the disabled attribute from the first input 
document.querySelector('input:first-child').disabled = false; 

si è più probabile che sarà styling HTML, quindi nessuno di questo può fare qualsiasi differenza per te, ma se la compatibilità del browser non è un problema, sceglierei :enabled e :disabled su :not([disabled]) e [disabled] semplicemente perché le pseudo-classi contengono semantica che il selettore di attributo non ha. Sono un purista del genere.

+1

Huh. Non lo ho mai pensato in quel modo. Ma è vero che ho usato CSS con MXML (linguaggio UI Flash) e HTML (sebbene il primo non supportasse praticamente nulla di utile) – Katana314

+3

Anche l'effetto della proprietà disabilitata sull'elemento fieldset HTML dovrebbe essere considerato. In FF e Chrome (ma non in IE), verrà applicato lo stato * disabilitato * dei controlli discendenti (riflesso da ': disabled'), sebbene né l'attributo content sia presente né l'attributo IDL (proprietà) sia true. Vedi http://jsfiddle.net/UH2S4/12/ – Alohci

+0

buona risposta! potresti spiegare di più su * come * "l'UA individua automaticamente quali elementi abbinare"? per esempio, lavorando con un aroma indipendente di XML, come si potrebbero specificare gli elementi da selezionare con la pseudo-classe ': disabled'? – chharvey

11

Si scopre che Internet Explorer 10 e 11 non riconosce la pseudoclass :disabled su alcuni elementi e funziona correttamente solo con la sintassi del selettore di attributo.

#test1:disabled { color: graytext; } 
 
#test2[disabled] { color: graytext; }
<form> 
 
<fieldset id="test1" disabled>:disabled</fieldset> 
 
<fieldset id="test2" disabled>[disabled]</fieldset> 
 
</form>

Il codice snipped sopra rende in IE come questo:

Finché si sta styling solo input elementi, si dovrebbe andare bene in entrambi i casi. Comunque è un buon consiglio per testare il risultato finale in tutti i browser che desideri supportare.

+0

Quale versione di IE? – trysis

+0

@trysis Grazie, vedi aggiornamento. –

+3

Questo non ha importanza nel tuo esempio, ma attributi come 'disabled' hanno lo scopo di prendere il loro nome, la stringa vuota, o nulla, anche senza' = '. Qui, invece di mettere 'disabled =" true "', devi mettere 'disabled =" disabled "' o semplicemente 'disabled'. Questo potrebbe essere il motivo per cui IE sta fallendo, anche se ne dubito. – trysis