Wenn css3 eine Option ist, kann dies mit der CSS-Funktion calc()
erfolgen.
Fall 1: Rechtfertigung von Boxen in einer einzigen Zeile ( FIDDLE )
Das Markup ist einfach - eine Gruppe von divs mit einem Container-Element.
Der CSS-Code sieht folgendermaßen aus:
div
{
height: 100px;
float: left;
background:pink;
width: 50px;
margin-right: calc((100% - 300px) / 5 - 1px);
}
div:last-child
{
margin-right:0;
}
wobei -1px einen IE9+ Calc/Rundungsfehler behebt - siehe hier
Fall 2: Rechtfertigung von Boxen in mehreren Zeilen ( FIDDLE )
Hier sind neben der calc()
-Funktion auch Medienabfragen
erforderlich.
Die Grundidee besteht darin, für jeden #columns-Zustand eine Medienabfrage einzurichten, in der ich dann calc() verwende, um den rechten Rand auf jedem der Elemente zu berechnen (außer den Elementen in der letzten Spalte).
Das klingt nach viel Arbeit, aber wenn Sie LESS oder SASS verwenden, kann dies recht einfach erledigt werden
(Es kann auch mit normalem CSS gemacht werden, aber dann müssen Sie alle Berechnungen manuell durchführen, und wenn Sie die Breite des Kastens ändern - müssen Sie alles erneut berechnen)
Nachfolgend ein Beispiel für LESS: (Sie können diesen Code kopieren/einfügen hier, um damit zu spielen, [es ist auch der Code, den ich verwendet habe, um die oben genannte fiddle zu generieren])
@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;
}
}
Grundsätzlich müssen Sie zunächst eine Kastenbreite und einen Mindestabstand festlegen, den Sie zwischen den Kästen haben möchten.
Damit können Sie ausrechnen, wie viel Platz Sie für jeden Zustand benötigen.
Verwenden Sie dann calc(), um den richtigen Rand zu berechnen, und nth-child, um den rechten Rand von den Kästen in der letzten Spalte zu entfernen.
Der Vorteil dieser Antwort gegenüber der akzeptierten Antwort, die text-align:justify
verwendet, besteht darin, dass bei mehr als einer Reihe von Kästen die Kästen in der letzten Reihe nicht 'gerechtfertigt' werden, d.h. Wenn noch 2 Kästen in der letzten Reihe verbleiben - möchte ich nicht, dass der erste Kasten links und der nächste rechts ist - sondern dass die Kästen in der Reihenfolge folgen.
Hinsichtlich Browserunterstützung: Dies funktioniert auf IE9+, Firefox, Chrome, Safari6.0+ - (siehe hier für weitere Details) Ich habe jedoch festgestellt, dass auf IE9+ ein kleiner Fehler zwischen Medienabfragezuständen vorhanden ist. [Wenn jemand weiß, wie man dies beheben kann, würde ich das wirklich gerne wissen :) ] <-- HIER BEHOBEN HIER