340

我有一个流体宽度容器 DIV。

在这里面我有 4 个 DIV,都是 300px x 250px ......

<div id="container">
   <div class="box1"> </div>
   <div class="box2"> </div>
   <div class="box3"> </div>
   <div class="box4"> </div>
</div>

我想要发生的是框 1 向左浮动,框 4 向右浮动,框 2 和 3 在它们之间均匀间隔。我希望间距也是流畅的,以便浏览器变得更小,空间也变得更小。

在此处输入图像描述

4

7 回答 7

445

见:http: //jsfiddle.net/thirtydot/EDp8R/

  • 这适用于IE6+ 和所有现代浏览器!
  • 我将您要求的尺寸减半只是为了更容易使用。
  • text-align: justify结合.stretch是处理定位的内容。
  • display:inline-block; *display:inline; zoom:1inline-blockIE6/7 的修复程序,请参见此处
  • font-size: 0; line-height: 0修复了 IE6 中的一个小问题。

#container {
  border: 2px dashed #444;
  height: 125px;
  text-align: justify;
  -ms-text-justify: distribute-all-lines;
  text-justify: distribute-all-lines;
  /* just for demo */
  min-width: 612px;
}

.box1,
.box2,
.box3,
.box4 {
  width: 150px;
  height: 125px;
  vertical-align: top;
  display: inline-block;
  *display: inline;
  zoom: 1
}

.stretch {
  width: 100%;
  display: inline-block;
  font-size: 0;
  line-height: 0
}

.box1,
.box3 {
  background: #ccc
}

.box2,
.box4 {
  background: #0ff
}
<div id="container">
  <div class="box1"></div>
  <div class="box2"></div>
  <div class="box3"></div>
  <div class="box4"></div>
  <span class="stretch"></span>
</div>

多余的span( .stretch) 可以替换为:after.

仍然适用于与上述解决方案相同的所有浏览器。:after在 IE6/7 中不起作用,但distribute-all-lines无论如何它们都在使用,所以没关系。

见:http: //jsfiddle.net/thirtydot/EDp8R/3/

有一个小缺点:after:要使最后一行在 Safari 中完美运行,您必须小心 HTML 中的空格。

具体来说,这不起作用:

<div id="container">
    ..
    <div class="box3"></div>
    <div class="box4"></div>
</div>

这确实:

<div id="container">
    ..
    <div class="box3"></div>
    <div class="box4"></div></div>

您可以将其用于任意数量的 child ,而无需通过更改为每个子div添加一个类boxN

.box1, .box2, .box3, .box4 { ...

#container > div { ...

这将选择作为 div 的第一个子项的任何#containerdiv,并且在它下面没有其他子项。为了概括背景颜色,您可以使用CSS3 nth-order selector,尽管它仅在 IE9+ 和其他现代浏览器中受支持:

.box1, .box3 { ...

变成:

#container > div:nth-child(odd) { ...

有关 jsfiddle 示例,请参见此处

于 2011-07-30T01:06:54.770 回答
155

现在最简单的方法是使用 flexbox:

http://css-tricks.com/snippets/css/a-guide-to-flexbox/

然后CSS很简单:

#container {
    display: flex;
    justify-content: space-between;
}

演示:http: //jsfiddle.net/QPrk3/

但是,目前只有相对较新的浏览器 ( http://caniuse.com/flexbox ) 支持。此外,flexbox 布局的规范已经更改了几次,因此可以通过另外包含旧语法来覆盖更多浏览器:

http://css-tricks.com/old-flexbox-and-new-flexbox/

http://css-tricks.com/using-flexbox/

于 2014-03-15T11:52:03.120 回答
20

如果css3是一个选项,则可以使用 csscalc()函数来完成。

案例 1:在单行上对齐框(FIDDLE

标记很简单——一堆带有一些容器元素的 div。

CSS 看起来像这样:

div
{
    height: 100px;
    float: left;
    background:pink;
    width: 50px;
    margin-right: calc((100% - 300px) / 5 - 1px); 
}
div:last-child
{
    margin-right:0;
}

其中-1px可修复 IE9+ 计算/舍入错误 - 请参见此处

案例2:多行对齐框(FIDDLE

在这里,除了calc()功能之外,media queries都是必要的。

基本思想是为每个#columns 状态设置一个媒体查询,然后我使用 calc() 计算每个元素的边距(最后一列中的元素除外)。

这听起来像是很多工作,但如果你使用 LESS 或 SASS,这可以很容易地完成

(它仍然可以使用常规 css 完成,但是您必须手动进行所有计算,然后如果您更改框宽度 - 您必须重新计算所有内容)

下面是一个使用LESS的例子:(你可以在这里复制/粘贴这段代码来玩,[这也是我用来生成上述小提琴的代码])

@min-margin: 15px;
@div-width: 150px;

@3divs: (@div-width * 3);
@4divs: (@div-width * 4);
@5divs: (@div-width * 5);
@6divs: (@div-width * 6);
@7divs: (@div-width * 7);

@3divs-width: (@3divs + @min-margin * 2);
@4divs-width: (@4divs + @min-margin * 3);
@5divs-width: (@5divs + @min-margin * 4);
@6divs-width: (@6divs + @min-margin * 5);
@7divs-width: (@7divs + @min-margin * 6);


*{margin:0;padding:0;}

.container
{
    overflow: auto;
    display: block;
    min-width: @3divs-width;
}
.container > div
{
    margin-bottom: 20px;
    width: @div-width;
    height: 100px;
    background: blue;
    float:left;
    color: #fff;
    text-align: center;
}

@media (max-width: @3divs-width) {
    .container > div {  
        margin-right: @min-margin;
    }
    .container > div:nth-child(3n) {  
        margin-right: 0;
    }
}

@media (min-width: @3divs-width) and (max-width: @4divs-width) {
    .container > div {  
        margin-right: ~"calc((100% - @{3divs})/2 - 1px)";
    }
    .container > div:nth-child(3n) {  
        margin-right: 0;
    }
}

@media (min-width: @4divs-width) and (max-width: @5divs-width) {
    .container > div {  
        margin-right: ~"calc((100% - @{4divs})/3 - 1px)";
    }
    .container > div:nth-child(4n) {  
        margin-right: 0;
    }
}

@media (min-width: @5divs-width) and (max-width: @6divs-width) {
    .container > div {  
        margin-right: ~"calc((100% - @{5divs})/4 - 1px)";
    }
    .container > div:nth-child(5n) {  
        margin-right: 0;
    }
}

@media (min-width: @6divs-width){
    .container > div {  
        margin-right: ~"calc((100% - @{6divs})/5 - 1px)";
    }
    .container > div:nth-child(6n) {  
        margin-right: 0;
    }
}

所以基本上你首先需要确定一个盒子宽度和你想要的盒子之间的最小边距。

这样,您就可以计算出每个州需要多少空间。

然后,使用 calc() 计算右边距,使用 nth-child 从最后一列的框中删除右边距。

这个答案相对于使用的公认答案的优势text-align:justify在于,当你有不止一排盒子时 - 最后一行的盒子不会“合理”,例如:如果最后一行还有 2 个盒子 - 我不希望第一个盒子在左边,下一个在右边——而是让盒子按顺序相互跟随。

关于浏览器支持:这将适用于 IE9+、Firefox、Chrome、Safari6.0+ - (有关详细信息,请参阅此处)但是我注意到在 IE9+ 上,媒体查询状态之间存在一些小故障。[如果有人知道如何解决这个问题,我真的很想知道 :) ] <--已修复

于 2013-04-30T22:30:59.097 回答
18

其他帖子都提到了 flexbox,但是如果需要多行项目,则 flexbox 的space-between属性失败(见帖子末尾)

迄今为止,唯一干净的解决方案是使用

CSS 网格布局模块Codepen 演示

基本上必要的相关代码归结为:

ul {
  display: grid; /* (1) */
  grid-template-columns: repeat(auto-fit, 120px); /* (2) */
  grid-gap: 1rem; /* (3) */
  justify-content: space-between; /* (4) */
  align-content: flex-start; /* (5) */
}

1)使容器元素成为网格容器

2)根据需要使用“自动”列数设置网格。这是为响应式布局完成的。每列的宽度为 120 像素。(注意使用auto-fit(as apposed to auto-fill) (对于 1 行布局)将空轨道折叠为 0 - 允许项目扩展以占用剩余空间。(查看此演示以了解我在说什么))。

3)为网格行和列设置间隙/排水沟 - 在这里,因为想要一个“间隔”布局 - 间隙实际上是最小间隙,因为它会根据需要增长。

4) 和 5) - 类似于 flexbox。

body {
  margin: 0;
}
ul {
  display: grid;
  grid-template-columns: repeat(auto-fit, 120px);
  grid-gap: 1rem;
  justify-content: space-between;
  align-content: flex-start;
  
  /* boring properties: */
  list-style: none;
  width: 90vw;
  height: 90vh;
  margin: 2vh auto;
  border: 5px solid green;
  padding: 0;
  overflow: auto;
}
li {
  background: tomato;
  height: 120px;
}
<ul>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
</ul>

Codepen demo(调整大小看效果)


浏览器支持 - Caniuse

目前受 Chrome (Blink)、Firefox、Safari 和 Edge 支持!...在 IE 的部分支持下(参见Rachel Andrew 的这篇文章)


注意:

Flexbox 的space-between属性适用于一行项目,但是当应用于包装它的项目的 flex 容器时 - (with flex-wrap: wrap) - 失败,因为您无法控制最后一行项目的对齐方式;最后一行总是合理的(通常不是你想要的)

展示:

body {
  margin: 0;
}
ul {
  
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
  align-content: flex-start;
  
  list-style: none;
  width: 90vw;
  height: 90vh;
  margin: 2vh auto;
  border: 5px solid green;
  padding: 0;
  overflow: auto;
  
}
li {
  background: tomato;
  width: 110px;
  height: 80px;
  margin-bottom: 1rem;
}
<ul>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
</ul>

Codepen(调整大小以查看我在说什么)


进一步阅读 CSS 网格:

于 2017-03-23T14:30:26.873 回答
2

这对我有用 5 张不同尺寸的图像。

  1. 创建一个容器 div
  2. 图像的无序列表
  3. 在 css 上,无序必须垂直显示并且没有项目符号
  4. 对齐容器 div 的内容

这是因为 justify-content:space-between,它在一个列表中,水平显示。

在 CSS 上

 #container {
            display: flex;
            justify-content: space-between;
 }
    #container ul li{ display:inline; list-style-type:none;
}

在 html 上

<div id="container"> 
  <ul>  
        <li><img src="box1.png"><li>
        <li><img src="box2.png"><li>
        <li><img src="box3.png"><li>
        <li><img src="box4.png"><li>
        <li><img src="box5.png"><li>
    </ul>
</div>
于 2015-12-24T19:46:19.610 回答
1

jQuery您可能直接针对父母。

如果您不知道究竟有多少孩子将被动态添加,或者如果您无法确定他们的数量,这将很有用。

var tWidth=0;

$('.children').each(function(i,e){
tWidth += $(e).width();

///Example: If the Children have a padding-left of 10px;..
//You could do instead:
tWidth += ($(e).width()+10);

})
$('#parent').css('width',tWidth);

这将使添加时parent水平增长children

注意:这假设'.children'有 awidthHeightSet

希望有帮助。

于 2013-06-04T11:12:55.463 回答
1

如果您知道每个“行”的元素数量和容器的宽度,则可以使用选择器为需要的元素添加边距,以产生合理的外观。

我有一排三个我想要合理的div,所以使用了:

.tile:nth-child(3n+2) { margin: 0 10px }

这允许每行中的中心 div 具有强制第一个和第三个 div 到容器外边缘的边距

也非常适合其他东西,如边框背景颜色等

于 2014-10-20T23:30:47.413 回答