怪癖模式

现行标准 — 最后更新

参与:
GitHub whatwg/quirks新建议题所有议题
Matrix 聊天
提交记录:
GitHub whatwg/quirks/commits
当前提交快照
@quirksstandard
测试:
web-platform-tests quirks/进行中的工作
翻译 (非规范性)
简体中文

摘要

怪癖模式定义了 Web 浏览器为兼容 Web 而必须支持的 CSS 和选择器中的怪癖行为。

1. 简介

1.1. 历史

浏览器有多种渲染模式用于渲染 HTML 文档,其原因基本上是历史偶然造成的。CSS 规范与现有浏览器的行为不兼容,而现有 Web 内容又依赖这些行为。为了遵循规范同时不破坏现有内容,浏览器引入了一种新的渲染模式(非怪癖模式)。有些浏览器在非怪癖模式下仍然对表格单元格中的图片采用收缩包裹行为,网站开始依赖这种行为,于是实现规范行为的浏览器又引入了第三种模式(有限怪癖模式)。事后看来,最好让默认的 CSS 行为与现有内容依赖的行为兼容,并提供可选的不同行为。此后,不同模式在 CSS 之外也出现了一些差异。

1.2. 目标

本规范并未枚举当前浏览器中存在的所有怪癖。许多怪癖在 HTML、DOM、CSSOM 和 CSSOM View 中有规范说明。[HTML] [DOM] [CSSOM] [CSSOM-VIEW] 如果某个怪癖没有在任何地方规范,可能是因为上面第二条原因。

2. 通用基础设施

2.1. 一致性

本规范中的所有图示、示例和注释均为非规范性内容,所有明确标记为非规范性的章节也是非规范性的。除此之外,规范中的其他内容均为规范性内容。

规范性部分中的关键词 "MUST"、"MUST NOT"、"REQUIRED"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"NOT RECOMMENDED"、"MAY" 和 "OPTIONAL" 应按照 RFC2119 的描述进行解释。为便于阅读,这些词在本规范中未全部采用大写。[RFC2119]

2.2. 术语

当本规范提到“foo 元素”时,指的是本地名为 foo 且命名空间为 http://www.w3.org/1999/xhtml 的元素。

当本规范提到“foo 属性”时,指的是本地名为 foo 且无命名空间的属性。

文档的 body 元素文档元素的第一个子元素,该元素为 body 元素(如果存在),且 文档元素html 元素。否则为 null。

文档的 body 元素与 HTML 的 body 元素不同,后者可以是 frameset 元素。

3. CSS

3.1. 无井号十六进制颜色怪癖

参见 CSS Color 4 § B 已废弃的怪癖十六进制颜色

3.2. 无单位长度怪癖

参见 CSS Values 4 § C 怪癖长度

3.3. 行高计算怪癖

怪癖模式有限怪癖模式下,满足以下所有条件的内联盒,在行高计算时应视为 line-height 为零:

3.4. 块级元素忽略行高怪癖

怪癖模式有限怪癖模式下,对于内容由内联级元素组成的块容器元素,该元素的 line-height 在计算该元素内行盒的最小高度时应被忽略。

这意味着不会创建“支撑线盒(strut)”。

3.5. 百分比高度计算怪癖

怪癖模式下,为了计算元素 elementheight,如果 elementposition 属性的计算值为 relativestatic,且 elementheight 属性的指定值为 <百分比>,并且 elementdisplay 属性的计算值不是 table-rowtable-row-grouptable-header-grouptable-footer-grouptable-celltable-caption,则 element包含块应按以下算法计算,遇到返回值时即终止:

  1. element 为其最近的祖先 包含块,如果没有,则返回 初始包含块

  2. 如果 elementdisplay 属性的计算值为 table-cell,则返回 UA 定义的值。

  3. 如果 elementheight 属性的计算值不是 auto,则返回 element

  4. 如果 elementposition 属性的计算值为 absolute,或 element 不是 块容器表格包装盒,则返回 element

  5. 跳转到第一步。

截至目前,CSS 中表格内百分比高度的行为未定义。本规范不尝试规定在表格中计算百分比高度时应使用哪个包含块。祝好运!

此怪癖需要考虑书写模式。

3.6. html 元素填充视口怪癖

怪癖模式下,如果 文档元素 element 满足以下所有条件:

……则 element 必须按以下算法设置其在 块流方向上的 border box 尺寸:

  1. marginselementmargin-leftmargin-right 属性的使用值之和(垂直书写模式),否则为 margin-topmargin-bottom 属性的使用值之和(水平书写模式)。

  2. size初始包含块块流方向上的尺寸减去 margins

  3. 返回 size 与元素按 CSS 规范正常应有的 border box 尺寸中的较大值。

3.7. body 元素填充 html 元素怪癖

怪癖模式下,如果 文档的 body 元素 body 不为 null 且满足以下所有条件:

……则 body 必须按以下算法设置其在 块流方向上的 border box 尺寸:

  1. marginsbodymargin-leftmargin-right 属性的使用值之和(垂直书写模式),否则为 margin-topmargin-bottom 属性的使用值之和(水平书写模式)。

  2. sizebody 的父元素 内容盒块流方向上的尺寸减去 margins

  3. 返回 size 与元素按 CSS 规范正常应有的 border box 尺寸中的较大值。

如果 htmlbody 具有不同的书写模式时应如何处理?

3.8. 表格单元格宽度计算怪癖

怪癖模式下,为了计算表格单元格 cell 作为 包含块的内联格式化上下文的 min-content 宽度时,如果 cellwidth 属性的计算值为 auto,则该内联格式化上下文中的 img 元素(作为 内联级 替换元素)前后不得有 软换行机会[CSS-TEXT-3] [INTRINSIC]

3.9. 表格单元格 nowrap 最小宽度计算怪癖

怪癖模式下,满足以下所有条件的元素 cell,在自动表格布局算法中,其 外部 min-content 宽度应为 cellwidth 属性的计算值与 外部 min-content 宽度中的较大值。[INTRINSIC]

3.10. 表格折叠怪癖

怪癖模式下,满足以下所有条件的元素 table,其 height 属性的使用值为 0border-style 属性的使用值为 none

3.11. 文本装饰不传播到表格怪癖

怪癖模式下,文本装饰不得传播到 table 元素内。

3.12. 表格继承 body 颜色怪癖

怪癖模式下,color 属性的初始值必须为 quirk-inherit,这是一个没有关键字映射的特殊值。

元素 elementcolor 属性的计算值必须按以下算法计算:

  1. 如果 elementcolor 属性的指定值不是 quirk-inherit,跳转到最后一步。

  2. 如果 element 不是 table 元素,跳转到最后一步。

  3. 如果 文档的 body 元素为 null,跳转到最后一步。

  4. 返回 文档的 body 元素color 属性的使用值。终止步骤。

  5. 如果 elementcolor 属性的指定值为 quirk-inherit,则将其指定值设为 CSS 规范中的初始值。返回 elementcolor 属性的计算值(按 CSS 规范)。

3.13. 表格单元格高度盒模型怪癖

怪癖模式下,display 属性计算值为 table-cell 的元素,在 heightmin-heightmax-height 属性的计算时,必须视为 box-sizing 属性的使用值为 border-box

4. 选择器

4.1. :active 和 :hover 怪癖

怪癖模式下,满足以下所有条件的 复合选择器 selector,不得匹配不会同时匹配 :any-link 选择器的元素。[SELECTORS4]

安全与隐私注意事项

本规范没有已知的安全或隐私影响。

致谢

感谢 Anne van Kesteren、Boris Zbarsky、Chris Rebert、Dan Mulvey、David Baron、Kang-Hao Lu、Ms2ger、Simon Sapin 和 Tab Atkins 的宝贵意见。

特别感谢 Boris Zbarsky 和 David Baron 在 MDN 上记录了 Mozilla 的怪癖行为

本标准由 Simon Pieters(Mozillazcorpan@gmail.com)撰写。

知识产权声明

Copyright © WHATWG (Apple, Google, Mozilla, Microsoft)。本作品采用 知识共享署名 4.0 国际许可协议授权。若部分内容被纳入源代码,则该部分按 BSD 3-Clause License 授权。

这是现行标准。如需专利审查版本,请参阅 现行标准审查草案

索引

本规范定义的术语

引用定义的术语

参考文献

规范性引用

[CSS-BACKGROUNDS-3]
Elika Etemad;Brad Kemper。CSS 背景与边框模块第 3 级(CSS Backgrounds and Borders Module Level 3)。URL: https://drafts.csswg.org/css-backgrounds/
[CSS-BOX-4]
Elika Etemad。CSS 盒模型模块第 4 级(CSS Box Model Module Level 4)。URL: https://drafts.csswg.org/css-box-4/
[CSS-CASCADE-5]
Elika Etemad;Miriam Suzanne;Tab Atkins Jr.。CSS 层叠与继承第 5 级(CSS Cascading and Inheritance Level 5)。URL: https://drafts.csswg.org/css-cascade-5/
[CSS-COLOR-4]
Chris Lilley;Tab Atkins Jr.;Lea Verou。CSS 颜色模块第 4 级(CSS Color Module Level 4)。URL: https://drafts.csswg.org/css-color-4/
[CSS-DISPLAY-4]
Elika Etemad;Tab Atkins Jr.。CSS 显示模块第 4 级(CSS Display Module Level 4)。URL: https://drafts.csswg.org/css-display/
[CSS-MULTICOL-2]
Florian Rivoal;Rachel Andrew。CSS 多列布局模块第 2 级(CSS Multi-column Layout Module Level 2)。URL: https://drafts.csswg.org/css-multicol-2/
[CSS-PAGE-FLOATS-3]
Johannes Wilm。CSS 页面浮动模块(CSS Page Floats)。URL: https://drafts.csswg.org/css-page-floats/
[CSS-POSITION-3]
Elika Etemad;Tab Atkins Jr.。CSS 定位布局模块第 3 级(CSS Positioned Layout Module Level 3)。URL: https://drafts.csswg.org/css-position-3/
[CSS-SIZING-3]
Tab Atkins Jr.;Elika Etemad。CSS 盒尺寸模块第 3 级(CSS Box Sizing Module Level 3)。URL: https://drafts.csswg.org/css-sizing-3/
[CSS-TABLES-3]
François Remy;Greg Whitworth;David Baron。CSS 表格模块第 3 级(CSS Table Module Level 3)。URL: https://drafts.csswg.org/css-tables-3/
[CSS-TEXT-3]
Elika Etemad;Koji Ishii;Florian Rivoal。CSS 文本模块第 3 级(CSS Text Module Level 3)。URL: https://drafts.csswg.org/css-text-3/
[CSS-TEXT-4]
Elika Etemad 等。CSS 文本模块第 4 级(CSS Text Module Level 4)。URL: https://drafts.csswg.org/css-text-4/
[CSS-VALUES-4]
Tab Atkins Jr.;Elika Etemad。CSS 值与单位模块第 4 级(CSS Values and Units Module Level 4)。URL: https://drafts.csswg.org/css-values-4/
[CSS-WRITING-MODES-3]
Elika Etemad;Koji Ishii。CSS 书写模式第 3 级(CSS Writing Modes Level 3)。URL: https://drafts.csswg.org/css-writing-modes-3/
[CSS-WRITING-MODES-4]
Elika Etemad;Koji Ishii。CSS 书写模式第 4 级(CSS Writing Modes Level 4)。URL: https://drafts.csswg.org/css-writing-modes-4/
[CSS2]
Bert Bos 等。层叠样式表第 2 级修订版(CSS 2.1)规范(Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification)。URL: https://drafts.csswg.org/css2/
[CSS3-MULTICOL]
Florian Rivoal;Rachel Andrew。CSS 多列布局模块第 1 级(CSS Multi-column Layout Module Level 1)。URL: https://drafts.csswg.org/css-multicol/
[DOM]
Anne van Kesteren。DOM 标准(DOM Standard)。现行标准。URL: https://dom.spec.whatwg.org/
[HTML]
Anne van Kesteren 等。HTML 标准(HTML Standard)。现行标准。URL: https://html.spec.whatwg.org/multipage/
[INTRINSIC]
David Baron。内在宽度与表格布局的更精确定义(提案)(More Precise Definitions of Intrinsic Widths and Table Layout (Proposal))。URL: https://dbaron.org/css/intrinsic/
[RFC2119]
S. Bradner。RFC 中用于指示需求级别的关键词(Key words for use in RFCs to Indicate Requirement Levels)。1997年3月。最佳当前实践。URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECTORS4]
Elika Etemad;Tab Atkins Jr.。选择器第 4 级(Selectors Level 4)。URL: https://drafts.csswg.org/selectors/

参考性引用

[CSSOM]
Daniel Glazman;Emilio Cobos Álvarez。CSS 对象模型(CSS Object Model, CSSOM)。URL: https://drafts.csswg.org/cssom/
[CSSOM-VIEW]
Simon Pieters。CSSOM 视图模块(CSSOM View Module)。URL: https://drafts.csswg.org/cssom-view/