前言
在CSS中,每个元素都被视为一个矩形盒子,这个盒子由四个部分组成:内容(content) 、内边距(padding) 、边框(border) 和外边距(margin) 。理解这些部分如何协同工作,是掌握CSS布局的关键。
一 、文档流与盒子占位
在正常文档流中,元素按照从上到下,从左到右的顺序排列。盒子在页面中的实际占位空间由以下因素决定:
            
            
              bash
              
              
            
          
          .box {
  width: 200px;         /* 内容宽度 */
  height: 100px;        /* 内容高度 */
  padding: 20px;        /* 内边距 */
  border: 2px solid #333; /* 边框 */
  margin: 10px;         /* 外边距 */
}
        1.标准盒子模型 (content-box)
默认情况下,CSS使用标准盒子模型(box-sizing: content-box)。在这种模式下:
width和height只定义内容区域的大小- 盒子的总宽度 = 
width+左右padding+左右border+左右margin - 盒子的总高度 = 
height+上下padding+上下border+上下margin 
计算示例
            
            
              bash
              
              
            
          
          .box {
  width: 600px;
  height:200px;
  padding: 10px;
  border: 2px solid #000;
  margin: 20px;
  box-sizing: content-box; /* 默认值 */
}
        实际占位宽度:600px + 10px×2 + 2px×2 + 20px×2 = 664px
weight 和height 只决定盒子的内容大小 
2.怪异盒子模型 (border-box)
box-sizing: border-box被称为怪异盒模型,也叫IE盒模型,它的计算方式更加直观:
width和height包含内容 + padding + border- 盒子的总宽度 = 
width+左右margin - 盒子的总高度 = 
height+上下margin 
计算示例
            
            
              bash
              
              
            
          
          .box {
  box-sizing: border-box;
  width: 600px;
  height: 200px;
  padding: 10px;
  border: 2px solid #000;
  margin: 20px;
     }
        实际占位宽度:600px + 20px×2 = 640px内容区域宽度:600px - 10px×2 - 2px×2 = 576px

3.二者对比
            
            
              bash
              
              
            
          
              *{
      margin: 0;
      padding: 0;
    }
  .box{
      width: 200px;
      height: 100px;
      padding: 20px;
      border: 5px solid black;
      margin: 20px;
    }
    .border-box{
      background-color: lightblue;
      box-sizing: border-box;
    }
    .content-box{
      background-color: red;
      box-sizing: content-box;
    }
        
从以上图片可见相同的样式下,二者大小存在明显差异

怪异盒模型尤其在多列式布局和移动端开发中有着显著优势
二在多列布局中的应用
1.inline-block布局
            
            
              bash
              
              
            
          
          .container {
  font-size: 0; /* 消除inline-block间隙 */
}
.column {
  width: 50%;
  padding: 20px;
  border: 1px solid #ccc;
  box-sizing: border-box;
  display: inline-block;
  vertical-align: top;
  font-size: 16px; /* 重置字体大小 */
}
        2.Flexbox布局
            
            
              bash
              
              
            
          
          .container {
  display: flex;
}
.column {
  flex: 1;
  padding: 20px;
  border: 1px solid #ccc;
  box-sizing: border-box;
}
        实际开发建议
- 全局设置border-box
 
            
            
              bash
              
              
            
          
          * {
  box-sizing: border-box;
}
html {
  box-sizing: border-box;
}
*, *::before, *::after {
  box-sizing: inherit;
}
        - 响应式布局优势
 
            
            
              bash
              
              
            
          
          .card {
  box-sizing: border-box;
  width: 25%; /* 始终占1/4宽度,不受padding影响 */
  padding: 20px;
}
        - 避免布局错乱
 
            
            
              bash
              
              
            
          
          /* 不推荐 */
.element {
  width: 100%;
  padding: 20px; /* 导致溢出 */
}
/* 推荐 */
.element {
  box-sizing: border-box;
  width: 100%;
  padding: 20px;
}
        总结
理解并正确使用盒子模型是CSS布局的基石。border-box模型通过将padding和border包含在设定的宽度内,让布局计算更加直观和可控。在现代网页开发中,建议全局使用border-box模型,这将大大提高布局开发的效率和可维护性。关键要点:
- 标准模型:width/height = 内容大小
 - 怪异模型:width/height = 内容 + padding + border
 - 多列布局中,border-box更具优势
 - 建议全局设置为border-box
 
掌握盒子模型的不同计算方式,能够帮助你在实际开发中更加游刃有余地处理各种布局需求。