0%

块格式化上下文

一致性 要求和建议

CSS 渲染模型中不考虑替换元素的内容。

在 CSS 2.1 中,只有替换元素才能具有内在维度。对于没有可靠分辨率信息的光栅图像,必须假设每个图像源像素的大小为 1 像素单位。

HTML 的元素名是大小写不敏感的 但是在 XML 中是大小写敏感的

0 长度单位后的单位是可选的

选择器

E[foo] 匹配设置了”foo”属性(无论值是什么)的 E 元素

E[foo=”warning”] 匹配所有”foo”属性值恰好是”wraning”的 E 元素

E[foo~=”warning”] 匹配所有”foo”属性值为一列空格分隔的值,且其中之一恰好是”warning”的 E 元素

E[lang|=”en”] 匹配所有”lang”属性值为一列以”en”开头(从左向右)用连字符分隔的值的 E 元素

link 伪类::link 与:visited

动态伪类: :hover,:active 与:focus

:first-line 伪元素对段落内容的第一个格式化行应用特殊样式(选择器”P:first-line”不会匹配任何真实 HTML 元素。它匹配一个(与 CSS 规范)一致的用户代理将在每个段落的开头插入的伪元素) :first-line 伪元素只能用于块容器元素

:first-letter 伪元素必须选择一个块的第一行的第一个字母

当:first-letter 和:first-line 伪元素被应用在一个具有使用:before 和:after 生成内容的元素,它们应用于元素包括生成的内容在内的首字母或首行

层叠和继承

为了让用户代理能够避免为不支持的媒体类型检索资源,编写者可以指定带媒体依赖(media-dependent)的@import 规则。

1
@import url("fineprint.css") print;
  • 用户样式表,简单来说就是浏览器的使用者自己编写的一份默认样式表,编写者样式表,是网页的编写者编写的样式表,第一次听说这种说法

视觉格式化模型

Block-level 块级元素 包含以下类型 block list-item table list-item 会生成附加的盒子,相对于主盒子放置

block container box 只包含块级元素或者内联块级元素,

匿名块级盒子 当块级盒子同时包含内联的文本和块级元素时,我们认为这里有一个匿名的盒子包围了这些文本,如果一个块级盒子包含了块级盒子,我们强制让他只包含块级盒子

以@开头的规则(At-rules)需要以分号来结尾

CSS 2.1 用户代理必须忽略在块内或在除@cherset 或@import 规则之外的任何非忽略语句之后发生的任何“@import”规则。一下是非法的,解决方法是将样式的语法放在 At-rules 之后

1
2
3
@import "subs.css";
h1 { color: blue }
@import "list.css";

盒模型

‘margin-top’, ‘margin-bottom’ 这两个属性对非替换的行内元素无效

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

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

  • 没有行框(line box),空隙,内边距和边框把它们隔开(注意,因此某些 0 高度行框(见 9.4.2)会被忽略)
  • 都属于垂直相邻框边界(vertically-adjacent box edges),即形成下列某一对:
    • 盒的上边距与其第一个流内(in-flow)孩子的上边距
    • 盒的下边距与其下一个流内紧挨着的兄弟的上边距
    • 最后一个流内孩子的下边距与其 height 计算值为’auto’的父元素的下边距
    • 盒的上边距和下边距,要求该盒没有建立新的块格式化上下文,并且’min-height’计算值为 0,’height’计算值为 0 或’auto’,还没有流内孩子
  • margin 和 padding 的百分比数值都相对于包含块,border 不能设置百分比数值

块格式化上下文

以下方式会创建块格式化上下文

  • 根元素或包含根元素的元素
  • 浮动元素(元素的 float 不是 none)
  • 绝对定位元素(元素的 position 为 absolute 或 fixed)
  • 行内块元素(元素的 display 为 inline-block)
  • 表格单元格(元素的 display 为 table-cell,HTML 表格单元格默认为该值)
  • 表格标题(元素的 display 为 table-caption,HTML 表格标题默认为该值)
  • 匿名表格单元格元素(元素的 display 为 table、table-row、 table-row-group、table-header-group、table-footer-group(分别是 HTML table、row、tbody、thead、tfoot 的默认属性)或 inline-table)
  • overflow 值不为 visible 的块元素
  • display 值为 flow-root 的元素
  • contain 值为 layout、content 或 strict 的元素
  • 弹性元素(display 为 flex 或 inline-flex 元素的直接子元素)
  • 网格元素(display 为 grid 或 inline-grid 元素的直接子元素)
  • 多列容器(元素的 column-count 或 column-width 不为 auto,包括 column-count 为 1)
  • column-span 为 all 的元素始终会创建一个新的 BFC,即使该元素没有包裹在一个多列容器中
  • 块格式化上下文对浮动定位(参见 float)与清除浮动(参见 clear)都很重要。浮动定位和清除浮动时只会应用于同一个 BFC 内的元素。浮动不会影响其它 BFC 中元素的布局,而清除浮动只能清除同一 BFC 中在它前面的元素的浮动。外边距折叠(Margin collapsing)也只会发生在属于同一 BFC 的块级元素之间。

  • 行内级元素是源文档中那些不会形成新内容块的元素,内容分布于多行 ‘display’属性的下列值能让一个元素变成行内级:’inline’,’inline-table’和’inline-block’。一个 inline-block 的内部会被格式化成一个块盒,而该元素本身会被格式化成一个原子行内级盒

  • display 为 table 系的元素的 postion:relative 效果是未定义的

  • 盒偏移:’top’,’right’,’bottom’,’left’ 如果元素的’position’属性有一个除’static’外的值,就说它是定位元素(positioned) 百分比数值参照包含块的宽度
  • 如果’left’和’right’都不是’auto’,位置就被过度约束(over-constrained)了,它们(’left’和’right’)其中有一个会被忽略。如果包含块的’direction’属性是’ltr’,那么’left’有效,’right’变成-‘left’(负的’left’)。如果包含块的’direction’属性是’rtl’,那么’right’有效,’left’被忽略
  • 清除浮动的方法 overflow-hidden 创建了一个 BFC,BFC 在计算高度的 也计算浮动元素的高度
  • 注意 ‘direction’属性,给表格列元素指定时,不会被列中的单元格继承,因为在文档树中,列不是单元格的祖先。因此,CSS 无法轻易获知[HTML4]的 11.3.2.1 节中”dir”属性的继承规则
  • direction 和 unicode-bidi 属性结合处理文本流方向问题(不仅,而且句子从右向左,单词也倒着写)

视觉格式化模型细节

width 应用于除了非替换的行内元素,表格行和行组(row group) 外的所有元素,非替换的行内元素盒的内容宽度是它里面渲染的内容(的内容宽度)负值对于 width 是非法的。

行内非替换(non-replaced)元素 ‘width’属性不适用,其计算值为’auto’的’margin-left’或者’margin-right’对应的应用值为’0’。

行内替换元素 计算值为’auto’的’margin-left’或者’margin-right’对应的应用值为’0’ 如果’height’和’width’计算值都是’auto’,并且该元素还具有固有宽度,那么这个固有宽度就是’width’的应用值。

height 指定一个百分比高度。百分比参照生成盒的包含块的高度。如果包含块的高度没有显式指定(即取决于内容高度),并且该元素不是绝对定位的,则计算值为’auto’。根元素上的百分比高度是相对于初始包含块的 注意:对于那些包含块基于一个块级元素的绝对定位元素,百分比根据这个元素的内边距框(padding box)的高度来计算。这与 CSS1 不同,(CSS1 中)百分比总是根据父级元素的内容框(content box)来计算

line-height 的百分比参考元素自身的字体大小

vertical-align 的百分比是行高

可视化效果

  • visibility hidden 生成的盒是不可见的(完全透明,什么都不绘制),但仍然会影响布局。而且该元素具有’visibility: visible’的后代将是可见的

颜色与背景

  • background-attachment 指定了它应该相对视口固定,还是随包含块滚动

文本

  • 字母与单词间距 ‘letter-spacing’和’word-spacing’
  • ‘text-transform’属性 转换单词大小写
  • ‘white-space’属性 决定如何处置换行符

用户界面

cursor crosshair 简单十字 move 暗示可移动 text 暗示可选中的文本 wait 暗示正忙
outline 当元素具有焦点时,可应用轮廓属性,该属性不占用空间