CSS盒子模型不得不说的故事

120 阅读6分钟

前序:

平常我们进行web开发时,需要根据设计图开发出对应的产品,在这个开发过程中,那怎么样去像个画家一样给这些单调,枯燥的物体赋予色彩上的鲜明和灵魂上的活力呢,那这就需要css啦,从1996年W3C发布CSS1规范到现在的CSS3规范,这是一个从出生到成长的故事...

正文:

  1. 1994年,网页设计主要依赖HTML,设计师通过表格( 标签)、帧( )和空格(   )来进行布局,这些方法不仅复杂且难以维护,也限制了设计的灵活性。
  2. 1996年,W3C发布css规范,标志着样式和布局从HTML中分离的开始。CSS引入了盒子模型的概念,为网页设计带来了革命性的变化。设计师可以用CSS控制文档的布局和样式,而不仅仅是内容。
  3. 1998年,CSS2规范发布,进一步发展了CSS的功能,包括定位和可视化效果。然而,不同浏览器对CSS规范的支持差异导致了所谓的"浏览器大战",其中盒模型的解释差异尤为显著。在1996年W3C发布的css规范中描述盒子模型的各个部分(外边距、边框、内边距、内容)被视为分开的组件。在这种标准盒模型下,元素的widthheight属性指定的是内容区域的大小,不包括内边距(padding)、边框(border)和外边距(margin),此后这被称为W3C 盒子模型。W3C盒子模型并不是唯一的, 1999年发布的Internet Explorer 5中的CSS盒模型实现是怪异盒模型,也称IE盒子模型,IE盒子模型将元素的widthheight定义为包括内容区域(content)、边框(border)和内边距(padding),但不包括外边距(margin)。这两种盒模型的区别如下表:
  4. 特征IE盒子模型(怪异盒模型)W3C标准盒模型
    定义widthheight 包括内容、内边距和边框widthheight 仅包括内容
    内容 (Content)widthheight 减去内边距和边框后的区域直接由 widthheight 定义的区域
    内边距 (Padding)包含在 widthheightwidthheight 外部额外添加
    边框 (Border)包含在 widthheightwidthheight 外部额外添加
    外边距 (Margin)对总体尺寸没有影响,用于元素之间的空间对总体尺寸没有影响,用于元素之间的空间
    应用场景早期IE版本默认现代浏览器默认
    示例:当设置width为200px,height为200px,padding为10px,margin为10px,可以看到盒子的widthheight定义为包括内容区域(content)、边框(border)和内边距(padding),但不包括外边距(margin)当设置width为200px,height为200px,padding为10px,margin为10px,可以看到盒子的widthheight属性指定的是内容区域的大小,不包括内边距(padding)、边框(border)和外边距(margin)
    1. 这个时期,开发者为了解决由于盒模型差异带来的兼容性问题,Web开发者通常需要采取额外的步骤,如使用CSS hacks或者特定的DOCTYPE声明来触发标准模式(Standards Mode)或怪异模式(Quirks Mode)。
    2. 2000年代初,随着Web标准化的推进和浏览器技术的发展,浏览器开始更好地遵守W3C的规范。CSS3的引入进一步丰富了Web设计的可能性,包括更灵活的布局选项和对盒模型的控制。W3C 在 CSS3 中包含了“box-sizing”属性。当box-sizing: border-box;为元素指定后,所有的元素填充或边框都会在指定的宽度和高度内绘制,“如传统 HTML 用户代理通常实现的那样”。从Can I Use (caniuse.com)可以看到border-box在各个浏览器的支持情况。
    3. 在此之后IE盒子模型的影响力和使用频率开始逐步下降,直到2022年6月15日正式停止支持Internet Explorer 11(IE11)在某些版本的Windows 10上的使用。IE盒子模型的影响力和使用频率达到了最低。
    4. 2000年代初直到现在,CSS盒子模型本身的基本概念和结构在Web标准中保持相对稳定。它继续围绕内容(content)、内边距(padding)、边框(border)、和外边距(margin)的核心组成部分展开。然而,随着CSS规范的不断发展,围绕盒子模型的功能和用法出现了一些扩展和改进,提高了布局设计的灵活性和控制力,如以下内容:
    特性/改进描述引入时间优点
    box-sizing允许改变用于计算元素宽度和高度的盒模型。CSS3提供了更灵活的盒模型控制,简化了边框和内边距的布局计算问题。
    Flexbox布局提供一种更高效的方式来布局、对齐和分配容器内项目之间的空间,即使项目大小未知或动态变化。CSS3强化了布局工具,特别适用于一维布局中的复杂布局和响应式设计。
    CSS Grid布局引入了二维网格布局系统,可以控制行和列以及它们之间的空间。CSS Grid使创建复杂的二维网页布局变得简单直观,极大地提升了布局的可能性和灵活性。
    响应式设计相关属性包括min-widthmax-widthmin-heightmax-height等,用于创建响应式设计。CSS2、CSS3增强了对不同屏幕和设备的适应能力,提升了网页的可访问性和用户体验。
    display: inline-block允许元素行内排布,同时保持块级特性(如设置宽高)。CSS2提供了在不使用浮动的情况下,进行更精细控制布局的能力。
    display: table, table-row, table-cell通过CSS属性模拟表格布局,无需使用HTML表格标签。CSS2提供了使用CSS实现表格布局的能力,增强了语义化HTML的实用性。
    CSS变量(自定义属性)允许存储可重用的值,并在整个文档中使用它们。CSS Variables增加了样式表的灵活性和可维护性,简化了复杂主题的实现。
    新的布局单位引入了如vw(视口宽度的百分比)、vh(视口高度的百分比)、rem(相对于根元素的字体大小)等单位。CSS3提供了更多布局和响应式设计的选项,使得布局适应性更强。

    最后:

    CSS盒子模型的发展反映了Web设计从简单文档到复杂应用的演变过程。通过不断的规范更新和浏览器技术的进步,盒子模型提供了一个强大而灵活的工具,使得网页布局更加直观和易于控制。今天,无论是传统网站还是现代Web应用,CSS盒子模型都是不可或缺的基础之一。随着Web技术的持续发展,理解盒子模型的历史和基本原理对于开发者来说依然至关重要。