如何在一个 div 中将元素均匀地分布在彼此之间?

这是用来做菜单的。
例如,我有一个包含3个 span 的 div 元素,它们都有一些边距、 max-width 和 float (左或右)。
它的位置从左边开始,像这样:
[[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;
}
138313 次浏览

This is the quick and easy way to do it

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

Then adjust the width of the spans for the number you have.

Example: http://jsfiddle.net/jasongennaro/wvJxD/

In the 'old days' you'd use a table and your menu items would be evenly spaced without having to explicitly state the width for the number of items.

If it wasn't for IE 6 and 7 (if that is of concern) then you can do the same in 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;
}

Without having to adjust for the number of items.

Example without table-layout:fixed - the cells are evenly distributed across the full width, but they are not necessarily of equal size since their width is determined by their contents.

Example with table-layout:fixed - the cells are of equal size, regardless of their contents. (Thanks to @DavidHerse in comments for this addition.)

If you want the first and last menu elements to be left and right justified, then you can add the following CSS:

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

You can use justify.

This is similar to the other answers, except that the left and rightmost elements will be at the edges instead of being equally spaced - [a...b...c instead of .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>

One gotcha is that you must leave spaces in between each element. [See the fiddle.]

There are two reasons to set the menu items to inline-block:

  1. If the element is by default a block level item (such as an <li>) the display must be set to inline or inline-block to stay in the same line.
  2. If the element has more than one word (<span>click here</span>), each word will be distributed evenly when set to inline, but only the elements will be distributed when set to inline-block.

See the JSFiddle

EDIT:
Now that flexbox has wide support (all non-IE, and IE 10+), there is a "better way".
Assuming the same element structure as above, all you need is:

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

If you want the outer elements to be spaced as well, just switch space-between to space-around.
See the JSFiddle

If someone wants to try a slightly different approach, they can use 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;
}

Here is the fiddle: http://jsfiddle.net/ynemh3c2/ (Try adding/removing divs as well)

Here is where I learned about this: https://css-tricks.com/snippets/css/a-guide-to-flexbox/

justify-content: space-betweenanddisplay: flex is all we needed, but thanks to @Pratul for the inspiration!

Make all spans used inline-block elements. Create an empty stretch span with a 100% width beneath the list of spans containing the menu items. Next make the div containing the spans text-align: justified. This would then force the inline-block elements [your menu items] to evenly distribute.

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>

I have managed to do it with the following css combination:

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

.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>

You just need to display the div with id #menu as flex container like this:

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

I wanted the children to fill the container space evenly with a small gap around the edge, so I found this worked best:

#menu {
display: flex;
flex-flow: row nowrap;
gap: 5px;
background-color: #00FF00;
padding: 10px 0;
}


.menuitem {
background-color: #FF0000;
flex-grow: 1;
text-align: center;
}

Strong colors added just to show you the effect of the spacing and borders :-)