2009-05-26 10 views
10

Suponiendo que el siguiente marcado:¿Cómo puedo hacer etiquetas alineadas en línea, horizontal y verticalmente para botones de opción en formularios 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> 

Cómo hacer etiquetas de los botones de radio estilo I para que se vea como la siguiente en la mayoría de los navegadores (IE6 +, FF, Safari, Chrome:

Radio Button Labels

Respuesta

4

Utilizando el siguiente marcado y CSS que era capaz de producir etiquetas de múltiples líneas que no envuelven bajo el botón de radio:

<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> 

sin embargo he podido utilizar:

fieldset label { 
    vertical-align: middle; 
} 

a centra la etiqueta verticalmente en el botón de radio, incluso cuando se aplica un ancho (ambas sugerencias en la respuesta de Dmitri Farkov. Mi propósito principal era evitar envolverlo con el botón de opción, por lo que esta solución estará bien por el momento.

+1

Pero, ¿y si el texto de la etiqueta es una masa de texto sin líneas de frenos explícitas? Digamos 50 palabras, y la lista de selección se presenta en un div que se establece en 400px de ancho. ¡Entonces todo el contenido de la etiqueta se presentará bajo la entrada! ¿Cómo puedo solucionar esto? – UlfR

+0

Ese problema no parece suceder si usa el marcado de la pregunta original. –

+0

Después de un montón de pruebas, mi respuesta anterior parece ser la mejor solución.Las etiquetas centradas verticalmente no son realmente deseables para texto largo. Imagine texto de varios párrafos. ¿Realmente quieres que el botón de radio se centre verticalmente en varios párrafos? Lo dudo. Estoy seleccionando esto como la respuesta. –

1

Hacer de entrada y la etiqueta de ambos

float: left; 
display: block; 

Set de anchura para la etiqueta y de entrada.


aplican

clear: both; 
vertical-align: middle; 

a todo el li de.

+0

o ajuste "overflow: hidden" en lugar de li claro: ambos –

+0

Dasha, ¿cuál es la ventaja de hacer eso? Sólo curioso. –

+0

Dmitry, en IE, si el flotador está configurado en los botones de radio, se adhieren a la parte superior del bloque. No estoy seguro, pero probablemente tendrá que ajustar los botones de radio en tramos y flotarlos en su lugar, ¿no? –

10

Creo que esto lo hace todo. Sin embargo, no mencionó que tiene que validar, así que usé la pantalla de bloque en línea (-moz-inline-box). Uno de mis favoritos, en realidad.

Here's a working copy

probado en Safari 3, FireFox 3, y 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

Esta solución funciona bastante bien, la voté, pero no la acepté porque también quiero que funcione en IE6. –

+0

¡Perfecto! Por cierto: No hay necesidad de la pantalla: bloque en línea en el . – Jabe

2

Desde que le pregunté cómo manejar las etiquetas realmente largas de arriba, y finalmente lo resolví yo mismo. Aquí está la solución a mi problema. Tal vez podría ayudarte?

<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

Hay un problema con este en IE6, si el texto de la etiqueta es corto, la etiqueta y el botón de radio aparecen sangrados. –

Cuestiones relacionadas