Putting style in HTML.
This specification is an experimental breakup of the HTML specification. You can see the full list on the index page and take part in the discussion in the repository.
style
elementscoped
attribute is present: flow content.scoped
attribute is absent: where metadata content is expected.scoped
attribute is absent: in a noscript
element that is a child of a head
element.scoped
attribute is present: where flow content is expected, but before any other flow content other than inter-element whitespace and style
elements, and not as the child of an element whose content model is transparent.type
attribute, but must match requirements described in prose below.media
— Applicable mediatype
— Type of embedded resourcescoped
— Whether the styles apply to the entire document or just the parent subtreetitle
attribute has special semantics on this element: Alternative style sheet set name.interface HTMLStyleElement : HTMLElement { attribute DOMString media; attribute DOMString type; attribute boolean scoped; }; HTMLStyleElement implements LinkStyle;
The style
element allows authors to embed style information in their documents.
The style
element is one of several inputs to the styling processing
model. The element does not represent content for the
user.
The type
attribute gives the styling language.
If the attribute is present, its value must be a valid MIME type that designates a
styling language. The charset
parameter must not be specified. The default
value for the type
attribute, which is used if the attribute
is absent, is "text/css
". [[!RFC2318]]
When examining types
to determine if they support the language, user agents must not ignore unknown MIME parameters
— types with unknown parameters must be assumed to be unsupported. The charset
parameter must be treated as an unknown parameter for the purpose of
comparing MIME types here.
The media
attribute says which media the
styles apply to. The value must be a valid media query list. The user
agent must apply the styles when the media
attribute's
value matches the environment and the other relevant conditions apply, and must not
apply them otherwise.
The styles might be further limited in scope, e.g. in CSS with the use of @media
blocks. This specification does not override such further restrictions or
requirements.
The default, if the media
attribute is omitted, is "all
", meaning that by default styles apply to all
media.
The scoped
attribute is a boolean
attribute. If present, it indicates that the styles are intended just for the subtree
rooted at the style
element's parent element, as opposed to the whole
Document
.
If the scoped
attribute is present and the element has a
parent element, then the style
element must precede any flow content in
its parent element other than inter-element whitespace and other style
elements, and the parent element's content model must not have a transparent
component.
This implies that scoped style
elements cannot be children of, e.g.,
a
or ins
elements, even when those are used as flow content
containers.
A style
element without a scoped
attribute is restricted to appearing in the
head
of the document.
A style sheet declared by a style
element that has a scoped
attribute and has a parent node that is an element is
scoped, with the scoping root being the style
element's parent
element. [[!CSSSCOPED]]
The title
attribute on
style
elements defines alternative style sheet sets. If the
style
element has no title
attribute, then it
has no title; the title
attribute of ancestors does not apply to
the style
element. [[!CSSOM]]
The title
attribute on style
elements, like the title
attribute on link
elements, differs from the global title
attribute in that a
style
block without a title does not inherit the title of the parent element: it
merely has no title.
The textContent
of a style
element must match the style
production in the following ABNF, the character set for which is Unicode. [[!ABNF]]
style = no-c-start *( c-start no-c-end c-end no-c-start ) no-c-start = < any string that doesn't contain a substring that matches c-start > c-start = "<!--" no-c-end = < any string that doesn't contain a substring that matches c-end > c-end = "-->"
Whenever one of the following conditions occur for an element whose Document
is in
a browsing context:
...the user agent must run the update a style
block algorithm that applies for the style sheet language specified by the element's type
attribute, passing it the element's style
data.
For styling languages that consist of pure text (as opposed to XML), a style
element's style data is the concatenation of the contents of all the
Text
nodes that are children of the style
element (not any other nodes
such as comments or elements), in tree order. For XML-based styling languages, the
style data consists of all the child nodes of the style
element.
The update a style
block algorithm for CSS (text/css
) is
as follows:
Let element be the style
element.
If element has an associated CSS style sheet, remove the CSS style sheet in question.
If element is not in a Document
, then abort
these steps.
Create a CSS style sheet with the following properties:
text/css
element
The media
attribute of element.
This is a reference to the (possibly absent at this time) attribute, rather than a copy of the attribute's current value. The CSSOM specification defines what happens when the attribute is dynamically set, changed, or removed.
The title
attribute of element.
Again, this is a reference to the attribute.
Unset.
Set.
null
Left at its default value.
Left uninitialised.
This specification does not define any other styling language's update a style
block algorithm.
Once the attempts to obtain the style sheet's critical subresources, if any, are
complete, or, if the style sheet has no critical subresources, once the style sheet
has been parsed and processed, the user agent must, if the loads were successful or there were
none, queue a task to fire a simple event named load
at the style
element, or, if one of the style sheet's
critical subresources failed to completely load for any reason (e.g. DNS error, HTTP
404 response, a connection being prematurely closed, unsupported Content-Type), queue a
task to fire a simple event named error
at
the style
element. Non-network errors in processing the style sheet or its
subresources (e.g. CSS parse errors, PNG decoding errors) are not failures for the purposes of
this paragraph.
The task source for these tasks is the DOM manipulation task source.
The element must delay the load event of the element's node document until all the attempts to obtain the style sheet's critical subresources, if any, are complete.
This specification does not specify a style system, but CSS is expected to be supported by most Web browsers. [[!CSS]]
The media
, type
and scoped
IDL attributes must reflect the
respective content attributes of the same name.
The LinkStyle
interface is also implemented by this element. [[!CSSOM]]
The following document has its stress emphasis styled as bright red text rather than italics text, while leaving titles of works and Latin words in their default italics. It shows how using appropriate elements enables easier restyling of documents.
<!DOCTYPE html> <html lang="en-US"> <head> <title>My favorite book</title> <style> body { color: black; background: white; } em { font-style: normal; color: red; } </style> </head> <body> <p>My <em>favorite</em> book of all time has <em>got</em> to be <cite>A Cat's Life</cite>. It is a book by P. Rahmel that talks about the <i lang="la">Felis Catus</i> in modern human society.</p> </body> </html>
Style sheets, whether added by a link
element, a style
element, an
<?xml-stylesheet?>
PI, an HTTP Link:
header, or
some other mechanism, have a style sheet ready flag, which is initially unset.
When a style sheet is ready to be applied, its style sheet ready flag must be set.
If the style sheet referenced no other resources (e.g. it was an internal style sheet given by a
style
element with no @import
rules), then the style rules must
be immediately made available to script; otherwise, the style rules must only be made available
to script once the event loop reaches its update the rendering step.
A style sheet in the context of the Document
of an HTML parser or
XML parser is said to be a style sheet that is blocking scripts if the
element was created by that Document
's parser, and the element is either a
style
element or a link
element that was an external resource link that contributes to the styling processing
model when the element was created by the parser, and the element's style sheet was enabled
when the element was created by the parser, and the element's style sheet ready flag
is not yet set, and, the last time the event loop reached step 1, the element was
in that Document
, and the user agent hasn't given
up on that particular style sheet yet. A user agent may give up on a style sheet at any time.
Giving up on a style sheet before the style sheet loads, if the style sheet eventually does still load, means that the script might end up operating with incorrect information. For example, if a style sheet sets the colour of an element to green, but a script that inspects the resulting style is executed before the sheet is loaded, the script will find that the element is black (or whatever the default colour is), and might thus make poor choices (e.g. deciding to use black as the colour elsewhere on the page, instead of green). Implementors have to balance the likelihood of a script using incorrect information with the performance impact of doing nothing while waiting for a slow network request to finish.
A Document
has a style sheet that is blocking scripts if there is
either a style sheet that is blocking scripts in the context of that
Document
, or if that Document
is in a browsing context that
has a parent browsing context, and the active document of that
parent browsing context itself has a style sheet that is blocking
scripts.
A Document
has no style sheet that is blocking scripts if it does not
have a style sheet that is blocking
scripts as defined in the previous paragraph.
stylesheet
"The stylesheet
keyword may be used with link
elements. This keyword creates an external resource
link that contributes to the styling processing model.
The specified resource is a resource that describes how to present the document. Exactly how the resource is to be processed depends on the actual type of the resource.
If the alternate
keyword is also specified on the
link
element, then the link is an alternative stylesheet; in this case,
the title
attribute must be specified on the link
element, with a non-empty value.
The default type for resources given by the stylesheet
keyword is text/css
.
The appropriate times to obtain the resource are:
When the external resource link is created on a link
element
that is already in a Document
.
When the external resource link's link
element is inserted into a document.
When the href
attribute of the link
element of an external resource link that is already in a
Document
is changed.
When the crossorigin
attribute of the
link
element of an external resource
link that is already in a Document
is set, changed, or
removed.
When the type
attribute of the link
element of an external resource link that is already in a
Document
is set or changed to a value that does not or no longer matches the
Content-Type metadata of the previous obtained external
resource, if any.
When the type
attribute of the link
element of an external resource link that is already in a
Document
but was previously not obtained due to the type
attribute specifying an unsupported type is set, removed, or
changed.
When the external resource link changes from being an alternative stylesheet to not being one, or vice versa.
Quirk: If the document has been set to quirks mode, has the
same origin as the URL of the external resource,
and the Content-Type metadata of the external resource is not a
supported style sheet type, the user agent must instead assume it to be text/css
.
Once a resource has been obtained, if its Content-Type metadata is text/css
, the user
agent must run these steps:
Let element be the link
element that created the
external resource link.
If element has an associated CSS style sheet, remove the CSS style sheet in question.
If element no longer creates an external resource link that contributes to the styling processing model, or if, since the resource in question was obtained, it has become appropriate to obtain it again (meaning this algorithm is about to be invoked again for a newly obtained resource), then abort these steps.
Create a CSS style sheet with the following properties:
text/css
The resulting absolute URL determined during the obtain algorithm.
This is before any redirects get applied.
element
The media
attribute of element.
This is a reference to the (possibly absent at this time) attribute, rather than a copy of the attribute's current value. The CSSOM specification defines what happens when the attribute is dynamically set, changed, or removed.
The title
attribute of element.
This is similarly a reference to the attribute, rather than a copy of the attribute's current value.
Set if the link is an alternative stylesheet; unset otherwise.
Set if the resource is CORS-same-origin; unset otherwise.
null
Left at its default value.
Left uninitialised.
The CSS environment encoding is the result of running the following steps: [[!CSSSYNTAX]]
If the element has a charset
attribute, get an encoding from that attribute's value. If that
succeeds, return the resulting encoding and abort these steps. [[!ENCODING]]
Otherwise, return the document's character encoding. [[!DOM]]
An element is said to be actually disabled if it one of the following:
button
element that is disabledinput
element that is disabledselect
element that is disabledtextarea
element that is disabledoptgroup
element that has a disabled
attributeoption
element that is disabledmenuitem
element that has a disabled
attributefieldset
element that is a disabled fieldsetThis definition is used to determine what elements can be focused and which elements match the :disabled
pseudo-class.
The Selectors specification leaves the case-sensitivity of element names, attribute names, and attribute values to be defined by the host language. [[!SELECTORS]]
The Selectors specification defines that ID and class selectors, when matched against elements in documents that are in quirks mode, will be work in an ASCII case-insensitive.
When comparing a CSS element type selector to the names of HTML elements in HTML documents, the CSS element type selector must first be converted to ASCII lowercase. The same selector when compared to other elements must be compared according to its original case. In both cases, the comparison is case-sensitive.
When comparing the name part of a CSS attribute selector to the names of namespace-less attributes on HTML elements in HTML documents, the name part of the CSS attribute selector must first be converted to ASCII lowercase. The same selector when compared to other attributes must be compared according to its original case. In both cases, the comparison is case-sensitive.
Everything else must be treated as entirely case-sensitive for the purposes of selector matching. This includes:
There are a number of dynamic selectors that can be used with HTML. This section defines when these selectors match HTML elements. [[!SELECTORS]] [[!CSSUI]]
:link
:visited
All a
elements that have an href
attribute, all area
elements that have an href
attribute, and all link
elements that have
an href
attribute, must match one of :link
and :visited
.
Other specifications might apply more specific rules regarding how these elements are to match these pseudo-classes, to mitigate some privacy concerns that apply with straightforward implementations of this requirement.
:active
The :active
pseudo-class is defined to match an element
while an
element is being activated by the user
.
To determine whether a particular element is being activated for the purposes of
defining the :active
pseudo-class only, an HTML user agent
must use the first relevant entry in the following list.
:active
pseudo-classThe element is being activated.
label
element that is
currently matching :activeThe element is being activated.
button
elementinput
element whose type
attribute is in the Submit Button, Image Button, Reset
Button, or Button stateThe element is being activated if it is in a formal activation state and it is not disabled.
For example, if the user is using a keyboard to push a button
element by pressing the space bar, the element would match this pseudo-class in between the
time that the element received the keydown
event and the
time the element received the keyup
event.
menuitem
elementThe element is being activated if it is in a formal activation state
and it does not have a disabled
attribute.
a
element that has an href
attributearea
element that has an href
attributelink
element that has an href
attributeThe element is being activated if it is in a formal activation state.
The element is being activated.
An element is said to be in a formal activation state between the time the user begins to indicate an intent to trigger the element's activation behaviour and either the time the user stops indicating an intent to trigger the element's activation behaviour, or the time the element's activation behaviour has finished running, which ever comes first.
An element is said to be being actively pointed at while the user indicates the element using a pointing device while that pointing device is in the "down" state (e.g. for a mouse, between the time the mouse button is pressed and the time it is depressed; for a finger in a multitouch environment, while the finger is touching the display surface).
:hover
The :hover
pseudo-class is defined to match an element while the
user designates an element with a pointing device
. For the purposes of defining the
:hover
pseudo-class only, an HTML user agent must consider
an element as being one that the user designates if it is:
An element that the user indicates using a pointing device.
An element that has a descendant that the user indicates using a pointing device.
An element that is the labeled control of a label
element that is
currently matching :hover.
Consider in particular a fragment such as:
<p> <label for=c> <input id=a> </label> <span id=b> <input id=c> </span> </p>
If the user designates the element with ID "a
" with their pointing
device, then the p
element (and all its ancestors not shown in the snippet above),
the label
element, the element with ID "a
", and the element
with ID "c
" will match the :hover
pseudo-class. The element with ID "a
" matches it from condition 1, the
label
and p
elements match it because of condition 2 (one of their
descendants is designated), and the element with ID "c
" matches it
through condition 3 (its label
element matches :hover). However, the element with ID "b
"
does not match :hover: its descendant is not
designated, even though it matches :hover.
:focus
For the purposes of the CSS ':focus' pseudo-class, an element has the focus when its top-level browsing context has the system focus, it is not itself a browsing context container, and it is one of the elements listed in the focus chain of the currently focused area of the top-level browsing context.
:enabled
The :enabled
pseudo-class must match any element
that is one of the following:
button
element that is not disabledinput
element that is not disabledselect
element that is not disabledtextarea
element that is not disabledoptgroup
element that does not have a disabled
attributeoption
element that is not disabledmenuitem
element that does not have a disabled
attributefieldset
element that is not a disabled fieldset:disabled
The :disabled
pseudo-class must match any element that
is actually disabled.
:checked
The :checked
pseudo-class must match any element
falling into one of the following categories:
input
elements whose type
attribute is in
the Checkbox state and whose checkedness state is trueinput
elements whose type
attribute is in
the Radio Button state and whose checkedness state is trueoption
elements whose selectedness is truemenuitem
elements whose type
attribute
is in the Checkbox state and that have a
checked
attributemenuitem
elements whose type
attribute
is in the Radio state and that have a checked
attribute:indeterminate
The :indeterminate
pseudo-class must match any
element falling into one of the following categories:
input
elements whose type
attribute is in
the Checkbox state and whose indeterminate
IDL attribute is set to trueinput
elements whose type
attribute is in
the Radio Button state and whose radio button
group contains no input
elements whose checkedness state is true.progress
elements with no value
content attribute:default
The :default
pseudo-class must match any element
falling into one of the following categories:
button
elements that are their form's default buttoninput
elements whose type
attribute is in
the Submit Button or Image Button state, and that are their form's
default buttoninput
elements to which the checked
attribute applies and that have a checked
attributeoption
elements that have a selected
attribute:valid
The :valid
pseudo-class must match any element falling
into one of the following categories:
form
elements that are not the form owner of any elements that
themselves are candidates for constraint
validation but do not satisfy their
constraintsfieldset
elements that have no descendant elements that themselves are candidates for constraint validation but do
not satisfy their constraints:invalid
The :invalid
pseudo-class must match any element
falling into one of the following categories:
form
elements that are the form owner of one or more elements
that themselves are candidates for constraint
validation but do not satisfy their
constraintsfieldset
elements that have of one or more descendant elements that themselves
are candidates for constraint
validation but do not satisfy their
constraints:in-range
The :in-range
pseudo-class must match all elements
that are candidates for constraint
validation, have range limitations, and that are neither suffering
from an underflow nor suffering from an overflow.
:out-of-range
The :out-of-range
pseudo-class must match all
elements that are candidates for constraint
validation, have range limitations, and that are either suffering from
an underflow or suffering from an overflow.
:required
The :required
pseudo-class must match any element
falling into one of the following categories:
:optional
The :optional
pseudo-class must match any element
falling into one of the following categories:
:read-only
:read-write
The :read-write
pseudo-class must match any element
falling into one of the following categories, which for the purposes of Selectors are thus
considered user-alterable: [[!SELECTORS]]
input
elements to which the readonly
attribute applies, and that are mutable (i.e. that do not
have the readonly
attribute specified and that are not
disabled)textarea
elements that do not have a readonly
attribute, and that are not disabledinput
elements nor textarea
elementsThe :read-only
pseudo-class must match all other
HTML elements.
:dir(ltr)
The :dir(ltr)
pseudo-class must match all elements whose
directionality is 'ltr'.
:dir(rtl)
The :dir(rtl)
pseudo-class must match all elements whose
directionality is 'rtl'.
Another section of this specification defines the target element used with the :target
pseudo-class.
This specification does not define when an element matches the :lang()
dynamic pseudo-class, as it is defined in sufficient
detail in a language-agnostic fashion in the Selectors specification. [[!SELECTORS]]