转自 菜鸟教程
所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用。
CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括: 边距(外边距) , 边框 , 填充(内边距) ,和 实际内容 。
盒模型允许我们在其它元素和周围元素边框之间的空间放置元素。
下面的图片说明了盒子模型(Box Model):
转自 链接
盒子模型有两种,分别是W3C盒子模型(标准盒模型)和IE盒子模型(怪异盒模型)
1.标准盒模型中width指的是内容区域content的宽度;height指的是内容区域content的高度。
2.标准盒模型下盒子的大小 = content + border + padding + margin
1.怪异盒模型中的width指的是内容、边框、内边距总的宽度(content + border + padding);height指的是内容、边框、内边距总的高度
2.怪异盒模型下盒子的大小=width(content + border + padding) + margin
建议不要给元素添加具有指定宽度的内边距,而是尝试将内边距或外边距添加到元素的父元素和子元素。
即box-sizing属性可以指定盒子模型种类,content-box指定盒子模型为W3C(标准盒模型),border-box为IE盒子模型(怪异盒模型)。
在CSS中,所有元素被“ 盒子 ”所包围,利用盒模型的基本原理来实现CSS准确布局,元素排列等处理
CSS广泛使用的两种盒子,其在页面流和元素之间的关系表现为不同的行为:
对于定义为块级盒子(block)的元素会表现出以下行为:
对于定义为内联盒子(inline)的元素会表现出以下行为:
通过对盒子设置display的属性值,来控制盒子的外部显示类型
外部显示类型与内部显示类型
外部显示类型:决定盒子是块级还是内联,即决定了盒子之间的布局方式
内部显示类型:决定了盒子内部的元素是如何布局的,默认情况是按照正常文档流布局,也可以通过设置display值为flex和grid来改变内部元素之间的布局方式
不同显示类型的例子
block:
图中段落里的 <span>word </span>被设置为 display:block
因此其独占一行,宽度填满整个父元素
flex:
图中的列表被设置为 display:block ,每个列表是一个块级元素 —— 像段落一样 —— 会充满整个容器的宽度并且换行
inline-flex与inline
图中的列表被设置为 display:inline-flex ,使得在一些flex元素外创建一个内联框
最后设置两个段落为 display: inline , inline flex 容器和两个段落在同一行上,而不是像块级元素一样换行
CSS组成一个盒模型需要以下几个部分:
在标准模型中,如果你给盒设置 width 和 height,实际设置的是 content box。 padding 和 border 再加上设置的宽高一起决定整个盒子的大小
如果使用标准模型宽度 = 410px (350 + 25 + 25 + 5 + 5),高度 = 210px (150 + 25 + 25 + 5 + 5),padding 加 border 再加 content box
如果使用替代模型,一切都将变得简单很多,此时的 width 和 height 就是盒子可见的宽度与高度,无论怎么改变 padding 或 border 的值,都会通过压缩 conten box 的大小来保持 width 和 height 的值不变
如需使用,只需要声明以下CSS样式:
外边距是盒子周围一圈看不到的空间。它会把其他元素从盒子旁边推开。 外边距属性值可以为正也可以为负。设置负值会导致和其他内容重叠。无论使用标准模型还是替代模型,外边距总是在计算可见部分后额外添加
CSS:
html:
结果如下:因为上外边距设置为负值,所以两个边框会重叠
外边距折叠
理解外边距的一个关键是外边距折叠的概念。如果你有两个外边距相接的元素,这些外边距将合并为一个外边距,即最大的单个外边距的大小
结果如下,中间间隔的部分为50px
如下图所示,对内联盒子设置 width 和 height 都不会生效,虽然margin,padding和border会生效,但不会改变与其它内联盒子的关系,因此其内边距和边框会与段落的其它元素重叠
要避免上述情况,只需要将内联盒子的display值设置为inline-block即可
设置之后的效果为:
但因其保留有inline的特征,所以它不会跳转到新行
float可以使得当前元素脱离正常文本流,并吸附到父元素的左边(left)或者右边(right)正常布局中位于该浮动元素之下的内容,此时会围绕着浮动元素进行排列
基本的常见用途在于图片与文字环绕排版以及首字母下沉:
重点是这个,元素浮动具有一定的规则与限制
设置如下三个盒子(均以块级元素方式呈现):
将box1设置为向右浮动:
因为box1脱离正常文档流,所以box2和box3会向上填补box1的空位,box1浮动到父元素(body)的最右边
设置box1向左浮动:
同理,box1脱离正常文档流,box2与box3向上填补box1的空位,此时box1浮动到父元素(body)的最左边,所以会覆盖掉box2(浮动元素在正常流文档的上方)
设置box2向左浮动:
可以看到box3因为box2脱离正常文档流而向上填充其空位,box2因为浮动到左边覆盖了box3,然而box1仍处于正常文档流中,并且在html文件中最先声明,所以box2只能在box1的下方进行浮动(即使box2设置为向右浮动也是一样)
设置box1、box2与box3都向左浮动:
可以看到三个盒子均向左浮动,直到碰到前一个浮动框的边缘为止(对于box1来说是碰到父元素的边缘),因此呈现如此的排列状况
如果当父元素太窄,无法包含三个盒子的宽度,则无法容纳的元素向下移动,直到有足够的空间使得其能向某个方向浮动,如下图所示:
如果浮动元素的高度不同,那么当它们向下移动时可能被其它浮动元素“卡住”
相关参考:
https://zhuanlan.zhihu.com/p/21286019?refer=miaomiaoji
https://www.jianshu.com/p/fe1052f1a8b6
浮动的规则先讨论到此
高度塌陷
在父元素container内设置一个盒子box1,此时没有设置浮动,box1会撑起父元素container的高度
如果此时设置box1浮动,因为其脱离了正常文档流,无法撑起盒子的高度,所以将发生高度塌陷:
为了解决这个问题,在此提供三种方法:
1. 添加额外标签
首先在父元素内添加空白内容的额外标签clearfix
然后再CSS规则中添加以下内容:
通过清除父元素内空白元素的浮动,使得父元素边框重新包含浮动内容
2. 父级元素添加overflow属性
直接在父元素内添加overflow属性:
同样可以清除浮动,结果如下:
3. after伪元素
html文档改为:
在CSS规则里添加:
W3C标准盒模型(默认):box-sizing: content-box
padding和border都会撑开盒子,改变盒子的宽度高度
总宽度:width + 左右border宽度 + 左右padding宽度 + 左右margin宽度
内盒宽度:width + 左右border宽度 + 左右padding宽度
IE盒模型:box-sizing: border-box
padding和border都不会撑开盒子,不会改变盒子的宽度,盒子的内容会相应缩小
总宽度:width + 左右margin宽度
内盒宽度: width
盒子模型布局稳定性
我们根据稳定性来分,建议如下:
按照 优先使用宽度,其次使用内边距,再次外边距。 即:width >padding >margin
原因:
(1)margin 会有外边距合并
(2)padding 会影响盒子大小,需要进行加减计算(麻烦) 其次使用
(3)width 没有问题我们经常使用宽度剩余法来做
padding margin 百分比
当margin和padding的值设置为百分比时,是相对于最近的块级或内联块父元素width(非总宽度)的相应百分比的值。
即使是margin-top、margin-bottom、padding-top、padding-bottom,设置为百分比时也是以最近块级父元素的width(非总宽度)为基准,而非height。
margin塌陷问题
相邻块元素垂直外边距的合并
当上下相邻的两个块元素相遇时,如果上面的元素有下外边距margin-bottom,下面的元素有上外边距margin-top,则他们之间的垂直间距不是margin-bottom与margin-top之和,而是两者中的较大者。这种现象被称为相邻块元素垂直外边距的合并(也称外边距塌陷)。
解决方法:
将其放在不同的 BFC 父容器中
<div class="container">
<div class="child"></div>
</div>
<div class="container">
<div class="child"></div>
</div>
.container {
overflow: hidden
}
.child {
width: 100px
height: 100px
background: #f0
margin: 100px
}
嵌套块元素垂直外边距的合并
对于两个嵌套关系的块元素,必须是block元素。如果父元素没有上内边距padding、没有上边框border、没有内容,则父元素的上外边距会与子元素的上外边距发生合并,合并后的外边距取其较大者。即使父元素的上外边距为0,也会发生合并。
解决方法:
给父元素加 overflow:hidden,相当于给父元素添加了一个BFC
给父元素加上内边距 或 上边框
BFC
BFC 全称为块格式化上下文 (Block Formatting Context) 。它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用
BFC触发条件:
overflow:除 visible 以外的值 (hidden、auto、scroll)
float:除 none 以外的值
display: inline-block、flex
position:absolute、fixed
BFC作用:
BFC解决margin塌陷问题
BFC解决浮动元素引起父元素高度塌陷问题
在通常情况下父元素的高度会被子元素撑开,而如果父元素没有设置高度,其子元素均为浮动元素,此时父元素会发生了高度坍塌,上下边界重合,即浮动元素无法撑起父元素。这时就可以用BFC来清除浮动了,将父元素整体设置为BFC环境
BFC解决元素被浮动元素覆盖问题
如果有两个相邻元素,第一个元素左浮动,第二个元素不设置浮动,这时候第二个元素会有部分被浮动元素所覆盖(但是文本信息不会被浮动元素所覆盖)。 如果想避免元素被覆盖,可触发第二个元素的 BFC 特性,在第二个元素中加入 overflow: hidden即可
龙华大道1号 http://www.kinghill.cn/Dynamics/2106.html