流体宽度等间距DIV

时间:2011-07-28 20:22:40

标签: html css fluid-layout

我有一个流体宽度的容器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在它们之间均匀间隔。我希望间距也是流畅的,因此当浏览器变小时,空间也会变小。

enter image description here

7 个答案:

答案 0 :(得分:432)

请参阅: http://jsfiddle.net/thirtydot/EDp8R/

  • 适用于 IE6 +及所有现代浏览器!
  • 我将您要求的尺寸减半,以便更轻松地使用。
  • text-align: justify.stretch相结合正在处理定位。
  • display:inline-block; *display:inline; zoom:1为IE6 / 7 see here修正了inline-block
  • 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>

您可以将此项用于任意数量的子div,而无需通过更改

为每个boxN类添加.box1, .box2, .box3, .box4 { ... 课程
#container > div { ...

#container

这将选择任何作为.box1, .box3 { ... div的第一个子节点的div,而不是它下面的其他div。要概括背景颜色,您可以使用CSS3 nth-order selector,但它仅在IE9 +和其他现代浏览器中受支持:

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

变为:

{{1}}

有关jsfiddle示例,请参阅here

答案 1 :(得分:128)

现在最简单的方法是使用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/

答案 2 :(得分:21)

如果 css3 是一个选项,可以使用css calc()函数完成此操作。

案例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 +计算/舍入错误 - 请参阅here

案例2:在多行(FIDDLE

上对齐方框

此处,除了calc()功能外,还需要media queries

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

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

(它仍然可以通过常规css完成,但是你必须手动完成所有计算,然后如果你改变你的盒子宽度 - 你必须再次计算出所有的东西)

以下是使用LESS的示例:(您可以复制/粘贴此代码here以使用它,[它也是我用来生成上述小提琴的代码])

@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个盒子 - 我不希望第一个盒子在左边而下一个盒子在右边 - 而是盒子按顺序相互跟随。“ p>

关于浏览器支持:这适用于IE9 +,Firefox,Chrome,Safari6.0 + - (有关详细信息,请参阅here但是我注意到在IE9 +上有媒体查询状态之间有点小问题。 [如果有人知道如何解决这个我真的很想知道:)] &lt; - FIXED HERE

答案 3 :(得分:11)

其他帖子提及flexbox,但如果需要多行项目,则flexbox的space-between属性失败(请参阅结尾(帖子)

到目前为止,唯一干净的解决方案是使用

CSS Grid Layout ModuleCodepen demo

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

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)根据需要将网格设置为“自动”列数。这是为响应式布局完成的。每列的宽度为120px。 (注意使用auto-fit(与auto-fill相对应)(对于1行布局)将空轨道折叠为0 - 允许项目展开以占用剩余空间。(查看 this demo ,看看我在说什么))。

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的this post

<小时/>

NB:

Flexbox的space-between属性适用于一行项目,但当应用于包装其项目的flex容器时(使用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网格:

答案 4 :(得分:2)

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

  1. 创建容器div
  2. 图片的无序列表
  3. 在css上,必须垂直显示未加载的子弹
  4. 证明容器div的内容
  5. 这是因为在水平显示的列表中的对齐内容:空格和它之间的作用。

    关于CSS

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

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

答案 5 :(得分: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'widthHeight设置

希望能帮助。

答案 6 :(得分:1)

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

我有三行我觉得合理的行,所以使用了:

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

这允许每行中的中心div有一个边距,迫使第1和第3个div到容器的外边缘

对于边框背景颜色等其他东西也很棒