盒模型
2019-03-23 本文已影响2人
yun_154192
基本概念
盒模型由content、padding、border和margin组成。
分类:标准盒模型(默认)和IE盒模型。
区别:标准盒模型的width/height为content的宽高,而IE盒模型的width/height为content+padding+border之和的宽高。
设置方法
/* 标准模型 */
box-sizing: content-box;
/*IE模型*/
box-sizing: border-box;
JS获取宽高
JS获取对应盒模型的宽高有以下几种方法:
- dom.style.width/height
这种方法只能获取dom元素内联样式所设置的宽高,即该节点的样式在style标签中或外联的css文件中设置的话,通过这种方法是获取不到dom元素宽高的。 - dom.currentStyle.width/height
这种方法获取的是页面渲染完成后的结果,就是说不管用哪种方法设置都可以获取到,但是只有IE浏览器支持。 - window.getComputedStyle(dom).width/height
这张方法和方法2几乎一致,只是可以兼容更多的浏览器。 - dom.getBoundingClientRect().width/height
这种方法是根据元素在视窗中的绝对位置来获取宽高的。 - dom.offsetWidth/offsetHeight
最常用,兼容性最好。
边距重叠
如下图所示,子元素设置margin-top:20px;,父元素没有设置,但是父元素也一起有了边距
边距重叠示意图
代码如下:
<!DOCTYPE html>
<html>
<head>
<title></title>
<style type="text/css">
.top{
width: 100%;
height: 100px;
background-color: #eee;
}
.parent{
width: 100%;
height: 400px;
background-color: #ccc;
}
.child{
width: 100%;
height: 100px;
margin-top: 20px;
background-color: green;
}
</style>
</head>
<body>
<div class="top">上边的标签1</div>
<div class="parent">
<div class="child">子标签</div>
父标签2
</div>
</body>
</html>
边距重叠解决方案(BFC)
首先要明确BFC是什么意思,其全英文拼写为 Block Formatting Context 直译为“块级格式化上下文”
BFC的原理
- 内部的box会在垂直方向,一个接一个的放置
- 每个元素的margin box的左边,与包含块border box的左边相接触(对于从做往右的格式化,否则相反)
- box垂直方向的距离由margin决定,属于同一个bfc的两个相邻box的margin会发生重叠
- bfc的区域不会与浮动区域的box重叠
- bfc是一个页面上的独立的容器,外面的元素不会影响bfc里的元素,反过来,里面的也不会影响外面的
- 计算bfc高度的时候,浮动元素也会参与计算
怎么创建BFC
- float属性不为none(脱离文档流)
- position为absolute或fixed
- display为inline-block,table-cell,table-caption,flex,inine-flex
- overflow不为visible
- 根元素
应用场景
- 自适应两栏布局
- 清除内部浮动
- 防止垂直margin重叠
BFC解决边距重叠例子
代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.top{
background: #0ff;
height:100px;
margin-bottom:30px;
}
.bottom{
height:100px;
margin-top:50px;
background: #ddd;
}
</style>
</head>
<body>
<section class="top">
<h1>上</h1>
margin-bottom:30px;
</section>
<section class="bottom">
<h1>下</h1>
margin-top:50px;
</section>
</body>
</html>
效果图:
边距重叠示意图
用BFC修改后的部分代码如下:
//...
<section class="top">
<h1>上</h1>
margin-bottom:30px;
</section>
<!-- 给下面这个块添加一个父元素,在父元素上创建bfc -->
<div style="overflow:hidden">
<section class="bottom">
<h1>下</h1>
margin-top:50px;
</section>
</div>
//...
效果图:
BFC解决边距重叠示意图
谢谢~