HTML Nesting
Содержание
Legend
- An uppercase word stands for the corresponding element. (Note that by XHTML rules, element names must be written in lower case, e.g.
<html>
, not<HTML>
.) - A lowercase word is a term which describes a collection of HTML elements.
- Each entry is followed by a list of elements which may appear within the elements specified by the entry. If there is no such list, no nested elements are allowed. This means that only text (#PCDATA, see next item) is allowed inside the element; but if the note (empty) is given, it means that no content whatsoever is allowed. However, for flow, inline, block, OBJECT, and BODY the allowed contents are described separately under the main entries for them.
- #PCDATA means «parsed character data», which is plain text (without HTML tags, but «escape sequences» such as
ä
andä
are allowed) - CDATA means «character data», which is plain text where even «escape sequences» aren’t interpreted; for a much better explanation, see the article CDATA Confusion by Joe English
- excluding … means that the element must not contain any of the listed elements, directly or indirectly.
The information here is based on the DTDs, basically the Strict DTD, in the 1999-12-24 version of the HTML 4.01 Specification.
Note that XHTML 1.0 is, as its subtitle says, «A Reformulation of HTML 4 in XML 1.0», so the nesting rules are the same as in HTML 4.01. However, there are the following differences that affect the nesting rules:
- The content of
script
andstyle
elements is CDATA in HTML 4 but #PCDATA in XHTML. - In XHTML, a
table
element may have atr
element as its direct constituent. In HTML 4.01, that’s not allowed, but note that since the start and end tags of atbody
element are omissible in HTML 4.01, this is not a big difference. However, note that when atable
element directly contains atr
element, an interveningtbody
element is implied by HTML 4.01 rules but not by XHTML rules, and this matters e.g. when you have a style sheet which usestbody
as a selector.
Moreover, some of the restrictions on nesting are expressed differently; due to metalanguage differences, some limitations are described in prose only in the XHTML specification, and this implies that a validator will not catch such violations of the limitations when validating against XHTML DOCTYPE but will catch them when an HTML DOCTYPE is used. See section Differences with HTML 4 in the XHTML 1.0 Specification.
Nesting rules for HTML 4.01 Transitional
HTML
- HEAD
- TITLE (required)
- SCRIPT, STYLE
- CDATA
- ISINDEX, BASE, META, LINK (empty)
- OBJECT (see content model below)
- BODY
- INS, DEL (special rules apply)
- flow
- flow
- block
- P, H1, H2, H3, H4, H5, H6
- inline
- UL, OL
- LI
- flow
- LI
- DIR, MENU
- LI
- inline exluding block
- LI
- DL
- DT
- inline
- DD
- flow
- DT
- PRE
- inline excluding IMG, OBJECT, APPLET, BIG, SMALL, SUB, SUP, FONT, BASEFONT
- DIV, CENTER, BLOCKQUOTE, IFRAME
- flow
- NOSCRIPT
- flow
- NOFRAMES
- flow
- FORM
- flow excluding an enclosed FORM
- ISINDEX, HR (empty)
- TABLE
- CAPTION
- inline
- COLGROUP
- COL (empty)
- COL (empty)
- THEAD, TBODY, TBODY
- TR
- TH, TD
- flow
- TH, TD
- TR
- CAPTION
- ADDRESS
- inline
- P
- inline
- FIELDSET
- #PCDATA
- flow
- LEGEND
- inline
- P, H1, H2, H3, H4, H5, H6
- inline
- #PCDATA
- TT, I, B, U, S, STRIKE, BIG, SMALL, FONT, EM, STRONG, DFN, CODE, SAMP, KBD, VAR, CITE, ABBR, ACRONYM, SUB, SUP, Q, SPAN, BDO
- inline
- A
- inline excluding an enclosed A element
- OBJECT, APPLET
- PARAM (empty)
- flow
- IMG, BASEFONT, BR (empty)
- SCRIPT
- CDATA
- MAP
- AREA (empty)
- block
- INPUT (empty)
- SELECT
- OPTGROUP
- OPTION
- OPTION
- OPTGROUP
- TEXTAREA
- LABEL
- LABEL excluding enclosed LABEL
- BUTTON
- flow excluding A, INPUT, SELECT, TEXTAREA, LABEL, BUTTON, FORM, ISINDEX, FIELDSET, IFRAME
- block
- INS, DEL (special rules apply)
Allowed nesting of elements in HTML 4 Strict (and XHTML 1.0 Strict)
HTML
- HEAD
- TITLE (required)
- SCRIPT, STYLE
- CDATA
- BASE, META, LINK (empty)
- OBJECT (see content model below)
- BODY
- INS, DEL (special rules apply)
- flow
- block
- inline
- flow
- SCRIPT
- CDATA
- block
- P, H1, H2, H3, H4, H5, H6
- inline
- #PCDATA
- TT, I, B, BIG, SMALL, EM, STRONG, DFN, CODE, SAMP, KBD, VAR, CITE, ABBR, ACRONYM, SUB, SUP, Q, SPAN, BDO
- inline
- A
- inline excluding an enclosed A element
- OBJECT
- PARAM (empty)
- flow
- IMG, BR (empty)
- SCRIPT
- CDATA
- MAP
- AREA (empty)
- block
- INPUT (empty)
- SELECT
- OPTGROUP
- OPTION
- OPTION
- OPTGROUP
- TEXTAREA
- LABEL
- LABEL excluding enclosed LABEL
- BUTTON
- flow excluding A, INPUT, SELECT, TEXTAREA, LABEL, BUTTON, FORM, FIELDSET
- inline
- UL, OL
- LI
- flow
- LI
- DL
- DT
- inline
- DD
- flow
- DT
- PRE
- inline excluding IMG, OBJECT, BIG, SMALL, SUB, SUP
- DIV
- flow
- BLOCKQUOTE
- block
- SCRIPT
- CDATA
- NOSCRIPT
- flow
- FORM
- block excluding an enclosed FORM
- SCRIPT
- CDATA
- HR (empty)
- TABLE
- CAPTION
- inline
- COLGROUP
- COL (empty)
- COL (empty)
- THEAD, TBODY, TBODY
- TR
- TH, TD
- flow
- TH, TD
- TR
- CAPTION
- ADDRESS
- inline
- FIELDSET
- #PCDATA
- inline
- flow
- LEGEND
- inline
- P, H1, H2, H3, H4, H5, H6
- INS, DEL (special rules apply)