文章目录
浮动布局(float)
一.HTML文档流
1.正常文档流动
在进行布局之前我们当然要先来了解一下未布局的正常文档流是什么样子,再通过对正常文档流的调整来达到布局的目的。
HTML文档流简单的来说就是元素在页面中出现的先后顺序。
正常文档流将窗体自上而下分成一行一行,块元素独占一行,相邻行内元素在行内按从左到右依次排列元素。
</style>
<body>
<div class="box1">box1</div>
<p class="box2">box2</p>
<ul class="box3">box3</ul>
<div class="box4">box4</div>
|<span>我是行内元素1</span>
|<span>我是行内元素2</span>
|<span>我是行内元素3</span>|
</body>
</html>
正常文档流效果图:
![](https://img-blog.csdnimg.cn/20210418174425481.png)
分析:
div、p、ul是块元素,独占一行,根据书写的顺序,自上而下依次排列。
span是行内元素,位于同一行,根据书写的顺序,自左向右依次排列。
b.脱离正常文档流
当我们用CSS样式去控制HTML文档结构时,此时的文档流相对于正常文档流而言脱离正常文档流
脱离正常文档流效果图:
![](https://img-blog.csdnimg.cn/20210418174425481.png)
分析:
由图可知该由于CSS的控制使得文档显示效果与与文档代码顺序不一致,我们称之为脱离正常文档流
二.浮动(float)
1.介绍:
在很长一段时间内,浮动元素是所有Web布局方案的基础。但浮动‘其实不是为布局而生的。与使用表格布局基本一样,把浮动作为布局工具算是无奈之举。
然而浮动自身却是相当有趣和有用的,下面我们正式进入浮动的讲解
2.内容精讲:
float |
---|
取值 | left、right、none |
---|---|
初始值 | none |
适用于 | 所有元素 |
a.浮动的元素
浮动元素后要注意几件事。
首先在某种程度上讲,浮动的元素脱离了常规文档流不过对布局仍有影响。
使用CSS浮动元素的独特之处是,浮动的元素基本上算是处于单独的平面上,但是对文档中其余的内容仍有影响之所以这样,是因为元素浮动后其他内容围绕它流动(文字环绕图片)。浮动的图像就是这样,不过即使浮动段落也是如此。
/*使图片向左浮动*/
img{
float:left;
}
![](https://img-blog.csdnimg.cn/20210418201232355.png)
分析:
由图可知图片向左浮动后脱离了常规文档流并且其他的内容围绕它流动
注意:
如果与图像相邻的其他元素也有外边距,那么这些外边距不会与浮动图像的外边距折叠在一起
b.浮动的详解:
浮动元素的容纳块是最近的块级祖辈元素(大家先记住即可)
<div class="box1">
<p>
<li>I want to be better!</li>
</p>
</div>
在上述标记中浮动元素的容纳块是其所在的段落元素p
1.元素浮动后变为块级框
不论是什么类型的元素,浮动后得到的都是块级框。因此如果浮动的如果是连接,即使元素自身正常情况下生成的是行内框,浮动后生成的也是块级框。
在布局中浮动元素除了不独占一行就像div元素一样。这与为浮动元素声明display:block效果没什么不同;
2.浮动元素的左(右)外边界不能超过容纳块的左(右)内边界
<body>
<div class="box">
<div class="box1">box1</div>
<p class="box2">box2</p>
<ul class="box3">box3</ul>
<div class="box4">box4</div>
box
</div>
</body>
让box3向左浮动,box4向右浮动(原始位置参考上方正常文档流效果图)
![](https://img-blog.csdnimg.cn/20210419083710619.png)
分析:
由图可知向左浮动的box3最多只能到达容纳块box的左内边界,向右浮动的box4最多只能到达容纳块的右内边距
3.避免浮动的元素重叠
情况1:
如果文档源码中处于前面的元素向左浮动,那后面的浮动元素的左外边界必定在前一个元素右边界的左侧(除非浮动后后面的元素在前面元素的底下)
同理如果文档中处于前面的元素向右浮动,后面的浮动元素的右外边界必定在前一个元素左外边界的左侧
(除非浮动后后面的元素在前面元素的底下)
<body>
<div class="box">
<div class="box1">box1</div>
<p class="box2">box2</p>
<ul class="box3">box3</ul>
<div class="box4">box4</div>
box
</div>
</body>
让box1、box2向左浮动,box3、box4向右浮动
分析:
在文档源码中box3在box4前面,所以当box3、box4均向左浮动时,位于后面的浮动元素box4的左外边界在在box3右边界的左侧
文档源码中box1在box2前面,但是box1、box2向左浮动后,由于一行容纳不下box1,box2,所以box2处于box1下方
作用: 这条规则能避免浮动的元素相互遮盖。
如果向左浮动一个元素,而左侧已经有浮动的元素了,那么后面浮动的元素将紧靠前面浮动元素的右外边界。然而,如果浮动元素的顶边在前面浮动元素的底边以下,那么浮动后的元素将直达父元素的左内边界
情况2:
左浮动元素的右外边界不能在右浮动元素的左外边界的右侧。右浮动元素的左外边界不能在左浮动元素的右外边界左侧。
我们在刚才的基础上让box2向右浮动
分析:
根据这条规则,box2不会与box1出现重叠区域。事实上第二个图像的顶边正好在左浮动图像的底边以下,这条规则可以避免元素重叠
4.浮动元素不会像气球一样一直往上飘
情况1:
浮动元素的顶边不能比前方任何一个浮动元素或者块级元素的顶边高
我们让box1、box2、box4向左浮动并将box3缩小后向右浮动
分析:
由图可知box3不会像气球一样浮到顶部,而是停在了它的前一个浮动元素box2顶边。
情况2:
浮动元素的顶边不能高于文档源码中出现在浮动元素之前的元素生成的框体所在的行框的顶边,与情况1类似,这条规则进一步限制浮动元素浮动元素上移的幅度
我们让图片向左浮动
分析:
从图中可以看出,浮动图片顶边没有高于在文档源码中出现在图片之前的文字生成的框体所在的行框的顶边
作用: 可以让浮动元素与所在的上下文同一高度
情况3:
左浮动元素的边缘如果还有一个向左浮动的元素,那么它的右边界不能在容纳块右边界的右侧。类似的,右浮动的元素右边如果还有一个向右浮动的元素,那么它的右边界不能在容纳块左边界的左侧
让box1、box2向左浮动,box3、box4向右浮动
分析:
由图可知向左浮动的box1,box2没有冲破box排在一行根据该条规则由于空间不足box2被自动挤到下一行
作用: 避免多个浮动的元素全部横排在一行,超出容纳块的边界
5.浮动元素必须放在尽可能高的位置上并尽量向左(右)移动
在满足上述规则的情况下元素会放在尽可能高的位置并尽量向左(右)移动
c.浮动的清除(clear)
我们刚才讲了相当多的浮动行为。有时我们并不想让内容向浮动元素的一方移动,某些情况下甚至想要刻意避免。如果把文档划分为多个区域,可能就不希望浮动元素从某一个区域探入,进入另一个区域。此时要禁止每个区域的第一个元素出现在浮动元素旁,它的位置会下移到浮动的元素下方,而后续内容将向下顺延
clear |
---|
取值 | left、right、both、none |
---|---|
初始值 | none |
适用于 | 块级元素 |
听起来可能会比较抽象,别着急我们马上用一个实例来掌握它
如图所示,我现在不想让第一张图片显示在文字的左侧(这里我们将文字写在了p标签中)
p{
clear:left;
}
即不让内容左侧存在浮动元素,效果如下:
同理:
p{clear:right}即不让内容右边存在浮动元素
p{clear:both}即不让内容两边存在浮动元素