本文次要对《CSS世界》3.2节 width/height 作用的具体细节 的内容进行一些摘取和概括。更多材料可查阅《CSS世界》。

一、深藏不露的width: auto

个别状况下, 咱们如果没有设置width,默认值为auto。依据不同的元素,体现出以下几种个性:

  • 充分利用可用空间。如<div>、<p>等这些块级元素宽度默认是100%于父级容器。(英文称:fill-available)
  • 膨胀与包裹。典型代表是浮动、相对定位、inline-block元素、table元素。(英文称:shrink-fit)
  • 膨胀到最小。最容易呈现在table-layout为auto的表格。

  • 超出容器限度。失常在父元素宽度固定的状况下,子元素宽度不会超出父元素。除非有明确的width相干设置,如间断的特地长的英文单词,或者是内联元素被设置了white-space:nowrap。

在css世界中,盒子分“外在盒子” 和 “外在盒子”,同样的,尺寸也分“内部尺寸” 和“外部尺寸”。其中,“内部尺寸”示意尺寸由内部元素决定, “外部尺寸”示意尺寸由外部元素决定。

1. 内部尺寸与流体个性

当咱们在一个容器里倒入足量的水时,水肯定会平均铺满整个容器。这就是“流”的概念。在页面中放一个块级元素,宽度天然会铺满容器,所以没必要再设置width: 100%。

例: 子元素均有 margin 和 padding,前者 width:auto , 齐全借助流个性,后者 width: 100%,后果尺寸会超出父容器。

默认状况下,相对定位元素的宽度是由外部尺寸决定,也有非凡状况,当left / right 对抗方位的属性值同时存在时,其宽度大小绝对于最近具备定位个性的先人元素计算。

2. 外部尺寸与流体个性

如果一个元素里边没有内容,宽度为0,那就是利用了外部尺寸,其次要体现在包裹性,就是包裹与自适应性。所谓的自适应性,指的是元素尺寸由外部尺寸决定,但永远小于父容器的尺寸,换句话说,外部子元素仿佛有个max-width: “父容器宽度”的感觉,button 就是一个很好的例子。

例:有这么个需要,心愿文字少时居中显示,文字内容较多时左对齐,此时可利用这包裹性实现。

<div class="content">    <span class="text">{{text}}</span></div>
.content {  width: 200px;  height: 100px;  text-align: center; /*次要*/  background-color: #f0f3f7;}.text {  display: inline-block;  text-align: left;}

二、width值的作用

对于盒模型的四层这里简略复述一下,从内到外别离是 content-box, padding-box, border-box和通明的 margin-box。默认状况下,width是作用在 content-box 的,当咱们在布局的时候增加 padding 和 border 的时候,导致元素宽高变大。

如咱们从设计稿上获取一个width:200px,padding:10px,border:10px的元素,最终咱们须要通过width - paddingLeft - paddingRight - boderLelft - borderRight去计算content-width。

这样未免太过麻烦。因而CSS提供了border-box模型不便咱们进行开发。事实上box-sizing:border-box扭转的就是width的作用对象。原来width只作用于content-box,用了border-box后,width = padding + border + content 。

三、有效的height: 100%

height 和 width 一个比拟显著的区别,就是对百分比单位的反对。对于width属性,就算其父元素是width:auto,其百分比值也是能够反对的。然而对于height的百分比属性,如果其父元素是height为auto,那么只有子元素在文档流中(如float,相对定位都能够使元素脱离文档流),其百分比值就齐全没用了。

<div class="height-box">    <div class="height-item"></div></div>
.height-box {    background-color: #6096cc;}.height-item {    height: 40%;    background-color: #98e9f1;}

为什么会这样呢?标准中给出了答案。原文这样形容:如果蕴含块的高度没有显示指定,并且该元素不是相对定位,则计算值为auto。也就是子元素的100% * auto=NaN,所以计算结果有效。因而非相对定位元素要应用height:100%,要一直的给父级,父级的父级增加height:具体值,才会失效。

那么宽度为什么能够反对呢?因为蕴含块的宽度取决于该元素的宽度,其行为是“未定义”的,也就是不同的浏览器能够有不同的个性,好在大家都想到一块去了,最终的布局成果在各个浏览器下都是统一的。就是依照蕴含块实在的计算值作为百分比计算的基数。

四、无效的height: 100%

想要 height: 100% 无效, 从下面的标准的答案曾经给出,即以下两种办法:

  1. 设置固定高度,例如设置 height: 100px, 或者百分比, height: 100%.
  2. 应用相对定位。即便先人元素 height: auto, 也有计算值。须要留神的是,相对定位的宽高百分比计算是绝对于 padding-box ,而非相对定位元素则是绝对于 content-box计算。

auto与子元素无关,100%与父元素无关,无非凡状况,最好不要应用固定值,不利于响应式开发。