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

浮动折叠引起的块级格式化的上下文思考

时间:2023-04-05 00:26:28 HTML5

浮动的原始定义:实现文字环绕图片的效果。除此之外,别无他法。查看演示什么是浮动?float在css中是通过float属性定义的:float:left|对|无|内联启动|inline,block->blocktable-*->blockinline-table,table->tableflex,inline-flex->值保持不变,但是float对此类元素不起作用其他值保持不变当一个元素被浮动时,它将移出正常的文档流,然后向左或向右平移,平移直到碰到它所在容器的边框,或者碰到另一个浮动元素。浮动元素不属于文档中的正常流动,属于浮动布局。(CSS中的三种基本定位机制:普通流、浮动和绝对定位)浮动元素不会影响普通流的块级元素的布局(就好像浮动元素不存在一样),只会影响内联元素(比如:文字换行),如下图2所示。当浮动元素的高度超过父元素时,父元素不会自动展开关闭浮动元素(高度塌陷现象)。顾名思义,漂浮就是漂浮在普通的水流之上,像浮云一样,但只能左右漂浮。

阅读并窥视他人的灵魂。旅行,去陌生的环境去感受。电影,到银幕去感受别人的人生过程。冥想和探索你内心的秘密。
阅读,窥探他人的心灵。旅行,去陌生的环境去感受。电影,到银幕去感受别人的人生过程。冥想和探索你内心的秘密。
ViewDEMOFloating会对相邻的元素(紧跟在浮动元素后面的元素)产生影响。如果相邻元素是块级元素,它会忽略浮动块框(如上图中的背景色模块),这就是我们通常看到的效果——使自己尽可能靠近同一行浮动元素,导致被浮动元素覆盖。如果相邻元素是行内元素,它会尽可能包围浮动元素(如上图中的复制模块)。当父元素获取高度计算时,浮动元素将被忽略,即不计算浮动元素的高度。这就是浮塌,又称高塌现象。什么是块级格式化上下文?块格式上下文(BlockFormattingContext,BFC)是网页可视化CSS渲染的一部分。它是块盒布局过程发生的区域,也是浮动元素与其他元素交互的区域。BFC,主要用于排版块级元素。用BFC创建的元素是一个独立的盒子(HTML中的盒子,不可见),里面的子元素不会影响布局中的外部元素。同样,外部元素不会影响其子元素。从这个角度来看,块级格式化上下文的特性类似于级联上下文(css探索系列中的CSScascading)。以下方法将创建块格式化上下文:根元素:浮动元素:floatisnotnone绝对定位元素:位置不是静态的块元素|relativeoverflowvalueisnotvisibleInlineblockelement:display:inline-blocktablecell格式:display:table-cell。HTML表格单元格默认值为table-caption:display:table-caption。HTML表格标题默认为此值匿名表格单元格元素:显示:表格|内联表|表行|表行组|表头组|表脚组显示:流根。创建无副作用BFC的显示属性的新值。注意:Safari不支持。弹性元素:显示:弹性|inline-flex元素grid元素的直接子元素:display:grid|inline-grid元素的直接子元素包含:layout|内容|绘制多列容器:column-count或column-widthno对于自动,column-count:1column-span:all。即使该元素未包装在多列容器中(标准更改,Chrome错误)。注意:display:table本身不会创建BFC,但是会生成匿名框(anonymousboxes),而display:table-cellinananonymousbox可以创建新的BFC,换句话说,触发块级格式化上下文是匿名框,不显示:表。所以display:table和display:table-cell创建的BFC效果是不一样的。块级格式化上下文的特点块格式化上下文对于浮动定位(float)、清除浮动(clear)和边距折叠(margincollapsing)很重要。浮动定位和清除将仅应用于同一BFC内的元素。边距折叠也只发生在属于同一BFC的块级元素之间。块级格式化上下文的三个特性:BFC防止边距折叠(CSS探索系列的边距)当两个相邻的块框在同一个块级格式化上下文中时,它们之间的垂直边距会发生叠加。换句话说,如果两个相邻的块框不属于同一个块级格式化上下文,那么它们的边距将不会重叠。按照惯例,块格式化上下文的边框不能与其中元素的边距重叠。出于这个原因,将负边距添加到浮点数旁边的块级格式化上下文将不起作用。BFC不与浮动元素重叠。BFC内部的浮动不影响其他BFC中元素的布局,而清除浮动只能清除同一个BFC中其前面元素的浮动。BFC通常可以包含浮动元素,即在计算BFC的高度时,浮动元素也参与计算。独立的块级上下文可以包裹浮动流,所有浮动的子元素都不会导致容器的高度塌陷,也就是说父元素会把浮动元素的高度也算进去,所以不需要清除浮动来支撑高度。同时BFC在文档中仍然属于普通流。因此,父元素创建一个新的BFC,可以关闭和浮动。什么是hasLayout?hasLayout是ie的私有概念。ie7及以下版本的IE浏览器不支持BFC,但是我们可以为ie7和6浏览器添加相应的hasLayout规则来实现BFC的效果!IE使用Layout概念来控制元素的大小和位置。您可以使用Javascript函数hasLayout来检查元素是否具有Layout并返回true|错误的。如果一个元素有布局,它有自己的大小和位置;如果不是,它的大小和位置由最近的具有布局的祖先元素控制。hasLayout是一个只读属性,因此不能使用Javascript设置它。当它的值为true时,会达到类似BFC的效果。以下方法可以使元素hasLayout为真:position:absolutefloat:left|rightdisplay:inline-blockwidth:除自动高度以外的任何值:除自动缩放外的任何值:除正常书写模式外的任何值:tb-如何清除溢出:隐藏|滚动|rlIE7中的自动?清浮,又称闭浮。本质上,两者都是为了消除浮塌。它们的区别是:clearfloat:对应的词是clear,css中对应的属性是clear:left|对|两者|none,只能在同一个BFC中清除其前面元素的浮动。关闭浮动:更准确的说是关闭浮动元素,即创建一个BFC,从而消除浮动折叠。准确的说,我们要达到的效果是关闭浮动,而不是简单的清除浮动。单纯的清除浮动并不能解决容器高度塌陷的问题。例如:如果我们将上一个例子的背景色模块添加到样式clear:both中来清除浮动,这个模块的浮动仍然会影响到它后面的兄弟元素。如图3所示:">...查看DEMO再举个例子:我们将样式显示添加到的背景色模块中前面的例子:flow-root是关闭浮动的,创建了一个新的BFC,所以不会影响其他BFC元素。如图4所示:webp">...查看DEMO清除浮动的三种方法方法一(推荐):添加父元素伪元素,并且在伪元素上加上clear:both,据说是最优越的方法优点:浏览器支持好,不容易出现奇怪的问题缺点:注意浏览器兼容性问题......方法二:在浮动元素之后,添加一个空标签div,并设置样式clear:both优点:容易理解,容易掌握缺点:会添加LotsofLotsofmeaninglessemptytags......方法三:在浮动元素后添加空标签br标签,设置属性clear="both"类似方法2......关闭浮动元素的方法为浮动元素的父元素创建一个BFC(为了兼容ie6,还需要触发hasLayout,比如添加:zoom:1)。例如:(推荐)display:inline-block。注意设置宽度:100%。溢出:自动|隐藏|可见的。据说auto对SEO比较友好,hidden对SEO不是很友好,但是切记不要用visible值。缺点:当内层元素的宽高超过父元素时,会出现滚动条(scroll)或隐藏溢出部分(hidden)。浮动:左|正确的。缺点:与父元素相邻的元素的布局会受到影响,不可能一直浮动到body。显示:表。缺点:盒子模型的属性发生了变化,由此引发的一系列问题得不偿失。显示:流根。创建无副作用BFC的显示属性的新值。缺点:Safari不支持。参考链接MDNfloatMDN块格式化上下文