zoukankan      html  css  js  c++  java
  • 【CSS】410- 关于CSS盒子模型、BFC及其应用

    关于CSS的盒子模型,正确的解释应该是这样的:

    把所有 HTML 元素都看作是一个 盒子(Box), 这个盒子包着一层又一层, 这就是盒模型.

    随便写个 div, 打开 Chrome 的开发者工具, 在右边栏能看到这样一个直观的盒模型图.

    640?wx_fmt=png

    这个 div 从外到内被分成了四层, 分别是:

    • Margin(外边距) - 清除边框外的区域, 外边距是透明的.

    • Border(边框) - 围绕在内边距和内容外的边框.

    • Padding(内边距) - 清除内容周围的区域, 内边距是透明的.

    • Content(内容) - 盒子的内容, 显示文本和图像等.

    640

    box-sizing

    640

    盒模型又被分为 IE盒模型 和 W3C标准盒模型 两种类型.

    在 IE8+ 的浏览器中要使用哪个盒模型可以由 box-sizing 控制.默认值为 content-box, 即W3C标准盒模型;如果将 box-sizing 设为 border-box 则用的是IE盒模型.

    这两者的区别在于:

    1. IE盒模型的盒子大小为 content + padding + border.

    2. W3C标准盒模型的盒子大小为 content, 不包括 padding 和 border.

    可以这样理解:

    IE盒模型的盒子总大小就是 content 的大小, padding 和 border 会被并进 content 内一起计算, content 将会被压缩.

    640?wx_fmt=png

    上图中, 元素样式为  200px; height: 200px; padding: 10px; border: 1px solid #333333;可以看到元素(盒子)的总大小为 (200 * 200)px.content 则是被压缩成了 ((200 - (10 + 1) * 2)/2)px.呃... 看得懂这串算式不..?

    W3C标准盒模型的盒子总大小是 content 和 padding 以及 border 的总和大小, 后两者另算大小.

    640?wx_fmt=png

    上图可以看到元素(盒子)的总大小为 (222 * 222)px, 这个 222 就是 200 + (10 + 1) * 2 得出来的.content 大小为 200, padding 和 border 另算大小. 总和大小就是元素(盒子)的总大小.

    640

    BFC 原理

    640

    BFC 即 Block Formatting Contexts, 翻成中文是 块级格式化上下文.具有 BFC 特性的元素, 可以看作是隔离了的独立容器, 容器里面的元素不会在布局上影响到外面的元素, 并且 BFC 具有普通容器所没有的一些特性。

    可以这样来理解, 将 BFC 理解为一个完全封闭的盒子, 盒子内部的元素无论如何摆放, 也不会影响到盒子外面.

    只要元素触发以下任意一条, 便视其具有 BFC 特性(创建BFC的方式):

    1. html根元素

    2. float浮动

    3. 绝对定位

    4. overflow不为visible

    5. display为表格布局或者弹性布局

    BFC的特性:

    1. 内部Box会在垂直方向,一个接一个地放置。

    2. Box垂直方向的距离由margin决定,在一个BFC中,两个相邻的块级盒子的垂直外边距会产生折叠。

    3. 在BFC中,每一个盒子的左外边缘(margin-left)会触碰到容器的左边缘(border-left)(对于从右到左的格式来说,则触碰到右边缘)

    4. 形成了BFC的区域不会与float box重叠

    5. 计算BFC高度时,浮动元素也参与计算。

    BFC主要的作用:

    1. 清除浮动

    2. 防止同一BFC容器中的相邻元素垂直方向的外边距重叠问题

    640

    举例

    640

    1. 同一个 BFC 下的两个块级元素之间的外边距会发生折叠.

    640?wx_fmt=png

    如上图所示, 这是两个一毛一样的 div.它们的样式同为

     100px; 	
    height: 100px; 	
    margin: 50px; 	
    background: #37A7FF

    640?wx_fmt=png

    但它们之间的距离却只有 100px, 并不是想象中的 (100 + 100)px.这是因为它们之间的外边距折叠了.你可以这样理解, 只有一个外边距起作用了. 如果有另外一种场景, 两个元素的外边距长短不一样, 那会是外边距较长的那一个起作用.

    640?wx_fmt=png

    就是这样. 如果想要避免这种情况, 可以把这两个元素分别放到一个具有 BFC 特性的盒子内.

    2. 清除浮动.这个很容易理解, 浮动的元素会脱离文档的普通流.如果盒子内的元素是浮动元素且盒子本身不具备 BFC 特性, 那么这个盒子在视觉上并不会包裹住内部浮动元素, 总大小也不包括内部浮动元素. 如下图.

    640?wx_fmt=png

    触发盒子的 BFC 特性后:

    640?wx_fmt=png

    3. 阻止元素被浮动元素覆盖下图是一个文字环绕效果.

    640?wx_fmt=png

    蓝色 div 是一个浮动元素, 灰色 div 是一个块级元素.会造成上图的原因是因为灰色 div 被蓝色 div 所覆盖, 但文本不会被覆盖, 所以被强行压缩换行.如果想要避免这种情况, 可以触发灰色 div 的 BFC 特性.

    640?wx_fmt=png

    总结就是, BFC 可以适用于各种结构布局.

    640?wx_fmt=png

    回复“加群”与大佬们一起交流学习~

    个人博客:http://www.pingan8787.com 微信公众号【前端自习课】和千万网友一起,每日清晨,享受一篇前端优秀文章。 目前已连续推送文章 600+ 天,愿每个人的初心都能一直坚持下去!
  • 相关阅读:
    自定义View绘制字符串
    自定义View实现图片的绘制、旋转、缩放
    Android圆形图片--ImageView
    laravel安装excel功能
    jQuery修改css属性
    cssText
    MySQL 启动、关闭、选择数据库等命令
    MySQL数据文件的导入、导出
    datepicker的使用
    laravel无法显示路由界面
  • 原文地址:https://www.cnblogs.com/pingan8787/p/13069613.html
Copyright © 2011-2022 走看看