三栏式用双飞翼和圣杯布局的时候为什么左边的模块-margin-left:100%会跑到左上方

就是不太能理解左栏负边距100%会跑到第一行左边的原理 。自己写了确实是这个效果 希望能有大神通俗易懂的解释下原理
dom结构如下:

<body>
<div id="hd">header</div>
<div id="bd">
  <div id="middle">middle</div>
  <div id="left">left</div>
  <div id="right">right</div>
</div>
<div id="footer">footer</div>
</body>

相对应的CSS内容如下:

<style>
#hd{
    height:50px;
    background: #666;
    text-align: center;
}
#bd{
    /*左右栏通过添加负的margin放到正确的位置了,此段代码是为了摆正中间栏的位置*/
    padding:0 200px 0 180px;
    height:100px;
}
#middle{
    float:left;
    width:100%;/*左栏上去到第一行*/
    height:100px;
    background:blue;
}
#left{
    float:left;
    width:180px;
    height:100px;
    margin-left:-100%;
    background:#0c9;
    /*中间栏的位置摆正之后,左栏的位置也相应右移,通过相对定位的left恢复到正确位置*/
    position:relative;
    left:-180px;
}
#right{
    float:left;
    width:200px;
    height:100px;
    margin-left:-200px;
    background:#0c9;
    /*中间栏的位置摆正之后,右栏的位置也相应左移,通过相对定位的right恢复到正确位置*/
    position:relative;
    right:-200px;
}
#footer{
    height:50px;
    background: #666;
    text-align: center;
}
</style>
阅读 3.8k
3 个回答

left元素的设置了 margin-left:-100%;,按规范所述,浮动元素要尽可能向上浮动。
100%就是bd的宽度,bd比left宽,因此left相当于不占空间,理论上可以放在和bd一行而不是另起一行,然后按规则就放上去了。
right在右边是因为 margin-left:-200px;这值比 margin-left:-100%;小,你给右边设 margin-left:-110%;(取消relative的负值定位)看看

margin负值会改变元素占据的空间,你要是不给他负值,一定是在第二行显示,因为他占据空间,第一行没有地方放他,你要是给一个-180px,和他宽度一样,那他占据的空间就是0,自然就回跑到上面去,跟着middel那个div,你在给大一点负值,你可以理解为给了一个margin-right,因为收缩到0之后,再给负值,又会在元素右边有一个负的margin值,就相当于给了一个margin-right 自然是向左移动。

marign-laft:-100%,是为了让sub块显示在main块的最前面。

推荐问题