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;
}

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值