当前位置: 首页 > 科技观察

了解CSS布局和BFC,真正提高你的CSS布局

时间:2023-03-12 19:45:02 科技观察

CSS布局中有一些概念,一旦你理解了它们,就可以真正提高你的CSS布局技能。这篇文章是关于块格式化上下文(BFC)的。您可能从未听说过这个术语,但是如果您曾经使用CSS进行过布局,您可能知道它是什么,并且了解BFC是什么、它的工作原理以及如何创建BFC来帮助你了解CSS中的布局是如何工作的。在本文中,我将通过一个熟悉的示例来解释什么是BFC。然后声明一个新的显示值,只有当您了解什么是BFC以及您为什么需要它时,这才有意义。什么是BFC在网页的CSS渲染中,块级格式化上下文(BlockFromattingContext)是根据块级框来布局的。W3C对BFC的定义如下:浮动元素和绝对定位元素、非块级框(如inline-blocks、table-cells、table-captions)的块级容器,以及溢出值的块级框不是“可见的”,将为它们的内容创建一个新的BFC(块格式上下文)。BFC是一个独立的布局环境,元素的布局不受外界影响,在一个BFC中,blockboxes和lineboxes(lineboxes由一行中的所有inline元素组成)会垂直沿着它的Border对齐父元素的。通过一个简单的float示例,块格式化上下文(BFC)的行为很容易理解。在下面的示例中,我有一个带有图像的框和一些浮动在左侧的文本。如果我们有足够的文本,它会环绕浮动图像和边框,然后是整个区域。//htmlIamafloatedelement.

Iamtextinsidetheouterbox.
//css.outer{border:5pxdottedrgb(214,129,137);border-radius:5px;width:450px;padding:10px;margin-bottom:40px;}.float{padding:10px;border:5pxsolidrgba(214,129,137,.4);border-radius:5px;background-color:rgba(233,78,119,.4);color:#fff;float:left;width: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

IamparagraphoneandIhaveamargintopandbottomof20px;

IamparagraphoneandIhaveamargintopandbottomof20px;

//css.outer{background-color:#ccc;margin:0040px0;}p{padding:0;margin:20px020px0;background-color:rgb(233,78,119);color:#fff;}因为p元素的margin和外层div上的margin之间没有任何东西,所以两者会塌陷,因此p最终与div的顶部和底部齐平。我们在p上方和下方看不到任何灰色。在CSS中,两个相邻框(可能是兄弟或祖先)的边距可以合并为一个边距。这种组合边距的方式称为折叠,因此组合边距称为折叠边距。折叠结果按照以下规则计算:当相邻的两个边距均为正时,折叠结果取两者中较大的那个值。当相邻两个边距均为负值时,折叠结果为两个绝对值中较大的值。当两个边距分别为正负时,折叠结果为两者之和。产生褶皱的必要条件:边距必须是连续的!如果我们将盒子设为BFC,它现在包含标签p和它们的边距,这样它们就不会折叠,我们可以在边距背景后面看到容器的灰色。.outer{background-color:#ccc;margin:0040px0;overflow:auto;}查看演示同样,BFC的工作是将东西放在盒子里,防止它们跑出盒子。BFC防止元素被浮动元素覆盖您会熟悉BFC的这种行为,因为任何使用浮动的列类型布局都是这样工作的。如果一个项目创建了一个BFC,那么该项目将不会包装任何浮动元素。在下面的示例中,有以下html结构:Iamafloatedelement.
Iamtextwithfloatclass的项目向左浮动,所以div中的文本在它环绕浮动之后。我可以通过使包装文本的div成为BFC来防止这种包装行为。.text{overflow:auto;}这实际上是我们创建多列浮动布局的方式。浮动项目还为该项目创建了一个BFC,因此如果右边的列比左边的列高,我们的列将不会相互环绕。查看演示在多列布局中使用BFC如果我们创建一个填充容器整个宽度的多列布局,在某些浏览器中,最后一列有时会落到下一行。这可能是因为浏览器将列宽四舍五入,使得所有列的总宽度超过了容器。但是如果我们在多列布局的最后一列创建一个新的BFC,它总是会占用其他列先完成后剩下的空间。例如:column1column2column3对应CSS:.column{width:31.33%;background-color:green;float:left;margin:01%;}.column:last-child{float:none;}在创建BFC之前:添加如下样式创建BFC:.column:last-child{float:none;overflow:hidden;}现在,尽管框的宽度略有变化,但布局不会中断。当然,对于多栏布局,这不一定是好办法,但可以防止最后一栏掉落。Flexbox可能是解决此问题的更好方法,但这种方法可用于说明元素在这些情况下的行为方式。还有什么可以创建BFC?除了使用overflow创建BFC之外,其他一些CSS属性也会创建BFC。正如我们所见,浮动元素创建了BFC。您的浮动将包含其中的任何内容。可以使用以下方法创建BFC。float的值不是没有。位置的值不是静态的或相对的。display的值为inline-block,table-cell,flex,table-caption或inline-flexoverflow的值为不可见创建BFC的新方式使用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布局所需的时间。