Elements, attributes, and attribute values in HTML are defined
  (by this specification) to have certain meanings (semantics). For
  example, the ol element represents an ordered list, and
  the lang attribute represents the
  language of the content.
Authors must not use elements, attributes, or attribute values for purposes other than their appropriate intended semantic purpose. Authors must not use elements, attributes, or attribute values that are not permitted by this specification or other applicable specifications.
For example, the following document is non-conforming, despite being syntactically correct:
<!DOCTYPE HTML>
<html lang="en-GB">
 <head> <title> Demonstration </title> </head>
 <body>
  <table>
   <tr> <td> My favourite animal is the cat. </td> </tr>
   <tr>
    <td>
     —<a href="http://example.org/~ernest/"><cite>Ernest</cite></a>,
     in an essay from 1992
    </td>
   </tr>
  </table>
 </body>
</html>
   ...because the data placed in the cells is clearly not tabular
   data (and the cite element mis-used). A corrected
   version of this document might be:
<!DOCTYPE HTML> <html lang="en-GB"> <head> <title> Demonstration </title> </head> <body> <blockquote> <p> My favourite animal is the cat. </p> </blockquote> <p> —<a href="http://example.org/~ernest/">Ernest</a>, in an essay from 1992 </p> </body> </html>
This next document fragment, intended to represent the heading of a corporate site, is similarly non-conforming because the second line is not intended to be a heading of a subsection, but merely a subheading or subtitle (a subordinate heading for the same section).
<body> <h1>ABC Company</h1> <h2>Leading the way in widget design since 1432</h2> ...
The hgroup element is intended for these kinds of
   situations:
<body> <hgroup> <h1>ABC Company</h1> <h2>Leading the way in widget design since 1432</h2> </hgroup> ...
In the next example, there is a non-conforming attribute value ("carpet") and a non-conforming attribute ("texture"), which is not permitted by this specification:
<label>Carpet: <input type="carpet" name="c" texture="deep pile"></label>
Here would be an alternative and correct way to mark this up:
<label>Carpet: <input type="text" class="carpet" name="c" data-texture="deep pile"></label>
Through scripting and using other mechanisms, the values of attributes, text, and indeed the entire structure of the document may change dynamically while a user agent is processing it. The semantics of a document at an instant in time are those represented by the state of the document at that instant in time, and the semantics of a document can therefore change over time. User agents must update their presentation of the document as this occurs.
HTML has a progress element that
  describes a progress bar. If its "value" attribute is dynamically
  updated by a script, the UA would update the rendering to show the
  progress changing.
The nodes representing HTML elements in the DOM must implement, and expose to scripts, the interfaces listed for them in the relevant sections of this specification. This includes HTML elements in XML documents, even when those documents are in another context (e.g. inside an XSLT transform).
Elements in the DOM represent things; that is, they have intrinsic meaning, also known as semantics.
For example, an ol element
  represents an ordered list.
The basic interface, from which all the HTML
  elements' interfaces inherit, and which
  must be used by elements that have no additional
  requirements, is the HTMLElement interface.
interface HTMLElement : Element {
  // DOM tree accessors
  NodeList getElementsByClassName(in DOMString classNames);
  // dynamic markup insertion
           attribute DOMString innerHTML;
           attribute DOMString outerHTML;
  void insertAdjacentHTML(in DOMString position, in DOMString text);
  // metadata attributes
           attribute DOMString id;
           attribute DOMString title;
           attribute DOMString lang;
           attribute DOMString dir;
           attribute DOMString className;
  readonly attribute DOMTokenList classList;
  readonly attribute DOMStringMap dataset;
  // user interaction
           attribute boolean hidden;
  void click();
           attribute long tabIndex;
  void focus();
  void blur();
           attribute DOMString accessKey;
  readonly attribute DOMString accessKeyLabel;
           attribute boolean draggable;
  [PutForwards=value] attribute DOMSettableTokenList dropzone;
           attribute DOMString contentEditable;
  readonly attribute boolean isContentEditable;
           attribute HTMLMenuElement contextMenu;
           attribute boolean spellcheck;
  // command API
  readonly attribute DOMString commandType;
  readonly attribute DOMString label;
  readonly attribute DOMString icon;
  readonly attribute boolean disabled;
  readonly attribute boolean checked;
  // styling
  readonly attribute CSSStyleDeclaration style;
  // event handler IDL attributes
           attribute Function onabort;
           attribute Function onblur;
           attribute Function oncanplay;
           attribute Function oncanplaythrough;
           attribute Function onchange;
           attribute Function onclick;
           attribute Function oncontextmenu;
           attribute Function oncuechange;
           attribute Function ondblclick;
           attribute Function ondrag;
           attribute Function ondragend;
           attribute Function ondragenter;
           attribute Function ondragleave;
           attribute Function ondragover;
           attribute Function ondragstart;
           attribute Function ondrop;
           attribute Function ondurationchange;
           attribute Function onemptied;
           attribute Function onended;
           attribute Function onerror;
           attribute Function onfocus;
           attribute Function oninput;
           attribute Function oninvalid;
           attribute Function onkeydown;
           attribute Function onkeypress;
           attribute Function onkeyup;
           attribute Function onload;
           attribute Function onloadeddata;
           attribute Function onloadedmetadata;
           attribute Function onloadstart;
           attribute Function onmousedown;
           attribute Function onmousemove;
           attribute Function onmouseout;
           attribute Function onmouseover;
           attribute Function onmouseup;
           attribute Function onmousewheel;
           attribute Function onpause;
           attribute Function onplay;
           attribute Function onplaying;
           attribute Function onprogress;
           attribute Function onratechange;
           attribute Function onreadystatechange;
           attribute Function onreset;
           attribute Function onscroll;
           attribute Function onseeked;
           attribute Function onseeking;
           attribute Function onselect;
           attribute Function onshow;
           attribute Function onstalled;
           attribute Function onsubmit;
           attribute Function onsuspend;
           attribute Function ontimeupdate;
           attribute Function onvolumechange;
           attribute Function onwaiting;
};
interface HTMLUnknownElement : HTMLElement { };The HTMLElement interface holds methods and
  attributes related to a number of disparate features, and the
  members of this interface are therefore described in various
  different sections of this specification.
The HTMLUnknownElement interface must be used for
  HTML elements that are not defined by this
  specification (or other applicable specifications).
The following attributes are common to and may be specified on all HTML elements (even those not defined in this specification):
accesskeyclasscontenteditablecontextmenudirdraggabledropzonehiddenidlangspellcheckstyletabindextitleThe following event handler content attributes may be specified on any HTML element:
onabortonblur*oncanplayoncanplaythroughonchangeonclickoncontextmenuoncuechangeondblclickondragondragendondragenterondragleaveondragoverondragstartondropondurationchangeonemptiedonendedonerror*onfocus*oninputoninvalidonkeydownonkeypressonkeyuponload*onloadeddataonloadedmetadataonloadstartonmousedownonmousemoveonmouseoutonmouseoveronmouseuponmousewheelonpauseonplayonplayingonprogressonratechangeonreadystatechangeonresetonscroll*onseekedonseekingonselectonshowonstalledonsubmitonsuspendontimeupdateonvolumechangeonwaitingThe attributes marked with an asterisk have a
  different meaning when specified on body elements as
  those elements expose event handlers of the
  Window object with the same names.
While these attributes apply to all elements, they
  are not useful on all elements. For example, only media elements will ever receive a volumechange event fired by
  the user agent.
Custom data attributes
  (e.g. data-foldername or data-msgid) can be specified on any HTML element, to store custom data
  specific to the page.
In HTML documents, elements in the HTML
  namespace may have an xmlns attribute
  specified, if, and only if, it has the exact value
  "http://www.w3.org/1999/xhtml". This does not apply to
  XML documents.
In HTML, the xmlns attribute
  has absolutely no effect. It is basically a talisman. It is allowed
  merely to make migration to and from XHTML mildly easier. When
  parsed by an HTML parser, the attribute ends up in no
  namespace, not the "http://www.w3.org/2000/xmlns/"
  namespace like namespace declaration attributes in XML do.
In XML, an xmlns attribute is
  part of the namespace declaration mechanism, and an element cannot
  actually have an xmlns attribute in no
  namespace specified.
The XML specification also allows the use of the xml:space attribute in the XML
  namespace on any element in an XML document. This attribute has no effect on
  HTML elements, as the default behavior in HTML is to
  preserve whitespace. [XML]
There is no way to serialize the xml:space attribute on HTML
  elements in the text/html syntax.
To enable assistive technology products to expose a more
  fine-grained interface than is otherwise possible with HTML elements
  and attributes, a set of annotations for
  assistive technology products can be specified (the ARIA
  role and aria-* attributes).
id attributeThe id attribute specifies its
  element's unique identifier (ID). The
  value must be unique amongst all the IDs in the element's home
  subtree and must contain at least one character. The value
  must not contain any space
  characters.
An element's unique identifier can be used for a variety of purposes, most notably as a way to link to specific parts of a document using fragment identifiers, as a way to target an element when scripting, and as a way to style a specific element from CSS.
If the value is not the empty string, user agents must associate
  the element with the given value (exactly, including any space
  characters) for the purposes of ID matching within the element's
  home subtree (e.g. for selectors in CSS or for the
  getElementById()
  method in the DOM).
Identifiers are opaque strings. Particular meanings should not be
  derived from the value of the id
  attribute.
This specification doesn't preclude an element having multiple
  IDs, if other mechanisms (e.g. DOM Core methods) can set an
  element's ID in a way that doesn't conflict with the id attribute.
title attributeThe title attribute
  represents advisory information for the element, such
  as would be appropriate for a tooltip. On a link, this could be the
  title or a description of the target resource; on an image, it could
  be the image credit or a description of the image; on a paragraph,
  it could be a footnote or commentary on the text; on a citation, it
  could be further information about the source; and so forth. The
  value is text.
If this attribute is omitted from an element, then it implies
  that the title attribute of the
  nearest ancestor HTML element
  with a title attribute set is also
  relevant to this element. Setting the attribute overrides this,
  explicitly stating that the advisory information of any ancestors is
  not relevant to this element. Setting the attribute to the empty
  string indicates that the element has no advisory information.
If the title attribute's value
  contains U+000A LINE FEED (LF) characters, the content is split into
  multiple lines. Each U+000A LINE FEED (LF) character represents a
  line break.
Caution is advised with respect to the use of newlines in title attributes.
For instance, the following snippet actually defines an abbreviation's expansion with a line break in it:
<p>My logs show that there was some interest in <abbr title="Hypertext Transport Protocol">HTTP</abbr> today.</p>
Some elements, such as link, abbr, and
  input, define additional semantics for the title attribute beyond the semantics
  described above.
lang and xml:lang attributesThe lang attribute (in
  no namespace) specifies the primary language for the element's
  contents and for any of the element's attributes that contain
  text. Its value must be a valid BCP 47 language tag, or the empty
  string. Setting the attribute to the empty string indicates that the
  primary language is unknown. [BCP47]
The lang
  attribute in the XML namespace is defined in XML. [XML]
If these attributes are omitted from an element, then the language of this element is the same as the language of its parent element, if any.
The lang attribute in no namespace
  may be used on any HTML
  element.
The lang
  attribute in the XML namespace may be used on
  HTML elements in XML documents, as well as
  elements in other namespaces if the relevant specifications allow it
  (in particular, MathML and SVG allow lang attributes in the
  XML namespace to be specified on their
  elements). If both the lang attribute
  in no namespace and the lang attribute in the XML
  namespace are specified on the same element, they must
  have exactly the same value when compared in an ASCII
  case-insensitive manner.
Authors must not use the lang attribute in the XML
  namespace on HTML elements in HTML
  documents. To ease migration to and from XHTML, authors may
  specify an attribute in no namespace with no prefix and with the
  literal localname "xml:lang" on HTML
  elements in HTML documents, but such attributes
  must only be specified if a lang
  attribute in no namespace is also specified, and both attributes
  must have the same value when compared in an ASCII
  case-insensitive manner.
The attribute in no namespace with no prefix and
  with the literal localname "xml:lang" has no
  effect on language processing.
To determine the language of a node, user agents must
  look at the nearest ancestor element (including the element itself
  if the node is an element) that has a lang attribute in the
  XML namespace set or is an HTML element and has a lang in no namespace attribute set. That
  attribute specifies the language of the node (regardless of its
  value).
If both the lang attribute in no
  namespace and the lang attribute in the XML
  namespace are set on an element, user agents must use
  the lang attribute
  in the XML namespace, and the lang attribute in no namespace must be
  ignored for the purposes of determining
  the element's language.
If none of the node's ancestors, including the root element, have either attribute set, but there is a pragma-set default language set, then that is the language of the node. If there is no pragma-set default language set, then language information from a higher-level protocol (such as HTTP), if any, must be used as the final fallback language instead. In the absence of any such language information, and in cases where the higher-level protocol reports multiple languages, the language of the node is unknown, and the corresponding language tag is the empty string.
If the resulting value is not a recognized language tag, then it must be treated as an unknown language having the given language tag, distinct from all other languages. For the purposes of round-tripping or communicating with other services that expect language tags, user agents should pass unknown language tags through unmodified.
Thus, for instance, an element with lang="xyzzy" would be matched by the selector :lang(xyzzy) (e.g. in CSS), but it would not be
  matched by :lang(abcde), even though both are
  equally invalid. Similarly, if a Web browser and screen reader
  working in unison communicated about the language of the element,
  the browser would tell the screen reader that the language was
  "xyzzy", even if it knew it was invalid, just in case the screen
  reader actually supported a language with that tag after all.
If the resulting value is the empty string, then it must be interpreted as meaning that the language of the node is explicitly unknown.
User agents may use the element's language to determine proper processing or rendering (e.g. in the selection of appropriate fonts or pronunciations, or for dictionary selection).
The lang IDL attribute
  must reflect the lang
  content attribute in no namespace.
xml:base
  attribute (XML only)The xml:base attribute is
  defined in XML Base. [XMLBASE]
The xml:base attribute may be
  used on elements of XML documents. Authors must not
  use the xml:base attribute in
  HTML documents.
dir attributeThe dir attribute specifies the
  element's text directionality. The attribute is an enumerated
  attribute with the following keywords and states:
ltr keyword, which maps to the ltr stateIndicates that the contents of the element are explicitly directionally embedded left-to-right text.
rtl keyword, which maps to the rtl stateIndicates that the contents of the element are explicitly directionally embedded right-to-left text.
auto keyword, which maps to the auto stateIndicates that the contents of the element are explicitly embedded text, but that the direction is to be determined programmatically using the contents of the element (as described below).
The heuristic used by this state is very crude (it just looks at the first character with a strong directionality, in a manner analogous to the Paragraph Level determination in the bidirectional algorithm). Authors are urged to only use this value as a last resort when the direction of the text is truly unknown and no better server-side heuristic can be applied.
For textarea and pre
    elements, the heuristic is applied on a per-paragraph level.
The attribute has no invalid value default and no missing value default.
The directionality of an element is either 'ltr' or 'rtl', and is determined as per the first appropriate set of steps from the following list:
dir attribute is
   in the ltr stateThe directionality of the element is 'ltr'.
dir attribute is
   in the rtl stateThe directionality of the element is 'rtl'.
dir attribute is
   in the auto statebdi element and the dir attribute is not in a defined state
   (i.e. it is not present or has an invalid value)Find the first character in tree order that matches the following criteria:
The character is from a text node that is a descendant of the element whose directionality is being determined.
The character is of bidirectional character type L, AL, or R. [BIDI]
The character is not in a text node that has an ancestor element that is a descendant of the element whose directionality is being determined and that is either:
If such a character is found and it is of bidirectional character type AL or R, the directionality of the element is 'rtl'.
Otherwise, the directionality of the element is 'ltr'.
dir attribute is not in a defined state
   (i.e. it is not present or has an invalid value)The directionality of the element is 'ltr'.
dir attribute is not in a defined state
   (i.e. it is not present or has an invalid value)The directionality of the element is the same as the element's parent element's directionality.
The effect of this attribute is primarily on the presentation layer. For example, the rendering section in this specification defines a mapping from this attribute to the CSS 'direction' and 'unicode-bidi' properties, and CSS defines rendering in terms of those properties.
dir [ = value ]Returns the html element's dir attribute's value, if any.
Can be set, to either "ltr", "rtl", or "auto" to replace the html element's dir attribute's value.
If there is no html element, returns the empty string and ignores new values.
The dir IDL attribute on
  an element must reflect the dir content attribute of that element,
  limited to only known values.
The dir IDL
  attribute on HTMLDocument objects must
  reflect the dir content
  attribute of the html element, if any,
  limited to only known values. If there is no such
  element, then the attribute must return the empty string and do
  nothing on setting.
Authors are strongly encouraged to use the dir attribute to indicate text direction
  rather than using CSS, since that way their documents will continue
  to render correctly even in the absence of CSS (e.g. as interpreted
  by search engines).
This markup fragment is of an IM conversation.
<p dir=auto class="u1"><b><bdi>Student</bdi>:</b> How do you write "What's your name?" in Arabic?</p> <p dir=auto class="u2"><b><bdi>Teacher</bdi>:</b> ما اسمك؟</p> <p dir=auto class="u1"><b><bdi>Student</bdi>:</b> Thanks.</p> <p dir=auto class="u2"><b><bdi>Teacher</bdi>:</b> That's written "شكرًا".</p> <p dir=auto class="u2"><b><bdi>Teacher</bdi>:</b> Do you know how to write "Please"?</p> <p dir=auto class="u1"><b><bdi>Student</bdi>:</b> "من فضلك", right?</p>
Given a suitable style sheet and the default alignment styles
   for the p element, namely to align the text to the
   start edge of the paragraph, the resulting rendering could
   be as follows:

As noted earlier, the auto
   value is not a panacea. The final paragraph in this example is
   misinterpreted as being right-to-left text, since it begins with an
   Arabic character, which causes the "right?" to be to the left of
   the Arabic text.
class attributeEvery HTML element may have a
  class attribute specified.
The attribute, if specified, must have a value that is a set of space-separated tokens representing the various classes that the element belongs to.
The classes that an HTML
  element has assigned to it consists of all the classes
  returned when the value of the class
  attribute is split on
  spaces. (Duplicates are ignored.)
Assigning classes to an element affects class
  matching in selectors in CSS, the getElementsByClassName()
  method in the DOM, and other such features.
There are no additional restrictions on the tokens authors can
  use in the class attribute, but
  authors are encouraged to use values that describe the nature of the
  content, rather than values that describe the desired presentation
  of the content.
style attributeAll HTML elements may have the style content attribute set. This is a
  CSS styling attribute as defined by the CSS Styling
  Attribute Syntax specification. [CSSATTR]
In user agents that support CSS, the attribute's value must be parsed when the attribute is added or has its value changed, according to the rules given for CSS styling attributes. [CSSATTR]
Documents that use style
  attributes on any of their elements must still be comprehensible and
  usable if those attributes were removed.
In particular, using the style attribute to hide and show content,
  or to convey meaning that is otherwise not included in the document,
  is non-conforming. (To hide and show content, use the hidden attribute.)
styleReturns a CSSStyleDeclaration object for the element's style attribute.
The style IDL attribute
  must return a CSSStyleDeclaration whose value
  represents the declarations specified in the attribute, if
  present. Mutating the CSSStyleDeclaration object must
  create a style attribute on the
  element (if there isn't one already) and then change its value to be
  a value representing the serialized form of the
  CSSStyleDeclaration object. The same object must be
  returned each time. [CSSOM]
In the following example, the words that refer to colors are
   marked up using the span element and the style attribute to make those words show
   up in the relevant colors in visual media.
<p>My sweat suit is <span style="color: green; background: transparent">green</span> and my eyes are <span style="color: blue; background: transparent">blue</span>.</p>
data-* attributesA custom data attribute is an attribute in no
  namespace whose name starts with the string "data-", has at least one
  character after the hyphen, is XML-compatible, and
  contains no characters in the range U+0041 to U+005A (LATIN CAPITAL
  LETTER A to LATIN CAPITAL LETTER Z).
All attributes on HTML elements in HTML documents get ASCII-lowercased automatically, so the restriction on ASCII uppercase letters doesn't affect such documents.
Custom data attributes are intended to store custom data private to the page or application, for which there are no more appropriate attributes or elements.
These attributes are not intended for use by software that is independent of the site that uses the attributes.
For instance, a site about music could annotate list items representing tracks in an album with custom data attributes containing the length of each track. This information could then be used by the site itself to allow the user to sort the list by track length, or to filter the list for tracks of certain lengths.
<ol> <li data-length="2m11s">Beyond The Sea</li> ... </ol>
It would be inappropriate, however, for the user to use generic software not associated with that music site to search for tracks of a certain length by looking at this data.
This is because these attributes are intended for use by the site's own scripts, and are not a generic extension mechanism for publicly-usable metadata.
Every HTML element may have any number of custom data attributes specified, with any value.
datasetReturns a DOMStringMap object for the element's data-* attributes.
Hyphenated names become camel-cased. For example, data-foo-bar="" becomes element.dataset.fooBar.
The dataset IDL
  attribute provides convenient accessors for all the data-* attributes on an element. On
  getting, the dataset IDL attribute
  must return a DOMStringMap object, associated with the
  following algorithms, which expose these attributes on their
  element:
data-" and whose
     remaining characters (if any) do not include any characters in
     the range U+0041 to U+005A (LATIN CAPITAL LETTER A to LATIN
     CAPITAL LETTER Z), add a name-value pair to list whose name is the attribute's name with the
     first five characters removed and whose value is the attribute's
     value.SYNTAX_ERR exception and abort these
     steps.data- at the front of
     name.setAttribute() would have raised an
     exception when setting an attribute with the name name, then this must raise the same
     exception.data- at the front of
     name.The same object must be returned each time.
If a Web page wanted an element to represent a space ship,
   e.g. as part of a game, it would have to use the class attribute along with data-* attributes:
<div class="spaceship" data-ship-id="92432"
     data-weapons="laser 2" data-shields="50%"
     data-x="30" data-y="10" data-z="90">
 <button class="fire"
         onclick="spaceships[this.parentNode.dataset.shipId].fire()">
  Fire
 </button>
</div>
   Notice how the hyphenated attribute name becomes camel-cased in the API.
Authors should carefully design such extensions so that when the attributes are ignored and any associated CSS dropped, the page is still usable.
User agents must not derive any implementation behavior from these attributes or values. Specifications intended for user agents must not define these attributes to have any meaningful values.
JavaScript libraries may use the custom data attributes, as they are considered to be part of the page on which they are used. Authors of libraries that are reused by many authors are encouraged to include their name in the attribute names, to reduce the risk of clashes. Where it makes sense, library authors are also encouraged to make the exact name used in the attribute names customizable, so that libraries whose authors unknowingly picked the same name can be used on the same page, and so that multiple versions of a particular library can be used on the same page even when those versions are not mutually compatible.
For example, a library called "DoQuery" could use attribute
   names like data-doquery-range, and a library
   called "jJo" could use attributes names like data-jjo-range. The jJo library could also provide
   an API to set which prefix to use (e.g. J.setDataPrefix('j2'), making the attributes have
   names like data-j2-range).
Each element in this specification has a definition that includes the following information:
A list of categories to which the element belongs. These are used when defining the content models for each element.
A non-normative description of where the element can be used. This information is redundant with the content models of elements that allow this one as a child, and is provided only as a convenience.
For simplicity, only the most specific expectations are listed. For example, an element that is both flow content and phrasing content can be used anywhere that either flow content or phrasing content is expected, but since anywhere that flow content is expected, phrasing content is also expected (since all phrasing content is flow content), only "where phrasing content is expected" will be listed.
A normative description of what content must be included as children and descendants of the element.
A normative list of attributes that may be specified on the element (except where otherwise disallowed).
A normative definition of a DOM interface that such elements must implement.
This is then followed by a description of what the element represents, along with any additional normative conformance criteria that may apply to authors and implementations. Examples are sometimes also included.
Except where otherwise specified, attributes on HTML elements may have any string value, including the empty string. Except where explicitly stated, there is no restriction on what text can be specified in such attributes.