Szerokość płynu z równomiernie rozmieszczonymi Div-ami

Mam pojemnik o szerokości płynu DIV.

W tym mam 4 divy wszystkie 300px x 250px...

<div id="container">
   <div class="box1"> </div>
   <div class="box2"> </div>
   <div class="box3"> </div>
   <div class="box4"> </div>
</div>

Chcę, aby pole 1 było płynne w lewo, pole 4 było płynne w prawo, a Pola 2 i 3 były rozmieszczone równomiernie między nimi. Chcę, aby odstępy były płynne, tak jak przeglądarka jest mniejsza, przestrzeń staje się również mniejsza.

Tutaj wpisz opis obrazka

Author: pnuts, 2011-07-29

7 answers

Zobacz też: http://jsfiddle.net/thirtydot/EDp8R/

  • to działa w IE6+ i wszystkich nowoczesnych przeglądarkach!
  • Zmniejszyłem Twoje wymiary o połowę, żeby ułatwić pracę.
  • text-align: justify w połączeniu z .stretch zajmuje się pozycjonowaniem.
  • display:inline-block; *display:inline; zoom:1 poprawki inline-block dla IE6/7, zobacz tutaj .
  • font-size: 0; line-height: 0 Naprawiono drobny problem w IE6.

#container {
  border: 2px dashed #444;
  height: 125px;
  text-align: justify;
  -ms-text-justify: distribute-all-lines;
  text-justify: distribute-all-lines;
  /* just for demo */
  min-width: 612px;
}

.box1,
.box2,
.box3,
.box4 {
  width: 150px;
  height: 125px;
  vertical-align: top;
  display: inline-block;
  *display: inline;
  zoom: 1
}

.stretch {
  width: 100%;
  display: inline-block;
  font-size: 0;
  line-height: 0
}

.box1,
.box3 {
  background: #ccc
}

.box2,
.box4 {
  background: #0ff
}
<div id="container">
  <div class="box1"></div>
  <div class="box2"></div>
  <div class="box3"></div>
  <div class="box4"></div>
  <span class="stretch"></span>
</div>

The extra span (.stretch) może być zastąpiony przez :after.

To nadal działa we wszystkich tych samych przeglądarkach, co powyższe rozwiązanie. :after nie działa w IE6 / 7, ale i tak używają distribute-all-lines, więc to nie ma znaczenia.

Zobacz też: http://jsfiddle.net/thirtydot/EDp8R/3/

Jest mały minus :after: aby ostatni wiersz działał idealnie w Safari, musisz uważać na białe znaki w HTML.

Konkretnie, to nie praca:

<div id="container">
    ..
    <div class="box3"></div>
    <div class="box4"></div>
</div>

A to robi:

<div id="container">
    ..
    <div class="box3"></div>
    <div class="box4"></div></div>

Możesz użyć tego dla dowolnej liczby Potomków divS bez dodawania klasy boxN do każdej z nich zmieniając

.box1, .box2, .box3, .box4 { ...

Do

#container > div { ...

To wybiera dowolny div, który jest pierwszym dzieckiem #container div, a nie inne poniżej niego. Aby uogólnić kolory tła, możesz użyć selektora CSS3 nth-order selector , chociaż jest on obsługiwany tylko w IE9 + i innych nowoczesnych przeglądarki:

.box1, .box3 { ...

Staje się:

#container > div:nth-child(odd) { ...

Zobacz tutaj dla przykładu jsfiddle.

 429
Author: thirtydot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-10 04:27:26

Najprostszym sposobem na to jest teraz flexbox:

Http://css-tricks.com/snippets/css/a-guide-to-flexbox/

CSS jest wtedy po prostu:

#container {
    display: flex;
    justify-content: space-between;
}

Demo: http://jsfiddle.net/QPrk3/

Jednak , jest to obecnie obsługiwane tylko przez stosunkowo najnowsze przeglądarki ( http://caniuse.com/flexbox ). Ponadto Specyfikacja układu flexbox zmieniła się kilka razy, więc możliwe jest pokrycie większej liczby przeglądarek, dodając dodatkowo starsza składnia:

Http://css-tricks.com/old-flexbox-and-new-flexbox/

Http://css-tricks.com/using-flexbox/

 121
Author: BYossarian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-31 13:14:27

Jeśli css3 jest opcją, można to zrobić za pomocą funkcji css calc().

Przypadek 1: uzasadnienie pola na jednej linii (} FIDDLE )

Znaczniki są proste - kilka div z jakimś elementem kontenera.

CSS wygląda tak:

div
{
    height: 100px;
    float: left;
    background:pink;
    width: 50px;
    margin-right: calc((100% - 300px) / 5 - 1px); 
}
div:last-child
{
    margin-right:0;
}

Gdzie -1px {[20] } aby naprawić błąd IE9 + calc / zaokrąglanie-zobacz proszę.

Przypadek 2: uzasadnianie pól na wielu liniach ( )

Tutaj, oprócz calc() Funkcja, media queries są niezbędne.

Podstawową ideą jest skonfigurowanie zapytania o media dla każdego stanu #columns, gdzie następnie używam calc () do ustalenia margin-right na każdym z elementów (z wyjątkiem tych w ostatniej kolumnie).

To brzmi 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 jeśli zmienisz szerokość pola-musisz work out everything again)

Poniżej znajduje się przykład użycia LESS: (możesz skopiować/wkleić ten kod proszę. aby się nim bawić, [jest to również kod, którego użyłem do wygenerowania wyżej wymienionych skrzypiec])

@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;
    }
}

Więc w zasadzie najpierw musisz zdecydować o szerokości pudełka i minimalnym marginesie, który chcesz między pudełkami.

Dzięki temu możesz określić, ile miejsca potrzebujesz dla każdego stanu.

Następnie użyj calc (), aby obliczyć prawy margines, a nth-child, aby usunąć prawy margines od pól w końcowej kolumnie.

Przewaga tej odpowiedzi nad zaakceptowaną odpowiedzią, która używa text-align:justify jest taka, że gdy masz więcej niż jeden rząd pól-Pola w ostatnim rzędzie nie są 'justowane' np: jeśli w ostatnim rzędzie pozostały 2 pola-nie chcę, aby pierwsze pole było po lewej, a następne po prawej-ale raczej, że pola następują po sobie w kolejności.

Odnośnie wsparcia przeglądarki : to będzie działać na IE9+, Firefox, Chrome, Safari6. 0+ - (zobacz proszę. Po Więcej Szczegółów) zauważyłem jednak, że na IE9+ jest trochę usterki między Stanami zapytań o media. [jeśli ktoś wie jak to naprawić to bardzo chciałbym wiedzieć :) ] HERE

 21
Author: Danield,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:28

Inne posty wspominały flexbox, ale jeśli potrzeba więcej niż jednego wiersza pozycji, właściwość flexbox space-between nie powiedzie się (patrz koniec postu)

Do tej pory, jedynym czystym rozwiązaniem dla tego jest

CSS Grid Layout Module (codepen demo )

W zasadzie odpowiedni kod niezbędny sprowadza się do tego:

ul {
  display: grid; /* (1) */
  grid-template-columns: repeat(auto-fit, 120px); /* (2) */
  grid-gap: 1rem; /* (3) */
  justify-content: space-between; /* (4) */
  align-content: flex-start; /* (5) */
}

1) Uczyń element kontenera kontenerem siatki

2) Ustaw siatkę z "auto" ilość kolumn-w razie potrzeby. Odbywa się to w przypadku układów responsywnych. Szerokość każdej kolumny będzie wynosić 120px. (Zwróć uwagę na użycie auto-fit (jak przystało na auto-fill), które (dla układu 1-rzędowego) zwija puste ścieżki do 0 - pozwalając elementom rozwinąć się, aby zająć pozostałą przestrzeń. (sprawdź To demo żeby zobaczyć o czym mówię)).

3) Ustaw szczeliny / rynny dla wierszy i kolumn siatki-tutaj, ponieważ chcesz' odstęp między ' układ-szczelina będzie rzeczywiście być minimalna Luka ponieważ będzie rosnąć w razie potrzeby.

4) i 5) - podobne do flexbox.

body {
  margin: 0;
}
ul {
  display: grid;
  grid-template-columns: repeat(auto-fit, 120px);
  grid-gap: 1rem;
  justify-content: space-between;
  align-content: flex-start;
  
  /* boring properties: */
  list-style: none;
  width: 90vw;
  height: 90vh;
  margin: 2vh auto;
  border: 5px solid green;
  padding: 0;
  overflow: auto;
}
li {
  background: tomato;
  height: 120px;
}
<ul>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
</ul>

Codepen demo (Zmień rozmiar, aby zobaczyć efekt)


Obsługa Przeglądarki - Caniuse

Obecnie obsługiwane przez Chrome (Blink), Firefox, Safari i Edge! ... z częściowym wsparciem ze strony IE (Zobacz ten post przez Rachel Andrew)


NB:

Flexbox ' S space-between właściwość działa świetnie dla jednego wiersza elementów, ale gdy zostanie zastosowana do kontenera flex, który zawija jego elementy - (z flex-wrap: wrap) - nie powiedzie się, ponieważ nie masz kontroli nad wyrównaniem ostatniego wiersza elementów; ostatni wiersz zawsze będzie uzasadniony (zwykle nie to, czego chcesz)

Aby zademonstrować:

body {
  margin: 0;
}
ul {
  
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
  align-content: flex-start;
  
  list-style: none;
  width: 90vw;
  height: 90vh;
  margin: 2vh auto;
  border: 5px solid green;
  padding: 0;
  overflow: auto;
  
}
li {
  background: tomato;
  width: 110px;
  height: 80px;
  margin-bottom: 1rem;
}
<ul>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
</ul>

Codepen (Resize to see what I ' m talking about)


Czytaj dalej CSS siatki:

 10
Author: Danield,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-20 09:54:07

W jQuery możesz skierować bezpośrednio na rodzica.

JEST TO PRZYDATNE, JEŚLI NIE WIESZ DOKŁADNIE, ILE DZIECI BĘDZIE Dodawane dynamicznie lub jeśli po prostu nie możesz ustalić ich liczby.

var tWidth=0;

$('.children').each(function(i,e){
tWidth += $(e).width();

///Example: If the Children have a padding-left of 10px;..
//You could do instead:
tWidth += ($(e).width()+10);

})
$('#parent').css('width',tWidth);

Pozwoli to parent rosnąć poziomo w miarę dodawania children.

UWAGA: zakłada się, że '.children' mają width i Height zbiór

Mam nadzieję, że to pomoże.
 1
Author: ErickBest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-04 11:12:55

Jeśli znasz liczbę elementów w "wierszu" i szerokość kontenera, możesz użyć selektora, aby dodać margines do elementów, które musisz wywołać.

Miałem rzędy trzech divów, które chciałem uzasadnić, więc użyłem:

.tile:nth-child(3n+2) { margin: 0 10px }

Dzięki temu środkowy div w każdym rzędzie ma margines, który wymusza 1. i 3. div na zewnętrznych krawędziach pojemnika

Świetnie nadaje się również do innych rzeczy, takich jak kolory tła granic itp

 1
Author: Dave Robertson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-20 23:30:47

To zadziałało dla mnie z 5 obrazami w różnych rozmiarach.

  1. Tworzenie kontenera div
  2. nieuporządkowana lista obrazów
  3. w css unordered musi być wyświetlany pionowo i bez punktorów
  4. Justify content of container div

Działa to z powodu justify-content: space-between, i znajduje się na liście, wyświetlanej poziomo.

On CSS

 #container {
            display: flex;
            justify-content: space-between;
 }
    #container ul li{ display:inline; list-style-type:none;
}

On html

<div id="container"> 
  <ul>  
        <li><img src="box1.png"><li>
        <li><img src="box2.png"><li>
        <li><img src="box3.png"><li>
        <li><img src="box4.png"><li>
        <li><img src="box5.png"><li>
    </ul>
</div>
 1
Author: Sebastián Brun Valiente,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-08 15:06:28