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


83

Это предназначено для меню.
Например, у меня есть элемент div с 3 промежутками в нем, каждый из которых имеет некоторый запас, максимальную ширину и плавающий (левый или правый).
Он расположен, начиная с левой стороны, и выглядит так:
[[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
<span>не является блочным элементом, он не должен принимать widthсвойство
Марек Себера

Вы можете предоставить реальный код?
Blazemonger

Ответы:


96

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

Если бы это не было для 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;
}

3
При использовании этого метода клетки распределяются неравномерно. См. Jsfiddle.net/hcrzx . Средняя ячейка длиннее двух других.
Susam Pal

1
@Susam: Верно, ячейки не обязательно должны быть одинакового размера , поскольку ширина ячейки определяется ее содержимым (так же, как в таблице HTML). Тем не менее, я бы сказал, что их можно описать как равномерно распределенные , поскольку они равномерно (не обязательно одинаково) распределены по всей ширине родительского элемента в зависимости от их содержимого. Если вам нужны ячейки одинакового размера, независимо от их содержимого, держу пари, вам понадобится скриптовое решение.
MrWhite 07

50

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

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

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

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

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

См. JSFiddle

РЕДАКТИРОВАТЬ:
Теперь, когда flexbox имеет широкую поддержку (все не IE и IE 10+), есть «лучший способ».
При той же структуре элементов, что и выше, все, что вам нужно, это:

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

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


23

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

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


10

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


Классный ответ. Совет: используйте, flex-wrap: wrapчтобы обернуть содержимое.
Суяш Гупта

8

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

<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из spanS для числа у вас есть.

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


1
ооочень ... нет простого способа просто автоматически регулировать ширину?
jurchiks

width: 33%;примерно настолько близок, насколько это возможно, но он основан на родительском контейнере, а не на количестве дочерних элементов. Если вы хотите, чтобы он настраивался на основе дочерних элементов (диапазона), вам, вероятно, придется поиграть с JavaScript.
Шона

правильно @Shauna. @jurchiks, вы можете автоматически вычислить widths на основе количества spans, но для этого потребуется несколько js. Если ваше меню не меняется часто, настройка widthне должна быть проблемой.
Джейсон Дженнаро

@ josh.trow. Весь день для меня это было медленным.
Джейсон Дженнаро

@Jason - уже сделал это (кроме PHP; недостаточно хорошо знаю JS, может быть, кто-нибудь научит меня, как это делать?). Выглядит нормально, но поля становятся проблемой.
jurchiks

1

Вам просто нужно отобразить div с идентификатором #menuкак гибкий контейнер следующим образом:

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

0

Мне удалось это сделать с помощью следующей комбинации 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

Сделайте все пролеты используемыми inline-block элементами. Создайте пустой участок растяжения шириной 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>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.