问题描述
|
CSS块格式设置上下文如何工作?
CSS2.1规范指出,在块格式设置上下文中,框是从顶部开始垂直放置的。即使块中有浮动元素,也会发生这种情况,除非块框建立了新的块格式化上下文。众所周知,当浏览器在块格式上下文中渲染块框时,会省略float元素,为什么建立新的块格式上下文有效?
框(块框和嵌入式框)在正常流程中如何布置?
我在某处读到了块元素会生成块框的情况,但是当用户代理绘制框时,浮动元素将被忽略,并在填充内容时将其考虑在内。尽管浮动元素将与框的其他元素重叠,但解决方案是使用ѭ0为重叠元素建立新的块格式化上下文。
\“新块格式设置上下文仍然是块格式\”,因此在绘制框时,它还将浮动元素当作没有退出一样。是这样吗?还是我误解了“新块格式设置上下文?”
更新:更多问题
通过说“这是对列式样式布局有用的行为。但是,它的主要用途是停止浮动,例如在” main content” div中,实际上清除浮动的侧栏,即浮动出现在源代码的前面。\“
我不懂意思,我会举一个例子,也许您会理解我。
.content {
background: #eee;
color #000;
border: 3px solid #444;
width: 500px;
height: 200px;
}
.float {
background: rgba(0,255,0.5);
border: 1px solid #00f;
width: 150px;
height: 150px;
float: right;
}
p {
background: #444;
color: #fff;
}
<div class=\"content\">
<h3>This is a content Box</h3>
<p>It contains a left floated Box,you can see the actual content div does go under the float,but that it is the <h3> and <p> <b>line Boxes</b> that are shortened to make room for the float. This is normal behavIoUr.</p>
<div class=\"float\">floated Box</div>
</div>
解决方法
块格式化上下文
浮动,绝对定位
元素,块容器(例如
内联块,表单元格和
表格标题)
框和带有“溢出”的阻止框
除了“可见”(
值已传播到
视口)为其内容建立新的块格式上下文。
以我的大胆,重要的是确立点
这意味着您使用
overflow
(可见以外的任何元素)或float
或inline-block
..etc等元素负责其子元素的布局。然后是子元素,然后是“包含的”,无论是浮点数还是折叠边距,它们都应完全由其边界父级包含。
在块格式化上下文中,每个
盒子的左外边缘触及左边
包含块的边缘(用于
从右到左格式化,右边缘
触摸)
上一行的含义是:
因为一个盒子只能是矩形的,而不能是不规则形状的,这意味着两个浮子(甚至旁边)之间的新块格式化上下文不会环绕相邻的侧面浮子。内部的子框只能延伸到其父母的左边缘(或RTL的右边缘)。这种行为对列式样式布局很有用。但是,它的主要用途是停止浮动,例如在“主要内容” div中,实际上清除浮动的侧栏,即在源代码中较早出现的浮动。
浮空
在正常情况下,浮点数应该清除所有先前浮点的元素,而这些浮点元素先前已浮在整个源代码中,而不仅仅是您显示的“列”
“浮动许可规范”中的引述语为:
此属性指示
元素的盒子可能不是
与较早的浮动框相邻。
\'clear \'属性不考虑
漂浮在元素本身内部或其他块格式上下文中
假设您有一个三列布局,左右列分别在左右浮动,侧面列现在处于新的“块格式设置”上下文中,因为它们是浮动的(请记住,float也是建立新BFC的属性之一),这样您就可以愉快地对其中的列表元素进行浮动,并且它们仅清除已经在侧列内部的浮动,而不再关心源代码中先前的浮动
要使主要内容成为新的块格式上下文?
现在,在中间的列中,您可以简单地从两侧开始对其进行页边空白,以使其看起来整齐地位于两侧的浮动列之间,并采用剩余的宽度,这是在中心列为“ fluid”的情况下获得所需宽度的一种常见方法-直到您需要在内容div中使用浮点/清除(对于使用\“ clearfix \” hack或包含它们的模板的用户而言,这种情况很常见)
使用以下非常简单的代码:
#left-col {
border: 1px solid #000;
width: 180px;
float: left;
}
#right-col {
border: 1px solid #000;
width: 180px;
float: right;
height: 200px;
}
#content {
background: #eee;
margin: 0 200px;
}
.floated {
float: right;
width: 180px;
height: 100px;
background: #dad;
}
<div id=\"left-col\">left column</div>
<div id=\"right-col\">right column</div>
<div id=\"content\">
<h3>Main Content</h3>
<p>Lorem ipsum etc..</p>
<div class=\"floated\">this a floated box</div>
<div class=\"floated\">this a floated box</div>
</div>