题目:你谈谈你对盒模型的认识
什么是盒模型?
css盒子模型 又称框模型 (Box Model) ,它包含了元素内容(content)、内边距(padding)、边框(border)、外边距(margin)几个要素。
1.盒模型基本概念:标准盒模型+IE盒模型
1.1标准盒模型
元素框的总宽度 =元素(element)的width + padding的左边距和右边距的值 + margin的左边距和右边距的值 + border的左右宽度
元素框的总高度 =元素(element)的height + padding的上下边距的值 + margin的上下边距的值 + border的上下宽度
1.2.IE盒模型
元素框的总宽度 = 元素(element)的width + margin的左边距和右边距的值;
元素框的总高度 = 元素(element)的height + margin的上下边距的值;
2. 他们之前的区别是什么
实际元素计算的宽度和高度不同
标准盒模型
元素框的总宽度 =元素(element)的width + padding的左边距和右边距的值 + margin的左边距和右边距的值 + border的左右宽度
元素框的总高度 =元素(element)的height + padding的上下边距的值 + margin的上下边距的值 + border的上下宽度
IE盒模型
元素框的总宽度 = 元素(element)的width + margin的左边距和右边距的值;
元素框的总高度 = 元素(element)的height + margin的上下边距的值;
3.如何设置这两种盒模型
box-sizing : border-box (IE盒模型)
box-sizing:content-box(标准盒模型)
4.js如何设置盒模型的宽和高
这一个className 为 box的dom
样式为 内部样式
1.dom.style.width/height
发现获取的宽度和高度都为空 因为这种方式 只能获取到内联样式里面的宽高
缺点:只能获取到内联样式里面的宽高
2.dom.currentStyle.widht/height
缺点:只支持IE浏览器 兼容性差
3.window.getComputedStyle(dom).height/widht
优点:能获取到各种样式的宽高 兼容性不错
4.dom.getBoundingClientReact().widht/height
当有10px的padding时
无padding
缺点:不能能准确获取到宽高
优点:能获取各种样式的的高度和宽度 但是包括padding
5.根据盒模型解释边距重叠
<div class="container">
<div class="box">
</div>
<div class="box2">
</div>
</div>
.container{
background-color: red;
height: 200px;;
width: 200px;
}
.box{
background-color: aqua;
height: 100px;
width: 100px;
margin: 20px 20px;
}
.box2 {
background-color: brown;
height: 100px;
width: 100px;
margin: 20px 20px;
}
样式图
从上面的图的效果我们可以看出两个问题点
1.蓝色的div和棕色的div 上下的mairgin 只有20px(margin重叠)
2.蓝色的div的上margin无效(margin塌陷)
如何解决这两个问题呢?
要解决这个问题我们必须要明白一个东西---bfc(Block Formatting Context)
bfc的基本概念 --- 块级格式上下文
bfc的原理是什么
1.在bfc这个元素的垂直方向的边距会发生重叠
2.bfc的区域不会与浮动元素的box重叠(一般用于清除浮动)
3.bfc在页面上一个独立的容器,外面的元素不会影响到里面的元素,反过来里面的元素也不会影响到外面的元素
4.计算bfc元素高度的时候浮动元素也会参与计算
那么如何创建bfc
1.float不为null
2.display为table inline-block
3.position不为relative,static
4.overflow为hidden,visiable
知道了bfc 如何 去解决上诉的两个问题
1.解决问题1(margin重叠)
我们可以在box2 外层套一个dom 并且让这个dom 触发bfc 结果图如下
可以看出box和box2中间的margin不发生重叠
2.解决问题2
方法一 给最外层添加一个border 多大都无所谓
方法二 也给box 添加一个外层dom 并且让这个dom触发bfc
扩展:bfc除了能解决上诉的问题还能解决什么问题呢?
问题一:当子元素有高度并且为float时 父容器的高度不能被撑开
效果图
可以发现父容器并没有撑开
当父容器触发bfc时
可以看到父容器被撑开了
这也就是上诉原理中的 第四点 bfc计算高度的时候浮动元素也参与计算
问题二:清除浮动
清除浮动的常见方法
方法一 在最底层套用一个dom并且清除 浮动 (实际中不推荐 结构出现不明白的dom)
方法二 利用伪元素 清除浮动(实际推荐用此方法 记住伪类默认是inline 清除浮动时用block)