当前位置: 首页 > Web前端 > CSS

深入理解CSS布局和BFC

时间:2023-03-31 13:33:28 CSS

个人专栏ES6已上线,深入ES6,通过案例学习掌握ES6新特性的一些使用技巧和原理,持续更新,←点击订阅。喜欢再读一遍,养成习惯。本文已收录到GitHubhttps://github.com/qq44924588...更多往期好评文章已归类,我的文档和教程资料也整理了很多。欢迎来到星和完美。面试时可参考考点复习。我希望我们能在一起。为了保证更好的可读性,本文采用意译而非直译。CSSLayout中有一些概念,一旦你理解了它们,就可以真正提高你的CSS布局能力。这篇文章是关于块格式化上下文(BFC)的。您可能从未听说过这个术语,但是如果您曾经使用CSS进行过布局,您可能知道它是什么,并且了解BFC是什么、它的工作原理以及如何创建BFC来帮助你了解CSS中的布局是如何工作的。在本文中,我将通过一个熟悉的示例来解释什么是BFC。然后声明一个新的显示值,只有当您了解什么是BFC以及您为什么需要它时,这才有意义。想阅读更多优质文章,请戳GitHub博客,一年百篇优质文章等你来!什么是BFC在网页的CSS渲染中,块级格式化上下文(BlockFromattingContext)是根据块级框来布局的。W3C对BFC的定义如下:浮动元素和绝对定位元素、非块级框(如inline-blocks、table-cells、table-captions)的块级容器,以及溢出值的块级框不是“可见的”,将为它们的内容创建一个新的BFC(块格式上下文)。BFC是一个独立的布局环境,元素的布局不受外界影响,在一个BFC中,blockboxes和lineboxes(lineboxes由一行中的所有inline元素组成)会垂直沿着它的Border对齐父元素的。通过一个简单的float示例,块格式化上下文(BFC)的行为很容易理解。在下面的示例中,我有一个带有图像的框和一些浮动在左侧的文本。如果我们有足够的文本,它会环绕浮动图像和边框,然后是整个区域。//html我是浮动元素。

我是外框内的文本。
//css.outer{border:5px点缀rgb(214,129,137);边界半径:5px;宽度:450px;填充:10px;margin-bottom:40px;}.float{填充:10px;5px;背景色:rgba(233,78,119,.4);颜色:#fff;向左飘浮;宽度:200px;margin:020px00;}如果我删除了一些文本,那么没有足够的内容来包围图像,并且由于浮动被从文档流中取出,边框上升到图像下方,直到高度的文字。这是因为当我们浮动一个元素时,文本所在框的宽度保持不变,是文本的行框被缩短以为浮动元素腾出空间。这就是背景和边框出现在浮动后面的原因。我们通常有两种方法来解决这个布局问题。一种方法是使用clearfixhack,它所做的是在文本和图像下方插入一个元素并将其设置为clear:both。另一种方法是将overflow属性与默认可见以外的值一起使用。.outer{overflow:auto;}参见演示overflow以这种方式工作的原因是使用除visible初始值以外的任何值都会创建块格式化上下文,而BFC的一个特性是它包含浮点数。BFC是布局中的迷你布局您可以将BFC视为页面中的迷你布局。一旦为元素创建了BFC,它就会包含所有内容。正如我们所见,这包括浮动元素,它们不再从盒子底部突出。BFC还会导致其他一些有用的行为。BFC防止边距折叠了解边距折叠是另一个被低估的CSS技能。在下一个示例中,假设一个div具有灰色背景色。这个div包含两个标签p。外部div元素的底部边距为40px,标签p的顶部和底部边距为20px。//html

我是第一个段落,顶部和底部的边距为20px;

我是第一个段落,顶部和底部的边距为20px;

//css.outer{background-color:#ccc;边距:0040px0;}p{填充:0;边距:20px020px0;背景色:rgb(233,78,119);color:#fff;}因为p元素的边距和外部div的边距之间没有任何东西,所以两者会折叠,所以p最终会与div的顶部和底部齐平。我们在p上方和下方看不到任何灰色。在CSS中,两个相邻框(可能是兄弟或祖先)的边距可以合并为一个边距。这种组合边距的方式称为折叠,因此组合边距称为折叠边距。折叠结果按照以下规则计算:当相邻的两个边距均为正时,折叠结果取两者中较大的值。当相邻两个边距均为负值时,折叠结果为两个绝对值中较大的值。当两个边距分别为正负时,折叠结果为两者之和。产生褶皱的必要条件:边距必须是连续的!如果我们将盒子设为BFC,它现在包含标签p和它们的边距,这样它们就不会折叠,我们可以在边距背景后面看到容器的灰色。.outer{背景颜色:#ccc;边距:0040px0;overflow:auto;}查看演示同样,BFC的工作是将东西保存在盒子里并防止它们跑出盒子。BFC防止元素被浮动元素覆盖您会熟悉BFC的这种行为,因为任何使用浮动的列类型布局都是这样工作的。如果一个项目创建了一个BFC,那么该项目将不会包装任何浮动元素。在下面的例子中,有如下html结构:Iamafloatedelement.
Iamtext具有float类的项目向左浮动,因此div中的文本位于它环绕的浮动后面。我可以通过使包装文本的div成为BFC来防止这种包装行为。.text{overflow:auto;}这实际上是我们创建多列浮动布局的方式。浮动项目还为该项目创建了一个BFC,因此如果右边的列比左边的列高,我们的列将不会相互环绕。查看在多列布局中使用BFC的演示如果我们创建一个填充容器整个宽度的多列布局,在某些浏览器中,最后一列有时会落到下一行。这可能是因为浏览器将列宽四舍五入,使得所有列的总宽度超过了容器。但是如果我们在多列布局的最后一列创建一个新的BFC,它总是会占据其他列先填充后剩下的空间。例如:第1列第2列第3列对应CSS:.column{width:31.33%;背景色:绿色;向左飘浮;margin:01%;}.column:last-child{float:none;}BFCnotcreated之前:通过添加以下样式创建BFC:.column:last-child{float:none;溢出:隐藏;现在,尽管框的宽度略有变化,但布局不会中断。当然,对于多栏布局,这不一定是好办法,但可以防止最后一栏掉落。Flexbox可能是解决此问题的更好方法,但这种方法可用于说明元素在这些情况下的行为方式。还有什么可以创建BFC?除了使用overflow创建BFC之外,其他一些CSS属性也会创建BFC。正如我们所见,浮动元素创建了BFC。您的浮动将包含其中的任何内容。BFCfloat的值不是没有,可以通过以下方式创建。位置的值不是静态的或相对的。display的值为inline-block、table-cell、flex、table-caption或inline-flex,overflow的值为不可见。使用溢出或其他方法创建BFC时有两个问题。首先,这些方法都有自己的设计目的,所以使用它们创建BFC时可能会产生副作用。例如,使用overflow创建BFC后,您可能会看到出现滚动条或元素内容在某些情况下被剪切。这是因为overflow属性旨在让您告诉浏览器如何定义元素的溢出状态。浏览器实现其最基本的定义。即使没有任何不需要的副作用,使用溢出也可能会使其他开发人员感到困惑。为什么溢出设置为自动或滚动?最初开发者的意图是什么?他们想要这个组件上的滚动条吗?最安全的做法是创建一个没有任何副作用的BFC,并且它里面的元素留在这个mini-layout中是安全的,这种做法不会引起任何意想不到的问题并且理解开发者的意图。CSS工作组也认同这个想法,于是他们自定义了一个新的属性值:display:flow-root。flow-root浏览器支持您可以使用display:flow-root安全地创建解决上述各种问题的BFC:包装浮点数、防止边距重叠以及防止环绕浮点数。浏览器对此属性的支持目前是有限的。如果你觉得这个属性值方便,请投票支持Edge。不过无论如何,你现在应该明白什么是BFC,以及如何使用overflow或者其他方法来包裹浮动元素,并且知道BFC可以防止元素包裹浮动元素。如果你想使用elastic或者grid布局,你可以在一些不同的支持浏览器中使用BFC的这些特性进行fallback处理。了解浏览器如何布局网页是非常基础的。虽然有时看似无关紧要,但这些小知识可以加快创建和调试CSS布局所需的时间。你的点赞是我继续分享好东西的动力,欢迎点赞!干货交流系列文章总结如下。我觉得点个Star就好了。欢迎加群,互相学习。https://github.com/qq44924588...我是小智,公众号《大招天下》的作者,前端技术爱好者。我会经常分享自己学习看到的干货,在进步的路上互相鼓励!关注公众号,后台回复福利,就能看到福利,你懂的。