基本上,我希望有一个页面由等大小的div构建而成,例如100x100,还有类似200x100的变体。它们都使用float:left来根据窗口的调整而调整位置。问题是,在这种情况下,比如有时候一行中有3个div,有时候有7个,我不知道如何使它们居中,因为通常右侧会有更多的空间,使其看起来偏离中心。 提前致谢!
你是否要寻找类似这样的效果? 在容器上设置自动 margin 将会水平居中它。从那里开始,你可以使用浮动或内联来展示你想要的布局方式。看一下下面的 CSS 和 HTML:
<div class="container">
<div></div>
<div class="variant"></div>
<div></div>
<div></div>
...
</div>
这段HTML语义化非常简单。理想情况下,我通常会将其作为无序列表来完成,但由于您的标题中提到了 divs
,因此我选择了这种方式。
div.container div{
border: solid 2px black;
min-height: 100px;
width: 100px;
display: inline-block;
background-color: white;
vertical-align: top;
margin: 10px;
}
div.container div.variant{
width: 200px;
}
div.container{
margin: auto;
max-width: 620px;
background-color: #ecefec;
padding: 10px;
font-size: 0;
}
这里发生了什么
我们通过属性display: inline-block
将块元素内联; 为此,我们需要制定一些额外的规则,以便在它们具有不同高度的情况下正确显示它们(这些元素将自动清除行,而不像浮动元素)。
内联元素上的属性vertical-align:top
确保它被排列,使其顶部边界与相邻元素的顶部边界齐平。
属性font-size:0
确保标记空格未被计入块元素之间间距的计算中(否则,每个关闭一个div标签到打开另一个标签之间的空格都会被包括在内)。
应该可以实现您要达到的目标。
更新
在查看您对另一个问题的评论后,我们需要向容器div的CSS添加text-align:center;
,因为这将使每个行居中在容器内。
text-align: center
,那么每一行都会单独居中,这完全破坏了它们类似网格的布局(第二个演示)。 - Kosdiv.container {
margin: auto;
max-width: 620px;
background-color: #ecefec;
padding: 10px;
font-size: 0;
display: -webkit-flex; /* Chrome */
display: -ms-flexbox; /* IE 10 */
display: flex; /* Opera 12.1, Firefox 20+ */
/* Chrome */
-webkit-flex-flow: row wrap;
-webkit-justify-content: center;
/* IE10 */
-ms-flex-flow: row wrap;
-ms-justify-content: center;
/* Opera 12.1, Firefox 20+ */
flex-flow: row wrap;
justify-content: center;
}
justify-content
的值更改为以下内容时会发生什么:
如果您不介意div没有特定的宽度,甚至可以像我在这个jsFiddle中所做的那样将它们设置为自动调整大小的flex box,这实际上将div的width
转换为min-width
。
div.container div {
-webkit-flex: auto; /* Chrome */
-ms-flex: auto; /* IE10 */
flex: auto; /* Opera 12.1, Firefox 20+ */
}
inline-block
而不是float
来实现您的布局:
display: inline-block
,text-align: center
(或者也可以是justify
)。HTML:
<div class="container">
<div class="small"></div>
<div class="large"></div>
<div class="small"></div>
<div class="mini"></div>
<div class="small"></div>
<div class="mini"></div>
<div class="small"></div>
</div>
CSS:
.container {
text-align: center;
letter-spacing:-0.25em;
word-spacing: -0.25em;
}
.small, .large, .mini {
display: inline-block;
*display: inline;
zoom: 1;
height: 50px;
letter-spacing:normal;
word-spacing: normal;
}
.small {
width: 25%;
background: #f00;
}
.large {
width: 50%;
background: #0f0;
}
.mini {
width: 12.5%;
background: #00f;
}
如果我理解正确,您有一些不同宽度的元素,并且希望将这组元素水平居中在页面上。
如果是这种情况,对我有效的解决方案如下:
HTML:
<div class="container">
<div class="outer">
<div class="inner">
<!-- your elements here -->
</div>
</div>
</div>
.container {
overflow: hidden;
}
.container .outer {
float: left;
position: relative;
left: 50%;
}
.container .outer .inner {
float: left;
position: relative;
left: -50%;
}
.outer
div 向右移动,以使其左边缘位于其父元素的中心位置。然后,.inner
被向左移动50%,这意味着 .inner
的中心与 .outer
的左边缘对齐。最终,.inner
及其内容将在屏幕中心对齐,而不管 .inner
中元素的总宽度如何。HTML:
<div id="container">
<div class="small"></div>
<div class="large"></div>
<div class="small"></div>
<div class="mini"></div>
<div class="small"></div>
<div class="mini"></div>
<div class="small"></div>
</div>
* {
margin: 0;
padding: 0;
}
#container {
margin: 0px auto;
overflow: hidden;
border: 1px solid #f00;
letter-spacing:-0.25em;
word-spacing: -0.25em;
line-height: 0;
}
.small, .large, .mini {
display: inline-block;
*display: inline;
float: left;
zoom: 1;
height: 50px;
letter-spacing:normal;
word-spacing: normal;
line-height: auto;
}
.small {
width: 100px;
background: #f00;
}
.large {
width: 200px;
background: #0f0;
}
.mini {
width: 50px;
background: #00f;
}
jQuery:
resizeContainer();
function resizeContainer() {
var containerWidth = 0;
$('#container > div').each(function () {
var self = $(this);
var offset = self.offset();
if (offset.top < 2) {
containerWidth += self.width();
} else {
$('#container').css('width', containerWidth);
return false;
}
});
}