资讯专栏INFORMATION COLUMN

CSS规范里的一些事(一)

neu / 586人阅读

摘要:规范里的一些事前言以下内容总结于规范,一盒子模型以上图形说的是盒子模型中的边界。,,和属性失效盒的位置是根据常规流计算的被称为常规流中的位置,然后盒相对于其常规位置偏移。

CSS规范里的一些事
前言:以下内容总结于CSS2.1规范,http://www.ayqy.net/doc/css2-1/cover.html
一、盒子模型


以上图形说的是盒子模型中的content、padding、border、margin边界。

样式

盒的内容区的尺寸—content width和content height —取决于几个因素:生成该盒的元素是否设置了"width"或"height"属性,该盒是否包含文本以及其它盒,该盒是不是表格等等。盒的内容,内边距和边框区域的背景样式由生成(该盒的)元素的"background"属性来指定。外边距背景总是透明的。

合并外边距

CSS中,两个或多个盒(可能但不一定是兄弟)的相邻的margin会被结合成一个margin。外边距按这种方式结合叫做合并(collapse),产生的结合的外边距叫做折叠外边距(collapsed margin 译注:这里译作折叠表示结果,与合并的动作区分开)

根元素盒的margin不合并;

如果一个带有间隙(clearance 指clear属性导致元素位置移动形成的间隙)的元素的上外边距与下外边距相邻,它的外边距会和紧挨着的兄弟(元素)的相邻外边距合并,但合并后不会再和父级块的下外边距合并;

水平margin不会合并;

两个margin是相邻的,当且仅当:

都属于流内(in-flow)块级盒,处于同一个块格式化上下文;

没有行框(line box),空隙,内边距和边框把它们隔开;

都属于垂直相邻框边界(vertically-adjacent box edges),即形成下列某一对:
盒的上边距与其第一个流内(in-flow)孩子的上边距
盒的下边距与其下一个流内紧挨着的兄弟的上边距
最后一个流内孩子的下边距与其height计算值为"auto"的父元素的下边距
盒的上边距和下边距,要求该盒没有建立新的块格式化上下文,并且"min-height"计算值为0,"height"计算值为0或"auto",还没有流内孩子折叠外边距也能与另一个外边距相邻,只要其外边距的任意一部分与那个外边距相邻就算

合并后的结果:
当两个或者更多的margin合并时,产生的margin宽度为被合并的外边距宽度中的最大值。至于负margin,就从正相邻margin的最大值中减去负相邻margin的绝对值的最大值。如果没有正margin,就用0减去相邻margin的绝对值的最大值。如果该元素的外边距与其父元素的上外边距合并了,盒的上边框边界被定义为与其父元素的相同否则,要么该元素的父元素没参与外边距合并,要么只涉及其父元素的下外边距。该元素上边框边界的位置与元素下边框非0时的位置相同。

内边距padding

内边距的属性和外边距的属性类似, 有一点不同的是,内边距padding不能为负。

边框border

这个属性比较简单, 有些样式而已。

二、视觉格式化模型
在视觉格式化模型中,文档树中的每个元素根据其盒模型生成0个或多个盒。这些盒的布局由(以下因素)控制:
* 盒尺寸与类型
* 定位方案(常规流,浮动与绝对定位)
* 文档树中元素间的关系
* 外部信息(例如,视口大小,图片的固有尺寸等等)

包含块

CSS 2.1中,很多盒的位置和大小是根据被称为包含块的矩形框的边界计算的。一般把生成的盒作为后代盒的包含块,我们说一个盒为其后代“建立”了包含块。“一个盒的包含块”表示“盒所在的包含块”,而不是它生成的(包含块)每个盒都根据其包含块确定了一个位置,但它不受该包含块的限制,可能会溢出

块级元素与块盒

行级元素与行内盒

使用display属性可以定义block、inline-block、inline、list-item、none等样式。以下分别是这几种属性的作用:

该值会让元素生成一个块盒

该值会让元素生成一个行内级块容器(inline-level block container)。一个inline-block的内部会被格式化成一个块盒,而该元素本身会被格式化成一个原子行内级盒

该值会让元素生成一个或多个行内盒

该值会让元素(例如,HTML中的LI)生成一个主块盒(principal block box)和一个标记盒(marker box)。关于列表及列表格式化示例的更多信息请查看列表章节

该值会让元素不在格式化结构(formatting structure)中出现(即在视觉媒体中,元素不会生成盒也不会影响布局)。后代元素也不会生成任何盒,该元素及其内容会从格式化结构中全部移除。这种行为不能通过给后代设置"display"属性来重写

定位方案

常规流 CSS 2.1中,常规流包括块级盒的块格式化(block formatting),

行内级盒的行内格式化和块级与行内级盒的相对定位

浮动 在浮动模型中,盒先根据常规流来放置,然后从常规流中取出来并尽可能远地向左或向右移动。其它内容可能沿着浮动(盒)的一侧排列(Content may flow along the side of a float)

* 绝对定位 在绝对定位模型中,一个盒会从常规流中全部移除(它不会影响后面的兄弟元素)并根据包含块确定位置
* 如果一个元素是浮动的,绝对定位的或者是根元素,它就叫流外(out of flow)(元素)。如果一个元素不是流外的,就叫流内(in-flow)(元素)。

static
盒是个常规盒,根据常规流布局。"top","right","bottom"和"left"属性失效.
relative
盒的位置是根据常规流计算的(被称为常规流中的位置),然后盒相对于其常规位置偏移。当盒B为相对定位时,后面的盒的位置仍按照B没有偏移量来计算。table-row-group,table-header-group,table-footer-group,table-row,table-column-group,table-column,table-cell和table-caption元素上"position:relative"的效果是未定义的
absolute
盒的位置(及可能的大小)由"top","right","bottom"和"left"属性指定,这些属性指定了相对于盒的包含块的偏移量。绝对定位的盒脱离了常规流,意味着它们不会影响后面兄弟元素的布局,而且,虽然绝对定位的盒有外边距,但它们不会与任何其它外边距合并
fixed
除了盒相对于某些参照(reference)是固定的(fixed)之外,盒的位置根据"absolute"模型来计算。如同"absolute"模型一样,盒的外边距不会与任何其它外边距合并。

三、常规流
常规流中的盒属于一个格式化上下文,可能是块或是行内(格式化上下文),但不能两者都是。块级盒参与块格式化上下文。行内级盒参与行内格式化上下文.

块格式化上下文

浮动,绝对定位的元素,非块盒的块容器(例如inline-blocks,table-cells和table-captions),以及’overflow’不为’visible’的块盒(当该值已被传播到视口时除外(except when that value has been propagated to the viewport))会为其内容建立新的块格式化上下文.

在一个块格式化上下文中,盒在垂直方向一个接一个地放置,从包含块的顶部开始。两个兄弟盒之间的垂直距离由"margin"属性决定。同一个块格式化上下文中的相邻块级盒之间的垂直外边距会合并.

在一个块格式化上下文中,每个盒的左外边界(left outer edge)挨着包含块的左外边界(对于从右向左的格式化,右外边界挨着)。即使存在浮动(尽管一个盒的行框可能会因为浮动而收缩 译注:环绕浮动元素放置的行框比正常的行短一些),这也成立。除非该盒建立了一个新的块格式化上下文(这种情况下,该盒自身可能会因为浮动变窄)

行内格式化上下文

在行内格式化上下文中,盒是从包含块的顶部开始一个挨一个水平放置的。这些盒之间的水平外边距,边框和内边距都有效。盒可能会以不同的方式垂直对齐:以它们的底部或者顶部对齐,或者以它们里面的文本的基线对齐。包含来自同一行的盒的矩形区域叫做行框    

行框的宽度由包含块和浮动情况决定,行框的高度由行高的计算小节给出的规则决定

行框总是足够高,能够容纳它包含的所有盒。然而,它可能比它所包含的最高的盒还要高(例如,如果盒是以基线对齐的)。当盒B的高度小于它所在的行框的高度时,行框中B的垂直对齐方式由"vertical-align"属性决定。当几个行内级盒在水平方向上不能共存于一个行框时,它们会被分到两个或多个垂直堆叠的(vertically-stacked) 行框里。因此,段落就是个行框的垂直栈(vertical stack)。行框没有垂直间隔地堆放(除非在其它地方有特别说明)并且它们不会重叠

相对定位

当一个盒根据常规流或者浮动摆放好后,它可能会相对于该位置移动,称之为相对定位。用这种方式偏移盒(B1)的位置不影响盒(B2),遵循:给定B2位置时就当B1没有偏移,并且B2在B1应用偏移之后没有重新定位(re-positioned)。这表明相对定位可能会导致盒重叠。然而,如果相对定位导致有"overflow:auto"或"overflow:scroll"的盒溢出了的话,UA必须让用户能够访问这部分内容(在其偏移位置),此时,滚动条的创建可能会影响布局

绝对定位

绝对定位模型中,盒相对其包含块明确偏移,它会从常规流中全部移除(不会影响后面的兄弟)。绝对定位的盒会为常规流中的子级和绝对(不包括fixed)定位的后代建立一个新的包含块。然而绝对定位的元素的内容不会沿着任何其它盒排列。它们可能会遮住其它盒的内容(或者它们自身被遮住),取决于重叠盒的堆叠层级(stack levels)

fixed定位是绝对定位的子类(subcategory)。fixed定位的盒唯一的区别是,包含块由视口建立。对于连续媒体,当文档滚动时,fixed盒不会移动。在这一点上,它们和fixed背景图像类似。对于分页媒体,fixed定位的盒会在每一页上重复(出现)。这在排版(placing)方面很有用,例如,每一页的底部都有一个签名。fixed定位的盒比页区(page area)大的部分会被裁剪。fixed定位盒在初始包含块中不可见的部分将不会被打印

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/115624.html

相关文章

  • 带你了解webpack

    摘要:根据依赖关系,按照配置文件把模块函数分组打包成若干个。会随着自身的的修改,而发生变化。只需要在命令行运行时带上参数就搞定一些插件的废除和替换废弃了顶替者用属性变化压缩优化代码分割,下面详解还有一些新的插件,。 1. 前端工程化项目打包历史 前端工程化之前的时代略过 1. 半自动执行脚本来压缩合并文件 自从xmlhttprequest被挖掘出来,网页能够和服务端通讯,js能做的事越来越多...

    senntyou 评论0 收藏0
  • 带你了解webpack

    摘要:根据依赖关系,按照配置文件把模块函数分组打包成若干个。会随着自身的的修改,而发生变化。只需要在命令行运行时带上参数就搞定一些插件的废除和替换废弃了顶替者用属性变化压缩优化代码分割,下面详解还有一些新的插件,。 1. 前端工程化项目打包历史 前端工程化之前的时代略过 1. 半自动执行脚本来压缩合并文件 自从xmlhttprequest被挖掘出来,网页能够和服务端通讯,js能做的事越来越多...

    Tamic 评论0 收藏0
  • 关于css命名的点思考,探讨css命名空间的可行性

    摘要:毕竟这是张鑫旭七年前的文章。命名法的意思就是块元素修饰符是由团队提出的一种前端命名方法论。但此法没有经过大型项目的考验,希望大神们来探讨一下可行性。 本文主要是探讨传统项目中的css命名,vue、react等单页应用都可以使用css-module来解决这个问题 作为一名初级前端,免不了要切图(写css、html静态部分),写css最头痛的就是给class命名了,词汇有限,本人又比较懒,...

    lk20150415 评论0 收藏0
  • 关于css命名的点思考,探讨css命名空间的可行性

    摘要:毕竟这是张鑫旭七年前的文章。命名法的意思就是块元素修饰符是由团队提出的一种前端命名方法论。但此法没有经过大型项目的考验,希望大神们来探讨一下可行性。 本文主要是探讨传统项目中的css命名,vue、react等单页应用都可以使用css-module来解决这个问题 作为一名初级前端,免不了要切图(写css、html静态部分),写css最头痛的就是给class命名了,词汇有限,本人又比较懒,...

    crossoverJie 评论0 收藏0

发表评论

0条评论

neu

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<