理解CSS的浮动Float
当前位置:点晴教程→点晴OA办公管理信息系统
→『 经验分享&问题答疑 』
前言提到浮动,前端的小伙伴肯定都不陌生,但是随着弹性布局等等一些更好用的标准出来后,用在布局方面少了很多,当初我刚开始接触前端的时候,很习惯用浮动来给元素改变定位,当时还并不是很流行flexbox布局,很多布局会通过浮动来实现,但是使用浮动来布局会产生一些副作用,比如虽然使用浮动可以使元素向左或向右靠齐,但会造成高度坍塌,当时的我并不太了解其中的缘由,只是机械地从网上搜索到一些解决高度坍塌的代码,到现在也不能算是了解的很透彻,只能算是比刚开始做前端的时候多了解了一点。 脱离文档流在说到浮动的时候,很多地方都会说,它们脱离了文档流,那么正常情况下文档流是怎么样的呢? 写过HTML的小伙伴应该都了解,HTML中的元素应用的是默认的流式布局;假设页面上有一个 应用了浮动的元素就不受流式布局的控制了。比如应用了 那么浮动有什么特点,清除浮动又是什么意思呢? 浮动前端有几个较为有名的布局方式,比如圣杯布局、双飞翼布局等等,使用 我们可以把文档想象成一个水面,而浮动元素就好比是浮在水面上的船。水波环绕船体,就像浮动元素被其他内容环绕一样。比如下面这张图: 设计
这里流动的内容就可以比作流动的水,所以我们经常能看到使用 只能说早些时候的CSS还不够完善,不能满足一些特殊的布局需求,而 当使用
float会影响所在行的行方框,也就是 清除浮动在使用浮动用于布局之后,我们常常需要清除浮动,那么清除浮动是什么意思呢?这里可以继续用前面浮在水面上的船来举例子,虽然可能不算很贴切。 船在水面上是浮动着的,随着水流的作用会飘移,那么就有可能飘移到其他的水域,清除浮动就类似于阻止这艘船飘移,比如安装一道闸门,防止船飘进来或飘出去。通过设置特定的css属性来清除浮动,就类似于这里的安装闸门。 创建BFC容器之前在《对BFC的理解》中我们有提到过,可以通过创建BFC容器的方式来清除浮动,比如设置 假设有以下一段HTML: <div style="width: 100px; height: 100px; border: 1px solid orange; float: left;"> <span>文本文本111文本文本111文本文本111</span> </div> <div style="width: 100px; height: 100px; background: pink; "> <span>文本文本222</span> </div> 在未清除浮动前是这样的: 可以看到, 将第一个div用BFC容器包裹后(类似于闸门的作用): <div style="display: flow-root;"> <div style="width: 100px; height: 100px; border: 1px solid orange; float: left;"> <span>文本文本111文本文本111文本文本111</span> </div> </div> <div style="width: 100px; height: 100px; background: pink;"> <span>文本文本222</span> </div> 页面就变成了下面这个样子: 使用clear属性可以看到在规范文档中,还直接提供了一个
创建BFC的方式可以类比为上游水域在下游口安装了闸门,使用 <div style="width: 100px; height: 100px; border: 1px solid orange; float: left;"> <span>文本文本111文本文本111文本文本111</span> </div> <div style="width: 100px; height: 100px; background: pink; clear: left;"> <span>文本文本222</span> </div> 可以看到,最终效果和上面创建BFC的效果是一样的。但实际我之前看到的解决浮动的方案中,比较推荐的做法是由浮动的元素这边来处理清除,比如创建BFC容器,或者加在伪元素 <div id="float-box"> <div style="width: 100px; height: 100px; border: 1px solid orange; float: left;"> <span>文本文本111文本文本111文本文本111</span> </div> </div> <style> #float-box::after { content: ''; display: block; clear: left; } </style> <div style="width: 100px; height: 100px; background: pink;"> <span>文本文本222</span> </div> 上面的代码中使用
根据文档里的描述, 但是规范文档中也提示我们,使用
在《对BFC的理解》中,我们提到过,在BFC容器中,相邻块级盒子之间的垂直'margin'会折叠。这里的意思应该就是指,设置了 文档中给出了间隙的值是怎么计算得出的:
光从描述上看,有点抽象,尤其是第二种计算,这里所谓的假设位置是哪里呢?第一种似乎好理解一些,就是让两个边缘对齐的一个间隔的量。所以文档中也举了例子来配合解说。
从名称就可以看出,F是个浮动块高度为H,此时B1有个bottom margin值为M1,B2有个top margin值为M2,在B2未设置clear属性之前,B1和B2之间的间距为M1和M2中的较大值,也就是产生了垂直 假设B1的底部边框在y=0这个位置,就如上图所示,此时浮动框F的顶部位置就在y=M1的位置,而B2的顶部边框就在y=max(M1,M2)的位置,浮动框F的底部位置在y=M1+H的位置。 在这个例子中,B2不在F下面,这个例子所描述的就是需要添加间隙的场景。也就是说:
根据文档中描述的计算方式,这里需要计算两次间隙量,C1和C2,然后取两者中的较大值:C = 第一种方法是使 B2 的顶部与 F 的底部齐平,即 y(top of B2) = M1 + H。这意味着margin不再折叠(B1和B2的间距肯定大于M1和M2),它们之间有了间隙: 此时它们的等式关系为: F的底部 = B2的顶部边框 M1 + H = M1 + C1 + M2 C1 = M1 + H - M1 - M2 = H - M2 第二中计算是保持 B2 的顶部位置,即 y(top of B2) = max(M1,M2)。也就是B2边框在其假设位置,按照预期保持垂直 max(M1, M2) = M1 + C2 + M2 C2 = max(M1, M2) - M1 - M2 因为假设了 C2 = max(M1, M2) - M1 - M2 < M1 + H - M1 - M2 = H - M2 C2 < H1 - M2 又因为
<p style="margin-bottom: 4em"> First paragraph.</p> <p style="float: left; height: 2em; margin: 0"> Floating paragraph.</p> <p style="clear: left; margin-top: 3em"> Last paragraph.</p> 在最后一个 当我们设置 c + m-t = 2em c = 2em - m-t = 2em - 3em = -1em 第一种方式计算C1 = H - M2 = 2em - 3em = -1em 第二种计算方式,也就是保持 最后一个 所以最后C=max(C1,C2)=-1em。 从上面两个例子可以看出,间隙量的两种计算方式的区别就在于,是否改变浮动框后续元素的顶部位置。 总结随着弹性布局、网格布局等一系列新的布局方式引入后,浮动的使用少了很多,但它仍然能实现特殊的网页效果,因此我们还是需要对它进行必要的了解。 本文来自博客园,作者:beckyye,转载请注明原文链接:https://www.cnblogs.com/beckyyyy/p/18032321 该文章在 2024/2/27 9:19:10 编辑过 |
关键字查询
相关文章
正在查询... |