基本概念
二者区别:
标准模型 width = content
ie模型 width = content+padding+border
如何设置?
box-sizing:content-box
box-sizing:border-box
js如何设置获取盒模型对应的宽和高?
dom.style.width----->只能获取行内样式,不能获取内嵌的样式和外联的样式。
dom.currentStyle.width----->获取渲染后的宽度,但只有ie支持
window.getComputedStyle(dom).width------->获取渲染后的宽度,且兼容IE,Chome
dom.getBoundingClientRect().width------>获取一个元素的绝对位置。绝对位置是视窗 viewport 左上角的绝对位置。此 api 可以拿到四个属性:left、top、width、height。
实例题(根据盒模型解释边距重叠)
margin塌陷/margin重叠
标准文档流中,竖直方向的margin不叠加,只取较大的值作为margin(水平方向的margin是可以叠加的,即水平方向没有塌陷现象)。
注意:如果不在标准流,比如盒子都浮动了,那么两个盒子之间是没有margin重叠的现象的。
margin这个属性,本质上描述的是兄弟和兄弟之间的距离; 最好不要用这个marign表达父子之间的距离。
所以,如果要表达父子之间的距离,我们一定要善于使用父亲的padding,而不是儿子的margin。
BFC(边距重叠解决方案)
BFC的概念
BFC(Block Formatting Context):块级格式化上下文。你可以把它理解成一个独立的区域。
另外还有个概念叫IFC。
BFC 的原理/BFC的布局规则【非常重要】
BFC 的原理,其实也就是 BFC 的渲染规则(能说出以下四点就够了)。包括:
-
(1)BFC 里面的元素,在垂直方向,边距会发生重叠。
-
(2)BFC在页面中是独立的容器,外面的元素不会影响里面的元素,反之亦然。(稍后看
举例1
) -
(3)BFC区域不与旁边的
float box
区域重叠。(可以用来清除浮动带来的影响)。(稍后看举例2
) -
(4)计算BFC的高度时,浮动的子元素也参与计算。(稍后看
举例3
)
如何生成BFC
有以下几种方法:
-
方法1:overflow: 不为vidible,可以让属性是 hidden、auto。【最常用】
-
方法2:浮动中:float的属性值不为none。意思是,只要设置了浮动,当前元素就创建了BFC。
-
方法3:定位中:只要posiiton的值不是 static或者是relative即可,可以是
absolute
或fixed
,也就生成了一个BFC。 -
方法4:display为inline-block, table-cell, table-caption, flex, inline-flex
下面来看几个例子,看看如何生成BFC。
BFC 的应用
举例1:解决 margin 重叠
当父元素和子元素发生 margin 重叠时,解决办法:给子元素增加一个父元素,给这个父元素创建BFC。
比如说,针对下面这样一个 div 结构:
<div class="father">
<p class="son">
</p>
</div>
上面的div结构中,如果父元素和子元素发生margin重叠,我们可以给子元素创建一个 BFC,就解决了:
<div class="father">
<p class="son" style="overflow: hidden">
</p>
</div>
因为第二条:BFC区域是一个独立的区域,不会影响外面的元素。
举例2:BFC区域不与float区域重叠:
针对下面这样一个div结构;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.father-layout {
background: pink;
}
.father-layout .left {
float: left;
width: 100px;
height: 100px;
background: green;
}
.father-layout .right {
height: 150px; /*右侧标准流里的元素,比左侧浮动的元素要高*/
background: red;
}
</style>
</head>
<body>
<section class="father-layout">
<div class="left">
左侧,生命壹号
</div>
<div class="right">
右侧,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,
</div>
</section>
</body>
</html>
效果如下:
上图中,由于右侧标准流里的元素,比左侧浮动的元素要高,导致右侧有一部分会跑到左边的下面去。
如果要解决这个问题,可以将右侧的元素创建BFC,因为第三条:BFC区域不与float box
区域重叠。解决办法如下:(将right区域添加overflow属性)
<div class="right" style="overflow: hidden">
右侧,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,smyhvae,
</div>
上图表明,解决之后,father-layout
的背景色显现出来了,说明问题解决了。
举例3:清除浮动
现在有下面这样的结构:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.father {
background: pink;
}
.son {
float: left;
background: green;
}
</style>
</head>
<body>
<section class="father">
<div class="son">
生命壹号
</div>
</section>
</body>
</html>
效果如下:
上面的代码中,儿子浮动了,但由于父亲没有设置高度,导致看不到父亲的背景色(此时父亲的高度为0)。正所谓有高度的盒子,才能关住浮动。
如果想要清除浮动带来的影响,方法一是给父亲设置高度,然后采用隔墙法。方法二是 BFC:给父亲增加 overflow=hidden
属性即可, 增加之后,效果如下:
为什么父元素成为BFC之后,就有了高度呢?这就回到了第四条:计算BFC的高度时,浮动元素也参与计算。意思是,在计算BFC的高度时,子元素的float box也会参与计算。