整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

好程序员web前端学习路线分享CSS浮动-清除浮动篇

程序员web前端学习路线分享CSS浮动-清除浮动篇,为什么要清除浮动

这里所说的清除浮动,并不是不要浮动了,而是清除浮动与浮动之间的影响。那么到底会有什么影响呢?

1.高度塌陷

举个例子我们看一下。



我们在这里设置了div0是外容器,div1是内部容器,div1因为设置了宽高是100,所以显示的时候就是一个橙色的100*100的方块,但是div0仅设置了背景色,因为div特有的独占一行,宽度会自动100%,高度被内部容器div1撑开了,撑开的高度是100像素,所有看到一个绿色高100像素,宽度100%的容器

现在我们给div1设置浮动



这时候我们发现div0这个外容器没了,看不见了。。别急,我们在div0里打一些字看看



我们发现aaa这些文字出来了,环绕在橙色方块周围了,这个原因在浮动中我们已经讲解了,而且我们也发现绿色的容器也出来了,但是它的高度仅仅是文字的行高。这就说明,内部的橙色块设置浮动后,它的父级容器绿色块就不知道橙色容器的高度了,因此绿色容器的高度变成了0,写入文字后,绿色容器重新被撑开高度才可以看到。我们把这种情况称为高度塌陷

我们其实是希望一个容器中的内容不断的撑开容器的高度,这样我们后续的内容就可以紧贴在上面了,而网页中的内容并不是都是静态的,很多都需要每天更新,更新的内容多少,图片高度,都不相同。那么后面的东西想要紧贴上面的内容,上面内容的高度就不能设置一个固定数值,否则很多数据的时候放不下。如果不设置高度,一旦设置浮动后,就会出现高度塌陷。丢失了高度后,页面后续的内容就会插在上面内容的底部,页面就会错乱,因此我们就需要做清除浮动来解决这个问题,最终做到即使使用浮动,外容器也会因为内容的多少自动撑开高度,不会高度塌陷。

margin padding设置值不能正确显示

2.Margin和padding属性值不正确

由于浮动导致父级子级之间设置了css padding、css margin属性的值不能正确表达。特别是上下边的padding和margin不能正确显示。

要来解决这个问题,我们就必须来认识一下BFC

什么是BFC

要来理解BFC,先介绍一下Box和Formatting Context

Box 是 CSS 布局的对象和基本单位, 简单来说页面就是由Box组成,元素的类型和 display 属性,决定了这个 Box 的类型。 不同类型的 Box, 会参与不同的 Formatting Context(一个决定如何渲染文档的容器),因此Box内的元素会以不同的方式渲染。

1、block-level box:display 属性为 block, list-item, table 的元素,会生成 block-level box。并且参与 block formatting context;

2、inline-level box:display 属性为 inline, inline-block, inline-table 的元素,会生成 inline-level box。并且参与 inline formatting context;

3、run-in box: css3 中才有, 这儿先不讲了。

Formatting context 是 W3C CSS2.1 规范中的一个概念。它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。最常见的 Formatting context 有 Block fomatting context (简称BFC)和 Inline formatting context (简称IFC)。

BFC(Block formatting context)直译为"块级格式化上下文"。它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。

BFC布局规则:

(1)内部的Box会在垂直方向,一个接一个地放置。

(2)Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠

(3)每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。

(4)BFC的区域不会与float box重叠。

(5)BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。

(6)计算BFC的高度时,浮动元素也参与计算

瞧,最后一条就是我们需要利用的了,我们只需要利用BFC就可以解决浮动后外容器高度塌陷的问题

如何生成BFC

1. 根元素是BFC模式

这种不能考虑,因为都不是根元素

2. 设置高度

显然也是不可以的。

3. float属性不为none

本来就要设置浮动的。所以也不考虑

4. position为absolute或fixed

这样设置后,就失去浮动的意义了。因此也不使用

5. display为inline-block, table-cell, table-caption, flex, inline-flex

虽然可以开启,但是导致父元素原有宽度丢失

6. overflow不为visible

这种方法副作用比较小,但是还是有问题的。比如overflow设置为hidden,这个不行,内容的高度是撑开的宽度也不能确定。设置为scroll,会出现右边和下边的滚动条宽度

设置为auto最合适,不过,如果里面的内容使用了定位,并且超出去就会出现滚动条。所以只能保证内容不能有定位。

Clear:both

清除:两者间,顾名思义就是清除浮动



我们看到如果要使用clear:both,就需要给高度塌陷的容器里面最后追加一个div,并且给这个div设置为clear:both,我们发现这种使用方法比较麻烦,每次设置都需要最后增加div。

因此我们做了一个修改

<!DOCTYPE html>

一篇文章我们把「Web前端开发进阶篇」CSS框模型讲解完了,接着我们来讲解下一篇文章,关于CSS定位的内容知识,小伙伴们跟上我的节奏,动起来,Let's go!

【引言】

CSS定位思想很简单,就是让你定义的元素框相对于其正常位置应该出现的位置,相对于父元素、另一个元素甚至是浏览器窗口的位置。浮动不是完全定位,不过,它也不是正常流布局。在我们切页面的过程中,定位和浮动是经常用,用不好,就会出现页面在不同浏览器的兼容性问题。我会在下面的文章中详细说明。

CSS定位

CSS定位机制

CSS有三种定位机制:普通流、浮动和绝对定位。

除非专门指定,否则所有框都在普通流中定位。也就是说,普通流中的元素的位置由元素在 (X)HTML 中的位置决定。

块级框从上到下一个接一个地排列,框之间的垂直距离是由框的垂直外边距计算出来。

行内框在一行中水平布置。可以使用水平内边距、边框和外边距调整它们的间距。但是,垂直内边距、边框和外边距不影响行内框的高度。由一行形成的水平框称为行框(Line Box),行框的高度总是足以容纳它包含的所有行内框。不过,设置行高可以增加这个框的高度。

CSS position属性

通过position属性我们可以选择4中不同类型的定位。

1、position:static

元素框正常生成。块级元素生成一个矩形框,作为文档流的一部分,行内元素则会创建一个或多个行框,置于其父元素中。

2、position:relative

元素框偏移某个距离。元素仍保持其未定位前的形状,它原本所占的空间仍保留。

3、position:absolute

元素框从文档流完全删除,并相对于其包含块定位。包含块可能是文档中的另一个元素或者是初始包含块。元素原先在正常文档流中所占的空间会关闭,就好像元素原来不存在一样。元素定位后生成一个块级框,而不论原来它在正常流中生成何种类型的框。

4、position:fixed

元素框的表现类似于将 position 设置为 absolute,不过其包含块是视窗本身。

提示:相对定位实际上被看作普通流定位模型的一部分,因为元素的位置相对于它在普通流中的位置。

CSS定位属性

CSS 定位属性允许你对元素进行定位。

position:把元素放置到一个静态的、相对的、绝对的、或固定的位置中。

top:定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。

right:定义了定位元素右外边距边界与其包含块右边界之间的偏移。

bottom:定义了定位元素下外边距边界与其包含块下边界之间的偏移。

left:定义了定位元素左外边距边界与其包含块左边界之间的偏移。

overflow:设置当元素的内容溢出其区域时发生的事情。

clip:设置元素的形状。元素被剪入这个形状之中,然后显示出来。

vertical-align:设置元素的垂直对齐方式。

z-index:设置元素的堆叠顺序。

了解了这些属性后,下面我们详细的说说相对定位和绝对定位。

CSS相对定位

相对定位是一个非常容易掌握的概念。如果对一个元素进行相对定位,它将出现在它所在的位置上。然后,可以通过设置垂直或水平位置,让这个元素“相对于”它的起点进行移动。

如果将 top 设置为 20px,那么框将在原位置顶部下面 20 像素的地方。如果 left 设置为 30 像素,那么会在元素左边创建 30 像素的空间,也就是将元素向右移动。

#box_relative {
 position: relative;
 left: 30px;
 top: 20px;
}

如下图所示:

相对定位

注意,在使用相对定位时,无论是否进行移动,元素仍然占据原来的空间。因此,移动元素会导致它覆盖其它框。

CSS绝对定位

绝对定位使元素的位置与文档流无关,因此不占据空间。这一点与相对定位不同,相对定位实际上被看作普通流定位模型的一部分,因为元素的位置相对于它在普通流中的位置。

普通流中其它元素的布局就像绝对定位的元素不存在一样:

#box_relative {
 position: absolute;
 left: 30px;
 top: 20px;
}

如下图所示:

绝对定位

绝对定位的元素的位置相对于最近的已定位祖先元素,如果元素没有已定位的祖先元素,那么它的位置相对于最初的包含块

对于定位的主要问题是要记住每种定位的意义。所以,现在让我们复习一下学过的知识吧:相对定位是“相对于”元素在文档中的初始位置,而绝对定位是“相对于”最近的已定位祖先元素,如果不存在已定位的祖先元素,那么“相对于”最初的包含块。

注释:根据用户代理的不同,最初的包含块可能是画布或 HTML 元素。

提示:因为绝对定位的框与文档流无关,所以它们可以覆盖页面上的其它元素。可以通过设置 z-index 属性来控制这些框的堆放次序。

CSS浮动

浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止。

由于浮动框不在文档的普通流中,所以文档的普通流中的块框表现得就像浮动框不存在一样。

请看下图,当把框 1 向右浮动时,它脱离文档流并且向右移动,直到它的右边缘碰到包含框的右边缘:

右浮动

再请看下图,当框 1 向左浮动时,它脱离文档流并且向左移动,直到它的左边缘碰到包含框的左边缘。因为它不再处于文档流中,所以它不占据空间,实际上覆盖住了框 2,使框 2 从视图中消失。

如果把所有三个框都向左移动,那么框 1 向左浮动直到碰到包含框,另外两个框向左浮动直到碰到前一个浮动框。

左浮动

如下图所示,如果包含框太窄,无法容纳水平排列的三个浮动元素,那么其它浮动块向下移动,直到有足够的空间。如果浮动元素的高度不同,那么当它们向下移动时可能被其它浮动元素“挡住”:

左浮动

CSS float 属性

通过 float 属性实现元素的浮动。因此,我们可以创建浮动框可以使文本围绕图像:

文本围绕图像

要想阻止行框围绕浮动框,需要对该框应用 clear 属性。clear 属性的值可以是 left、right、both 或 none,它表示框的哪些边不应该挨着浮动框。

为了实现这种效果,在被清理的元素的上外边距上添加足够的空间,使元素的顶边缘垂直下降到浮动框下面:

清除浮动

这是一个有用的工具,它让周围的元素为浮动元素留出空间。

让我们更详细地看看浮动和清理。假设希望让一个图片浮动到文本块的左边,并且希望这幅图片和文本包含在另一个具有背景颜色和边框的元素中。您可能编写下面的代码:

.news {
 background-color: gray;
 border: solid 1px black;
 }

.news img {
 float: left;
 }

.news p {
 float: right;
 }

<div class="news">
<img src="news-pic.jpg" />
<p>some text</p>
</div>

这种情况下,出现了一个问题。因为浮动元素脱离了文档流,所以包围图片和文本的 div 不占据空间。

如何让包围元素在视觉上包围浮动元素呢?需要在这个元素中的某个地方应用 clear:

不幸的是出现了一个新的问题,由于没有现有的元素可以应用清理,所以我们只能添加一个空元素并且清理它。

.news {
 background-color: gray;
 border: solid 1px black;
 }

.news img {
 float: left;
 }

.news p {
 float: right;
 }

.clear {
 clear: both;
 }

<div class="news">
<img src="news-pic.jpg" />
<p>some text</p>
<div class="clear"></div>
</div>

这样可以实现我们希望的效果,但是需要添加多余的代码。常常有元素可以应用 clear,但是有时候不得不为了进行布局而添加无意义的标记。

不过我们还有另一种办法,那就是对容器 div 进行浮动:

.news {
 background-color: gray;
 border: solid 1px black;
 float: left;
 }

.news img {
 float: left;
 }

.news p {
 float: right;
 }

<div class="news">
<img src="news-pic.jpg" />
<p>some text</p>
</div>

这样会得到我们希望的效果。不幸的是,下一个元素会受到这个浮动元素的影响。为了解决这个问题,有些人选择对布局中的所有东西进行浮动,然后使用适当的有意义的元素(常常是站点的页脚)对这些浮动进行清理。这有助于减少或消除不必要的标记。


CSS定位今天就讲解到这里了,下一篇讲解CSS选择器,希望大家不要放弃学习哦!

PS:

本文为‘Web前端进阶指南’原创,手动码字不易,小伙伴们别忘了顺手点个赞加个关注哈,有什么不懂的下方留言评论或私信。谢谢大家哈!

、浮动

本章目标:

  • 会使用display属性排版网页元素
  • 会使用float属性排版网页元素
  • 会使用float属性创建横向多列布局
  • 会使用四种防止父级边框塌陷的清除浮动的方法

4.1、标准文档流

标准文档流:指元素根据块元素或行内元素的特性按从上到下,从左到右的方式自然排列。这也是元素默认的排列方式

标准文档流组成

  • 块级元素(block) <h1>…<h6>、<p>、<div>、列表
  • 内联元素(inline) <span>、<a>、<img/>、<strong>... 内联标签可以包含于块级标签中,成为它的子元素,而反过来则不成立

4.2、display

display属性

在这里插入图片描述