2009-05-26 10 views
10

Supponendo che il codice seguente:Come posso creare etichette multilinea, verticalmente e orizzontalmente allineate per i pulsanti di opzione nei moduli HTML con CSS?

<fieldset> 
    <legend>Radio Buttons</legend> 
    <ol> 
     <li> 
      <input type="radio" id="x"> 
      <label for="x"><!-- Insert multi-line markup here --></label> 
     </li> 
     <li> 
      <input type="radio" id="x"> 
      <label for="x"><!-- Insert multi-line markup here --></label> 
     </li> 
    </ol> 
</fieldset> 

Come faccio etichette dei pulsanti della radio stile in modo che essi hanno il seguente aspetto nella maggior parte dei browser (IE6 +, FF, Safari, Chrome:

Radio Button Labels

risposta

4

Utilizzando il seguente markup e CSS sono stato in grado di produrre etichette più righe che non avvolgono sotto il pulsante di opzione:

<style type="text/css"> 
    fieldset input, label { 
     float: left; 
     display: block; 
    } 

    fieldset li { 
     clear: both; 
    } 
</style> 

<fieldset> 
    <ol> 
    <li> 
     <input type="radio" id="x" /> 
     <label for="x"> 
     stuff<br/> 
     stuff1 
     </label> 
    </li> 
    <li> 
     <input type="radio" id="x" /> 
     <label for="x"> 
     stuff<br/> 
     stuff1 
     </label> 
    </li> 
    </ol> 
</fieldset> 

però non ero in grado di utilizzare:

fieldset label { 
    vertical-align: middle; 
} 

a centra l'etichetta verticalmente sul pulsante di opzione, anche quando si applica una larghezza (entrambi i suggerimenti nella risposta di Dmitri Farkov.) Il mio scopo principale era quello di impedire il wrapping sotto il pulsante radio, quindi questa soluzione andrà bene per il momento

+1

Ma cosa succede se il testo dell'etichetta è una massa di testo senza freni di linea espliciti? Pronuncia 50 parole e l'elenco di selezione viene presentato in un div che è impostato su 400 px di larghezza. Quindi l'intero contenuto dell'etichetta sarà presentato sotto l'input! Come lo risolvo? – UlfR

+0

Questo problema non sembra accadere se si utilizza il markup della domanda originale. –

+0

Dopo una serie di test, la mia risposta sopra sembra essere la soluzione migliore.Le etichette centrate sulla carta non sono davvero auspicabili per il testo lungo. Immagina un testo lungo diversi paragrafi. Vorresti davvero che il pulsante radio fosse centrato verticalmente su più paragrafi? Ne dubito. Lo sto selezionando come risposta. –

1

Effettuare ingresso e etichettare entrambe

float: left; 
display: block; 

impostare la larghezza di per l'etichetta e l'ingresso.


applicano

clear: both; 
vertical-align: middle; 

a tutta la Li.

+0

o impostare "overflow: hidden" su Li, invece di clear: both –

+0

Dasha, qual è il vantaggio di fare questo? Solo curioso. –

+0

Dmitry, in IE se float è impostato sui pulsanti di opzione, restano nella parte superiore del blocco. Non sono sicuro, ma probabilmente dovrai avvolgere i pulsanti di opzione in span e farli fluttuare, no? –

10

Credo che questo faccia tutto. Non hai detto che deve convalidare, tuttavia, così ho usato il display inline-block (-moz-inline-box). Uno dei miei preferiti, in realtà.

Here's a working copy

testato in Safari 3, FireFox 3 e IE7.

<style type="text/css"> 
ol{ 
    padding-left: 0; 
    margin-left:0; 
} 

ol>li { 
    list-style-type: none; 
    margin-bottom: .5em; 
} 

ol>li input[type=radio] { 
    display: -moz-inline-box; 
    display: inline-block; 
    vertical-align: middle; 
} 

ol>li label { 
    display: -moz-inline-box; 
    display: inline-block; 
    vertical-align: middle; 
} 
</style> 
+0

Questa soluzione funziona abbastanza bene, l'ho votata, ma non l'ho accettata perché voglio che funzioni anche in IE6. –

+0

Perfetto! BTW: Nessuna necessità di visualizzazione: blocco in linea su . – Jabe

2

Da quando ho chiesto come gestire etichette molto lunghe sopra, e alla fine l'ho risolto io stesso. Ecco la soluzione al problema my. Forse potrebbe aiutarti?

<style type="text/css"> 
    #master_frame { 
     background: #BBB; 
     height: 300px; 
     width: 300px; 
    } 
    fieldset.radios { 
     border: none; 
    } 
    fieldset fields { 
     clear: both; 
    } 
    input { 
     float: left; 
     display: block; 
    } 
    label { 
     position: relative; 
     margin-left: 30px; 
     display: block; 
    } 
</style> 

<div id="master_frame"> 
    <fieldset class='radios'> 
    <div class='field'> 
     <input type="radio" id="a" /> 
     <label for="a">Short</label> 
    </div> 
    <div class='field'> 
     <input type="radio" id="b" /> 
     <label for="b"> 
     A really long and massive text that does not fit on one row! 
     </label> 
    </div> 
    </fieldset> 
</div> 
+0

C'è un problema con questo in IE6, se il testo dell'etichetta è breve, l'etichetta e il pulsante radio appaiono rientrati. –

Problemi correlati