2010-01-16 10 views
25

C'è un modo in CSS per selezionare label s associato ai campi input (tramite l'attributo for) con l'attributo required impostato? Qualcosa di simile:Selettore CSS per etichetta legata all'input

label:input[required] { 
    ... 
} 

Attualmente, sto aggiungendo class="required" alle etichette e gli ingressi per lo styling. Ora ho l'attributo HTML5 required="required" nei campi di input richiesti. Sarebbe bello rimuovere gli attributi di classe ridondanti.

La closest answer ho trovato non utilizza attributo dell'elemento labelfor, ma richiederebbe che la label essere direttamente adiacente all'ingresso del HTML.

risposta

6

Che dire di CSS 2 Attribute Selectors È abbastanza compatibile tra i browser.

Esempio:

<style> 
label[required=required] 
{ 
color: blue; 
} 
</style> 
<label required="required" for="one">Label:</label><input name="one" id="one" /> 

controllare anche this fuori.

+5

Apparentemente le domande e le risposte utilizzano la formattazione, ma i commenti no. Il problema con questo suggerimento è che l'attributo richiesto appartiene all'elemento input, non all'elemento label. Anche nel CSS, meglio solo dicendo: ingresso [necessaria], perché l'unica marcatura valida è: HTML -> richiesto XHTML -> required = "necessaria" required = "false" o qualcosa di simile che non è valida. –

+0

Vedere anche: http://www.whatwg.org/specs/web-apps/current-work/multipage/common-input-element-attributes.html#the-required-attribute –

+0

sì, richiesto = richiesto non è necessario. Ma se poi vuole essere in grado di ottenere tutti i tag etichetta collegati agli input che hanno l'attributo richiesto, non penso sia possibile. È possibile ottenere tutti gli input @required 'input [required]', ma non tutte le etichette a meno che non siano un nodo figlio dell'input, che non è corretto nemmeno in HTML. – Tom

4

Questa soluzione funziona nella maggior parte dei browser moderni:

<style> 

label > input[required="required"] { 
    background: red; 
} 

</style> 
<label for="myField"><input required="required" id="myField" /></label> 
+1

Penso che l'OP chiedesse un selettore che si applicasse genericamente a tutti gli elementi richiesti, per evitare di specificare un selettore per ogni elemento. –

+2

questo non funziona se si utilizza il modo consigliato di usare label/input (non annidandoli) – ashwoods

+2

L'altro problema con questo approccio, o qualcosa che fa 'label + input [required]' è che si sta disegnando lo tag e non lo

0

non credo che questo può davvero essere realizzato attraverso i CSS nel modo in cui il PO vuole. I CSS semplicemente non funzionano in questo modo.

Un approccio migliore secondo me è quello di fare un passo indietro e guardare il quadro generale. Hai una forma in cui alcuni campi sono obbligatori e altri no. È un buon approccio per fornire all'utente tutti i campi richiesti, o raggruppare insieme i campi richiesti, e tenerli chiaramente separati dai campi opzionali.

è possibile creare una struttura come

<form> 
    <ul class="required_fields"> 
     <li> 
      <label>username</label> 
      <input /> 
     </li> 
     <li> 
      <label>email</label> 
      <input /> 
     </li> 
    </ul 
    <ul class="optional_fields"> 
      ... 
    </ul> 
</form> 

/* CSS */ 
.required_fields label {font-weight: bold} 
.required_fields label:after { content: "*"; color: red } /*more styles for labels*/ 

Ci sono una serie di vantaggi di questo approccio. Puoi aggiungere e rimuovere elementi dal gruppo 'richiesto' facilmente senza doverli modificare singolarmente. Puoi assegnare la classe 'required' più in alto della catena che vuoi. Se il modulo avesse la classe 'required', allora tutto in esso sarebbe etichettato come richiesto. Ci sono meno posti dove apportare modifiche, se decidete che la classe 'required' dovrebbe essere chiamata qualcos'altro. E in generale questo approccio ti aiuta anche ad organizzare meglio le tue forme. Non dovresti mescolare campi obbligatori e facoltativi.

Si potrebbe fare un ulteriore passo avanti e avere qualche javascript che inserirà l'attributo richiesto anche nei campi di input.

$(".required_fields input").each(function(){ 
    this.setAttribute('required', 'required'); 
}); 
+0

Questo è un requisito rigido e costringe una particolare decisione progettuale. Prendi in considerazione la possibilità di chiedere un indirizzo postale. Richiediamo l'indirizzo 1, città, stato, zip. Si sposta la riga di indirizzo 2 fuori dal flusso perché è facoltativa? Le persone hanno familiarità con la struttura di un indirizzo postale e vorrebbero che fosse strutturato in un modo standard. –

+0

In questo caso, l'indirizzo 2 è l'eccezione e, come eccezione, dovrebbe ricevere un trattamento speciale. Forse una classe '.not_required' che disabilita lo stile richiesto. '.required_fields label.not_required: after {content:" "}'. Sembra una soluzione perfetta per passare dal generale al più specifico. – mastaBlasta