Solución CSS pura para dividir elementos en una cantidad dinámica de columnas


¿Hay alguna manera de alinear elementos en varias columnas, donde el número de columnas depende del elemento más ancho? Tanto la altura del elemento como el ancho del contenedor son fijos, pero el ancho del elemento es dinámico.

Estoy buscando una manera solo de CSS para lograr el siguiente comportamiento:

(Supongamos que el contenedor principal tiene 300px de ancho.)

  • Si el elemento más ancho es más ancho que 150px, use una sola columna
  • Si el elemento más ancho está entre 100px y 150px, use dos columnas
  • Si el elemento más ancho es inferior a 100px, utilice tres columnas
  • ...
  • Si el elemento más ancho es menor que container width / N, use N columnas

Una forma posible de tener este comportamiento podría ser usando display:inline-block y estableciendo la propiedad width al ancho del elemento más ancho del contenedor usando JavaScript.

Ver este JSFiddle para un ejemplo:

Ejemplo

Sin Embargo, estoy pensando que también debería haber una forma de hacer esto solo con CSS. Es posible?

Si no, tal vez hay una elegante forma de DISTRIBUIR / ajustar los elementos de tamaño dinámico a las columnas en un contenedor con un ancho fijo.

Author: David Mulder, 2015-08-17

7 answers

...Estoy buscando una forma única de CSS para lograr lo siguiente comportamiento...Si el elemento más ancho es más ancho que...

...Estoy pensando que también debería haber una forma de CSS de hacer esto...

Como indica @Paulie-D , CSS no puede detectar anchuras variables en sus hijos div y, por lo tanto, no existe una solución CSS pura.

Esto se debe a que desea obtener los anchos de todos los elementos, luego obtener el máximo de esos, y luego use ese ancho para distribuir elementos en columnas. Este cálculo está más allá de CSS. Necesitarás Javascript para hacer eso.

Si no, tal vez haya una elegante forma de distribuir solo CSS / ajustar los elementos de tamaño dinámico a las columnas de un contenedor con un ancho fijo?

Lo explicaré en dos partes:{[42]]}


Parte 1, el CSS:

Cuando decimos que queremos que el contenido esté en columnas, significa un flujo de arriba a abajo en su lugar de solo flujo de envoltura de izquierda a derecha. Para ello requerimos Columnas CSS.

El truco sería especificar auto para column-count / column-width. Esto distribuirá automáticamente el contenido en el número de columnas necesarias dentro del ancho principal.

Cometí un error fundamental en la declaración anterior ( de ahí otra edición). Según las especificaciones aquí el algoritmo dice:

(01) if ((column-width = auto) and (column-count = auto)) then
(02)      exit; /* not a multicol element */ 

Aquí es donde me equivoqué antes. Cuando ambos column-count y column-width se establecen en auto entonces se trata como no como un elemento multicol. Cuando una de estas propiedades se establece en valor no automático, la otra propiedad está determinada por esta.

Del anterior ref :

Si column-count se establece en auto, entonces el número de columnas estará determinado por otras propiedades (por ejemplo, column-width, si tiene un valor no automático) y si column-width se establece en auto, entonces el ancho de la columna será determinado por otras propiedades (por ejemplo, column-count, si tiene un valor no automático)

Un ejemplo sería establecer column-width a un ancho fijo, por ejemplo 120px (nos ocuparemos de eso en la parte 2 un poco más tarde):

.container { -webkit-columns: auto 120px; columns: auto 120px; }

Esto hará que el contenedor ajuste el contenido en tantas columnas como pueda para un ancho de columna de 120px dentro de su propio ancho. Si aumenta el ancho del contenedor, obtendrá más columnas. Si disminuye el ancho del contenedor, eventualmente obtendrá menos columnas colapsar a una sola columna cuando no hay mucho espacio disponible.

Vea el ejemplo completo en el fragmento de código a continuación:

Ejemplo 1:

* { box-sizing: border-box; padding: 0; margin: 0; }
p { margin-left: 16px; }
.container { width: 400px; border: 1px solid #f00; margin: 16px; }
.container.col { -webkit-columns: auto 120px; columns: auto 120px; }
.container > div { 
	-webkit-column-break-inside: avoid; column-break-inside: avoid; 
	display: block; padding: 8px; border: 1px solid #ccc;
}
#one { width: 200px; }
#two { width: 300px; }
<p>Small Container (1-column):</p>
<div id="one" class="container col">
	<div class="item-min">Maudie Mcmanus</div>
	<div class="item-min">Remedios</div>
	<div class="item-min">Chaya B</div>
	<div class="item-min">Duncan</div>
	<div class="item-min">Lashonda</div>
</div>
<p>Medium Container (2-column):</p>
<div id="two" class="container col">
	<div class="item-min">Maudie Mcmanus</div>
	<div class="item-min">Remedios</div>
	<div class="item-min">Chaya B</div>
	<div class="item-min">Duncan</div>
	<div class="item-min">Lashonda</div>
</div>
<p>Large Container (3-column):</p>
<div id="three" class="container col">
	<div class="item-min">Maudie Mcmanus</div>
	<div class="item-min">Remedios</div>
	<div class="item-min">Chaya B</div>
	<div class="item-min">Duncan</div>
	<div class="item-min">Lashonda</div>
</div>

Violín 1: http://jsfiddle.net/abhitalks/tgwp4b7a/2/show

En el fragmento anterior, estamos usando column-count: auto en el contenedor, y un arbitrario column-width: 120px (solo para demo). Es todo lo que hay que hacer. Hay tres ejemplos en el código anterior: (1) donde contenedor es de ancho pequeño y el contenido se distribuye en una columna, ya que están restringidos por el column-width; (2) donde el contenedor es de ancho medio y el contenido se distribuye en dos columnas, ya que ahora hay más espacio disponible; y (3) donde el contenedor es de ancho mucho mayor y puede acomodar tres columnas.

Como efecto secundario, si el ancho del contenedor es en porcentaje, entonces todo el aparato automáticamente también se vuelve sensible. En pantallas más grandes que muestran más columnas, y en pantallas colapsando en una columna.

Sin embargo, esto depende del ancho fijo que le dé al contenedor column-width y por lo tanto también se puede llamar una solución de número mágico. Pero, esto no es lo que queremos. No queremos determinar las columnas en función del ancho del contenedor, queremos que las columnas estén determinadas por el ancho del contenido. Veremos cómo eliminar esa dependencia en la parte 2 que sigue.


Parte 2, extendiéndolo con Javascript:

Ahora que hemos establecido que los elementos se pueden distribuir automáticamente por CSS en columnas dependiendo del ancho disponible en el padre, podemos extender esto para eliminar nuestra dependencia del ancho fijo a través de Javascript.

Volviendo a su pregunta de:{[42]]}

...Si el elemento más ancho es más ancho que...

Para determinar el elemento más ancho y aplicar ese ancho al resto de ellos, todo lo que necesita es simplemente un bien conocido Javascript de dos líneas:

var maxWidth = Math.max.apply(null, $("div.item").map(function () {
    return $(this).width();
}).get());

También establecemos child div s a inline-block prevent wrapping para identificar el ancho real. Por lo tanto, todo lo que tiene que agregar al CSS que escribimos en la parte 1 es esto:

.container > div {
    display: inline-block; 
    white-space: nowrap;   /* prevents wrapping and helps getting actual width */
}

Entonces necesitamos hacer dos cosas: (1) establecer el column-width en el contenedor a este ancho máximo que calculamos anteriormente; y (2) establecer este ancho a todo el hijo div para permitir que se apilen cuidadosamente. Además, no necesitaremos column-count / column-width que se establezca en CSS, porque tenemos que hacerlo en Javascript de todos modos.

$("#container").css({ "column-width": maxWidth }).find('div').width(maxWidth);

Vea el ejemplo completo en el fragmento de código a continuación:

Ejemplo 2:

//large
	var maxWidth = Math.max.apply(null, $("#one > div").map(function () { return $(this).outerWidth(); }).get());
	$("#one").css({ "-webkit-column-width": maxWidth, "column-width": maxWidth }).find('div').outerWidth(maxWidth);

	// medium
	var maxWidth2 = Math.max.apply(null, $("#two > div").map(function () { return $(this).outerWidth(); }).get());
	$("#two").css({ "-webkit-column-width": maxWidth2, "column-width": maxWidth2 }).find('div').outerWidth(maxWidth2);

	// small
	var maxWidth3 = Math.max.apply(null, $("#three > div").map(function () { return $(this).outerWidth(); }).get());
	$("#three").css({"-webkit-column-width": maxWidth3, "column-width": maxWidth3 }).find('div').outerWidth(maxWidth3);
* { box-sizing: border-box; padding: 0; margin: 0; }
	p { margin-left: 16px; }
	.container { width: 450px; border: 1px solid #f00; margin: 16px; }
	.container > div { 
		-webkit-column-break-inside: avoid; column-break-inside: avoid; 
		display: inline-block;  white-space: nowrap;
		padding: 8px; border: 1px solid #ccc;
	}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
	<p>Normal children (wrapping):</p>
	<div class="container">
		<div class="item">Maudie Mcmanus</div>
		<div class="item">Remedios Arrington</div>
		<div class="item">Chaya B</div>
		<div class="item">Duncan</div>
		<div class="item">Lashonda Tatum Walls</div>
	</div>
	<p>Large children (1-column):</p>
	<div id="one" class="container">
		<div class="item-min">Maudie Mcmanus Mcmanus Mcmanus</div>
		<div class="item-min">Remedios</div>
		<div class="item-min">Chaya B</div>
		<div class="item-min">Duncan</div>
		<div class="item-min">Lashonda</div>
	</div>
	<p>Medium children (2-column):</p>
	<div id="two" class="container">
		<div class="item-min">Maudie Mcmanus Mcmanus</div>
		<div class="item-min">Remedios</div>
		<div class="item-min">Chaya B</div>
		<div class="item-min">Duncan</div>
		<div class="item-min">Lashonda</div>
	</div>
	<p>Small children (3-column):</p>
	<div id="three" class="container">
		<div class="item-min">Maudie Mcmanus</div>
		<div class="item-min">Remedios</div>
		<div class="item-min">Chaya B</div>
		<div class="item-min">Duncan</div>
		<div class="item-min">Lashonda</div>
	</div>

Fiddle 2: http://jsfiddle.net/abhitalks/ojd57678/4/show

(Se ha cambiado el fragmento de código anterior y el violín. Gracias a @Yandy_Viera, quien señaló el hecho de que se debe usar jQuery .outerWdith en lugar de .width (que ignora box-sizing: border-box, causando que los anchos incorrectos sean establecer.)

En el fragmento anterior, ahora estamos usando tres variaciones de ejemplos: (1) donde los hijos divson de mayor ancho y se distribuyen en una columna ya que están restringidos por el ancho del contenedor; (2) donde los hijos divson de menor ancho y se distribuyen en dos columnas ya que ahora hay más espacio disponible; y (3) donde los hijos divson de muy pequeño ancho y se pueden acomodar en tres columnas.


Como puede ver, CSS puede ayudar en distribuir el contenido en columnas en función del ancho disponible, pero no puede calcular y aplicar el ancho más amplio de los elementos a cada uno de ellos. Para esto, un Javascript de dos líneas te haría hacer lo que inicialmente querías.

Nota: Cuando leí por primera vez su pregunta, tenía la impresión de que ya tenía una solución de Javascript que funcionaba con usted, y no estaba seguro de si quería una. Sin embargo, en una segunda lectura me di cuenta de que no lo había hecho, y el ángulo de Javascript era esencial entender. Por lo tanto, esta edición para agregar una parte de Javascript.

Nota 2: Hubo un defecto en la versión anterior de esta respuesta, donde dejé entrar un error fundamental en los valores automáticos de las propiedades de las columnas. Esto requirió otra edición.

 25
Author: Abhitalks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:26

Además de todo lo que dijeron en los comentarios, no existe una solución solo CSS, así que quería dejarle una buena solución usando js en la que ni siquiera tiene que iterar buscando el elemento más amplio, todo proviene de un conjunto de CSS y matemáticas.

Puede cambiar el contenido de los elementos y verá cómo se ajusta el número de columnas, si el elemento más ancho es menor que el ancho del contenedor / N, usará N columnas automáticamente.

Echa un vistazo a este JSFiddle para demo

La idea es muy simple, usted set width: 'auto', display: 'inline-block' para container para permitir que se ajuste a su contenido que se define por el ancho del elemento más ancho, véalo en el siguiente img:

introduzca la descripción de la imagen aquí

Ahora puede usar el ancho de container para conocer el ancho del elemento más ancho y esto evita que tenga que iterar buscándolo. En este momento se puede utilizar este ancho para establecer el resto de elementos, pero vamos a hacerlo un poco mejor podemos hacer que los elementos ocupan todo el ancho de la container solo con una camada calc:

var div = Math.floor(initialWidth / widestItemWidth);     /*this is to get as many items fit with the width of the widest element*/
var itemWidth = initialWidth / div;      /*for the width of the item occupy the entire container*/

Así que si el elemento más ancho es menor que container width / N, usará N columnas automáticamente y se ajustarán al ancho de container, eso es todo lo que tienes que hacer, simplemente establece una propiedad css, haz un poco de calc y ahí tienes lo que querías lograr.

$(document).ready(function() {
    var $container = $('.container');
    var $item = $('.item');

    var initialWidth = $container.outerWidth();

   $container.css({     /*to allow it to fit its contents which is defined by the width of the widest element*/
        width: 'auto',
        display: 'inline-block'
    });   

    var widestItemWidth = $container.outerWidth();     /*Now this is the width of the widest item*/

    var div = Math.floor(initialWidth / widestItemWidth);     /*this is to get as many items fit with the width of the widest element*/
    var itemWidth = initialWidth / div;      /*for the width of the item occupy the entire container*/
  
  /*if you don't want the items occupy the entire width of the container just use 'widestItemWidth' as width of $item*/

    $item.css({
        width: itemWidth,
        float: 'left'
    });
    $container.css({     /*restoring the initial styles*/
        width: initialWidth,
        display: 'block'
    });
})
.container {
  width: 400px;
  overflow: hidden;
}
.container .item {
  padding: 8px;
  border: 1px solid rgb(216, 213, 213);
}
*{
  box-sizing: border-box;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container">
    <div class="item">Maudie Mcmanus</div>
    <div class="item">Remedios Arrington</div>
    <div class="item">Chaya B</div>
    <div class="item">Duncan</div>
    <div class="item">Lashonda Tatum Walls</div>
</div>

Si quieres añadir margen a tus ítems solo tienes que tenerlo en cuenta a la hora de hacer las matemáticas como esto:

$(document).ready(function() {
    var $container = $('.container');
    var $item = $('.item');

    var initialWidth = $container.outerWidth();

    $container.css({
            width: 'auto',
            display: 'inline-block'
        });

    var currentWidth = $container.outerWidth();
    var itemMargin= parseInt($item.css('margin-right'));

    var div = Math.floor(initialWidth / currentWidth);
    var itemWidth = initialWidth / div - itemMargin;   /*subtracting the item's margin from the compute width*/

    $item.css({
        width: itemWidth,
        float: 'left'
    });
    $container.css({
        width: initialWidth,
        display: 'block'
    });
})
.container {
  width: 400px;
  overflow: hidden;
}
.container .item {
  padding: 8px;
  border: 1px solid rgb(216, 213, 213);
  margin-right: 3px;
}
*{
  box-sizing: border-box;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container">
    <div class="item">Maudie Mcmanus</div>
    <div class="item">Remedios Arrington</div>
    <div class="item">Chaya B</div>
    <div class="item">Duncan</div>
    <div class="item">Lashonda Tatum Walls</div>
</div>

Aquí un ejemplo de JSFiddle para jugar con

 9
Author: Yandy_Viera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-25 18:34:09

Lo más cercano que puede obtener con una solución CSS pura es usar columnas CSS como sugieren otros (o enfoque de cuadrícula CSS - Ver Editar). Sin embargo, la clave es usar unidades relativas y ser muy consciente de la ubicación y del contenedor de columnas en su diseño y usar consultas de medios para controlar el recuento de columnas. Esto es definitivamente NO una solución a prueba de balas. Sin embargo, si está creando el diseño y controla la ubicación y el alcance del elemento contenedor de columna, puede controle el recuento de columnas de forma bastante fiable. Si esto es para un widget que está fuera de su control, de hecho necesitará implementar una solución basada en Javascript.

Enlaces de referencia: Columnas CSS responsivas, Diseño de cuadrícula CSS

EDIT: Después de leer su pregunta de nuevo y mirar su ejemplo de captura de pantalla, parece que realmente está buscando una solución de cuadrícula CSS común donde los elementos fluyan horizontalmente y no verticalmente. Yo he actualizado mi respuesta es incluir un fragmento de demostración de esto donde los bloques vuelven a fluir horizontalmente.

Demostración de fragmentos con Consultas de medios basadas en columnas y Anchos de contenedor (ancho de columna mínimo aproximado de 10em):

#main, #sideBar {
    box-sizing:border-box;
    display:block;
    padding:0;
    margin:0;
    width:100%;
}

.container {
    width: 100%;
    min-width:10em;
    -webkit-columns: 1;
    -moz-columns: 1;
      columns: 1;
}
.container .item {
    display: block;
    padding: 8px;
    border: 1px solid rgb(216, 213, 213);
    box-sizing:border-box;
    -webkit-column-break-inside: avoid; /* Chrome, Safari, Opera */
          page-break-inside: avoid; /* Firefox */
               break-inside: avoid; /* IE 10+ */
}
@media only screen and (min-width:20em) {
    .container {
    -webkit-columns: 2;
    -moz-columns: 2;
      columns: 2;
    }
}

@media only screen and (min-width:32em) {
    #main {
        float:left;
        width:65%;
    }

    #sideBar {
        float:left;
        width:30%;
        margin-left:5%;
    }
    #sideBar .container {
    -webkit-columns: 1;
    -moz-columns: 1;
      columns: 1;
    }

}

@media only screen and (min-width:48em) {
    
    #main .container {
    -webkit-columns: 3;
    -moz-columns: 3;
      columns: 3;
    }

    #sideBar .container {
    -webkit-columns: 1;
    -moz-columns: 1;
      columns: 1;
    }

}

@media only screen and (min-width:52em) {
    
    #sideBar .container {
    -webkit-columns: 2;
    -moz-columns: 2;
      columns: 2;
    }

}

@media only screen and (min-width:100em) {
    
    #main .container {
    -webkit-columns: 5;
    -moz-columns: 5;
      columns: 5;
    }

    #sideBar .container {
    -webkit-columns: 3;
    -moz-columns: 3;
      columns: 3;
    }

}
<div id="main"><h1>#main</h1>
    <div class="container">
        <div class="item">Maudie Mcmanus</div>
        <div class="item">Remedios Arrington</div>
        <div class="item">Chaya B</div>
        <div class="item">Duncan</div>
        <div class="item">Lashonda Tatum Walls</div>
    </div>
</div>
<div id="sideBar"><h1>#sideBar</h1>
    <div class="container">
        <div class="item">Maudie Mcmanus</div>
        <div class="item">Remedios Arrington</div>
        <div class="item">Chaya B</div>
        <div class="item">Duncan</div>
        <div class="item">Lashonda Tatum Walls</div>
    </div>
</div>

EDITAR: Se ha añadido esta Demostración de fragmento utilizando un enfoque de cuadrícula CSS que re-fluye los bloques horizontalmente en lugar de verticalmente.

#main, #sideBar {
    box-sizing:border-box;
    display:block;
    padding:0;
    margin:0;
    width:100%;
    clear:left;
}

.container {
    width: 100%;
    min-width:10em;
}

.container .item {
    display: block;
    float:left;
    padding: .5em;
    border: 1px solid rgb(216, 213, 213);
    box-sizing:border-box;
    vertical-align: top;

}

@media only screen and (min-width:20em) {
    .container .item {
        margin: 0 1%;
        width:48%;
    }
}

@media only screen and (min-width:32em) {
    #main {
        float:left;
        width:65%;
    }

    #sideBar {
        float:left;
        clear:none;
        width:30%;
        margin-left:5%;
    }
    

    #sideBar .container .item {
        margin: 0;
        width:100%;
    }

}

@media only screen and (min-width:48em) {
    
    #main .container .item {
        width:31%;
    }

}

@media only screen and (min-width:52em) {
    
    #sideBar .container .item {
        margin: 0 1%;
        width:48%;
    }


}

@media only screen and (min-width:100em) {
    
    #main .container .item {
        width:18%;
    }

    #sideBar .container .item {
        width:31%;
    }

}
<div id="main"><h1>#main</h1>
    <div class="container">
        <div class="item">Maudie Mcmanus</div>
        <div class="item">Remedios Arrington</div>
        <div class="item">Chaya B</div>
        <div class="item">Duncan</div>
        <div class="item">Lashonda Tatum Walls</div>
    </div>
</div>
<div id="sideBar"><h1>#sideBar</h1>
    <div class="container">
        <div class="item">Maudie Mcmanus</div>
        <div class="item">Remedios Arrington</div>
        <div class="item">Chaya B</div>
        <div class="item">Duncan</div>
        <div class="item">Lashonda Tatum Walls</div>
    </div>
</div>
 4
Author: IMI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-19 14:46:51

Así como muchos otros lo señalaron aquí, no hay una única solución CSS. Principalmente porque CSS fue diseñado para ser cargado antes del contenido dom para que el contenido se muestre muy bien. Nuestro principal problema aquí es que NO conocemos el ancho del elemento de antemano, solo lo sabremos cuando la página se haya cargado. Casi todas las soluciones en la página tienen la misma idea, use Javascript para recorrer los elementos, encontrar el más ancho y establecer todos los demás elementos (con la misma clase) al ancho dado. A mejorar el proceso y para que sea una solución de una línea (con jquery, se puede hacer con Javascript, así, pero por simplicidad he utilizado jQuery), sugiero el siguiente "hack / trick":

1) No defina el ancho de su contenedor, y establezca la pantalla en tabla en lugar de bloque;

2) No establezca ningún ancho para los elementos dentro del div

Esto hará que los elementos tengan el mismo ancho y se muestren en una columna, por lo que cuando usamos jQuery para obtener el ancho máximo no necesitamos hacer un bucle a través de los elementos.

Ahora use jQuery para inyectar reglas CSS adicionales en el encabezado del documento para el contenedor y para los elementos. Necesitamos cambiar el tipo de pantalla del contenedor de nuevo a bloque en lugar de tabla, establecer su ancho a 400px (o lo que sea que necesitemos) y necesitamos hacer los elementos bloques en línea con un ancho establecido.

Dado que CSS siempre está aplicando la última propiedad, esto será bastante fácil:

$("<style> .container {display: block; width:400px;} .item-min {width:"+$(".item-min").width()+"px;display:inline-block;}</style>").appendTo("head");

He actualizado su ejemplo de Violinista AQUÍ

Tengo probado en IE 12, Edge, Chorme y Firefox y funciona en todos los navegadores.

EDITAR 1

Si no desea usar jQuery para mantener la página lo más ligera posible, también puede usar el siguiente Javascript de línea:

document.head.innerHTML += "<style> .container {display: block; width:400px;} .item-min {width:"+(document.getElementsByClassName("container")[0].clientWidth-16-2)+"px;display:inline-block;}</style>";

Explicación Rápida: container clientWidth incluirá el relleno y el borde de los elementos, ya que el relleno en el ejemplo original es 8px y el borde es 1px necesitamos deducirlo dos veces (una vez a la izquierda una vez a la derecha) del ancho del contenedor.

Ver actualizado Violín

EDITAR 2

Un documento HTML completo:

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <style type='text/css'>
    .container {

    display:table;
    table-layout:fixed;
}

.container .item-min {
    padding: 8px;
    border: 1px solid rgb(216, 213, 213);

}
  </style>


<script type='text/javascript'>
window.onload=function(){
document.head.innerHTML += "<style> .container {display: block; width:400px;} .item-min {width:"+(document.getElementsByClassName("container")[0].clientWidth-16-2)+"px;display:inline-block;}</style>";
}
</script>

</head>
<body>
      <div class="container">
        <div class="item-min">Maudie Mcmanus</div>
        <div class="item-min">Remedios Arrington</div>
        <div class="item-min">Chaya B</div>
        <div class="item-min">Duncan</div>
        <div class="item-min">Lashonda Tatum Walls</div>
    </div>


</body>

</html>
 2
Author: Emil Borconi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-26 14:06:40

En primer lugar - Echa un vistazo a la Demostración de Violín (juega con el ancho de .container...)

Esto no es posible solo usando CSS, pero aquí hay una solución elegante usando jquery, que detecta el ancho del contenedor, el ancho del elemento más ancho y distribuye los elementos en el número relevante de columnas (creadas dinámicamente).

HTML

<p>Without width:
    <div class="container">
        <div class="item">Maudie Mcmanus</div>
        <div class="item">Remedios Arrington</div>
        <div class="item">Chaya B</div>
        <div class="item">Duncan</div>
        <div class="item">Lashonda Tatum Walls</div>
    </div>
</p>

Javascript

$(function(){
    var $items = $('.item');

    // detect the widest column's width
    var widestItemWidth = 0;
    $items.each(function(){
        widestItemWidth = Math.max(widestItemWidth, $(this).width());
    });

    // calculate the number of columns
    var $container = $('.container');
    var containerWidth = $container.width();
    var numOfColumns = parseInt(containerWidth / widestItemWidth);

    // create the columns
    for(var i = 0; i < numOfColumns; i++){
        $container.prepend('<div class="column"></div>');
    }
    var $columns = $('.column');
    $columns.css('width', (100/numOfColumns)+'%');

    // spread the items between the columns
    $items.each(function(i){
        var columnIndex = i % numOfColumns;
        $(this).appendTo($columns.eq(columnIndex));
    });
});

CSS

.container {
    width: 400px;
}
.container .column {
    display: inline-block;
    box-sizing: border-box;
    vertical-align: text-top;
}
.container .item {
    display: inline-block;
    padding: 8px;
    border: 1px solid rgb(216, 213, 213);
}
 1
Author: Ronen Cypis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-24 13:25:45

Lo más fácil parecería establecer width en 32% más clear:none para todas las columnas y una clase clear:both separada por cada tercera (última) columna. Agregue consultas de medios para abordar diferentes tamaños de pantalla y establecer el ancho en consecuencia, por ejemplo, 24%, 48%, etc.

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-20 21:25:20

Prueba este ejemplo

@media only screen and (device-width : 300px) {#container {width:300px; display:block;}}
@media only screen and (device-width : 150px) {#container {width:150px; display:block; float:left}}
@media only screen and (device-width : 100px) {#container {width:150px; display:block; float:left}}
 0
Author: Stalin Rex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-23 18:01:43