CSS中width:100%和width:auto的区别

<div class="father1">
    <div class="son1"></div>
</div>
<br>
<div class="father2">
    <div class="son2"></div>
</div>
<style>
   .father1, .father2 {
       width: 200px;
       height: 200px;
       border: 10px solid red;
       padding: 20px;
       background-color: #ddd;
   }
   .son1 {
       width: 100%;
       border: 10px solid blue;
       padding: 20px;
       /* margin: 30px; */
       background-color:chartreuse;
   }
   .son2 {
       width: auto;
       border: 10px solid blue;
       padding: 20px;
       margin: 30px;
       background-color:chartreuse;
   }
</style>

结果如下图所示:
在这里插入图片描述

上述情况产生的原因是:本实验是在chrome浏览器下测试的,而chrome浏览器采用的是W3C标准盒模型,这里涉及到一个知识点是W3C标准盒模型和IE盒模型:
(1)有两种盒子模型:IE盒模型(border-box)、W3C标准盒模型(content-box)
(2)盒模型:分为内容(content)、填充(padding)、边界(margin)、边框(border)四个部分
IE盒模型和W3C标准盒模型的区别:
(1)W3C标准盒模型:属性width,height只包含内容content,不包含border和padding
(2)IE盒模型:属性width,height包含content、border和padding,指的是content
+padding+border。
如何设置IE盒模型:
如果将box-sizing设为border-box则用的是IE盒模型。如果在ie6,7,8中DOCTYPE缺失会将盒子模型解释为IE盒子模型。若在页面中声明了DOCTYPE类型,所有的浏览器都会把盒模型解释为W3C盒模型。在ie8+浏览器中使用哪个盒模型可以由box-sizing(CSS新增的属性)控制,默认值为content-box,即标准盒模型。

因此上述son1的总宽度为:content(200px) + 左右padding(40px) + 左右border(20px) = 260px,超过父元素的content-box的宽度60px,与父元素的border-box宽度260px一致

如果想实现content + padding + border等于parent的宽度,可以进行如下设置:

* {
    box-sizing: border-box
}

结果图为:
在这里插入图片描述
上图中son2的border-box宽度(80px)看起来比son1的border-box宽度(140px)小是因为son2设置了左右margin值均为30px。因此如果设置child的宽度为auto,则表现为content+padding+border+margin值等于parent的宽度。
因为没有margin-box这个属性值,因此如果子元素左右margin值不为0 ,而宽度又为100%的话,则必然会超过父元素的宽度,无法实现与width: auto一致的效果。

* {
      box-sizing: border-box;
  }
.father1, .father2 {
      width: 200px;
      height: 200px;
      border: 10px solid red;
      padding: 20px;
      background-color: #ddd;
  }
  .son1 {
      width: 100%;
      border: 10px solid blue;
      padding: 20px;
      margin: 30px;
      background-color:chartreuse;
  }
  .son2 {
      width: auto;
      border: 10px solid blue;
      padding: 20px;
      margin: 30px;
      background-color:chartreuse;
  }

结果如下如所示:
在这里插入图片描述
注意一个知识点:
以上讨论的子元素都是非绝对定位元素的情况,如果是子元素绝对定位的元素而父元素是非static定位元素,同时在所有元素都是border-box的情况下,子元素的border+padding+content = 父元素的padding+content(可以理解为padding-box,但实际上并没有这种box-sizing值)。

<div class="father3">
    <div class="son3">

    </div>
</div>
<style>
    .father3 {
        position: relative;
        width: 200px;
        height: 200px;
        border: 10px solid red;
        padding: 20px;
        background-color: #ddd;
    }
    .son3 {
        position: absolute;
        width: 100%;
        border: 10px solid blue;
        padding: 20px;
        background-color:chartreuse;
    }
</style>

所得结果如下图所示:
在这里插入图片描述
延伸一个知识点:
CSS3的calc()函数,calc()函数可以计算不同单位的表达式的值,表达式可以是“+”、“-”、“*”、“/”,其中加减符号前后必须要有空格,乘除不必须,但是为了保持风格一致,可以都保留空格。
因此可以通过calc计算函数来强行实现与width: auto一致的效果:

.father1, .father2 {
    width: 200px;
    height: 200px;
    border: 10px solid red;
    padding: 20px;
    background-color: #ddd;
}
.son1 {
    width: calc(100% - 120px);
    border: 10px solid blue;
    padding: 20px;
    margin: 30px;
    background-color:chartreuse;
}
.son2 {
    width: auto;
    border: 10px solid blue;
    padding: 20px;
    margin: 30px;
    background-color:chartreuse;
}

结果如下所示:
在这里插入图片描述

 

来源:https://blog.csdn.net/m0_38102188/article/details/80611615

 

posted @ 2021-02-21 10:37  两只小老虎  阅读(457)  评论(0编辑  收藏  举报