CSS两种盒模型总结


参考:《精通CSS:高级Web标准解决方案(第2版)》. Andy Budd , Simon Collison , Cameron Moll (作者) 陈剑瓯(译者)

通过理解两种盒模型,区别其不同点,重点在于总结盒模型的兼容性。

1.IE盒模型

在早期的IE浏览器中,IE5及以下甚至包括IE6,在混杂模式中,使用自己的非标准盒模型。这些浏览器的width属性不是内容的宽度,而是内容的、内边距和边框的宽度总和。什么意思呢?我们举个例子说明下:以width为例,浏览器为IE5,定义如下代码:

<div id="app"></div>
#app{
      margin:10px;
      padding:5px;
      width:70px;
    }

在IE5中,上述中的盒模型的总宽度为90px。总宽度=定义的width+定义的margin
这是因为,在IE5中,认为每个边上的内边距padding(5px) 是定义的宽度width(70px)的宽度的一部分,而不是宽度之外的附加的。并且,在此条件下,定义的width=content实际宽度+padding+border

在CSS3中,新增了box-sizing属性,可以通过box-sizing属性设置为border-box使用这种IE盒模型

#app{
      margin:10px;
      padding:5px;
      width:70px;
      box-sizing:border-box;
    }

注意但是,除了一些非常特殊的场合之外,我们很少需要使用box-sizing:border-box;这个属性。

2.W3C标准盒模型

前面对IE盒模型有了一个初步的认识,再来了解下我们常用的标准盒模型,也就是W3C标准盒模型。
值得注意的,此处使用了完整的html结构,主要是为了调用!DOCTYPE声明。我们后面详细说明声明的重要性。

(坑边闲话:手懒~~~直接使用VS code快捷生成了····使用编辑器的好处:快准,但同时亦容易忽略一些关键的知识点。建议在初学的时候,不要使用编辑器的快捷和自动生成,手动去敲,练习打字速度,同时熟悉代码结构。例如,此处对于meta的知识点,经常使用!+ tab 必然容易忽略,可参考MDN进行知识充能下,特别是需要注意下name="viewport"属性)

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    #app{
      margin:10px;
      padding:5px;
      width:70px;
    }
  </style>
</head>

<body>
  <div id="app"></div>
</body>

</html>

此时,盒模型的总宽度为100px;

盒模型的总宽度为:margin+padding+border+定义的width

此处定义width,就是实际的content的宽度。

在CSS3中,新增的box-sizing的默认属性content-box,即设置为W3C标准盒模型;

3.IE盒模型和W3C标准盒模型的兼容性

对于盒模型的优先如何选用?前面有提到,除了一些非常特殊的场合之外,我们很少使用box-sizing:border-box去调用IE盒模型,而是默认设置box-sizing:content-box使用W3C标准盒模型,这样可以避免多个浏览器对同一页面的不兼容。

那我们怎样让我们的元素都遵循W3C标准盒子模型呢?在html文件头部有一个<!DOCTYPE html> 声明,就说明已经遵循W3C标准盒子模型了。

值得注意的是,我们为什么要添加这么一个声明呢?
<!DOCTYPE html> 声明的作用主要是定义浏览器会使用它来判断文档类型, 决定使用何种协议来解析,以及切换浏览器模式(可随手Google一下<!DOCTYPE html>,反手就是一个链接~~~)

因为若不声明DOCTYPE类型,IE浏览器会将盒子模型解释为IE盒子模型,FireFox等会将其解释为W3C盒子模型;若在页面中声明了DOCTYPE类型,所有的浏览器都会把盒模型解释为W3C盒模型。

4.写在最后:停止对IE的批评

下面是书中的一段原话,第一次是在知乎live上听到一个老师的理解,再看到书时,便把它记下了。对于书中的提到的Firefox、Safari,以及现在使用Chrome,能力层次并不能达到,所以感受不到Chrome的问题,相反,更多的是,直接的感受IE对初学者的不友好(;′⌒`);因此,便把这段话,记在心中,希望改变的自身的对IE的偏见。

“ IE并不是唯一一中有bug的浏览器,所以你可能会奇怪我为什么只关注IE bug。不必担心,我并不是和微软过不去,这么做是有理由的。
首先,IE目前仍然占有很大的浏览器市场份额,所以bug往往很快被发现并且很好地记录下来。但是,IE的开发节奏比其他的浏览器慢得多。Firefox和Safari每过几个月就会发布新版本,而要看到IE的新版本要等好几年。因此,IE的bug往往会存在很长时间。
在Firefox和Safari中以如此快的速度发现和修复bug确实很棒,但是这也有问题,开发人员要应付的浏览器的版本不是两三个,而是10或20个。你无法确定用户是否使用了最新的版本,这使得测试变得积极困难。另一方面,IE差不多5年没有发布主要修订版了。因此,bug有更多的时间可以暴露出来,开发人员也有更强的寻找修复的方法的动力。
幸而,与以前的版本相比,IE8更符合标准了。许多有名的bug已经被解决,而且对高级CSS2.1特性的支持也在增加。与所有浏览器一样,新的bug也会出现,IE8远不是完美的。但是,人们越快地升级IE8和Firefox等现代浏览器,IE6等老式浏览器就会越来越快地退役。”

<think>好的,我现在需要回答用户关于CSS两种模型区别的问题。首先,我需要确认自己对模型的理解是否正确。根据引用[2],CSS盒子模型包括内容、内边距、边框和外边距。两种模型分别是content-box和border-box,主要区别在于元素宽度的计算方式。 接下来,我应该详细解释这两种模型的差异。content-box是默认的W3C模型,元素的宽度仅包括内容部分,而内边距和边框会增加元素的总宽度。例如,如果一个元素的width设置为100px,padding为10px,border为5px,那么总宽度就是100 + 2*10 + 2*5 = 130px。而border-box模型,即IE模型,元素的width包括内容、内边距和边框。同样的设置下,内容区域会自动调整,保持总宽度为100px,内容宽度变为100 - 2*10 - 2*5 = 70px。 然后,我需要考虑如何让用户更容易理解。可能通过举例说明两者的计算方式不同,导致布局上的差异。同时,可以提到在实际开发中,border-box更便于控制元素尺寸,特别是在响应式设计中,避免因padding和border导致元素超出预期。 用户可能还会想知道如何切换模型,所以需要提到CSS的box-sizing属性,设置box-sizing: content-box或border-box来切换两种模式。此外,引用[3]提到margin和padding的区别,这里虽然不直接相关,但可以强调在模型中margin不属于元素宽度的一部分,无论哪种模型,margin都是额外空间。 最后,生成相关问题时要覆盖应用场景、如何设置、历史背景等,帮助用户进一步学习。例如,为什么IE模型后来被接纳为标准选项,或者在不同浏览器中的兼容性问题,引用[1]提到不同浏览器的显示差异,可能涉及模型的渲染区别。 总结回答结构:定义两种模型,对比计算方式,示例说明,如何设置,以及实际应用中的建议。确保引用相关文献,如引用[2]解释模型结构,引用[1]提到浏览器差异,可能涉及模型的实际影响。</think>### CSS两种模型的区别 CSS模型是布局设计的核心概念,主要分为**标准模型(content-box)**和**IE模型(border-box)**,两者在元素宽度的计算方式上有本质区别。 #### 1. 标准模型(content-box) - **默认模式**:遵循W3C标准,元素的`width`属性仅指**内容区域**的宽度。 - **计算公式**: $$总宽度 = width + padding_{\text{左右}} + border_{\text{左右}}$$ 例如,设置`width: 100px; padding: 10px; border: 5px solid;`时,元素实际占用宽度为$100 + 2 \times 10 + 2 \times 5 = 130$px。 #### 2. IE模型(border-box) - **传统模式**:最初由IE浏览器采用,后被CSS3纳入标准。元素的`width`属性包含**内容、内边距和边框**。 - **计算公式**: $$总宽度 = width$$ 同样的示例中,内容区域会自动调整为$100 - 2 \times 10 - 2 \times 5 = 70$px,总宽度仍为100px。 #### 对比示意图 ``` 标准模型:[内容 | padding | border | margin] IE模型: [内容+padding+border | margin] ``` #### 如何切换? 通过`box-sizing`属性控制: ```css div { box-sizing: content-box; /* 标准模型(默认) */ box-sizing: border-box; /* IE模型 */ } ``` #### 实际应用建议 - **响应式布局**:使用`border-box`可避免因`padding`或`border`导致元素溢出容器[^2]。 - **浏览器兼容性**:现代浏览器均支持两种模型,但需注意旧版IE的默认行为[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值