任何元素都可以看作盒子,css盒子模型本质上是一个盒子,封装周围的HTML元素。每个盒子有自己的大小和位置,并且还影响着 其他盒子的大小与位置。
css盒子模型(Box module)有以下几部分组成:
- content(实际内容)
- padding(填充)
- border(边框)
- margin(边距)
通常情况下我们设置的背景,包含的区域为content+padding+border,margin为透明的,不包含在里面。
元素框的总宽度 = 元素(content)的width + padding的左边距和右边距的值 + margin的左边距和右边距的值 + border的左右宽度
元素框的总高度 = 元素(element)的height + padding的上下边距的值 + margin的上下边距的值 + border的上下宽度。
css盒子模型有两种:
- W3C盒子模型(标准盒模型):****
box-sizing: content-box;( 浏览器默认设置 ) - IE盒子模型(怪异盒模型) :
box-sizing: border-box;
W3C盒子模型(标准盒模型)
IE盒子模型(怪异盒模型)
标准模型和IE模型的区别:
计算宽度和高度的不同。
标准盒模型:盒子总宽度/高度 = width/height + padding + border + margin。( 即 width/height 只是内容高度,不包含 padding 和 border 值 )
IE盒子模型:盒子总宽度/高度 = width/height + margin = (内容区宽度/高度 + padding + border) + margin。( 即 width/height 包含了 padding 和 border 值 )
也就是元素的width/高度计算不同:
标准盒模型:
元素width=content的width
元素height=content的height
IE盒子模型:
元素width=content的width+padding(左右)+border(左右)
元素height=content的height+padding(上下)+border(上下)
也就是当设置了元素的宽高之后,改变padding+border,标准盒模型的width不会改变,但是IE怪异模型会改变content的宽高(缩放)。
例:
<div class="box">
content
</div>
.box{
width: 100px;
height: 100px;
border: 5px solid red;
padding: 0px;
margin: 20px;}
修改padding为20px后,盒子占总空间的距离缩小,但是content的width没变。
.box{
width: 100px;
height: 100px;
border: 5px solid red;
padding: 0px;
margin: 20px;
}
当设置为怪异模型后:content的宽度缩小,被挤压。盒子占据的总空间没变。
.box{
width: 100px;
height: 100px;
border: 5px solid red;
padding: 20px;
margin: 20px;
box-sizing: border-box;
}
JS如何获取盒模型对应的宽和高
(1)dom.style.width/height 只能取到行内样式的宽和高,style 标签中和 link 外链的样式取不到。
(2)dom.currentStyle.width/height (只有IE兼容)取到的是最终渲染后的宽和高
(3)window.getComputedStyle(dom).width/height 同(2)但是多浏览器支持,IE9 以上支持。
(4)dom.getBoundingClientRect().width/height 也是得到渲染后的宽和高,大多浏览器支持。IE9 以上支持,除此外还可以取到相对于视窗的上下左右的距离。
(6)dom.offsetWidth/offsetHeight 包括高度(宽度)、内边距和边框,不包括外边距。最常用,兼容性最好。
补充:行内元素,块级元素,行内块级元素
通过设置display:inline| block| inline-block可以改变元素的显示方式。
1. 对于行内元素(display:inline)如元素来说,设置margin-top/margin-buttom/padding-top/padding-buttom是无效的,也就是行内元素设置上面姐属性并不会影响周围元素的属性。但是设置margin-left/margin-right/padding-left/padding-right是可以影响周围元素的。例:
<div id="box"">
<span class="item item1">test1</span>
<span class="item item2">test2</span>
<span class="item item3">test3</span>
</div>
span.item {
background: black; padding: 0px; color: white;}
.item1{
padding: 10px;
}
2. 对于块级元素**(display:block)**如
3. 对于行内块级元素**(display:inline-block)**如元素来说,既可以让元素按照行内元素的方式布局(不换行),也可以设置margin/padding/width/height等属性。
边距塌陷:
1. 当上下相邻块级元素,上面元素设置margin-buttom。下面元素设置了margin-top,那两个元素的垂直间隔一般不是margin-buttom+margin-top,而是按照以下规则进行计算:
- 当两个值都为正数,取最大值。
- 当两个值其中有负有正,则两个相加
- 当两个都为负数,取最小值。
- 当两个相同,则取其中一个。
2. 对于两个嵌套关机的块级元素,若父元素没有设内边距与边框,则父元素的上边距会与子元素上边距发生合并,合并为方式和1类似。即使父元素没设边距.例:
<div class="box">
<div class="item1">test1</div>
</div>
.box{
width:300px;
height:100px;
margin:0px;
background: aqua
}
.item1{
width: 100px;
height: 50px;
margin-top: 20px;
background: bisque;
}
当给父元素设置边框或者padding后,即可避免父子元素外边距塌陷问题,例:
<div class="box">
<div class="item1">test1</div>
</div>.box{
width:300px;
height:100px;
margin:0px;
padding:10px;
background: aqua
}
.item{
width: 100px;
height: 50px;
margin-top: 20px;
background: bisque;
}
BFC(块级格式化上下文):解决边距塌陷
1. BFC基本概念:BFC 是 CSS 布局的一个概念,是一块独立的渲染区域,是一个环境,里面的元素不会影响到外部的元素 。
2. BFC原理(渲染规则|布局规则):
- 内部的
Box会在垂直方向,从顶部开始一个接着一个地放置; Box垂直方向的距离由margin(外边距)决定,属于同一个BFC的两个相邻Box的margin会发生重叠;- 每个元素的
margin Box的左边, 与包含块border Box的左边相接触,(对于从左到右的格式化,否则相反)。即使存在浮动也是如此; - BFC 的区域不会与
float Box重叠(清浮动); - 计算
BFC的高度时,浮动元素也参与计算。 - BFC就是页面中的一个隔离的独立容器,容器里的字标签不会影响到外部标签,反之,外部标签也不会影响BFC内部标签
3. CSS在什么情况下会创建出BFC(即脱离文档流)
- 根元素,即 HTML 元素(最大的一个
BFC) - 浮动(
float 的值不为 none) - 绝对定位元素(
position 的值为 absolute 或 fixed) - 行内块(
display 为 inline-block) - 表格单元(
display 为 table、table-cell、table-caption、inline-block 等 HTML 表格相关的属性) - 弹性盒(
display 为 flex 或 inline-flex) - 默认值。内容不会被修剪,会呈现在元素框之外(
overflow 不为 visible)
4. BFC作用(使用场景)
- 自适应两(三)栏布局(避免多列布局由于宽度计算四舍五入而自动换行) --->根据规则4
两栏布局,左侧固定宽度,右侧栏自适应(浏览器的尺寸变化缩小放大)
三栏布局,左右两栏是固定宽度,中间栏是自适应
- 防止文字环绕图片排列(根据规则4)
浮动的元素会覆盖不浮动的元素,文字会环绕图片排列,把文字所在的标签设置为BFC,可以避免文字环绕的效果
- 避免元素被浮动元素覆盖
给不是浮动元素的标签设置BFC,可以有效解决
- 清除浮动
可以让父元素的高度包含子浮动元素,清除内部浮动(原理:触发父
div的BFC属性,使下面的子div都处在父div的同一个BFC区域之内;计算BFC的高度时,浮动子元素也会参与计算,例如给浮动元素父级添加overflow:hidden)
- 去除边距重叠现象 (由于规则2导致)
让标签分属于不同的
BFC时,可以阻止margin重叠
IFC(行内格式化上下文)
IFC原理(渲染规则|布局规则):
- 内部的
Box会在水平方向,从含块的顶部开始一个接着一个地放置; - 这些
Box之间的水平方向的margin,border和padding都有效; Box垂直对齐方式:以它们的底部、顶部对齐,或以它们里面的文本的基线(baseline)对齐(默认,文本与图片对其),例:line-heigth与vertical-align。