Как равномерно распределять элементы в div рядом друг с другом?

Это предназначено для меню.
Например, у меня есть элемент div с тремя пролетами в нем, все из которых имеют некоторый запас, максимальную ширину и поплавок (влево или вправо).
Он позиционируется с левой стороны и выглядит следующим образом:
[[span1][span2][span3] - lots of free space here].
Я хочу сделать это так: [[span1] - space - [span2] - space - [span3]]
Как это сделать с помощью CSS? Я сомневаюсь, что это невозможно.
Обратите внимание, что я хочу, чтобы он сохранял тот же стиль, когда я добавляю или удаляю элемент меню.
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

В "старые дни" вы должны использовать таблицу, и ваши пункты меню будут равномерно распределены без явного указания ширины для количества элементов.

Если это не для IE 6 и 7 (если это вызывает беспокойство), вы можете сделать то же самое в 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;
}

Без необходимости корректировать количество элементов.

Пример без table-layout:fixed - ячейки равномерно распределены по всей ширине, но они не обязательно имеют одинаковый размер, так как их ширина определяется их содержимым.

Пример с table-layout:fixed - ячейки имеют одинаковый размер независимо от их содержимого. (Спасибо @DavidHerse в комментариях для этого добавления.)

Если вы хотите, чтобы первый и последний элементы меню были левыми и правыми, вы можете добавить следующий CSS:

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

Ответ 2

Вы можете использовать выравнивание.

Это похоже на другие ответы, за исключением того, что левый и правый элементы будут располагаться по краям, а не равномерно - [a... b... c вместо .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>

Один из них - это то, что вы должны оставлять пробелы между каждым элементом. [См. Скрипку.]

Есть две причины для установки элементов меню в встроенный блок:

  • Если элемент по умолчанию является элементом уровня блока (например, <li>), дисплей должен быть установлен на встроенный или встроенный блок, чтобы оставаться в одной строке.
  • Если элемент имеет более одного слова (<span>click here</span>), каждое слово будет равномерно распределено при установке в строку, но только элементы будут распределены при установке в встроенный блок.

См. JSFiddle

EDIT:
Теперь, когда flexbox имеет широкую поддержку (все не IE и IE 10+), есть "лучший способ".
Предполагая ту же структуру элементов, что и выше, все, что вам нужно, это:

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

Если вы хотите, чтобы внешние элементы также были расположены на расстоянии, просто переключите пространство между пространством и вокруг. См. JSFiddle

Ответ 3

Если кто-то хочет попробовать немного другой подход, он может использовать 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;
}

Вот скрипка: http://jsfiddle.net/ynemh3c2/ (попробуйте добавить/удалить divs)

Здесь я узнал об этом: https://css-tricks.com/snippets/css/a-guide-to-flexbox/

Ответ 4

Это быстрый и простой способ сделать это

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

Затем отрегулируйте width для span для вашего номера.

Пример: http://jsfiddle.net/jasongennaro/wvJxD/

Ответ 5

justify-content: space-between и display: flex - это все, что нам нужно, но благодаря @Pratul для вдохновения!

Ответ 6

Сделать все пролеты используемыми элементами встроенного блока. Создайте пустой диапазон растяжения со 100% шириной под списком пролетов, содержащих пункты меню. Затем сделайте div, содержащий пробелы text-align: justified. Это заставит элементы встроенного блока [ваши пункты меню] равномерно распределять.

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>