jak równomiernie rozmieścić elementy w div obok siebie?


83

To jest przeznaczone do menu.
Na przykład mam element div z 3 rozpiętościami, z których wszystkie mają margines, maksymalną szerokość i zmiennoprzecinkowe (lewe lub prawe).
Jest ustawiony zaczynając od lewej strony i wygląda tak:
[[span1][span2][span3] - lots of free space here].
Chcę wyrównać to w następujący
[[span1] - space - [span2] - space - [span3]]
sposób : Jak mogę to zrobić za pomocą CSS? Trochę wątpię, że to niemożliwe.
Zwróć uwagę, że chcę, aby zachowywał ten sam styl podczas dodawania lub usuwania pozycji menu.
HTML:

<div id="menu">
    <span class="menuitem"></span>
    <span class="menuitem"></span>
    <span class="menuitem"></span>
</div>

CSS:

#menu {
    ...
    width:800px;
}
.menuitem {
    display:block;
    float:left;
    margin-left:25px;
    position:relative;
    min-height:35px;
    max-width:125px;
    padding-bottom:10px;
    text-align:center;
}

1
<span>nie jest elementem blokowym, nie powinien przyjmować widthwłasności
Marek Sebera

Czy możesz podać rzeczywisty kod?
Blazemonger

Odpowiedzi:


95

W „dawnych czasach” używałbyś tabeli, a pozycje menu byłyby równomiernie rozmieszczone bez konieczności jawnego określania szerokości dla liczby pozycji.

Gdyby nie IE 6 i 7 (jeśli to dotyczy), możesz zrobić to samo w CSS.

<div class="demo">
    <span>Span 1</span>
    <span>Span 2</span>
    <span>Span 3</span>
</div>

CSS:

div.demo {
    display: table;
    width: 100%;
    table-layout: fixed;    /* For cells of equal size */
}
div.demo span {
    display: table-cell;
    text-align: center;
}

Bez konieczności dostosowywania się do liczby przedmiotów.

Przykład bez table-layout:fixed- komórki są równomiernie rozmieszczone na całej szerokości, ale niekoniecznie mają taki sam rozmiar, ponieważ ich szerokość jest określana przez zawartość.

Przykład z table-layout:fixed- komórki mają ten sam rozmiar, niezależnie od ich zawartości. (Podziękowania dla @DavidHerse w komentarzach za ten dodatek).

Jeśli chcesz, aby pierwszy i ostatni element menu był wyrównany do lewej i prawej strony, możesz dodać następujący arkusz CSS:

div.demo span:first-child {
    text-align: left;
}
div.demo span:last-child {
    text-align: right;
}

3
Dzięki tej metodzie komórki nie są równomiernie rozmieszczone. Zobacz jsfiddle.net/hcrzx . Środkowa komórka jest dłuższa niż pozostałe dwie komórki.
Susam Pal

1
@Susam: Prawda, komórki niekoniecznie mają taki sam rozmiar , ponieważ szerokość komórki jest określana przez jej zawartość (tak samo jak w przypadku tabeli HTML). Jednak nadal powiedziałbym, że można je opisać jako równomiernie rozmieszczone , ponieważ są one równomiernie rozmieszczone (niekoniecznie równo) na całej szerokości elementu nadrzędnego, w oparciu o ich zawartość. Jeśli chcesz mieć komórki tego samego rozmiaru, niezależnie od ich zawartości, to założę się, że potrzebujesz rozwiązania skryptowego.
MrWhite,

50

Możesz użyć uzasadnienia.

Jest to podobne do innych odpowiedzi, z tą różnicą, że lewy i skrajny prawy element będą na krawędziach, a nie w równych odstępach - [a ... b ... c zamiast .a..b..c.]

<div class="menu">
    <span>1</span>
    <span>2</span>
    <span>3</span>
</div>

<style>
.menu {text-align:justify;}
.menu:after { content:' '; display:inline-block; width: 100%; height: 0 }
.menu > span {display:inline-block} 
</style>

Jedna trudność polega na tym, że musisz zostawić spacje między każdym elementem. [Zobacz skrzypce].

Istnieją dwa powody, dla których warto ustawić pozycje menu na blokowanie inline:

  1. Jeśli element jest domyślnie elementem na poziomie bloku (takim jak a <li>), wyświetlanie musi być ustawione na inline lub inline-block, aby pozostać w tym samym wierszu.
  2. Jeśli element ma więcej niż jedno słowo ( <span>click here</span>), każde słowo zostanie rozdzielone równomiernie, gdy zostanie ustawione na inline, ale tylko elementy zostaną rozłożone, gdy zostanie ustawione na inline-block.

Zobacz JSFiddle

EDYCJA:
Teraz, gdy flexbox ma szerokie wsparcie (wszystkie nie-IE i IE 10+), jest „lepszy sposób”.
Zakładając taką samą strukturę elementów jak powyżej, wystarczy:

<style>
    .menu { display: flex; justify-content: space-between; }
</style>

Jeśli chcesz, aby elementy zewnętrzne również były rozmieszczone, po prostu zmień spację między na przestrzeń wokół.
Zobacz JSFiddle


23

Jeśli ktoś chce spróbować nieco innego podejścia, może skorzystać z FLEX.

HTML

<div class="test">
    <div>Div 1</div>
    <div>Div 2</div>
    <div>Div 3</div>
    <div>Div 4</div>
</div>

CSS

.test {
    display: flex;
    flex-flow: row wrap;
    justify-content: space-around;
}
.test > div {
    margin-top: 10px;
    padding: 20px;
    background-color: #FF0000;
}

Oto skrzypce: http://jsfiddle.net/ynemh3c2/ (Spróbuj również dodać / usunąć elementy div)

Tutaj dowiedziałem się o tym: https://css-tricks.com/snippets/css/a-guide- do-flexbox /


10

justify-content: space-betweeni display: flexto wszystko, czego potrzebowaliśmy, ale dzięki @Pratul za inspirację!


Fajna odpowiedź. Wskazówka: użyj, flex-wrap: wrapaby zawinąć zawartość.
Suyash Gupta

8

To szybki i łatwy sposób na zrobienie tego

<div>
    <span>Span 1</span>
    <span>Span 2</span>
    <span>Span 3</span>
</div>

css

div{
    width:100%;
}
span{
    display:inline-block;    
    width:33%;
    text-align:center;
}

Następnie dostosuj widthzspan s do liczby masz.

Przykład: http://jsfiddle.net/jasongennaro/wvJxD/


1
sooo ... nie ma łatwego sposobu na automatyczne dostosowanie szerokości?
jurchiks

width: 33%;jest tak blisko, jak to tylko możliwe, ale opiera się na kontenerze nadrzędnym, a nie na liczbie elementów podrzędnych. Jeśli chcesz, aby dostosowywał się na podstawie elementów potomnych (rozpiętości), prawdopodobnie będziesz musiał pobawić się JavaScript.
Shauna

prawo @Shauna. @jurchiks, możesz automatycznie obliczyć widths na podstawie liczby spans, ale wymagałoby to trochę js. Jeśli twoje menu nie zmienia się często, regulacja widthnie powinna stanowić problemu.
Jason Gennaro

@ josh.trow. Przez cały dzień było mi wolno.
Jason Gennaro

@Jason - już to zrobiłem (z wyjątkiem PHP; nie znasz wystarczająco dobrze JS, może ktoś może mnie tego nauczyć?). Wygląda dobrze, ale problemem stają się marginesy.
jurchiks

1

Wystarczy wyświetlić div z id #menujako kontener elastyczny w następujący sposób:

#menu{
    width: 800px;
    display: flex;
    justify-content: space-between;
}

0

Udało mi się to zrobić z następującą kombinacją CSS:

text-align: justify;
text-align-last: justify;
text-justify: inter-word;

0

.container {
  padding: 10px;
}
.parent {
  width: 100%;
  background: #7b7b7b;
  display: flex;
  justify-content: space-between;
  height: 4px;
}
.child {
  color: #fff;
  background: green;
  padding: 10px 10px;
  border-radius: 50%;
  position: relative;
  top: -8px;
}
<div class="container">
  <div class="parent">
    <span class="child"></span>
    <span class="child"></span>
    <span class="child"></span>
    <span class="child"></span>
    <span class="child"></span>
    <span class="child"></span>
    <span class="child"></span>
    <span class="child"></span>
    <span class="child"></span>
    <span class="child"></span>
  </div>
</div>


-1

Wykonaj wszystkie rozpiętości używane w elementach blokowych. Utwórz pusty zakres rozciągania o szerokości 100% poniżej listy rozpiętości zawierającej elementy menu. Następnie ustaw element div zawierający spansy na tekst: wyjustowany. To zmusiłoby elementy inline-block [elementy menu] do równomiernego rozmieszczenia.

https://jsfiddle.net/freedawirl/bh0eadzz/3/

  <div id="container">

          <div class="social">
            <a href="#" target="_blank" aria-label="facebook-link">
            <img src="http://placehold.it/40x40">
            </a>
            <a href="#" target="_blank" aria-label="twitter-link">
                <img src="http://placehold.it/40x40">
            </a>
            <a href="#" target="_blank" aria-label="youtube-link">
                <img src="http://placehold.it/40x40">
            </a>
            <a href="#" target="_blank" aria-label="pinterest-link">
                 <img src="http://placehold.it/40x40">
            </a>
            <a href="#" target="_blank" aria-label="snapchat-link">
                <img src="http://placehold.it/40x40">
            </a>
            <a href="#" target="_blank" aria-label="blog-link">
                 <img src="http://placehold.it/40x40">
            </a>

            <a href="#" aria-label="phone-link">
                 <img src="http://placehold.it/40x40">
            </a>
            <span class="stretch"></span>
          </div>
             </div>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.