3列布局HTML / CSS


68

我有以下HTML布局:

<div class="container">
   <div class="column-center">Column center</div>
   <div class="column-left">Column left</div>
   <div class="column-right">Column right</div>
</div>

是否有机会仅在使用CSS更改HTML的情况下在下面的示例网格上排列列?

----------------------------------------------------
|              |                   |               |
| Column left  |   Column center   | Column right  |
|              |                   |               |
----------------------------------------------------

您可以扩展一点,但不太确定您的意思是什么。您想要实现什么?居中文字?边界?
Richlewis


2
@Richlewis-列需要按照我描绘的方式排列。要求文本居中是愚蠢的……
easwee 2013年

Answers:


146

这样的事情应该做到这一点:

.column-left{ float: left; width: 33.333%; }
.column-right{ float: right; width: 33.333%; }
.column-center{ display: inline-block; width: 33.333%; }

演示

编辑

为此,可以使用大量列来构建一个非常简单的网格系统。例如,这样的事情应该适用于五列布局:

.column {
    float: left;
    position: relative;
    width: 20%;
  
    /*for demo purposes only */
    background: #f2f2f2;
    border: 1px solid #e6e6e6;
    box-sizing: border-box;
}

.column-offset-1 {
    left: 20%;
}
.column-offset-2 {
    left: 40%;
}
.column-offset-3 {
    left: 60%;
}
.column-offset-4 {
    left: 80%;
}

.column-inset-1 {
    left: -20%;
}
.column-inset-2 {
    left: -40%;
}
.column-inset-3 {
    left: -60%;
}
.column-inset-4 {
    left: -80%;
}
<div class="container">
   <div class="column column-one column-offset-2">Column one</div>
   <div class="column column-two column-inset-1">Column two</div>
   <div class="column column-three column-offset-1">Column three</div>
   <div class="column column-four column-inset-2">Column four</div>
   <div class="column column-five">Column five</div>
</div>

或者,如果您很幸运能够仅支持现代浏览器,则可以使用灵活的盒子

.container {
    display: flex;
}

.column {
    flex: 1;
    
    /*for demo purposes only */
    background: #f2f2f2;
    border: 1px solid #e6e6e6;
    box-sizing: border-box;
}

.column-one {
    order: 3;
}
.column-two {
    order: 1;
}
.column-three {
    order: 4;
}
.column-four {
    order: 2;
}
.column-five {
    order: 5;
}
<div class="container">
   <div class="column column-one">Column one</div>
   <div class="column column-two">Column two</div>
   <div class="column column-three">Column three</div>
   <div class="column column-four">Column four</div>
   <div class="column column-five">Column five</div>
</div>


1
这适用于所有浏览器,包括IE8。IE7是唯一不支持块元素上的内联块,因此它失败了的方法,但是由于我不必再支持它,因此可以解决我的问题!
easwee 2013年

1
如果有任意数量的列怎么办?说,从2到5。是否可以使用相同的CSS设置样式?
Alexei Sholik 2014年

添加text-align:center; 到容器元素以使其实际均匀。
穆斯塔法2014年

关于响应性,当响应性变
小时,

1
.column-center的宽度应为34%,以便cols总和为33 + 34 + 33 = 100%宽度。否则,中间和右边的色差会稍宽一些,使3个色差不完全对称。
James_

21

这对于@easwee来说较少,而对于其他可能有相同问题的人则更多:

如果不需要IE <10支持,则可以使用Flexbox。这是一个令人兴奋的CSS3属性,不幸的是它已在多个不同版本中实现;添加供应商前缀,突然获得良好的跨浏览器支持就需要比原来更多的属性。

使用当前的最终标准,您将完成

.container {
    display: flex;
}

.container div {
    flex: 1;
}

.column_center {
    order: 2;
}

而已。如果您想支持iOS 6,Safari <6,Firefox 19或IE10等较早的实现,则可以将其扩展为

.container {
    display: -webkit-box;      /* OLD - iOS 6-, Safari 3.1-6 */
    display: -moz-box;         /* OLD - Firefox 19- (buggy but mostly works) */
    display: -ms-flexbox;      /* TWEENER - IE 10 */
    display: -webkit-flex;     /* NEW - Chrome */
    display: flex;             /* NEW, Spec - Opera 12.1, Firefox 20+ */
}

.container div {
    -webkit-box-flex: 1;      /* OLD - iOS 6-, Safari 3.1-6 */
    -moz-box-flex: 1;         /* OLD - Firefox 19- */
    -webkit-flex: 1;          /* Chrome */
    -ms-flex: 1;              /* IE 10 */
    flex: 1;                  /* NEW, Spec - Opera 12.1, Firefox 20+ */
}

.column_center {
    -webkit-box-ordinal-group: 2;   /* OLD - iOS 6-, Safari 3.1-6 */
    -moz-box-ordinal-group: 2;      /* OLD - Firefox 19- */
    -ms-flex-order: 2;              /* TWEENER - IE 10 */
    -webkit-order: 2;               /* NEW - Chrome */
    order: 2;                       /* NEW, Spec - Opera 12.1, Firefox 20+ */
}

jsFiddle演示

这是有关Flexbox跨浏览器支持的出色文章:使用Flexbox:新旧混合


2
+1要使用简单版本,可以使用-prefix-free
Oriol 2014年

5
.container{
height:100px;
width:500px;
border:2px dotted #F00;
border-left:none;
border-right:none;
text-align:center;
}
.container div{
display: inline-block;
border-left: 2px dotted #ccc;
vertical-align: middle;
line-height: 100px;
} 
 .column-left{ float: left; width: 32%;  height:100px;}
.column-right{ float: right; width: 32%;  height:100px; border-right: 2px dotted #ccc;}
.column-center{ display: inline-block; width: 33%; height:100px;}

 <div class="container">
   <div class="column-left">Column left</div>
   <div class="column-center">Column center</div>
   <div class="column-right">Column right</div>
</div> 

看到此链接http://jsfiddle.net/bipin_kumar/XD8RW/2/


5

CSS:

.container {
    position: relative;
    width: 500px;
}
.container div {
    height: 300px;
}

.column-left {
    width: 33%;
    left: 0;
    background: #00F;
    position: absolute;
}
.column-center {
    width: 34%;
    background: #933;
    margin-left: 33%;
    position: absolute;
}
.column-right {
    width: 33%;
    right: 0;
    position: absolute;
    background: #999;
}

HTML:

<div class="container">
   <div class="column-center">Column center</div>
   <div class="column-left">Column left</div>
   <div class="column-right">Column right</div>
</div>

这是演示:http : //jsfiddle.net/nyitsol/f0dv3q3z/


1
将主要内容DIV放在首位的奖励积分。更适合SEO。
BlueSix

1
我认为,当您想要一个容器时,此答案胜过了浮动,因为浮动需要清除:两者都是固定的(不仅限于CSS)。当您想要全高列背景时,这是一个明显的赢家,因为您可以将列top:0设置为bottom:0(设置为父高度)。嵌套div的相对位置将使您返回到表。:O)
user982671

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.