2011-09-23 17 views
6

Tengo una lista desordenada horizontal con un ancho establecido. En el interior, tengo una cantidad dinámica de elementos de lista. Podría ser 2 elementos, o 6 - depende de varios factores.Establecer el ancho de los elementos de la lista para completar la lista desordenada

Me gustaría poder establecer el ancho de cada elemento de la lista para que llenen todo el ancho de la ul, sin importar cuántos elementos haya dentro. Entonces, si hubiera 1 elemento de lista, su ancho sería 100%; 2, y ambos serían 50%, y así sucesivamente.

Aquí es mi HTML y CSS:

ul 
{ 
    width: 300px; 
    height: 50px; 
    background-color: #000000; 
    list-style: none; 
    margin: 0; 
    padding: 0; 
} 

li 
{ 
    float: left; 
    height: 50px; 
    background-color: #4265CE; 
    margin: 0; 
    padding: 0; 
} 

<ul> 
    <li>Item 1</li> 
    <li>Item 2</li> 
    <li>Item 3</li> 
    <li>Item 4</li> 
</ul> 

Aquí está en jFiddle: http://jsfiddle.net/vDVvm/3/

¿Hay una manera de hacer esto con CSS, o voy a tener que usar jQuery?

Respuesta

5

ninguna manera con CSS puro, me temo.

Editar: La solución más adecuada jQuery que se me ocurre: http://jsfiddle.net/vDVvm/8/

(function($){ 
    $.fn.autowidth = function() { 
    return this.each(function() {   
     $('li', this).css({'width' : (100/$('li', this).length) + '%'}) 
    }); 
    }; 
})(jQuery); 

$(document).ready(function(){ 
    $('.fill-me').autowidth();  
}); 

Tenga en cuenta, sin embargo, que cada vez (100% number_of_lis == 0), que van a estar en ejecución en algunos problemas desagradables con errores de redondeo.

+0

meh ... el suyo es mejor ... mi versión de lo que hizo sería esta: '$ (" ul li "). css ({ancho: (100/$ (" ul li "). longitud) + "%"}); ' –

1

Usando jQuery, puede hacer algo como esto:

var li = $('#mylist li').size(); 
var liWidth = 100/li; 

$('#mylist li').width(liWidth + '%'); 

asumiendo el código HTML siguiente aspecto:

<ul id="mylist"> 
    <li>Item 1</li> 
    <li>Item 2</li> 
    <li>Item 3</li> 
    <li>Item 4</li> 
</ul> 
+0

Por desgracia, que utiliza todos y cada li en la página para calcular el ancho ... – vzwick

+0

sí, tendrá que especificar un ID/clase para su selector –

3

Una solución sin JavaScript.

ul 
{ 
    width: 300px; 
    height: 50px; 
    background-color: #000000; 
    list-style: none; 
    margin: 0; 
    padding: 0; 
    display: table; 
} 

li 
{ 
    height: 50px; 
    background-color: #4265CE; 
    margin: 0; 
    padding: 0; 
    display: table-cell; 
} 

http://jsfiddle.net/vDVvm/5/

Puede ser cruzada navegador no es suficiente, sin embargo.

+0

¡Absolutamente hermoso! –

+0

Meh. Lamentablemente, mostrar: table-cell a menudo conduce a resultados inesperados. No es un navegador cruzado. – vzwick

+0

También, vea el escenario (muy hipotético, cierto) aquí: http://jsfiddle.net/vDVvm/9/ - <ul> deja de preocuparse por su ancho en algún punto, para acomodar todos <li> s incluyendo su texto. – vzwick

3

Esto también es posible solo con CSS, pero solo funcionará en los navegadores modernos.

ul { 
    /* ... */ 
    display: table; 
} 

li { 
    /* ... */ 
    display: table-cell; 
} 
0

Aquí es una mejora en la función de vzwick:

(function($){ 
    $.fn.autowidth = function() { 
    return this.each(function() { 
     var w = $(this).width(); 
     var liw = w/$(this).children('li').length; 
     $(this).children('li').each(function(){ 
      var s = $(this).outerWidth(true)-$(this).width(); 
      $(this).width(liw-s); 
     }); 
    }); 
    }; 
})(jQuery); 
Cuestiones relacionadas