如何在div中彼此相邻均匀分布元素?


82

这是为了菜单。
例如,我有一个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财产
Marek Sebera 2011年

您能提供实际的代码吗?
Blazemonger'Aug

Answers:


93

在过去,您将使用表格,菜单项将均匀分布,而不必明确说明项数的宽度。

如果不是针对IE 6和IE 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

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>

一个陷阱是,您必须在每个元素之间保留空格。[看小提琴。]

将菜单项设置为inline-block的原因有两个:

  1. 如果默认情况下元素是块级项目(例如<li>),则必须将显示设置为inline或inline-block,以保持在同一行中。
  2. 如果元素具有多个单词(<span>click here</span>),则在设置为内联时,每个单词将平均分配,但在设置为内联块时,将仅分配元素。

参见JSFiddle

编辑:
现在,flexbox具有广泛的支持(所有非IE和IE 10+),这是一种“更好的方法”。
假设与上面相同的元素结构,您需要做的是:

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

如果您希望外部元素也间隔开,只需将“间隔”更改为“间隔”。
参见JSFiddle


22

如果有人想尝试稍微不同的方法,则可以使用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-到flexbox /


10

justify-content: space-betweendisplay: flex就是我们所需要的,但是感谢@Pratul的启发!


很酷的答案。提示:flex-wrap: wrap用于包装内容。
Suyash Gupta

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中的调整span为您拥有的编号。

示例:http//jsfiddle.net/jasongennaro/wvJxD/


如此...没有简单的方法可以自动调整宽度吗?
jurchiks 2011年

width: 33%;尽可能接近,但是它基于父容器,而不是子元素的数量。如果要根据子(跨度)元素进行调整,则可能需要使用JavaScript。
Shauna

对@Shauna。@jurchiks,您可以根据widths的数量自动计算spans,但这需要一些js。如果您的菜单不经常更改,则调整菜单width应该不会有问题。
詹森·詹纳罗

@ josh.trow。我整天都慢。
杰森·根纳罗

@Jason-已经做到了(PHP除外;对JS不够了解,也许有人可以教我如何做到这一点?)。看起来不错,但边距成为一个问题。
jurchiks 2011年



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

使所有跨度都使用内联块元素。在包含菜单项的跨度列表下方创建一个宽度为100%的空拉伸跨度。接下来,使包含范围的div成为text-align:对齐的。然后,这将强制内联块元素[您的菜单项]均匀分布。

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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.