浮动实现两栏布局
<body>
<ul class="sidebar">
<li><a href="#1">Hello world</a></li>
<li><a href="#2">Installation</a></li>
</ul>
<div class="content">
<div id="1">
<h3>Hello world</h3>
<div>Welcome to learning React</div>
</div>
<div id="2">
<h3>Installation</h3>
<div>You can install React from npm.</div>
</div>
</div>
</body>
.sidebar{
float:left;
list-style: none;
padding:0;
}
- 子元素浮动导致父元素高度塌陷
ul
浮动前,其父元素body
的高度是208.88px
;ul
浮动后,父元素的高度是148.16px
。 - 后面的兄弟元素环绕浮动元素
ul
浮动后,ul
的兄弟元素div.content
将跟随浮动元素排列,产生环绕效果。
比较搞笑的是,实现 环绕效果 是float
的初衷,但为了布局我们常常想办法避免 环绕效果。
比如,现在希望实现两栏布局,ul
一栏,div.content
一栏。为了避免 环绕效果,给div.content
设置 比ul
的宽度大 的margin-left
。
“惹不起,我还躲不起么?腾出120px宽的位置给你,你爱咋浮咋浮!”
.sidebar{
float:left;
list-style: none;
padding:0;
}
.content{
margin-left:120px;
}
几个例子
- 例1:图片在左,文本在右
img{
float:left;
}
div{
margin-left:440px;
}
<body>
<img src="./imgs/doraemon.gif">
<div>哆啦A梦(日语:ドラえもん),旧译为机器猫,是藤子·F·不二雄的漫画作品《哆啦A梦》中登场的猫型机器人,本作的主人公。名字的意思是铜锣(ドラ)卫门(えもん)。
哆啦A梦肚子上拥有四次元口袋,这个口袋直接通往四次元空间,再多的东西也放得下。害怕老鼠。平时的职责是照顾野比大雄。</div>
</body>
- 例2:图片在右,文本在左
img{
float:right;
}
div{
margin-right:440px;
}
<body>
<img src="./imgs/doraemon.gif">
<div>哆啦A梦(日语:ドラえもん),旧译为机器猫,是藤子·F·不二雄的漫画作品《哆啦A梦》中登场的猫型机器人,本作的主人公。名字的意思是铜锣(ドラ)卫门(えもん)。
哆啦A梦肚子上拥有四次元口袋,这个口袋直接通往四次元空间,再多的东西也放得下。害怕老鼠。平时的职责是照顾野比大雄。</div>
</body>
- 例3:图片在右,文本在左
例2中,图片在右文本在左与 html中标签的顺序不一致。这次,在html中调整下顺序。
img{
float:right;
}
div{
margin-right:440px;
}
<body>
<div>哆啦A梦(日语:ドラえもん),旧译为机器猫,是藤子·F·不二雄的漫画作品《哆啦A梦》中登场的猫型机器人,本作的主人公。名字的意思是铜锣(ドラ)卫门(えもん)。
哆啦A梦肚子上拥有四次元口袋,这个口袋直接通往四次元空间,再多的东西也放得下。害怕老鼠。平时的职责是照顾野比大雄。</div>
<img src="./imgs/doraemon.gif">
</body>
但是,情况不妙! div
和img
不在一行上。
这挺好解释的。
css文档流默认是从上到下,从左到右排列。div
在前,img
在后,所以div
占了上面那行。img
浮动,使其父元素body
高度塌陷,但仍然占据流空间,所以就顺着div
往下了。
好吧,解决方法是 使用负的margin
,margin-left:-440px
。
img{
float:right;
margin-left:-440px;
}
div{
float:left;
margin-right:440px;
}
浮动实现两栏布局,一栏得定宽
下面这个例子和 例3 差不多。
#left{
float:left;
margin-right:500px;
}
#right{
float:right;
margin-left:-500px;
}
<body>
<div id="left">向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走</div>
<div id="right">向右走 向右走 向右走 向右走 向右走 向右走 向右走 </div>
</body>
但是,如果 多写点 “向右走”,也就是把div#right
变宽些,情况就糟糕了。
<body>
<div id="left">向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走 向左走</div>
<div id="right">向右走 向右走 向右走 向右走 向右走 向右走 向右走 向右走 向右走 向右走 向右走 向右走 向右走 向右走 </div>
</body>
好吧,把div#left
的margin-right
和div#right
的margin-left
都调大点。
#left{
float:left;
margin-right:800px;
}
#right{
float:right;
margin-left:-800px;
}
因此,浮动能够实现两栏布局,但其中一栏必须宽度固定。
浮动实现三栏布局
浮动实现三栏布局 其实就是 浮动实现两栏布局 的一个扩展,因此保留了 两栏布局的 局限,需要 定宽,否则无法形成多栏布局。
#left{
float:left;
}
#middle{
float:left;
margin-left:200px;
margin-right:300px;
}
#right{
float:right;
margin-left:-300px;
}
<body>
<div id="left">向左走 向左走 向左走 向左走 向左走 向左走</div>
<div id="middle">原地踏步 原地踏步 原地踏步 原地踏步 原地踏步 原地踏步</div>
<div id="right">向右走 向右走 向右走 向右走 向右走 向右走</div>
</body>