Jeśli css3 jest opcją, można to zrobić za pomocą calc()
funkcji css .
Przypadek 1: Wyrównanie pól w jednym wierszu ( FIDDLE )
Znaczniki są proste - kilka div z pewnym elementem kontenera.
CSS wygląda następująco:
div
{
height: 100px;
float: left;
background:pink;
width: 50px;
margin-right: calc((100% - 300px) / 5 - 1px);
}
div:last-child
{
margin-right:0;
}
gdzie -1px, aby naprawić błąd obliczania / zaokrąglania IE9 + - patrz tutaj
Przypadek 2: Wyrównanie pól w wielu wierszach ( FIDDLE )
Tutaj oprócz calc()
funkcji media queries
są konieczne.
Podstawową ideą jest skonfigurowanie zapytania medialnego dla każdego stanu #kolumny, gdzie następnie używam calc () do opracowania marginesu po prawej stronie dla każdego elementu (oprócz tych w ostatniej kolumnie).
Brzmi to jak dużo pracy, ale jeśli używasz LESS lub SASS, można to zrobić dość łatwo
(Nadal można to zrobić za pomocą zwykłego css, ale wtedy będziesz musiał wykonać wszystkie obliczenia ręcznie, a następnie, jeśli zmienisz szerokość pudełka - musisz wszystko jeszcze raz wypracować)
Poniżej znajduje się przykład użycia LESS: (Możesz skopiować / wkleić ten kod tutaj, aby się nim bawić, [jest to również kod, którego użyłem do wygenerowania wyżej wspomnianego skrzypka])
@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;
}
}
Zasadniczo najpierw musisz wybrać szerokość pudełka i minimalny margines, jaki chcesz między nimi.
Dzięki temu możesz obliczyć, ile miejsca potrzebujesz na każdy stan.
Następnie użyj funkcji calc (), aby obliczyć prawy margines, a n-to dziecko, aby usunąć prawy margines z pól w ostatniej kolumnie.
Zaletą tego odpowiedź na odpowiedź przyjętą który wykorzystuje text-align:justify
to, że jeśli masz więcej niż jeden rząd skrzynek - pudełka na ostatnim rzędzie nie dostać „uzasadnione” np: Jeśli istnieją 2 pudełka pozostające w końcowym wierszu - I nie chcę, aby pierwsze pole znajdowało się po lewej stronie, a następne po prawej - ale raczej, aby pola następowały po sobie w kolejności.
Odnośnie obsługi przeglądarki : To będzie działać na IE9 +, Firefox, Chrome, Safari6.0 + - (zobacz tutaj, aby uzyskać więcej informacji) Jednak zauważyłem, że w IE9 + jest trochę usterki między stanami zapytań o media. [jeśli ktoś wie, jak to naprawić, naprawdę chciałbym wiedzieć :)] <- NAPRAWIONO TUTAJ
display:inline-block;
zamiast float?