谈谈对盒模型的理解?

1.1 基本概念

当对一个文档进行布局的时候,浏览器的渲染引擎会将元素表示为一个个的矩形的盒子,一个盒子由四部分组成content、padding、border、margin

  • content:实际内容,显示文本和图像
  • padding:内边距,内容和边框之间的空白区域,内边距是透明的,取值不能为负,颜色由盒子模型的background属性决定
  • border:元素内容周围的一条或者多挑的线,由粗细、样式、颜色三部分组成,没有设置颜色的时候和盒子的color属性一致
  • margin:外边框,在元素边框外面创建的空白区域

1.2 盒模型

  • css盒模型的每个部分:content、padding、border、margin合在一起就创建了我们在页面上看到的内容
  • css盒模型分为两种:标准盒模型和怪异盒模型

1.2.1 标准盒模型

  • 盒子的总宽度=width+padding+border
  • 盒子的总高度=height+padding+border

1.2.2 怪异盒模型

  • 盒子总宽度=width
  • 盒子总高度=height

1.3 盒模型的转换

css中的box-sizing属性定义了两种盒模型如何的转换

box-sizing: content-box|border-box|inherit;
  • content-box默认值,元素的width、height不包含padding和border,与标准盒模型表现一致
  • border-box元素的width、height包含了padding和border,与怪异盒模型表现一致
  • inherit指定box-sizing属性的值,应该从父元素继承

1.4 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以上支持,除此外还可以获得相对于视窗的上下左右的距离。
  5. dom.offsetWidth/offsetHeight包括高度(宽度)、内边距和外框,不包括外边框,最常用,兼容性是最好的

1.5 实例题(根据盒模型解释外边距重叠)

父元素里面嵌套一个子元素,已知子元素的高度是100px,子元素与父元素的上边距是10px,计算父元素的实际高度。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      * {
        padding: 0;
        margin: 0;
      }
      .parents {
        width: 100px;
        background: #ff9934;
      }
      .child {
        width: 100%;
        height: 100px;
        background: #336667;
        margin-top: 10px;
      }
      .parent2 {
        overflow: hidden;
      }
    </style>
  </head>
  <body>
    <p>1父元素实际高度为100px</p>
    <div class="parents parent1">
      <div class="child child1"></div>
    </div>
    <p>2父元素实际高度为110px</p>
    <div class="parents parent2">
      <div class="child child2"></div>
    </div>
  </body>
</html>