Se css3 è un'opzione, questo può essere fatto usando la calc()
funzione css .
Caso 1: giustificare le caselle su una sola riga ( FIDDLE )
Il markup è semplice: un gruppo di div con qualche elemento contenitore.
CSS assomiglia a questo:
div
{
height: 100px;
float: left;
background:pink;
width: 50px;
margin-right: calc((100% - 300px) / 5 - 1px);
}
div:last-child
{
margin-right:0;
}
dove -1px per correggere un bug di IE9 + calc / rounding - vedi qui
Caso 2: giustificazione di caselle su più righe ( FIDDLE )
Qui, oltre alla calc()
funzione, media queries
sono necessari.
L'idea di base è quella di impostare una media query per ogni stato #columns, dove uso quindi calc () per calcolare il margine destro su ciascuno degli elementi (eccetto quelli nell'ultima colonna).
Sembra un sacco di lavoro, ma se stai usando LESS o SASS questo può essere fatto abbastanza facilmente
(Può ancora essere fatto con i normali CSS, ma poi dovrai fare tutti i calcoli manualmente, e quindi se cambi la larghezza della tua scatola, devi elaborare di nuovo tutto)
Di seguito è riportato un esempio usando MENO: (Puoi copiare / incollare questo codice qui per giocarci, [è anche il codice che ho usato per generare il violino sopra menzionato])
@min-margin: 15px;
@div-width: 150px;
@3divs: (@div-width * 3);
@4divs: (@div-width * 4);
@5divs: (@div-width * 5);
@6divs: (@div-width * 6);
@7divs: (@div-width * 7);
@3divs-width: (@3divs + @min-margin * 2);
@4divs-width: (@4divs + @min-margin * 3);
@5divs-width: (@5divs + @min-margin * 4);
@6divs-width: (@6divs + @min-margin * 5);
@7divs-width: (@7divs + @min-margin * 6);
*{margin:0;padding:0;}
.container
{
overflow: auto;
display: block;
min-width: @3divs-width;
}
.container > div
{
margin-bottom: 20px;
width: @div-width;
height: 100px;
background: blue;
float:left;
color: #fff;
text-align: center;
}
@media (max-width: @3divs-width) {
.container > div {
margin-right: @min-margin;
}
.container > div:nth-child(3n) {
margin-right: 0;
}
}
@media (min-width: @3divs-width) and (max-width: @4divs-width) {
.container > div {
margin-right: ~"calc((100% - @{3divs})/2 - 1px)";
}
.container > div:nth-child(3n) {
margin-right: 0;
}
}
@media (min-width: @4divs-width) and (max-width: @5divs-width) {
.container > div {
margin-right: ~"calc((100% - @{4divs})/3 - 1px)";
}
.container > div:nth-child(4n) {
margin-right: 0;
}
}
@media (min-width: @5divs-width) and (max-width: @6divs-width) {
.container > div {
margin-right: ~"calc((100% - @{5divs})/4 - 1px)";
}
.container > div:nth-child(5n) {
margin-right: 0;
}
}
@media (min-width: @6divs-width){
.container > div {
margin-right: ~"calc((100% - @{6divs})/5 - 1px)";
}
.container > div:nth-child(6n) {
margin-right: 0;
}
}
Quindi, in sostanza, devi prima decidere una larghezza della scatola e un margine minimo che desideri tra le scatole.
Con ciò, puoi capire di quanto spazio hai bisogno per ogni stato.
Quindi, utilizza calc () per calcolare il margine destro e nth-child per rimuovere il margine destro dalle caselle nella colonna finale.
Il vantaggio di questa risposta rispetto alla risposta accettata che utilizza text-align:justify
è che quando si dispone di più di una riga di caselle - le caselle nell'ultima riga non vengono "giustificate", ad esempio: se sono rimaste 2 caselle nell'ultima riga - I non voglio che la prima casella sia a sinistra e la successiva a destra, ma piuttosto che le caselle si susseguano in ordine.
Per quanto riguarda il supporto del browser : questo funzionerà su IE9 +, Firefox, Chrome, Safari6.0 + - (vedi qui per maggiori dettagli) Tuttavia ho notato che su IE9 + c'è un piccolo problema tra gli stati delle query multimediali. [se qualcuno sa come risolvere questo mi piacerebbe davvero saperlo :)] <- RISOLTO QUI
display:inline-block;
invece di float?