CSS-盒子模型

前言:

当对一个文档进行布局(layout)的时候,浏览器的渲染引擎会根据标准之一的 CSS 基础框盒模型(CSS basic box model),将所有元素表示为一个个矩形的盒子(box)。CSS 决定这些盒子的大小、位置以及属性(例如颜色、背景、边框尺寸…)。

盒模型的认识:

  • 基本概念:标准模型+IE模型。 包括margin,border,padding,content
  • 标准模型和IE模型的区别
  • css如何设置获取这两种模型的宽和高
  • js如何设置获取盒模型对应的宽和高
  • 根据盒模型解释边距重叠
  • BFC(边距重叠解决方案,还有IFC)解决边距重叠

基本概念:标准模型+IE模型:

每个盒子由四个部分(或称区域)组成,其效用由它们各自的边界(Edge)所定义(原文:defined by their respective edges,可能意指容纳、包含、限制等)。如图,与盒子的四个组成区域相对应,每个盒子有四个边界:内容边界 Content edge、内边距边界 Padding Edge、边框边界 Border Edge、外边框边界 Margin Edge。

在这里插入图片描述
由于IE盒模型的怪异模式,IE模型和标准模型的内容计算方式不同。

标准模型和IE模型的区别:

IE模型和标准模型的区别是内容计算方式的不同。

IE模型元素宽度width=content+padding+border,高度计算相同:
在这里插入图片描述

标准模型元素宽度width=content,高度计算相同:
在这里插入图片描述

css如何设置获取这两种模型的宽和高:

通过css3新增的属性 box-sizing: content-box | border-box分别设置盒模型为标准模型(content-box)和IE模型(border-box)。

.content-box {
  box-sizing:content-box;
  width: 100px;
  height: 50px;
  padding: 10px;
  border: 5px solid red;
  margin: 15px;
}

在这里插入图片描述
.content-box设置为标准模型,它的元素宽度width=100px。

.border-box {
  box-sizing: border-box;
  width: 100px;
  height: 50px;
  padding: 10px;
  border: 5px solid red;
  margin: 15px;
}

在这里插入图片描述
.border-box设置为IE模型,它的元素宽度width=content + 2 * padding + 2 * border = 70px + 2 *10px + 2 * 5px = 100px。

javascript如何设置获取盒模型对应的宽和高:

  • dom.style.width/height 只能取到行内样式的宽和高,style标签中和link外链的样式取不到。
  • dom.currentStyle.width/height 取到的是最终渲染后的宽和高(只有IE支持此属性)。
  • window.getComputedStyle(dom).width/height 取到的是最终渲染后的宽和高(大多浏览器支持,IE9以上支持)。
  • dom.getBoundingClientRect().width/height 也是得到渲染后的宽和高,除此外还可以取到相对于视窗的上下左右的距离(大多浏览器支持。IE9以上支持)。

外边距重叠:

当两个垂直外边距相遇时,他们将形成一个外边距,合并后的外边距高度等于两个发生合并的外边距的高度中的较大者。注意:只有普通文档流中块框的垂直外边距才会发生外边距合并,行内框、浮动框或绝对定位之间的外边距不会合并。

在这里插入图片描述

BFC:

BFC(Block Formatting Context):块级格式化上下文。
BFC决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用。当设计到可视化布局的时候,BFC提供了一个环境,HTML元素在这个环境中按照一定的规则进行布局。一个环境中的元素不会影响到其他环境中的布局。

BFC的原理(渲染规则):

  • 根元素或其它包含它的元素
  • overflow不为visible;
  • 浮动元素(float的值不为none);
  • 绝对定位元素 (position的值不为static或relative);
  • 内联块(元素具有 display: inline-block);
  • 表格单元格(元素具有 display: table,table-cell,HTML表格单元格默认属性);
  • 表格标题 (元素具有 display: table-caption, HTML表格标题默认属性);
  • display: flex,inline-flex;
  • display: flow-root;
  • column-span: all 应当总是会创建一个新的格式化上下文,即便具有 column-span: all 的元素并不被包裹在一个多列容器中。
  • 一个块格式化上下文包括创建它的元素内部所有内容,除了被包含于创建新的块级格式化上下文的后代元素内的元素。
 <section id="layout">
        <style media="screen">
            #layout {
                background: red;
            }
            #layout .left {
                float: left;
                width: 100px;
                height: 100px;
                background: pink;
            }
            #layout .right {
                height: 110px;
                background: #ccc;
            }
        </style>
        <div class="left"></div>
        <div class="right"></div>
    </section>

在这里插入图片描述
这样发现浮动元素叠在 .right 元素的上面,这样的话我们可以通过在.right元素上加 overflow:hidden (用其他的方式创建BFC也可以)创建BFC就可以解决。

#layout .right {
     height: 110px;
     background: #ccc;
     overflow:hidden;
     //	float: left
 }

在这里插入图片描述
BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。

参考:
CSS 基础框盒模型介绍

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值