浮动元素的包裹性可以从两个方面去理解:首先,如果元素的子元素较少,则元素的宽度由其子元素决定;其次,如果元素的子元素较多,则元素的宽度由其包含块的宽度决定。
例子:
<style> div { width: 200px; float: left; outline: auto; } p { margin: 0; color: #fff; } p:nth-of-type(1) { background-color: fuchsia; } p:nth-of-type(2) { float: left; background-color: dodgerblue; } p:nth-of-type(3) { float: left; background-color: coral; } </style> <div> <p>正常 div 元素</p> <p>浮动 div 元素</p> <p>这是一个内容较多的浮动 div 元素</p> </div>
*有关于包裹性的详细介绍可以参考:宽度的流动性与包裹性
块化,即 BFC,全称为块级格式化上下文。专指 web 页面上一块独立的渲染区域,该区域拥有一套规则来决定子元素的布局方式,且不会影响到外部区域。
*除了 BFC,常见的还有 IFC( 内联格式化上下文 )、FFC( flex 格式化上下文 ) 和 GFC( grid 格式化上下文 )。
CSS 规范中,有关于 BFC 的规则有很多,但我们可以简单记住 BFC 最大的一个表现特点,即 BFC 化的元素,不管其子元素怎样地翻江倒海,都不会影响到外部元素。下面,列举两种 BFC 的常见应用,以便更加深入地理解 BFC 的这一特点:
阻止 margin 合并
例子:
<style> div, ul, li { margin: 0; padding: 0; } div { background-color: chocolate; width: 100px; height: 60px; } ul { background-color: cornsilk; margin: 10px; } li { margin: 30px; } </style> <div></div> <ul> <li>111</li> <li>222</li> </ul>
例子中,ul 与其子元素发生 margin 重叠,导致 div 与 ul 的垂直外边距为 30px。
如果为 ul 设置浮动属性,以触发其创建 BFC,那么子元素将不会再影响到外部元素。
例子:
<style> div, ul, li { margin: 0; padding: 0; } div { background-color: chocolate; width: 100px; height: 60px; } ul { background-color: cornsilk; margin: 10px; float: left; } li { margin: 30px; } </style> <div></div> <ul> <li>111</li> <li>222</li> </ul>
例子中,我们可以看到,子元素 li 被牢牢的封闭在 ul 中,并没有发生父子外边距合并的现象,说明 BFC 阻止了 margin 合并。
阻止高度塌陷
例子:
<style> ul, li { margin: 0; padding: 0; } ul { background-color: cornsilk; } li { list-style: none; float: left; } </style> <ul> <li>111</li> <li>222</li> </ul>
例子中,为 li 设置浮动属性,导致其父元素 ul 高度塌陷。
如果为 ul 设置浮动属性,以触发其创建 BFC,那么 ul 的高度就不会塌陷。
例子:
<style> ul, li { margin: 0; padding: 0; } ul { background-color: cornsilk; float: left; } li { list-style: none; float: left; } </style> <ul> <li>111</li> <li>222</li> </ul>
例子中,我们可以看到,父元素 ul 的高度并不为 0,说明 BFC 成功阻止了高度塌陷的发生。
能够触发 BFC 的方法有很多,float 属性只是其中之一。常见的方法如下:
以上,html 与 display 都很熟悉,float 是本文内容,overflow 与 position 后面会详细介绍。
如有错误,欢迎指正,本人不胜感激。