2009-07-18 18 views
16

Mi problema es HTML y CSS relacionados. Tengo una estructura de tipo de jerarquía que quiero mostrar dentro de una lista. La jerarquía contiene países, estados y ciudades (tiene tres niveles de profundidad).Renderizar una jerarquía de "OPCIONES" en una etiqueta "SELECCIONAR"

Quiero mostrar la lista dentro de una lista de selección, cada tipo de elemento (país, estado, ciudad) debe ser seleccionable. Los elementos deben aparecer sangrados como:

United States 
- Hawaii 
-- Kauai 
- Washington 
-- Seattle 
-- Chelan 

El problema es con la sangría. Estoy tratando de usar margen izquierdo o relleno izquierdo para sangrar las etiquetas, que aparecen correctas en Firefox pero no en IE7. Este es un ejemplo de la lista de selección generada:

<select name="Something"> 
<option style="padding-left: 0">United States</option> 
<option style="padding-left: 20px">Hawaii</option> 
<option style="padding-left: 40px">Kauai</option> 
<option style="padding-left: 20px">Washington</option> 
<option style="padding-left: 40px">Seattle</option> 
<option style="padding-left: 40px">Chelan</option> 
</select> 

que quiero lograr indentación consistente a través de los navegadores sin usar hacks CSS.

+0

ver también http://stackoverflow.com/questions/1037732/nesting-optgroups-in-a-dropdownlist-select –

Respuesta

18

deceze way es mucho mejor y fue mi primera idea. Como alternativa, si eso no funciona es que se puede utilizar espacios de no separación en el valor de la etiqueta:

<select> 
    <option>select me</option> 
    <option>&nbsp;me indented</option> 
    <option>&nbsp;&nbsp;even more indentation</option> 
</select> 

Está lejos de ser bonita, pero que podría funcionar para usted si el optgroup no lo hace.

+0

ugh, no puedo hacer que la entidad funcione correctamente   – MacAnthony

+1

Me temo que esta es la solución más confiable. – Ms2ger

+0

Estoy de acuerdo también. Los espacios sin interrupción funcionan, y también lo hacen los guiones. –

37

La representación de SELECT elementos depende en gran medida del navegador, usted tiene muy poca influencia sobre su presentación. Algunos navegadores obviamente te permiten una mayor personalización que otros, IE permite muy poco (boqueo, quién tiene thunk;)). Si necesita elementos muy personalizados SELECT, necesitará emplear JavaScript o volver a crear algo que se comporte como un SELECT pero está hecho de un grupo de DIV y casillas de verificación o algo así.

Una vez dicho esto, creo que lo que estás buscando son OPTGROUPs:

<select> 
    <optgroup label="xxx"> 
    <option value="xxxx">xxxx</option> 
    .... 
    </optgroup> 
    <optgroup label="yyy"> 
    ... 
    </optgroup> 
</select> 

Cada navegador mostrará de manera diferente, pero que van a ser exhibidas en una manera distintiva de una manera u otra. Sin embargo, tenga en cuenta que oficialmente en HTML4 no puede anidar OPTGROUP s.

+1

Como alternativa, siempre puede mostrarlos como lo hizo en el ejemplo, sangrándolos con guiones -. – deceze

+1

@deceze Citado de la pregunta: "cada tipo de elemento (país, estado, ciudad) debe ser seleccionable". Dudo que el grupo de opción sea seleccionable. –

+0

Cierto. Luego necesita agruparlos de manera diferente y usar la etiqueta del grupo como, bueno, etiqueta, o simplemente omitir la segunda parte de mi respuesta. – deceze

2

¿No es este método de agrupación la creación de más problemas de los que resuelve? Como usuario, ¿cuál de esos se supone que debo elegir? ¿Hay algún beneficio al elegir algo más específico que el país?

Si el problema es que solo tiene un campo de base de datos para almacenarlos, ¿por qué no tener tres cuadros de selección separados (haciendo 2 o 3 opcionales) y simplemente almacenar el más específico?:

<select name="country"> 
    <option>Choose a country</option> 
    <option>United States</option> 
</select> 
<select name="state"> 
    <option>Choose a state</option> 
    <option>Hawaii</option> 
</select> 
<select name="city"> 
    <option>Choose a city</option> 
    <option>Kauai</option> 
</select> 
+0

Tendré que hacer una cascada "onchange = populate_next_select();" para este propósito. Además, lo que quiero es presentar toda la lista de una sola vez. –

+0

@Salman A: ¿Por qué? De todos modos, está rellenando completamente el cuadro de selección única, entonces ¿por qué no completar completamente los 3? Sin embargo, su punto sobre proporcionar toda la lista de una vez es justo. –

+5

>> "¿Por qué?" El cliente lo dijo así :( –

9

Sólo por el bien de los visitantes, siento que debo compartir esta solución Ideé: http://jsfiddle.net/n9qpN/

Decorar las opciones con la clase de nivel

<select name="hierarchiacal"> 
<option class="level_1">United States</option> 
    <option class="level_2">Hawaii</option> 
     <option class="level_3">Kauai</option> 
    <option class="level_2">Washington</option> 
     <option class="level_3">Seattle</option> 
     <option class="level_3">Chelan</option> 
</select> 

Ahora podemos utilizar jQuery para reformatear el contenido del elemento select

$(document).ready(
function(){ 
    $('.level_2').each(
     function(){ 
      $(this).text('----'+$(this).text()); 
     } 
    ); 

    $('.level_3').each(
     function(){ 
      $(this).text('---------'+$(this).text()); 
     } 
    ); 

} 
); 

Esto se puede extender a cualquier nivel

2

Intente usar & # 160;

<select name="Something"> 
 
    <option>United States</option> 
 
    <option>&#160;Hawaii</option> 
 
    <option>&#160;&#160;Kauai</option> 
 
    <option>&#160;Washington</option> 
 
    <option>&#160;&#160;Seattle</option> 
 
    <option>&#160;&#160;Chelan</option> 
 
</select>

Cuestiones relacionadas