html怎么取消浮动,html css 中浮动的讲解和取消浮动的常见问题

添加浮动

单个浮动(只浮动了一个div元素div2)

首先要知道,div是块级元素,在页面中独占一行,自上而下排列,也就是传说中的流。如下图:

d8aad6bbb8d948d9b47a8d585405d60f.jpg

可以看出,即使div1的宽度很小,页面中一行可以容下div1和div2,div2也不会排在div1后边,因为div元素是独占一行的。

注意,以上这些理论,是指标准流中的div。无论多么复杂的布局,其基本出发点均是:“如何在一行显示多个div元素”。

显然标准流已经无法满足需求,这就要用到浮动。 浮动可以理解为让某个div元素脱离标准流,漂浮在标准流之上,和标准流不是一个层次。

例如,假设上图中的div2浮动,那么它将脱离标准流,但div1、div3、div4仍然在标准流当中,所以div3会自动向上移动,占据div2的位置,重新组成一个流。如图:

9d66b31e735349d6ad42e797eb55ef8a.png

从图中可以看出,由于对div2设置浮动,因此它不再属于标准流,div3自动上移顶替div2的位置,div1、div3、div4依次排列,成为一个新的流。又因为浮动是漂浮在标准流之上的,因此div2挡住了一部分div3,div3看起来变“矮”了。

这里div2用的是左浮动(float:left;),可以理解为漂浮起来后靠左排列,右浮动(float:right;)当然就是靠右排列。这里的靠左、靠右是说页面的左、右边缘。

如果我们把div2采用右浮动,会是如下效果:

e56e097c20b64f67879a868c54348e65.jpg

此时div2靠页面右边缘排列,不再遮挡div3,读者可以清晰的看到上面所讲的div1、div3、div4组成的流。

总结:

标准流的概念,“新”标准流

谁浮动,自己浮起来、下面的元素占据自己的位置。

浮动多个div

示例1

下面我们把div2和div3都加上左浮动,效果如图:

4a424f2394724f5fb978e1dd849e5c90.png

同理,由于div2、div3浮动,它们不再属于标准流,因此div4会自动上移,与div1组成一个“新”标准流,而浮动是漂浮在标准流之上,因此div2又挡住了div4。

当同时对div2、div3设置浮动之后,div3会跟随在div2之后,不知道读者有没有发现,一直到现在,div2在每个例子中都是浮动的,但并没有跟随到div1之后。因此,我们可以得出一个重要结论:

假如某个div元素A是浮动的,

如果A元素上一个元素也是浮动的,那么A元素会跟随在上一个元素的后边(如果一行放不下这两个元素,那么A元素会被挤到下一行);

如果A元素上一个元素是标准流中的元素,那么A的相对垂直位置不会改变,也就是说A的顶部总是和上一个元素的底部对齐。

示例2

假如我们把div2、div3、div4都设置成左浮动,效果如下:

80c7a95a186d4390b3436c1a656228fc.jpg

根据上边的结论:先从div4开始分析,它发现上边的元素div3是浮动的,所以div4会跟随在div3之后;div3发现上边的元素div2也是浮动的,所以div3会跟随在div2之后;而div2发现上边的元素div1是标准流中的元素,因此div2的相对垂直位置不变,顶部仍然和div1元素的底部对齐。由于是左浮动,左边靠近页面边缘,所以左边是前,因此div2在最左边。

示例3

假如把div2、div3、div4都设置成右浮动,效果如下:

3e3597fe585c48d5b49b3757a01e4ed6.jpg

道理和左浮动基本一样,只不过需要注意一下前后对应关系。由于是右浮动,因此右边靠近页面边缘,所以右边是前,因此div2在最右边。

示例4

假如我们只把div2、div4左浮动,效果图如下:

2db05f5e9e6f40d18683914303830204.jpg

依然是根据结论,div2、div4浮动,脱离了标准流,因此div3将会自动上移,与div1组成标准流。div2发现上一个元素div1是标准流中的元素,因此div2相对垂直位置不变,与div1底部对齐。div4发现上一个元素div3是标准流中的元素,因此div4的顶部和div3的底部对齐,并且总是成立的,因为从图中可以看出,div3上移后,div4也跟着上移,div4总是保证自己的顶部和上一个元素div3(标准流中的元素)的底部对齐。

清除浮动

经过上边的学习,可以看出:元素浮动之前,也就是在标准流中,是竖向排列的,而浮动之后可以理解为横向排列。

清除浮动可以理解为打破横向排列。

清除浮动的关键字是clear,官方定义如下:

语法

clear : none | left | right | both

取值:

none  :默认值。允许两边都可以有浮动对象

left   :不允许左边有浮动对象

right  :不允许右边有浮动对象

both  :不允许有浮动对象

定义非常容易理解,但是读者实际使用时可能会发现不是这么回事。

定义没有错,只不过它描述的太模糊,让我们不知所措。

示例1

页面中只有两个元素div1、div2,它们都是左浮动

根据上边的基础,假如页面中只有两个元素div1、div2,它们都是左浮动,场景如下:

6f2aa9ebe9254f059516fe6dbd1a8011.png

此时div1、div2都浮动,根据规则,div2会跟随在div1后边,但我们仍然希望div2能排列在div1下边,就像div1没有浮动,div2左浮动那样。

这时候就要用到清除浮动(clear),如果单纯根据官方定义,读者可能会尝试这样写:在div1的CSS样式中添加clear:right;,理解为不允许div1的右边有浮动元素,由于div2是浮动元素,因此会自动下移一行来满足规则。

其实这种理解是不正确的,这样做没有任何效果。

对于CSS的清除浮动(clear),一定要牢记:这个规则只能影响使用清除的元素本身,不能影响其他元素。

怎么理解呢?就拿上边的例子来说,我们是想让div2移动,但我们却是在div1元素的CSS样式中使用了清除浮动,试图通过清除div1右边的浮动元素(clear:right;)来强迫div2下移,这是不可行的,因为这个清除浮动是在div1中调用的,它只能影响div1,不能影响div2。

要想让div2下移,就必须在div2的CSS样式中使用浮动。本例中div2的左边有浮动元素div1,因此只要在div2的CSS样式中使用clear:left;来指定div2元素左边不允许出现浮动元素,这样div2就被迫下移一行。

27d971fcecff4a14a2964cdd6cbc79db.png

示例2

那么假如页面中只有两个元素div1、div2,它们都是右浮动呢?读者此时应该已经能自己推测场景,如下:

aeaf9f7eac504a3f82a2dfaaeb35b6b8.png

此时如果要让div2下移到div1下边,要如何做呢?

我们希望移动的是div2,就必须在div2的CSS样式中调用浮动,因为浮动只能影响调用它的元素。可以看出div2的右边有一个浮动元素div1,那么我们可以在div2的CSS样式中使用clear:right;来指定div2的右边不允许出现浮动元素,这样div2就被迫下移一行,排到div1下边。

拾遗

补充1

float的属性值有none、left、right,有几个要点:

只有横向浮动,并没有纵向浮动。

当元素应用了float属性后,将会脱离普通流,其容器(父)元素将得不到脱离普通流的子元素高度。

0357ecb6f67a49ae90f737d78a7b9138.png

思考:如何解决这个问题?

会将元素的display属性变更为block。e7ee0143d6734583940b61417a7fb1a1.png

知识补充:css之display:inline-block布局

inline:

使元素变成行内元素,拥有行内元素的特性,即可以与其他行内元素共享一行,不会独占一行.

不能更改元素的height,width的值,大小由内容撑开.

可以使用padding,margin的left和right产生边距效果,但是top和bottom就不行.

block:

使元素变成块级元素,独占一行,在不设置自己的宽度的情况下,块级元素会默认填满父级元素的宽度.

能够改变元素的height,width的值.

可以设置padding,margin的各个属性值,top,left,bottom,right都能够产生边距效果.

inline-block:

结合了inline与block的一些特点,结合了上述inline的第1个特点和block的第2,3个特点.

用通俗的话讲,就是不独占一行的块级元素。

浮动元素的后一个元素会围绕着浮动元素(典型运用是文字围绕图片),与应用了position的元素相比浮动元素并不会遮盖后一个元素。

浮动元素的前一个元素不会受到任何影响(如果你想让两个块状元素并排显示,必须让两个块状元素都应用float)。

补充2

元素同时应用了position: relative、float、(top / left / bottom / right)属性后,则元素先浮动到相应的位置,然后再根据(top / left / bottom / right)所设置的距离来发生偏移。

divdiv>

0bea08d4585d4bbfb8c01e2f98c53f45.png

左图中的div是没有设置top、left值的,而右边则设置了50px的偏移。

元素同时应用了position: absolute及float属性,则float失效。

我是一个应用了position:absolute和float:left的DIV,不过我还是在浏览器的右边,没有浮动到左边。div>

e3fc7303bab846639ddd70cb91aac0c5.png

第一个元素应用了position之后会覆盖着接下来的float元素(如果两个元素所处的位置相同)

我是一个应用了position:absolute的DIV。div>

我是float:left的DIVdiv>

d26d1987199c4e7e9742c6d3c46e4910.jpg

回顾:如果你不将float的元素的position设置成relative的话,你想通过设置float元素的z-index来的达到覆盖position:absolute是无效的。同理,float元素下面存在position: absolute的子元素,如果你不将float的元素的position设置成relative的话,absolute元素是不会定位到float元素的。

同时应用position: absolute和float: left会导致清除浮动无效(position: relative则可以清除浮动)。

常用的清除浮动的方法有两种:

通过在容器中添加一个标签,设置该标签的样式为 clear: both

容器设置overflow: hidden

我是DIVdiv>

div>

8c411ac415cf4eaabc1e8dbda53cb7c9.jpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值