`
天梯梦
  • 浏览: 13630166 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

详解CSS的盒模型(box model) 及 CSS3新增盒模型计算方式box-sizing

 
阅读更多

W3C规范

一般来说,页面中的每一个元素都会形成一个矩形盒子,渲染引擎根据给定的样式确定这个盒子的呈现。通俗的来说,页面的布局就是一个个盒子的排列和摆放。掌握了盒子呈现的本质,布局也就轻而易举。

在 W3C 规范中定义了标准的盒模型:

Each box has a content area (e.g., text, an image, etc.) and optional surrounding padding, border, and margin areas; the size of each area is specified by properties defined below. The following diagram shows how these areas relate and the terminology used to refer to pieces of margin, border, and padding

每一个盒子都有一个内容区域(比如:文本,图片.etc)和可选的环绕着内容的内边距(padding),边框(border),外边距(margin)。盒子的大小有这些属性定义。下面这张图很直观的说明了这一点

详解CSS的盒模型(box model) 及 CSS3新增盒模型计算方式box-sizing

元素框的最内部分是实际的内容,直接包围内容的是内边距。内边距呈现了元素的背景。内边距的边缘是边框。边框以外是外边距,外边距默认是透明的,因此不会遮挡其后的任何元素。

 

提示:背景应用于由内容和内边距、边框组成的区域。

内边距、边框和外边距都是可选的,默认值是零。但是,许多元素将由用户代理样式表设置外边距和内边距。可以通过将元素的 margin 和 padding 设置为零来覆盖这些浏览器样式。这可以分别进行,也可以使用通用选择器对所有元素进行设置:

* {
  margin: 0;
  padding: 0;
}

 

在 CSS 中,width 和 height 指的是内容区域的宽度和高度。增加内边距、边框和外边距不会影响内容区域的尺寸,但是会增加元素框的总尺寸。

 

假设框的每个边上有 10 个像素的外边距和 5 个像素的内边距。如果希望这个元素框达到 100 个像素,就需要将内容的宽度设置为 70 像素,请看下图:

详解CSS的盒模型(box model) 及 CSS3新增盒模型计算方式box-sizing
#box {
  width: 70px;
  margin: 10px;
  padding: 5px;
}

 

提示:内边距、边框和外边距可以应用于一个元素的所有边,也可以应用于单独的边。

提示:外边距可以是负值,而且在很多情况下都要使用负值的外边距。

 

如果是 Firebug 用户的话(基本和前端有关的都会用到 Firebug 吧 – 糖伴西红柿),就会很熟悉下面的图表了。
这个图表很好地展示了作用于页面上任意盒子的数值。

详解CSS的盒模型(box model) 及 CSS3新增盒模型计算方式box-sizing

注意以上两个例子中,margin 都是白色的。Margin 比较特别,它不会影响盒子本身的大小,但是它会
影响和盒子有关的其他内容,因此 margin 是盒模型的一个重要的组成部分。

盒子本身的大小是这样计算的:

**Width** width + padding-left + padding-right + border-left + border-right
**Height** height + padding-top + padding-bottom + border-top + border-bottom

 

值未声明的情况

如果未声明 padding 或者 border,那他们或者值为零(使用 css reset 时),或者为浏览器的默认值(很可能不是零,尤其是那些通常没有重置的表单元素)

 

块级盒的默认宽度

如果未声明宽度,并且盒子是静态或者相对定位的,宽度会保持 100%的 宽度,padding 和 border 会向内推动,而不是向外扩展。

 

但是,如果明确设置盒子的宽度为 100%,那么 padding 就会向外延展。

详解CSS的盒模型(box model) 及 CSS3新增盒模型计算方式box-sizing

The lesson here being that the default width of a box isn’t really 100% but a less tangible “whatever is left”. This is particularly valuable to know, since there are lots of circumstances where it is immensely useful to either set or not set a width.

 

要注意的是,盒子的默认宽度并不真的是 100%,而是剩下的可能值(应该是说,剩余真实存在的宽度 )。应该了解这个特殊值,因为很多情况下,它对于设置/不设置宽度都是非常有用的。

 

我 遇到的最大的麻烦就是 textarea(文本框) 元素了,它们需要设为宽度为所需的”cols”属性,并且不能包含子元素。因此通常需要明确的设置 textarea 的宽度为 100%,但有 padding 时,就会延展 textarea 的宽度。固定宽度环境下,通常可以设置为合适的像素值宽度,但是变宽情况就没那么幸运了。

 

无宽度的绝对定位盒子

未设定宽度的绝对定位的盒子的表现有点不一样。它们的宽度只需要适合它们所包含的内容即可。因此,如果盒中只有一个单词,盒子就会像那个词的表现一样宽。如果变成两个词,盒子的宽度也会相应增加。

详解CSS的盒模型(box model) 及 CSS3新增盒模型计算方式box-sizing

这种情况会持续到盒子的宽度达到父元素宽度的 100%(最近的相对定位的父元素或者浏览器窗口),然后就会折行。

 

对盒子来说,垂直扩展以适应包含的内容是很自然的。值得奇怪的是,不仅仅是不同平台下的文本表现不同,不同的浏览器处理这个问题时,也有很多怪癖。

详解CSS的盒模型(box model) 及 CSS3新增盒模型计算方式box-sizing

无宽度浮动盒子

同 无宽度的绝对定位盒子的表现一样。盒子的宽度只需要扩展到所包含内容的宽度,直到其父元素的宽度(其父元素不必是相对定位的)。由于这些无宽度盒 子的脆弱性,我们要学到的是关键任务模式的时候它们是不能依赖的,像总体页面布局中。如果浮动一列作为侧边栏使用,并指望那些内部元素(如图片)来负责包 含它的宽度,你就是在自找麻烦。

 

内联元素也是盒子

我们这里一直把重点放在块级元素的盒子上。很容易就可以把块级元素想象为盒子,但是内联元素也是盒子。可以把他们想象为非常长而窄的长方形,它们也可以像其它盒子一样有 margin, padding he border

详解CSS的盒模型(box model) 及 CSS3新增盒模型计算方式box-sizing

折 行使它看起来有些不好理解。如上所示的左 margin 把盒子推向右边,但是只在第一行有效,因为那是盒子的起点。padding 正常的应用在文本的上部或下部,当折行时它会忽略上面行的 padding 并且以行高(line-height)要求的位置作为起点。透明背景是为了让效果看起来更清楚。

 

亲眼目睹一下

想看看组成页面的每个单独的“盒子”吗?试着把这行代码暂时放入样式表:

*{ border: 1px solid red !important; }

 

 

详解CSS的盒模型(box model) 及 CSS3新增盒模型计算方式box-sizing

box-sizing

不过在新的 CSS3 中,新增了一种盒模型计算方式:box-sizing属性。盒模型默认的值是content-box, 新增的值是padding-boxborder-box,几种盒模型计算元素宽高的区别如下:

 

content-box(默认)

布局所占宽度Width:

Width = width + padding-left + padding-right + border-left + border-right

布局所占高度Height:

Height = height + padding-top + padding-bottom + border-top + border-bottom

 

padding-box(只在部分浏览器中有效,例如firefox,所以建议不要使用)

布局所占宽度Width:

Width = width(包含padding-left + padding-right) + border-top + border-bottom

布局所占高度Height:

Height = height(包含padding-top + padding-bottom) + border-top + border-bottom

 

border-box

布局所占宽度Width:

Width = width(包含padding-left + padding-right + border-left + border-right)

布局所占高度Height:

Height = height(包含padding-top + padding-bottom + border-top + border-bottom)

 

参考:

http://www.w3school.com.cn/css/css_boxmodel.asp

https://www.qianduan.net/css-box-model/

https://leohxj.gitbooks.io/front-end-database/content/html-and-css-basic/box-module.html

 

更多内容可以参考:CSS: 深入理解BFC和Margin Collapse (margin叠加或者合并外边距)

本文转自:详解CSS的盒模型(box model) 及 CSS3新增盒模型计算方式box-sizing

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    详解CSS3中的box-sizing(content-box与border-box)

    CSS3中的box-sizing 属性允许以特定的方式来指定盒模型,有两种方式: content-box:标准盒模型,又叫做 W3C盒模型,一般在现代浏览器中使用的都是这个盒模型 border-box:怪异盒模型,低版本IE浏览器中的盒模型 ...

    css详解box-sizing.zip

    css详解box-sizing.zip

    CSS3 box-sizing属性详解

     3、border-box,border和padding计算入width之内,其实就是怪异模式了~ 注意: ie8+浏览器支持content-box和border-box; ff则支持全部三个值。 使用时: -webkit-box-sizing: 100px; // for ios-safari, and

    CSS3属性box-sizing使用指南

    box-sizing用于改变CSS盒子模型,从而改变元素宽高的计算方式。 box-sizing取值如下: 复制代码代码如下:box-sizing: content-box | padding-box | border-box 默认值是 content-box ,对应CSS2.1规范中标准的盒子...

    关于box-sizing的全面理解

    box-sizing 属性允许您以特定的方式定义匹配某个区域的特定元素。 例如,假如您需要并排放置两个带边框的框,可通过将 box-sizing 设置为 "border-box"。这可令浏览器呈现出带有指定宽度和高度的框,并把边框和内...

    浅谈CSS3 box-sizing 属性 有趣的盒模型

    盒模型的组成大家肯定都懂,由里向外content,padding,border,margin. ...这里用到了CSS3 的属性 box-sizing(默认值:content-box) /* 标准模型 */ box-sizing:content-box; /*IE模型*/ box-sizing:border-box; co

    使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题

    有时我们会给页面的元素...1,box-sizing 属性介绍box-sizing 允许我们以特定的方式定义匹配某个区域的特定元素。 CSS Code复制内容到剪贴板 box-sizing: content-box|border-box|inherit;  值 描述 conte

    css3 盒模型以及box-sizing属性全面了解

    在CSS中,这些矩形盒子用标准盒模型来描述。这个模型描述了一个元素所占用的空间。每一个盒子有四条边界:外边距边界margin, 边框边界border, 内边距边界padding与内容边界content。 在W3C模型中: 总宽度 = margin-...

    前端开源库-tachyons-box-sizing

    前端开源库-tachyons-box-sizing超光速管盒尺寸,CSS模块,更智能的默认盒模型。

    css3 box-sizing属性使用参考指南

    border|padding|content {element width=border+padding+content} border-box:此值改变css2.1盒模型组成模式,content|border|padding {element width=content} 说明: 改变容器的盒模型组成方式。 引擎...

    解决CSS 中box-sizing与background-clip解决背景显示范围的问题

    过去在学习CSS的时候,首要任务就是要理解“box model”,因为box model是CSS里头很重要的模型概念,描述了padding、margin、border与content的空间定位,今天的项目竟然卡在一个简单的小问题,因此就用一篇文章做个...

    CSS3盒子模型详解

    本章将介绍CSS3中各种盒的知识点;主要包含以下内容: CSS3中各种各样盒的类型概念、浏览器支持情况; 当盒中内容超出容纳范围时,如何利用属性来让浏览器按照自己想要的方式对盒中内容进行显示; 掌握给盒添加阴影...

    emotion-box-sizing-reset:Emotion CSS-in-JS库的框大小重置

    情感框大小重置 CSS-in-JS库的。...npm install --save emotion-box-sizing-reset Java脚本 import { Global , css } from "@emotion/core" ; import reset from "emotion-box-sizing-reset" ; // … 执照

    box-sizing.docx

    box-sizing.docx

    CSS3 box-sizing属性

    说到 IE 的 bug,一个臭名昭著的例子是它对于“盒模型”的错误解释:在 IE5.x 以及 Quirks 模式的 IE6/7 中,将 border 与 padding 都包含在 ...这种情况在 CSS3 时代有了改善,得益于这个叫做 box-sizing 的属性,

    50道CSS基础面试题

    50道CSS基础面试题(附答案) 1 介绍一下标准的CSS的盒子模型?与低版本IE的盒子模型有什么不同的? 2 box-sizing属性? 3 CSS选择器有哪些?哪些属性可以继承?

Global site tag (gtag.js) - Google Analytics