Event delegation overhead

JavaScript performance comparison

Test case created by Joshua Peek

Preparation code

<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
  <div class="head">
    <!--begin-logo-->

    <p><a href="http://www.w3.org/"><img alt="W3C" height="48" src=
   "http://www.w3.org/Icons/w3c_home" width="72" /></a> <!--end-logo--></p>

    <h1 id="title">Selectors Level 3</h1>

    <h2 class="no-num no-toc" id="longstatus-date">W3C Recommendation 29 September
    2011</h2>

    <dl>
      <dt>This version:</dt>

      <dd><a href=
     "http://www.w3.org/TR/2011/REC-css3-selectors-20110929/">http://www.w3.org/TR/2011/REC-css3-selectors-20110929/</a>
      <!-- <a href="http://dev.w3.org/csswg/selectors3">
            http://dev.w3.org/csswg/selectors3</a> --></dd>

      <dt>Latest version:</dt>

      <dd><a href=
     "http://www.w3.org/TR/css3-selectors/">http://www.w3.org/TR/css3-selectors/</a></dd>

      <dt>Latest Selectors specification:</dt>

      <dd><a href=
     "http://www.w3.org/TR/selectors/">http://www.w3.org/TR/selectors/</a></dd>

      <dt>Previous version:</dt>

      <dd><a href=
     "http://www.w3.org/TR/2009/PR-css3-selectors-20091215/">http://www.w3.org/TR/2009/PR-css3-selectors-20091215/</a></dd>

      <dt><a name="editors-list" id="editors-list"></a>Editors:</dt>

      <dd class="vcard"><a class="url fn" href="http://www.tantek.com/" lang="tr"
     xml:lang="tr">Tantek &Ccedil;elik</a> (Invited Expert)</dd>

      <dd class="vcard"><a class="url fn" href=
     "http://fantasai.inkedblade.net/contact">Elika J. Etemad</a> (Invited Expert)</dd>

      <dd class="vcard"><span class="fn">Daniel Glazman</span> (Disruptive Innovations
      SARL)</dd>

      <dd class="vcard"><a class="url fn" href="mailto:ian@hixie.ch">Ian Hickson</a>
      (<span class="company"><a href="http://www.google.com/">Google</a></span>)</dd>

      <dd class="vcard"><span class="fn">Peter Linss</span> (former editor, <span class=
     "company"><a href="http://www.netscape.com/">Netscape/AOL</a></span>)</dd>

      <dd class="vcard"><span class="fn">John Williams</span> (former editor,
      <span class="company"><a href="http://www.quark.com/">Quark, Inc.</a></span>)</dd>
    </dl>

    <p>Please refer to the <a href=
   "http://www.w3.org/Style/2011/REC-css3-selectors-20110929-errata.html"><strong>errata</strong></a>
    for this document, which may include some normative corrections.</p>

    <p>See also <a href=
   "http://www.w3.org/2003/03/Translations/byTechnology?technology=css3-selectors"><strong>
    translations</strong></a>.</p><!--begin-copyright-->

    <p class="copyright"><a href=
   "http://www.w3.org/Consortium/Legal/ipr-notice#Copyright">Copyright</a> &copy; 2011
    <a href="http://www.w3.org/"><acronym title=
   "World Wide Web Consortium">W3C</acronym></a><sup>&reg;</sup> (<a href=
   "http://www.csail.mit.edu/"><acronym title=
   "Massachusetts Institute of Technology">MIT</acronym></a>, <a href=
   "http://www.ercim.eu/"><acronym title=
   "European Research Consortium for Informatics and Mathematics">ERCIM</acronym></a>,
    <a href="http://www.keio.ac.jp/">Keio</a>), All Rights Reserved. W3C <a href=
   "http://www.w3.org/Consortium/Legal/ipr-notice#Legal_Disclaimer">liability</a>,
    <a href="http://www.w3.org/Consortium/Legal/ipr-notice#W3C_Trademarks">trademark</a>
    and <a href="http://www.w3.org/Consortium/Legal/copyright-documents">document use</a>
    rules apply.</p><!--end-copyright-->
    <hr title="Separator for header" />
  </div>

  <h2 class="no-num no-toc" id="abstract">Abstract</h2>

  <p><em>Selectors</em> are patterns that match against elements in a tree, and as such
  form one of several technologies that can be used to select nodes in an XML document.
  Selectors have been optimized for use with HTML and XML, and are designed to be usable
  in performance-critical code.</p>

  <p><acronym title="Cascading Style Sheets">CSS</acronym> (Cascading Style Sheets) is a
  language for describing the rendering of <acronym title=
 "Hypertext Markup Language">HTML</acronym> and <acronym title=
 "Extensible Markup Language">XML</acronym> documents on screen, on paper, in speech,
  etc. CSS uses Selectors for binding style properties to elements in the document.</p>

  <p>This document describes the selectors that already exist in <abbr title=
 "CSS level 1">CSS1</abbr> <a href="#CSS1" rel="biblioentry">[CSS1]<!--{{CSS1}}--></a>
  and <abbr title="CSS level 2">CSS2</abbr> <a href="#CSS21" rel="biblioentry">[CSS21]
  <!--{{!CSS21}}--></a>, and further introduces new selectors for <abbr title=
 "CSS level 3">CSS3</abbr> and other languages that may need them.</p>

  <p>Selectors define the following function:</p>
  <pre>
expression &lowast; element &rarr; boolean
</pre>

  <p>That is, given an element and a selector, this specification defines whether that
  element matches the selector.</p>

  <p>These expressions can also be used, for instance, to select a set of elements, or a
  single element from a set of elements, by evaluating the expression across all the
  elements in a subtree. <acronym title=
 "Simple Tree Transformation Sheets">STTS</acronym> (Simple Tree Transformation Sheets),
  a language for transforming XML trees, uses this mechanism. <a href="#STTS3" rel=
 "biblioentry">[STTS3]<!--{{STTS3}}--></a></p>

  <h2 class="no-num no-toc" id="status">Status of this document</h2><!--begin-status-->

  <p><em>This section describes the status of this document at the time of its
  publication. Other documents may supersede this document. A list of current W3C
  publications and the latest revision of this technical report can be found in the
  <a href="http://www.w3.org/TR/">W3C technical reports index at
  http://www.w3.org/TR/.</a></em></p>

  <p>This document was produced by the <a href="http://www.w3.org/Style/CSS/members">CSS
  Working Group</a> as a <a href=
 "http://www.w3.org/Consortium/Process/tr#RecsPR">Proposed Recommendation.</a></p>

  <p>A W3C Recommendation is a mature document that has been widely reviewed and has been
  shown to be implementable. W3C encourages everybody to implement this specification.
  Comments may be sent to the (<a href=
 "http://lists.w3.org/Archives/Public/www-style/">archived</a>) public mailing list
  <a href=
 "mailto:www-style@w3.org?Subject=%5Bcss3-selectors%5D%20PUT%20SUBJECT%20HERE">www-style@w3.org</a>
  (see <a href="http://www.w3.org/Mail/Request">instructions</a>). When sending e-mail,
  please put the text &ldquo;css3-selectors&rdquo; in the subject, preferably like this:
  &ldquo;[<!---->css3-selectors<!---->] <em>&hellip;summary of
  comment&hellip;</em>&rdquo;</p>

  <p>This document has been reviewed by W3C Members, by software developers, and by other
  W3C groups and interested parties, and is endorsed by the Director as a W3C
  Recommendation. It is a stable document and may be used as reference material or cited
  from another document. W3C's role in making the Recommendation is to draw attention to
  the specification and to promote its widespread deployment. This enhances the
  functionality and interoperability of the Web.</p>

  <p>This document was produced by a group operating under the <a href=
 "http://www.w3.org/Consortium/Patent-Policy-20040205/">5&nbsp;February 2004 W3C Patent
  Policy</a>. W3C maintains a <a href="http://www.w3.org/2004/01/pp-impl/32061/status"
 rel="disclosure">public list of any patent disclosures</a> made in connection with the
  deliverables of the group; that page also includes instructions for disclosing a
  patent. An individual who has actual knowledge of a patent which the individual
  believes contains <a href=
 "http://www.w3.org/Consortium/Patent-Policy-20040205/#def-essential">Essential
  Claim(s)</a> must disclose the information in accordance with <a href=
 "http://www.w3.org/Consortium/Patent-Policy-20040205/#sec-Disclosure">section&nbsp;6 of
  the W3C Patent Policy</a>.</p><!--end-status-->

  <p>A separate <a href=
 "/Style/CSS/Test/CSS3/Selectors/20091025/reports/CR-ImpReport.html">implementation
  report</a> contains a test suite and shows several implementations of the
  specification.</p>

  <p id="changes">This document is the same as the previous, Proposed Recommendation
  version, except for editorial changes to the front matter, and updating of
  references.</p>

  <h2 class="no-num no-toc" id="contents">Table of Contents</h2><!--begin-toc-->

  <ul class="toc">
    <li>
      <a href="#context"><span class="secno">1.</span> Introduction</a>

      <ul class="toc">
        <li><a href="#dependencies"><span class="secno">1.1.</span> Dependencies</a></li>

        <li><a href="#terminology"><span class="secno">1.2.</span> Terminology</a></li>

        <li><a href="#changesFromCSS2"><span class="secno">1.3.</span> Changes from
        CSS2</a></li>
      </ul>
    </li>

    <li><a href="#selectors"><span class="secno">2.</span> Selectors</a></li>

    <li><a href="#casesens"><span class="secno">3.</span> Case sensitivity</a></li>

    <li><a href="#selector-syntax"><span class="secno">4.</span> Selector syntax</a></li>

    <li><a href="#grouping"><span class="secno">5.</span> Groups of selectors</a></li>

    <li>
      <a href="#simple-selectors"><span class="secno">6.</span> Simple selectors</a>

      <ul class="toc">
        <li>
          <a href="#type-selectors"><span class="secno">6.1.</span> Type selector</a>

          <ul class="toc">
            <li><a href="#typenmsp"><span class="secno">6.1.1.</span> Type selectors and
            namespaces</a></li>
          </ul>
        </li>

        <li>
          <a href="#universal-selector"><span class="secno">6.2.</span> Universal
          selector</a>

          <ul class="toc">
            <li><a href="#univnmsp"><span class="secno">6.2.1.</span> Universal selector
            and namespaces</a></li>
          </ul>
        </li>

        <li>
          <a href="#attribute-selectors"><span class="secno">6.3.</span> Attribute
          selectors</a>

          <ul class="toc">
            <li><a href="#attribute-representation"><span class="secno">6.3.1.</span>
            Attribute presence and value selectors</a></li>

            <li><a href="#attribute-substrings"><span class="secno">6.3.2.</span>
            Substring matching attribute selectors</a></li>

            <li><a href="#attrnmsp"><span class="secno">6.3.3.</span> Attribute selectors
            and namespaces</a></li>

            <li><a href="#def-values"><span class="secno">6.3.4.</span> Default attribute
            values in DTDs</a></li>
          </ul>
        </li>

        <li><a href="#class-html"><span class="secno">6.4.</span> Class
        selectors</a></li>

        <li><a href="#id-selectors"><span class="secno">6.5.</span> ID selectors</a></li>

        <li>
          <a href="#pseudo-classes"><span class="secno">6.6.</span> Pseudo-classes</a>

          <ul class="toc">
            <li>
              <a href="#dynamic-pseudos"><span class="secno">6.6.1.</span> Dynamic
              pseudo-classes</a>

              <ul class="toc">
                <li><a href="#the-link-pseudo-classes-link-and-visited"><span class=
               "secno">6.6.1.1.</span> The link pseudo-classes: :link and
                :visited</a></li>

                <li><a href="#the-user-action-pseudo-classes-hover-act"><span class=
               "secno">6.6.1.2.</span> The user action pseudo-classes :hover, :active,
                and :focus</a></li>
              </ul>
            </li>

            <li><a href="#target-pseudo"><span class="secno">6.6.2.</span> The target
            pseudo-class :target</a></li>

            <li><a href="#lang-pseudo"><span class="secno">6.6.3.</span> The language
            pseudo-class :lang</a></li>

            <li>
              <a href="#UIstates"><span class="secno">6.6.4.</span> The UI element states
              pseudo-classes</a>

              <ul class="toc">
                <li><a href="#enableddisabled"><span class="secno">6.6.4.1.</span> The
                :enabled and :disabled pseudo-classes</a></li>

                <li><a href="#checked"><span class="secno">6.6.4.2.</span> The :checked
                pseudo-class</a></li>

                <li><a href="#indeterminate"><span class="secno">6.6.4.3.</span> The
                :indeterminate pseudo-class</a></li>
              </ul>
            </li>

            <li>
              <a href="#structural-pseudos"><span class="secno">6.6.5.</span> Structural
              pseudo-classes</a>

              <ul class="toc">
                <li><a href="#root-pseudo"><span class="secno">6.6.5.1.</span> :root
                pseudo-class</a></li>

                <li><a href="#nth-child-pseudo"><span class="secno">6.6.5.2.</span>
                :nth-child() pseudo-class</a></li>

                <li><a href="#nth-last-child-pseudo"><span class="secno">6.6.5.3.</span>
                :nth-last-child() pseudo-class</a></li>

                <li><a href="#nth-of-type-pseudo"><span class="secno">6.6.5.4.</span>
                :nth-of-type() pseudo-class</a></li>

                <li><a href="#nth-last-of-type-pseudo"><span class=
               "secno">6.6.5.5.</span> :nth-last-of-type() pseudo-class</a></li>

                <li><a href="#first-child-pseudo"><span class="secno">6.6.5.6.</span>
                :first-child pseudo-class</a></li>

                <li><a href="#last-child-pseudo"><span class="secno">6.6.5.7.</span>
                :last-child pseudo-class</a></li>

                <li><a href="#first-of-type-pseudo"><span class="secno">6.6.5.8.</span>
                :first-of-type pseudo-class</a></li>

                <li><a href="#last-of-type-pseudo"><span class="secno">6.6.5.9.</span>
                :last-of-type pseudo-class</a></li>

                <li><a href="#only-child-pseudo"><span class="secno">6.6.5.10.</span>
                :only-child pseudo-class</a></li>

                <li><a href="#only-of-type-pseudo"><span class="secno">6.6.5.11.</span>
                :only-of-type pseudo-class</a></li>

                <li><a href="#empty-pseudo"><span class="secno">6.6.5.12.</span> :empty
                pseudo-class</a></li>
              </ul>
            </li>

            <li><a href="#content-selectors"><span class="secno">6.6.6.</span>
            Blank</a></li>

            <li><a href="#negation"><span class="secno">6.6.7.</span> The negation
            pseudo-class</a></li>
          </ul>
        </li>
      </ul>
    </li>

    <li>
      <a href="#pseudo-elements"><span class="secno">7.</span> Pseudo-elements</a>

      <ul class="toc">
        <li>
          <a href="#first-line"><span class="secno">7.1.</span> The ::first-line
          pseudo-element</a>

          <ul class="toc">
            <li><a href="#first-formatted-line"><span class="secno">7.1.1.</span> First
            formatted line definition in CSS</a></li>
          </ul>
        </li>

        <li>
          <a href="#first-letter"><span class="secno">7.2.</span> The ::first-letter
          pseudo-element</a>

          <ul class="toc">
            <li><a href="#application-in-css"><span class="secno">7.2.1.</span>
            Application in CSS</a></li>
          </ul>
        </li>

        <li><a href="#selection"><span class="secno">7.3.</span> Blank</a></li>

        <li><a href="#gen-content"><span class="secno">7.4.</span> The ::before and
        ::after pseudo-elements</a></li>
      </ul>
    </li>

    <li>
      <a href="#combinators"><span class="secno">8.</span> Combinators</a>

      <ul class="toc">
        <li><a href="#descendant-combinators"><span class="secno">8.1.</span> Descendant
        combinator</a></li>

        <li><a href="#child-combinators"><span class="secno">8.2.</span> Child
        combinators</a></li>

        <li>
          <a href="#sibling-combinators"><span class="secno">8.3.</span> Sibling
          combinators</a>

          <ul class="toc">
            <li><a href="#adjacent-sibling-combinators"><span class="secno">8.3.1.</span>
            Adjacent sibling combinator</a></li>

            <li><a href="#general-sibling-combinators"><span class="secno">8.3.2.</span>
            General sibling combinator</a></li>
          </ul>
        </li>
      </ul>
    </li>

    <li><a href="#specificity"><span class="secno">9.</span> Calculating a selector's
    specificity</a></li>

    <li>
      <a href="#w3cselgrammar"><span class="secno">10.</span> The grammar of
      Selectors</a>

      <ul class="toc">
        <li><a href="#grammar"><span class="secno">10.1.</span> Grammar</a></li>

        <li><a href="#lex"><span class="secno">10.2.</span> Lexical scanner</a></li>
      </ul>
    </li>

    <li><a href="#profiling"><span class="secno">11.</span> Profiles</a></li>

    <li><a href="#Conformance"><span class="secno">12.</span> Conformance and
    requirements</a></li>

    <li><a href="#Tests"><span class="secno">13.</span> Tests</a></li>

    <li><a href="#ACKS"><span class="secno">14.</span> Acknowledgements</a></li>

    <li>
      <a href="#references"><span class="secno">15.</span> References</a>

      <ul class="toc">
        <li><a href="#normative-references"><span class="secno">15.1.</span> Normative
        References</a></li>

        <li><a href="#informative-references"><span class="secno">15.2.</span>
        Informative References</a></li>
      </ul>
    </li>
  </ul><!--end-toc-->

  <h2 id="context"><span class="secno">1.</span> Introduction</h2>

  <p>Selectors Level 1 and Selectors Level 2 are defined as the subsets of selector
  functionality defined in the <a href="http://www.w3.org/TR/REC-CSS1">CSS1</a> and
  <a href="http://www.w3.org/TR/CSS21/">CSS2.1</a> specifications, respectively.</p>

  <h3 id="dependencies"><span class="secno">1.1.</span> Dependencies</h3>

  <p>Some features of this specification are specific to CSS, or have particular
  limitations or rules specific to CSS. In this specification, these have been described
  in terms of CSS2.1. <a href="#CSS21" rel="biblioentry">[CSS21]<!--{{!CSS21}}--></a></p>

  <h3 id="terminology"><span class="secno">1.2.</span> Terminology</h3>

  <p>All of the text of this specification is normative except examples, notes, and
  sections explicitly marked as non-normative.</p>

  <p>Additional terminology is defined in the <a href=
 "http://www.w3.org/TR/CSS21/conform.html#defs">Definitions</a> section of <a href=
 "#CSS21" rel="biblioentry">[CSS21]<!--{{!CSS21}}--></a>. Examples of document source
  code and fragments are given in XML [[XML10] or HTML [[HTML40]] syntax.</p>

  <h3 id="changesFromCSS2"><span class="secno">1.3.</span> Changes from CSS2</h3>

  <p><em>This section is non-normative.</em></p>

  <p>The main differences between the selectors in CSS2 and those in Selectors are:</p>

  <ul>
    <li>the list of basic definitions (selector, group of selectors, simple selector,
    etc.) has been changed; in particular, what was referred to in CSS2 as a simple
    selector is now called a sequence of simple selectors, and the term "simple selector"
    is now used for the components of this sequence</li>

    <li>an optional namespace component is now allowed in element type selectors, the
    universal selector and attribute selectors</li>

    <li>a <a href="#general-sibling-combinators">new combinator</a> has been
    introduced</li>

    <li>new simple selectors including substring matching attribute selectors, and new
    pseudo-classes</li>

    <li>new pseudo-elements, and introduction of the "::" convention for
    pseudo-elements</li>

    <li>the grammar has been rewritten</li>

    <li>profiles to be added to specifications integrating Selectors and defining the set
    of selectors which is actually supported by each specification</li>

    <li>Selectors are now a CSS3 Module and an independent specification; other
    specifications can now refer to this document independently of CSS</li>

    <li>the specification now has its own test suite</li>
  </ul>

  <h2 id="selectors"><span class="secno">2.</span> Selectors</h2>

  <p><em>This section is non-normative, as it merely summarizes the following
  sections.</em></p>

  <p>A Selector represents a structure. This structure can be used as a condition (e.g.
  in a CSS rule) that determines which elements a selector matches in the document tree,
  or as a flat description of the HTML or XML fragment corresponding to that
  structure.</p>

  <p>Selectors may range from simple element names to rich contextual
  representations.</p>

  <p>The following table summarizes the Selector syntax:</p>

  <p class="bind-setup"></p>
  <p class="delegate-setup"></p>

  <p class="bind-trigger"></p>
  <p class="delegate-trigger"></p>

  <table class="selectorsReview">
    <thead>
      <tr>
        <th class="pattern">Pattern</th>

        <th class="meaning">Meaning</th>

        <th class="described">Described in section</th>

        <th class="origin">First defined in CSS level</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <td class="pattern">*</td>

        <td class="meaning">any element</td>

        <td class="described"><a href="#universal-selector">Universal selector</a></td>

        <td class="origin">2</td>
      </tr>

      <tr>
        <td class="pattern">E</td>

        <td class="meaning">an element of type E</td>

        <td class="described"><a href="#type-selectors">Type selector</a></td>

        <td class="origin">1</td>
      </tr>

      <tr>
        <td class="pattern">E[foo]</td>

        <td class="meaning">an E element with a "foo" attribute</td>

        <td class="described"><a href="#attribute-selectors">Attribute selectors</a></td>

        <td class="origin">2</td>
      </tr>

      <tr>
        <td class="pattern">E[foo="bar"]</td>

        <td class="meaning">an E element whose "foo" attribute value is exactly equal to
        "bar"</td>

        <td class="described"><a href="#attribute-selectors">Attribute selectors</a></td>

        <td class="origin">2</td>
      </tr>

      <tr>
        <td class="pattern">E[foo~="bar"]</td>

        <td class="meaning">an E element whose "foo" attribute value is a list of
        whitespace-separated values, one of which is exactly equal to "bar"</td>

        <td class="described"><a href="#attribute-selectors">Attribute selectors</a></td>

        <td class="origin">2</td>
      </tr>

      <tr>
        <td class="pattern">E[foo^="bar"]</td>

        <td class="meaning">an E element whose "foo" attribute value begins exactly with
        the string "bar"</td>

        <td class="described"><a href="#attribute-selectors">Attribute selectors</a></td>

        <td class="origin">3</td>
      </tr>

      <tr>
        <td class="pattern">E[foo$="bar"]</td>

        <td class="meaning">an E element whose "foo" attribute value ends exactly with
        the string "bar"</td>

        <td class="described"><a href="#attribute-selectors">Attribute selectors</a></td>

        <td class="origin">3</td>
      </tr>

      <tr>
        <td class="pattern">E[foo*="bar"]</td>

        <td class="meaning">an E element whose "foo" attribute value contains the
        substring "bar"</td>

        <td class="described"><a href="#attribute-selectors">Attribute selectors</a></td>

        <td class="origin">3</td>
      </tr>

      <tr>
        <td class="pattern">E[foo|="en"]</td>

        <td class="meaning">an E element whose "foo" attribute has a hyphen-separated
        list of values beginning (from the left) with "en"</td>

        <td class="described"><a href="#attribute-selectors">Attribute selectors</a></td>

        <td class="origin">2</td>
      </tr>

      <tr>
        <td class="pattern">E:root</td>

        <td class="meaning">an E element, root of the document</td>

        <td class="described"><a href="#structural-pseudos">Structural
        pseudo-classes</a></td>

        <td class="origin">3</td>
      </tr>

      <tr>
        <td class="pattern">E:nth-child(n)</td>

        <td class="meaning">an E element, the n-th child of its parent</td>

        <td class="described"><a href="#structural-pseudos">Structural
        pseudo-classes</a></td>

        <td class="origin">3</td>
      </tr>

      <tr>
        <td class="pattern">E:nth-last-child(n)</td>

        <td class="meaning">an E element, the n-th child of its parent, counting from the
        last one</td>

        <td class="described"><a href="#structural-pseudos">Structural
        pseudo-classes</a></td>

        <td class="origin">3</td>
      </tr>

      <tr>
        <td class="pattern">E:nth-of-type(n)</td>

        <td class="meaning">an E element, the n-th sibling of its type</td>

        <td class="described"><a href="#structural-pseudos">Structural
        pseudo-classes</a></td>

        <td class="origin">3</td>
      </tr>

      <tr>
        <td class="pattern">E:nth-last-of-type(n)</td>

        <td class="meaning">an E element, the n-th sibling of its type, counting from the
        last one</td>

        <td class="described"><a href="#structural-pseudos">Structural
        pseudo-classes</a></td>

        <td class="origin">3</td>
      </tr>

      <tr>
        <td class="pattern">E:first-child</td>

        <td class="meaning">an E element, first child of its parent</td>

        <td class="described"><a href="#structural-pseudos">Structural
        pseudo-classes</a></td>

        <td class="origin">2</td>
      </tr>

      <tr>
        <td class="pattern">E:last-child</td>

        <td class="meaning">an E element, last child of its parent</td>

        <td class="described"><a href="#structural-pseudos">Structural
        pseudo-classes</a></td>

        <td class="origin">3</td>
      </tr>

      <tr>
        <td class="pattern">E:first-of-type</td>

        <td class="meaning">an E element, first sibling of its type</td>

        <td class="described"><a href="#structural-pseudos">Structural
        pseudo-classes</a></td>

        <td class="origin">3</td>
      </tr>

      <tr>
        <td class="pattern">E:last-of-type</td>

        <td class="meaning">an E element, last sibling of its type</td>

        <td class="described"><a href="#structural-pseudos">Structural
        pseudo-classes</a></td>

        <td class="origin">3</td>
      </tr>

      <tr>
        <td class="pattern">E:only-child</td>

        <td class="meaning">an E element, only child of its parent</td>

        <td class="described"><a href="#structural-pseudos">Structural
        pseudo-classes</a></td>

        <td class="origin">3</td>
      </tr>

      <tr>
        <td class="pattern">E:only-of-type</td>

        <td class="meaning">an E element, only sibling of its type</td>

        <td class="described"><a href="#structural-pseudos">Structural
        pseudo-classes</a></td>

        <td class="origin">3</td>
      </tr>

      <tr>
        <td class="pattern">E:empty</td>

        <td class="meaning">an E element that has no children (including text nodes)</td>

        <td class="described"><a href="#structural-pseudos">Structural
        pseudo-classes</a></td>

        <td class="origin">3</td>
      </tr>

      <tr>
        <td class="pattern">E:link<br />
        E:visited</td>

        <td class="meaning">an E element being the source anchor of a hyperlink of which
        the target is not yet visited (:link) or already visited (:visited)</td>

        <td class="described"><a href="#link">The link pseudo-classes</a></td>

        <td class="origin">1</td>
      </tr>

      <tr>
        <td class="pattern">E:active<br />
        E:hover<br />
        E:focus</td>

        <td class="meaning">an E element during certain user actions</td>

        <td class="described"><a href="#useraction-pseudos">The user action
        pseudo-classes</a></td>

        <td class="origin">1 and 2</td>
      </tr>

      <tr>
        <td class="pattern">E:target</td>

        <td class="meaning">an E element being the target of the referring URI</td>

        <td class="described"><a href="#target-pseudo">The target pseudo-class</a></td>

        <td class="origin">3</td>
      </tr>

      <tr>
        <td class="pattern">E:lang(fr)</td>

        <td class="meaning">an element of type E in language "fr" (the document language
        specifies how language is determined)</td>

        <td class="described"><a href="#lang-pseudo">The :lang() pseudo-class</a></td>

        <td class="origin">2</td>
      </tr>

      <tr>
        <td class="pattern">E:enabled<br />
        E:disabled</td>

        <td class="meaning">a user interface element E which is enabled or disabled</td>

        <td class="described"><a href="#UIstates">The UI element states
        pseudo-classes</a></td>

        <td class="origin">3</td>
      </tr>

      <tr>
        <td class="pattern">E:checked<!--<br>E:indeterminate--></td>

        <td class="meaning">a user interface element E which is checked<!-- or in an
     indeterminate state--> (for instance a radio-button or checkbox)</td>

        <td class="described"><a href="#UIstates">The UI element states
        pseudo-classes</a></td>

        <td class="origin">3</td>
      </tr>

      <tr>
        <td class="pattern">E::first-line</td>

        <td class="meaning">the first formatted line of an E element</td>

        <td class="described"><a href="#first-line">The ::first-line
        pseudo-element</a></td>

        <td class="origin">1</td>
      </tr>

      <tr>
        <td class="pattern">E::first-letter</td>

        <td class="meaning">the first formatted letter of an E element</td>

        <td class="described"><a href="#first-letter">The ::first-letter
        pseudo-element</a></td>

        <td class="origin">1</td>
      </tr>

      <tr>
        <td class="pattern">E::before</td>

        <td class="meaning">generated content before an E element</td>

        <td class="described"><a href="#gen-content">The ::before pseudo-element</a></td>

        <td class="origin">2</td>
      </tr>

      <tr>
        <td class="pattern">E::after</td>

        <td class="meaning">generated content after an E element</td>

        <td class="described"><a href="#gen-content">The ::after pseudo-element</a></td>

        <td class="origin">2</td>
      </tr>

      <tr>
        <td class="pattern">E.warning</td>

        <td class="meaning">an E element whose class is "warning" (the document language
        specifies how class is determined).</td>

        <td class="described"><a href="#class-html">Class selectors</a></td>

        <td class="origin">1</td>
      </tr>

      <tr>
        <td class="pattern">E#myid</td>

        <td class="meaning">an E element with ID equal to "myid".</td>

        <td class="described"><a href="#id-selectors">ID selectors</a></td>

        <td class="origin">1</td>
      </tr>

      <tr>
        <td class="pattern">E:not(s)</td>

        <td class="meaning">an E element that does not match simple selector s</td>

        <td class="described"><a href="#negation">Negation pseudo-class</a></td>

        <td class="origin">3</td>
      </tr>

      <tr>
        <td class="pattern">E F</td>

        <td class="meaning">an F element descendant of an E element</td>

        <td class="described"><a href="#descendant-combinators">Descendant
        combinator</a></td>

        <td class="origin">1</td>
      </tr>

      <tr>
        <td class="pattern">E &gt; F</td>

        <td class="meaning">an F element child of an E element</td>

        <td class="described"><a href="#child-combinators">Child combinator</a></td>

        <td class="origin">2</td>
      </tr>

      <tr>
        <td class="pattern">E + F</td>

        <td class="meaning">an F element immediately preceded by an E element</td>

        <td class="described"><a href="#adjacent-sibling-combinators">Adjacent sibling
        combinator</a></td>

        <td class="origin">2</td>
      </tr>

      <tr>
        <td class="pattern">E ~ F</td>

        <td class="meaning">an F element preceded by an E element</td>

        <td class="described"><a href="#general-sibling-combinators">General sibling
        combinator</a></td>

        <td class="origin">3</td>
      </tr>
    </tbody>
  </table>

  <p>The meaning of each selector is derived from the table above by prepending "matches"
  to the contents of each cell in the "Meaning" column.</p>

  <h2 id="casesens"><span class="secno">3.</span> Case sensitivity</h2>

  <p>All Selectors syntax is case-insensitive within the ASCII range (i.e. [a-z] and
  [A-Z] are equivalent), except for parts that are not under the control of Selectors.
  The case sensitivity of document language element names, attribute names, and attribute
  values in selectors depends on the document language. For example, in HTML, element
  names are case-insensitive, but in XML, they are case-sensitive. Case sensitivity of
  namespace prefixes is defined in <a href="#CSS3NAMESPACE" rel=
 "biblioentry">[CSS3NAMESPACE]<!--{{!CSS3NAMESPACE}}--></a>.</p>

  <h2 id="selector-syntax"><span class="secno">4.</span> Selector syntax</h2>

  <p>A <dfn id="selector">selector</dfn> is a chain of one or more <a href=
 "#sequence">sequences of simple selectors</a> separated by <a href=
 "#combinators">combinators</a>. One <a href="#pseudo-elements">pseudo-element</a> may
  be appended to the last sequence of simple selectors in a selector.</p>

  <p>A <dfn id="sequence-of-simple-selectors"><a name="sequence" id="sequence">sequence
  of simple selectors</a></dfn> is a chain of <a href="#simple-selectors-dfn">simple
  selectors</a> that are not separated by a <a href="#combinators">combinator</a>. It
  always begins with a <a href="#type-selectors">type selector</a> or a <a href=
 "#universal-selector">universal selector</a>. No other type selector or universal
  selector is allowed in the sequence.</p>

  <p>A <dfn id="simple-selector"><a name="simple-selectors-dfn" id=
 "simple-selectors-dfn"></a><a href="#simple-selectors">simple selector</a></dfn> is
  either a <a href="#type-selectors">type selector</a>, <a href=
 "#universal-selector">universal selector</a>, <a href="#attribute-selectors">attribute
  selector</a>, <a href="#class-html">class selector</a>, <a href="#id-selectors">ID
  selector</a>, or <a href="#pseudo-classes">pseudo-class</a>.</p>

  <p><dfn id="combinators0">Combinators</dfn> are: whitespace, "greater-than sign"
  (U+003E, <code>&gt;</code>), "plus sign" (U+002B, <code>+</code>) and "tilde" (U+007E,
  <code>~</code>). White space may appear between a combinator and the simple selectors
  around it. <a name="whitespace" id="whitespace"></a>Only the characters "space"
  (U+0020), "tab" (U+0009), "line feed" (U+000A), "carriage return" (U+000D), and "form
  feed" (U+000C) can occur in whitespace. Other space-like characters, such as "em-space"
  (U+2003) and "ideographic space" (U+3000), are never part of whitespace.</p>

  <p>The elements of a document tree that are represented by a selector are the <dfn id=
 "subjects-of-the-selector"><a name="subject" id="subject"></a>subjects of the
  selector</dfn>. A selector consisting of a single sequence of simple selectors
  represents any element satisfying its requirements. Prepending another sequence of
  simple selectors and a combinator to a sequence imposes additional matching
  constraints, so the subjects of a selector are always a subset of the elements
  represented by the last sequence of simple selectors.</p>

  <p>An empty selector, containing no sequence of simple selectors and no pseudo-element,
  is an <a href="#Conformance">invalid selector</a>.</p>

  <p>Characters in Selectors can be escaped with a backslash according to the same
  <a href="http://www.w3.org/TR/CSS21/syndata.html#characters">escaping rules</a> as CSS.
  <a href="#CSS21" rel="biblioentry">[CSS21]<!--{{!CSS21}}--></a>.</p>

  <p id="nsdecl">Certain selectors support namespace prefixes. The mechanism by which
  namespace prefixes are <dfn id="declared">declared</dfn> should be specified by the
  language that uses Selectors. If the language does not specify a namespace prefix
  declaration mechanism, then no prefixes are declared. In CSS, namespace prefixes are
  declared with the <a href=
 "http://www.w3.org/TR/css3-namespace/#declaration"><code>@namespace</code></a> rule.
  <a href="#CSS3NAMESPACE" rel="biblioentry">[CSS3NAMESPACE]
  <!--{{!CSS3NAMESPACE}}--></a></p>

  <h2 id="grouping"><span class="secno">5.</span> Groups of selectors</h2>

  <p>A comma-separated list of selectors represents the union of all elements selected by
  each of the individual selectors in the list. (A comma is U+002C.) For example, in CSS
  when several selectors share the same declarations, they may be grouped into a
  comma-separated list. White space may appear before and/or after the comma.</p>

  <div class="example">
    <p>CSS example:</p>

    <p>In this example, we condense three rules with identical declarations into one.
    Thus,</p>
    <pre>
h1 { font-family: sans-serif }
h2 { font-family: sans-serif }
h3 { font-family: sans-serif }
</pre>

    <p>is equivalent to:</p>
    <pre>
h1, h2, h3 { font-family: sans-serif }
</pre>
  </div>

  <p><strong>Warning</strong>: the equivalence is true in this example because all the
  selectors are valid selectors. If just one of these selectors were invalid, the entire
  group of selectors would be invalid. This would invalidate the rule for all three
  heading elements, whereas in the former case only one of the three individual heading
  rules would be invalidated.</p>

  <div class="example">
    <p>Invalid CSS example:</p>
    <pre>
h1 { font-family: sans-serif }
h2..foo { font-family: sans-serif }
h3 { font-family: sans-serif }
</pre>

    <p>is not equivalent to:</p>
    <pre>
h1, h2..foo, h3 { font-family: sans-serif }
</pre>

    <p>because the above selector (<code>h1, h2..foo, h3</code>) is entirely invalid and
    the entire style rule is dropped. (When the selectors are not grouped, only the rule
    for <code>h2..foo</code> is dropped.)</p>
  </div>

  <h2 id="simple-selectors"><span class="secno">6.</span> Simple selectors</h2>

  <h3 id="type-selectors"><span class="secno">6.1.</span> Type selector</h3>

  <p>A <dfn id="type-selector">type selector</dfn> is the name of a document language
  element type written using the syntax of <a href=
 "http://www.w3.org/TR/css3-namespace/#css-qnames">CSS qualified names</a> <a href=
 "#CSS3NAMESPACE" rel="biblioentry">[CSS3NAMESPACE]<!--{{!CSS3NAMESPACE}}--></a>. A type
  selector represents an instance of the element type in the document tree.</p>

  <div class="example">
    <p>Example:</p>

    <p>The following selector represents an <code>h1</code> element in the document
    tree:</p>
    <pre>
h1
</pre>
  </div>

  <h4 id="typenmsp"><span class="secno">6.1.1.</span> Type selectors and namespaces</h4>

  <p>Type selectors allow an optional namespace component: a namespace prefix that has
  been previously <a href="#nsdecl">declared</a> may be prepended to the element name
  separated by the namespace separator "vertical bar" (U+007C, <code>|</code>). (See,
  e.g., <a href="#XML-NAMES" rel="biblioentry">[XML-NAMES]<!--{{XML-NAMES}}--></a> for
  the use of namespaces in XML.)</p>

  <p>The namespace component may be left empty (no prefix before the namespace separator)
  to indicate that the selector is only to represent elements with no namespace.</p>

  <p>An asterisk may be used for the namespace prefix, indicating that the selector
  represents elements in any namespace (including elements with no namespace).</p>

  <p>Element type selectors that have no namespace component (no namespace separator)
  represent elements without regard to the element's namespace (equivalent to
  "<code>*|</code>") unless a default namespace has been <a href="#nsdecl">declared</a>
  for namespaced selectors (e.g. in CSS, in the style sheet). If a default namespace has
  been declared, such selectors will represent only elements in the default
  namespace.</p>

  <p>A type selector containing a namespace prefix that has not been previously <a href=
 "#nsdecl">declared</a> for namespaced selectors is an <a href=
 "#Conformance">invalid</a> selector.</p>

  <p>In a namespace-aware client, the name part of element type selectors (the part after
  the namespace separator, if it is present) will only match against the <a href=
 "http://www.w3.org/TR/REC-xml-names/#NT-LocalPart">local part</a> of the element's
  <a href="http://www.w3.org/TR/REC-xml-names/#ns-qualnames">qualified name</a>.</p>

  <p>In summary:</p>

  <dl>
    <dt><code>ns|E</code></dt>

    <dd>elements with name E in namespace ns</dd>

    <dt><code>*|E</code></dt>

    <dd>elements with name E in any namespace, including those without a namespace</dd>

    <dt><code>|E</code></dt>

    <dd>elements with name E without a namespace</dd>

    <dt><code>E</code></dt>

    <dd>if no default namespace has been <a href="#nsdecl">declared</a> for selectors,
    this is equivalent to *|E. Otherwise it is equivalent to ns|E where ns is the default
    namespace.</dd>
  </dl>

  <div class="example">
    <p>CSS examples:</p>
    <pre>
@namespace foo url(http://www.example.com);
 foo|h1 { color: blue }  /* first rule */
 foo|* { color: yellow } /* second rule */
 |h1 { color: red }      /* ...*/
 *|h1 { color: green }
 h1 { color: green }
</pre>

    <p>The first rule (not counting the <code>@namespace</code> at-rule) will match only
    <code>h1</code> elements in the "http://www.example.com" namespace.</p>

    <p>The second rule will match all elements in the "http://www.example.com"
    namespace.</p>

    <p>The third rule will match only <code>h1</code> elements with no namespace.</p>

    <p>The fourth rule will match <code>h1</code> elements in any namespace (including
    those without any namespace).</p>

    <p>The last rule is equivalent to the fourth rule because no default namespace has
    been defined.</p>
  </div>

  <h3 id="universal-selector"><span class="secno">6.2.</span> Universal selector</h3>

  <p>The <dfn id="universal-selector0">universal selector</dfn>, written as a <a href=
 "http://www.w3.org/TR/css3-namespace/#css-qnames">CSS qualified name</a> <a href=
 "#CSS3NAMESPACE" rel="biblioentry">[CSS3NAMESPACE]<!--{{!CSS3NAMESPACE}}--></a> with an
  asterisk (<code>*</code> U+002A) as the local name, represents the qualified name of
  any element type. It represents any single element in the document tree in any
  namespace (including those without a namespace) if no default namespace has been
  specified for selectors. If a default namespace has been specified, see <a href=
 "#univnmsp">Universal selector and Namespaces</a> below.</p>

  <p>If a universal selector represented by <code>*</code> (i.e. without a namespace
  prefix) is not the only component of a <a href="#sequence">sequence of simple
  selectors</a> selectors or is immediately followed by a <a href=
 "#pseudo-elements">pseudo-element</a>, then the <code>*</code> may be omitted and the
  universal selector's presence implied.</p>

  <div class="example">
    <p>Examples:</p>

    <ul>
      <li><code>*[hreflang|=en]</code> and <code>[hreflang|=en]</code> are
      equivalent,</li>

      <li><code>*.warning</code> and <code>.warning</code> are equivalent,</li>

      <li><code>*#myid</code> and <code>#myid</code> are equivalent.</li>
    </ul>
  </div>

  <p class="note"><strong>Note:</strong> it is recommended that the <code>*</code> not be
  omitted, because it decreases the potential confusion between, for example,
  <code class="c1">div :first-child</code> and <code class="c1">div:first-child</code>.
  Here, <code class="c1">div *:first-child</code> is more readable.</p>

  <h4 id="univnmsp"><span class="secno">6.2.1.</span> Universal selector and
  namespaces</h4>

  <p>The universal selector allows an optional namespace component. It is used as
  follows:</p>

  <dl>
    <dt><code>ns|*</code></dt>

    <dd>all elements in namespace ns</dd>

    <dt><code>*|*</code></dt>

    <dd>all elements</dd>

    <dt><code>|*</code></dt>

    <dd>all elements without a namespace</dd>

    <dt><code>*</code></dt>

    <dd>if no default namespace has been specified, this is equivalent to *|*. Otherwise
    it is equivalent to ns|* where ns is the default namespace.</dd>
  </dl>

  <p>A universal selector containing a namespace prefix that has not been previously
  <a href="#nsdecl">declared</a> is an <a href="#Conformance">invalid</a> selector.</p>

  <h3 id="attribute-selectors"><span class="secno">6.3.</span> Attribute selectors</h3>

  <p>Selectors allow the representation of an element's attributes. When a selector is
  used as an expression to match against an element, attribute selectors must be
  considered to match an element if that element has an attribute that matches the
  attribute represented by the attribute selector.</p>

  <h4 id="attribute-representation"><span class="secno">6.3.1.</span> Attribute presence
  and value selectors</h4>

  <p>CSS2 introduced four attribute selectors:</p>

  <dl>
    <dt><code>[att]</code></dt>

    <dd>Represents an element with the <code>att</code> attribute, whatever the value of
    the attribute.</dd>

    <dt><code>[att=val]</code></dt>

    <dd>Represents an element with the <code>att</code> attribute whose value is exactly
    "val".</dd>

    <dt><code>[att~=val]</code></dt>

    <dd>Represents an element with the <code>att</code> attribute whose value is a
    <a href="#whitespace">whitespace</a>-separated list of words, one of which is exactly
    "val". If "val" contains whitespace, it will never represent anything (since the
    words are <em>separated</em> by spaces). Also if "val" is the empty string, it will
    never represent anything.</dd>

    <dt><code>[att|=val]</code></dt>

    <dd>Represents an element with the <code>att</code> attribute, its value either being
    exactly "val" or beginning with "val" immediately followed by "-" (U+002D). This is
    primarily intended to allow language subcode matches (e.g., the <code>hreflang</code>
    attribute on the <code>a</code> element in HTML) as described in BCP 47 (<a href=
   "#BCP47" rel="biblioentry">[BCP47]<!--{{BCP47}}--></a>) or its successor. For
    <code>lang</code> (or <code>xml:lang</code>) language subcode matching, please see
    <a href="#lang-pseudo">the <code>:lang</code> pseudo-class</a>.</dd>
  </dl>

  <p>Attribute values must be CSS <a href=
 "http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier">identifiers</a> or
  <a href="http://www.w3.org/TR/CSS21/syndata.html#strings">strings</a>. <a href="#CSS21"
 rel="biblioentry">[CSS21]<!--{{!CSS21}}--></a> The case-sensitivity of attribute names
  and values in selectors depends on the document language.</p>

  <div class="example">
    <p>Examples:</p>

    <p>The following attribute selector represents an <code>h1</code> element that
    carries the <code>title</code> attribute, whatever its value:</p>
    <pre>
h1[title]
</pre>

    <p>In the following example, the selector represents a <code>span</code> element
    whose <code>class</code> attribute has exactly the value "example":</p>
    <pre>
span[class="example"]
</pre>

    <p>Multiple attribute selectors can be used to represent several attributes of an
    element, or several conditions on the same attribute. Here, the selector represents a
    <code>span</code> element whose <code>hello</code> attribute has exactly the value
    "Cleveland" and whose <code>goodbye</code> attribute has exactly the value
    "Columbus":</p>
    <pre>
span[hello="Cleveland"][goodbye="Columbus"]
</pre>

    <p>The following CSS rules illustrate the differences between "=" and "~=". The first
    selector would match, for example, an <code>a</code> element with the value
    "copyright copyleft copyeditor" on a <code>rel</code> attribute. The second selector
    would only match an <code>a</code> element with an <code>href</code> attribute having
    the exact value "http://www.w3.org/".</p>
    <pre>
a[rel~="copyright"] { ... }
a[href="http://www.w3.org/"] { ... }
</pre>

    <p>The following selector represents an <code>a</code> element whose
    <code>hreflang</code> attribute is exactly "fr".</p>
    <pre>
a[hreflang=fr]
</pre>

    <p>The following selector represents an <code>a</code> element for which the value of
    the <code>hreflang</code> attribute begins with "en", including "en", "en-US", and
    "en-scouse":</p>
    <pre>
a[hreflang|="en"]
</pre>

    <p>The following selectors represent a <code>DIALOGUE</code> element whenever it has
    one of two different values for an attribute <code>character</code>:</p>
    <pre>
DIALOGUE[character=romeo]
DIALOGUE[character=juliet]
</pre>
  </div>

  <h4 id="attribute-substrings"><span class="secno">6.3.2.</span> Substring matching
  attribute selectors</h4>

  <p>Three additional attribute selectors are provided for matching substrings in the
  value of an attribute:</p>

  <dl>
    <dt><code>[att^=val]</code></dt>

    <dd>Represents an element with the <code>att</code> attribute whose value begins with
    the prefix "val". If "val" is the empty string then the selector does not represent
    anything.</dd>

    <dt><code>[att$=val]</code></dt>

    <dd>Represents an element with the <code>att</code> attribute whose value ends with
    the suffix "val". If "val" is the empty string then the selector does not represent
    anything.</dd>

    <dt><code>[att*=val]</code></dt>

    <dd>Represents an element with the <code>att</code> attribute whose value contains at
    least one instance of the substring "val". If "val" is the empty string then the
    selector does not represent anything.</dd>
  </dl>

  <p>Attribute values must be CSS <a href=
 "http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier">identifiers</a> or
  <a href="http://www.w3.org/TR/CSS21/syndata.html#strings">strings</a>. <a href="#CSS21"
 rel="biblioentry">[CSS21]<!--{{!CSS21}}--></a> The case-sensitivity of attribute names
  in selectors depends on the document language.</p>

  <div class="example">
    <p>Examples:</p>

    <p>The following selector represents an HTML <code>object</code>, referencing an
    image:</p>
    <pre>
object[type^="image/"]
</pre>

    <p>The following selector represents an HTML anchor <code>a</code> with an
    <code>href</code> attribute whose value ends with ".html".</p>
    <pre>
a[href$=".html"]
</pre>

    <p>The following selector represents an HTML paragraph with a <code>title</code>
    attribute whose value contains the substring "hello"</p>
    <pre>
p[title*="hello"]
</pre>
  </div>

  <h4 id="attrnmsp"><span class="secno">6.3.3.</span> Attribute selectors and
  namespaces</h4>

  <p>The attribute name in an attribute selector is given as a <a href=
 "http://www.w3.org/TR/css3-namespace/#css-qnames">CSS qualified name</a>: a namespace
  prefix that has been previously <a href="#nsdecl">declared</a> may be prepended to the
  attribute name separated by the namespace separator "vertical bar" (<code>|</code>). In
  keeping with the Namespaces in the XML recommendation, default namespaces do not apply
  to attributes, therefore attribute selectors without a namespace component apply only
  to attributes that have no namespace (equivalent to "<code>|attr</code>"; these
  attributes are said to be in the "per-element-type namespace partition"). An asterisk
  may be used for the namespace prefix indicating that the selector is to match all
  attribute names without regard to the attribute's namespace.</p>

  <p>An attribute selector with an attribute name containing a namespace prefix that has
  not been previously <a href="#nsdecl">declared</a> is an <a href=
 "#Conformance">invalid</a> selector.</p>

  <div class="example">
    <p>CSS examples:</p>
    <pre>
@namespace foo "http://www.example.com";
[foo|att=val] { color: blue }
[*|att] { color: yellow }
[|att] { color: green }
[att] { color: green }
</pre>

    <p>The first rule will match only elements with the attribute <code>att</code> in the
    "http://www.example.com" namespace with the value "val".</p>

    <p>The second rule will match only elements with the attribute <code>att</code>
    regardless of the namespace of the attribute (including no namespace).</p>

    <p>The last two rules are equivalent and will match only elements with the attribute
    <code>att</code> where the attribute is not in a namespace.</p>
  </div>

  <h4 id="def-values"><span class="secno">6.3.4.</span> Default attribute values in
  DTDs</h4>

  <p>Attribute selectors represent attribute values in the document tree. How that
  document tree is constructed is outside the scope of Selectors. In some document
  formats default attribute values can be defined in a DTD or elsewhere, but these can
  only be selected by attribute selectors if they appear in the document tree. Selectors
  should be designed so that they work whether or not the default values are included in
  the document tree.</p>

  <p>For example, a XML UA may, but is <em>not</em> required to read an "external subset"
  of the DTD but <em>is</em> required to look for default attribute values in the
  document's "internal subset." (See, e.g., <a href="#XML10" rel="biblioentry">[XML10]
  <!--{{XML10}}--></a> for definitions of these subsets.) Depending on the UA, a default
  attribute value defined in the external subset of the DTD might or might not appear in
  the document tree.</p>

  <p>A UA that recognizes an XML namespace may, but is not required to use its knowledge
  of that namespace to treat default attribute values as if they were present in the
  document. (For example, an XHTML UA is not required to use its built-in knowledge of
  the XHTML DTD. See, e.g., <a href="#XML-NAMES" rel="biblioentry">[XML-NAMES]
  <!--{{XML-NAMES}}--></a> for details on namespaces in XML 1.0.)</p>

  <p class="note"><strong>Note:</strong> Typically, implementations choose to ignore
  external subsets. This corresponds to the behaviour of non-validating processors as
  defined by the XML specification.</p>

  <div class="example">
    <p>Example:</p>

    <p>Consider an element <code>EXAMPLE</code> with an attribute <code>radix</code> that
    has a default value of <code>"decimal"</code>. The DTD fragment might be</p>
    <pre class="dtd-example">
&lt;!ATTLIST EXAMPLE radix (decimal,octal) "decimal"&gt;
</pre>

    <p>If the style sheet contains the rules</p>
    <pre>
EXAMPLE[radix=decimal] { /*... default property settings ...*/ }
EXAMPLE[radix=octal]   { /*... other settings...*/ }
</pre>

    <p>the first rule might not match elements whose <code>radix</code> attribute is set
    by default, i.e. not set explicitly. To catch all cases, the attribute selector for
    the default value must be dropped:</p>
    <pre>
EXAMPLE                { /*... default property settings ...*/ }
EXAMPLE[radix=octal]   { /*... other settings...*/ }
</pre>

    <p>Here, because the selector <code>EXAMPLE[radix=octal]</code> is more specific than
    the type selector alone, the style declarations in the second rule will override
    those in the first for elements that have a <code>radix</code> attribute value of
    <code>"octal"</code>. Care has to be taken that all property declarations that are to
    apply only to the default case are overridden in the non-default cases' style
    rules.</p>
  </div>

  <h3 id="class-html"><span class="secno">6.4.</span> Class selectors</h3>

  <p>Working with HTML, authors may use the "period" notation (also known as "full stop",
  U+002E, <code>.</code>) as an alternative to the <code>~=</code> notation when
  representing the <code>class</code> attribute. Thus, for HTML, <code>div.value</code>
  and <code>div[class~=value]</code> have the same meaning. The attribute value must
  immediately follow the full stop (<code>.</code>).</p>

  <p>UAs may apply selectors using the period (.) notation in XML documents if the UA has
  namespace-specific knowledge that allows it to determine which attribute is the "class"
  attribute for the respective namespace. One such example of namespace-specific
  knowledge is the prose in the specification for a particular namespace (e.g. SVG 1.0
  <a href="#SVG11" rel="biblioentry">[SVG11]<!--{{SVG11}}--></a> describes the <a href=
 "http://www.w3.org/TR/2001/PR-SVG-20010719/styling.html#ClassAttribute">SVG
  <code>class</code> attribute</a> and how a UA should interpret it, and similarly MathML
  1.01 <a href="#MATHML" rel="biblioentry">[MATHML]<!--{{MATHML}}--></a> describes the
  <a href="http://www.w3.org/1999/07/REC-MathML-19990707/chapter2.html#sec2.3.4">MathML
  <code>class</code> attribute</a>.)</p>

  <div class="example">
    <p>CSS examples:</p>

    <p>We can assign style information to all elements with
    <code>class~="pastoral"</code> as follows:</p>
    <pre>
*.pastoral { color: green }  /* all elements with class~=pastoral */
</pre>

    <p>or just</p>
    <pre>
.pastoral { color: green }  /* all elements with class~=pastoral */
</pre>

    <p>The following assigns style only to H1 elements with
    <code>class~="pastoral"</code>:</p>
    <pre>
H1.pastoral { color: green }  /* H1 elements with class~=pastoral */
</pre>

    <p>Given these rules, the first <code>H1</code> instance below would not have green
    text, while the second would:</p>
    <pre>
&lt;H1&gt;Not green&lt;/H1&gt;
&lt;H1 class="pastoral"&gt;Very green&lt;/H1&gt;
</pre>

    <p>The following rule matches any <code>P</code> element whose <code>class</code>
    attribute has been assigned a list of <a href="#whitespace">whitespace</a>-separated
    values that includes both <code>pastoral</code> and <code>marine</code>:</p>
    <pre>
p.pastoral.marine { color: green }
</pre>

    <p>This rule matches when <code>class="pastoral blue aqua marine"</code> but does not
    match for <code>class="pastoral blue"</code>.</p>
  </div>

  <p class="note"><strong>Note:</strong> Because CSS gives considerable power to the
  "class" attribute, authors could conceivably design their own "document language" based
  on elements with almost no associated presentation (such as <code>DIV</code> and
  <code>SPAN</code> in HTML) and assigning style information through the "class"
  attribute. Authors should avoid this practice since the structural elements of a
  document language often have recognized and accepted meanings and author-defined
  classes may not.</p>

  <p class="note"><strong>Note:</strong> If an element has multiple class attributes,
  their values must be concatenated with spaces between the values before searching for
  the class. As of this time the working group is not aware of any manner in which this
  situation can be reached, however, so this behavior is explicitly non-normative in this
  specification.</p>

  <h3 id="id-selectors"><span class="secno">6.5.</span> ID selectors</h3>

  <p>Document languages may contain attributes that are declared to be of type ID. What
  makes attributes of type ID special is that no two such attributes can have the same
  value in a conformant document, regardless of the type of the elements that carry them;
  whatever the document language, an ID typed attribute can be used to uniquely identify
  its element. In HTML all ID attributes are named "id"; XML applications may name ID
  attributes differently, but the same restriction applies.</p>

  <p>An ID-typed attribute of a document language allows authors to assign an identifier
  to one element instance in the document tree. An ID selector contains a "number sign"
  (U+0023, <code>#</code>) immediately followed by the ID value, which must be an CSS
  <a href="http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier">identifiers</a>.
  An ID selector represents an element instance that has an identifier that matches the
  identifier in the ID selector.</p>

  <p>Selectors does not specify how a UA knows the ID-typed attribute of an element. The
  UA may, e.g., read a document's DTD, have the information hard-coded or ask the
  user.</p>

  <div class="example">
    <p>Examples:</p>

    <p>The following ID selector represents an <code>h1</code> element whose ID-typed
    attribute has the value "chapter1":</p>
    <pre>
h1#chapter1
</pre>

    <p>The following ID selector represents any element whose ID-typed attribute has the
    value "chapter1":</p>
    <pre>
#chapter1
</pre>

    <p>The following selector represents any element whose ID-typed attribute has the
    value "z98y".</p>
    <pre>
*#z98y
</pre>
  </div>

  <p class="note"><strong>Note:</strong> In XML 1.0 <a href="#XML10" rel=
 "biblioentry">[XML10]<!--{{XML10}}--></a>, the information about which attribute
  contains an element's IDs is contained in a DTD or a schema. When parsing XML, UAs do
  not always read the DTD, and thus may not know what the ID of an element is (though a
  UA may have namespace-specific knowledge that allows it to determine which attribute is
  the ID attribute for that namespace). If a style sheet author knows or suspects that a
  UA may not know what the ID of an element is, he should use normal attribute selectors
  instead: <code>[name=p371]</code> instead of <code>#p371</code>.</p>

  <p>If an element has multiple ID attributes, all of them must be treated as IDs for
  that element for the purposes of the ID selector. Such a situation could be reached
  using mixtures of xml:id, DOM3 Core, XML DTDs, and namespace-specific knowledge.</p>

  <h3 id="pseudo-classes"><span class="secno">6.6.</span> Pseudo-classes</h3>

  <p>The pseudo-class concept is introduced to permit selection based on information that
  lies outside of the document tree or that cannot be expressed using the other simple
  selectors.</p>

  <p>A pseudo-class always consists of a "colon" (<code>:</code>) followed by the name of
  the pseudo-class and optionally by a value between parentheses.</p>

  <p>Pseudo-classes are allowed in all sequences of simple selectors contained in a
  selector. Pseudo-classes are allowed anywhere in sequences of simple selectors, after
  the leading type selector or universal selector (possibly omitted). Pseudo-class names
  are case-insensitive. Some pseudo-classes are mutually exclusive, while others can be
  applied simultaneously to the same element. Pseudo-classes may be dynamic, in the sense
  that an element may acquire or lose a pseudo-class while a user interacts with the
  document.</p>

  <h4 id="dynamic-pseudos"><span class="secno">6.6.1.</span> Dynamic pseudo-classes</h4>

  <p>Dynamic pseudo-classes classify elements on characteristics other than their name,
  attributes, or content, in principle characteristics that cannot be deduced from the
  document tree.</p>

  <p>Dynamic pseudo-classes do not appear in the document source or document tree.</p>

  <h5 id="the-link-pseudo-classes-link-and-visited"><span class="secno">6.6.1.1.</span>
  The <a name="link" id="link">link pseudo-classes: :link and :visited</a></h5>

  <p>User agents commonly display unvisited links differently from previously visited
  ones. Selectors provides the pseudo-classes <code>:link</code> and
  <code>:visited</code> to distinguish them:</p>

<script>
var bindTrigger     = $('.bind-trigger');
var delegateTrigger = $('.delegate-trigger');
$('.bind-trigger').on('click', function() {});
$(document).on('click', '.delegate-trigger', function() {});
</script>
<script>
Benchmark.prototype.setup = function() {
    var handler = function() {};
    $('.bind-trigger').on('click', handler);
    $(document).on('click', '.delegate-trigger', handler);
};

Benchmark.prototype.teardown = function() {
    $('.bind-setup').off('click', handler);
    $(document).off('click', '.delegate-setup', handler);
   
};
</script>

Preparation code output

W3C

Selectors Level 3

W3C Recommendation 29 September 2011

This version:
http://www.w3.org/TR/2011/REC-css3-selectors-20110929/
Latest version:
http://www.w3.org/TR/css3-selectors/
Latest Selectors specification:
http://www.w3.org/TR/selectors/
Previous version:
http://www.w3.org/TR/2009/PR-css3-selectors-20091215/
Editors:
Tantek Çelik (Invited Expert)
Elika J. Etemad (Invited Expert)
Daniel Glazman (Disruptive Innovations SARL)
Ian Hickson (Google)
Peter Linss (former editor, Netscape/AOL)
John Williams (former editor, Quark, Inc.)

Please refer to the errata for this document, which may include some normative corrections.

See also translations.


Abstract

Selectors are patterns that match against elements in a tree, and as such form one of several technologies that can be used to select nodes in an XML document. Selectors have been optimized for use with HTML and XML, and are designed to be usable in performance-critical code.

CSS (Cascading Style Sheets) is a language for describing the rendering of HTML and XML documents on screen, on paper, in speech, etc. CSS uses Selectors for binding style properties to elements in the document.

This document describes the selectors that already exist in CSS1 [CSS1] and CSS2 [CSS21] , and further introduces new selectors for CSS3 and other languages that may need them.

Selectors define the following function:

expression ∗ element → boolean

That is, given an element and a selector, this specification defines whether that element matches the selector.

These expressions can also be used, for instance, to select a set of elements, or a single element from a set of elements, by evaluating the expression across all the elements in a subtree. STTS (Simple Tree Transformation Sheets), a language for transforming XML trees, uses this mechanism. [STTS3]

Status of this document

This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at http://www.w3.org/TR/.

This document was produced by the CSS Working Group as a Proposed Recommendation.

A W3C Recommendation is a mature document that has been widely reviewed and has been shown to be implementable. W3C encourages everybody to implement this specification. Comments may be sent to the (archived) public mailing list www-style@w3.org (see instructions). When sending e-mail, please put the text “css3-selectors” in the subject, preferably like this: “[css3-selectors] …summary of comment…

This document has been reviewed by W3C Members, by software developers, and by other W3C groups and interested parties, and is endorsed by the Director as a W3C Recommendation. It is a stable document and may be used as reference material or cited from another document. W3C's role in making the Recommendation is to draw attention to the specification and to promote its widespread deployment. This enhances the functionality and interoperability of the Web.

This document was produced by a group operating under the 5 February 2004 W3C Patent Policy. W3C maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy.

A separate implementation report contains a test suite and shows several implementations of the specification.

This document is the same as the previous, Proposed Recommendation version, except for editorial changes to the front matter, and updating of references.

Table of Contents

1. Introduction

Selectors Level 1 and Selectors Level 2 are defined as the subsets of selector functionality defined in the CSS1 and CSS2.1 specifications, respectively.

1.1. Dependencies

Some features of this specification are specific to CSS, or have particular limitations or rules specific to CSS. In this specification, these have been described in terms of CSS2.1. [CSS21]

1.2. Terminology

All of the text of this specification is normative except examples, notes, and sections explicitly marked as non-normative.

Additional terminology is defined in the Definitions section of [CSS21]. Examples of document source code and fragments are given in XML [[XML10] or HTML [[HTML40]] syntax.

1.3. Changes from CSS2

This section is non-normative.

The main differences between the selectors in CSS2 and those in Selectors are:

  • the list of basic definitions (selector, group of selectors, simple selector, etc.) has been changed; in particular, what was referred to in CSS2 as a simple selector is now called a sequence of simple selectors, and the term "simple selector" is now used for the components of this sequence
  • an optional namespace component is now allowed in element type selectors, the universal selector and attribute selectors
  • a new combinator has been introduced
  • new simple selectors including substring matching attribute selectors, and new pseudo-classes
  • new pseudo-elements, and introduction of the "::" convention for pseudo-elements
  • the grammar has been rewritten
  • profiles to be added to specifications integrating Selectors and defining the set of selectors which is actually supported by each specification
  • Selectors are now a CSS3 Module and an independent specification; other specifications can now refer to this document independently of CSS
  • the specification now has its own test suite

2. Selectors

This section is non-normative, as it merely summarizes the following sections.

A Selector represents a structure. This structure can be used as a condition (e.g. in a CSS rule) that determines which elements a selector matches in the document tree, or as a flat description of the HTML or XML fragment corresponding to that structure.

Selectors may range from simple element names to rich contextual representations.

The following table summarizes the Selector syntax:

Pattern Meaning Described in section First defined in CSS level
* any element Universal selector 2
E an element of type E Type selector 1
E[foo] an E element with a "foo" attribute Attribute selectors 2
E[foo="bar"] an E element whose "foo" attribute value is exactly equal to "bar" Attribute selectors 2
E[foo~="bar"] an E element whose "foo" attribute value is a list of whitespace-separated values, one of which is exactly equal to "bar" Attribute selectors 2
E[foo^="bar"] an E element whose "foo" attribute value begins exactly with the string "bar" Attribute selectors 3
E[foo$="bar"] an E element whose "foo" attribute value ends exactly with the string "bar" Attribute selectors 3
E[foo*="bar"] an E element whose "foo" attribute value contains the substring "bar" Attribute selectors 3
E[foo|="en"] an E element whose "foo" attribute has a hyphen-separated list of values beginning (from the left) with "en" Attribute selectors 2
E:root an E element, root of the document Structural pseudo-classes 3
E:nth-child(n) an E element, the n-th child of its parent Structural pseudo-classes 3
E:nth-last-child(n) an E element, the n-th child of its parent, counting from the last one Structural pseudo-classes 3
E:nth-of-type(n) an E element, the n-th sibling of its type Structural pseudo-classes 3
E:nth-last-of-type(n) an E element, the n-th sibling of its type, counting from the last one Structural pseudo-classes 3
E:first-child an E element, first child of its parent Structural pseudo-classes 2
E:last-child an E element, last child of its parent Structural pseudo-classes 3
E:first-of-type an E element, first sibling of its type Structural pseudo-classes 3
E:last-of-type an E element, last sibling of its type Structural pseudo-classes 3
E:only-child an E element, only child of its parent Structural pseudo-classes 3
E:only-of-type an E element, only sibling of its type Structural pseudo-classes 3
E:empty an E element that has no children (including text nodes) Structural pseudo-classes 3
E:link
E:visited
an E element being the source anchor of a hyperlink of which the target is not yet visited (:link) or already visited (:visited) The link pseudo-classes 1
E:active
E:hover
E:focus
an E element during certain user actions The user action pseudo-classes 1 and 2
E:target an E element being the target of the referring URI The target pseudo-class 3
E:lang(fr) an element of type E in language "fr" (the document language specifies how language is determined) The :lang() pseudo-class 2
E:enabled
E:disabled
a user interface element E which is enabled or disabled The UI element states pseudo-classes 3
E:checked a user interface element E which is checked (for instance a radio-button or checkbox) The UI element states pseudo-classes 3
E::first-line the first formatted line of an E element The ::first-line pseudo-element 1
E::first-letter the first formatted letter of an E element The ::first-letter pseudo-element 1
E::before generated content before an E element The ::before pseudo-element 2
E::after generated content after an E element The ::after pseudo-element 2
E.warning an E element whose class is "warning" (the document language specifies how class is determined). Class selectors 1
E#myid an E element with ID equal to "myid". ID selectors 1
E:not(s) an E element that does not match simple selector s Negation pseudo-class 3
E F an F element descendant of an E element Descendant combinator 1
E > F an F element child of an E element Child combinator 2
E + F an F element immediately preceded by an E element Adjacent sibling combinator 2
E ~ F an F element preceded by an E element General sibling combinator 3

The meaning of each selector is derived from the table above by prepending "matches" to the contents of each cell in the "Meaning" column.

3. Case sensitivity

All Selectors syntax is case-insensitive within the ASCII range (i.e. [a-z] and [A-Z] are equivalent), except for parts that are not under the control of Selectors. The case sensitivity of document language element names, attribute names, and attribute values in selectors depends on the document language. For example, in HTML, element names are case-insensitive, but in XML, they are case-sensitive. Case sensitivity of namespace prefixes is defined in [CSS3NAMESPACE].

4. Selector syntax

A selector is a chain of one or more sequences of simple selectors separated by combinators. One pseudo-element may be appended to the last sequence of simple selectors in a selector.

A sequence of simple selectors is a chain of simple selectors that are not separated by a combinator. It always begins with a type selector or a universal selector. No other type selector or universal selector is allowed in the sequence.

A simple selector is either a type selector, universal selector, attribute selector, class selector, ID selector, or pseudo-class.

Combinators are: whitespace, "greater-than sign" (U+003E, >), "plus sign" (U+002B, +) and "tilde" (U+007E, ~). White space may appear between a combinator and the simple selectors around it. Only the characters "space" (U+0020), "tab" (U+0009), "line feed" (U+000A), "carriage return" (U+000D), and "form feed" (U+000C) can occur in whitespace. Other space-like characters, such as "em-space" (U+2003) and "ideographic space" (U+3000), are never part of whitespace.

The elements of a document tree that are represented by a selector are the subjects of the selector. A selector consisting of a single sequence of simple selectors represents any element satisfying its requirements. Prepending another sequence of simple selectors and a combinator to a sequence imposes additional matching constraints, so the subjects of a selector are always a subset of the elements represented by the last sequence of simple selectors.

An empty selector, containing no sequence of simple selectors and no pseudo-element, is an invalid selector.

Characters in Selectors can be escaped with a backslash according to the same escaping rules as CSS. [CSS21].

Certain selectors support namespace prefixes. The mechanism by which namespace prefixes are declared should be specified by the language that uses Selectors. If the language does not specify a namespace prefix declaration mechanism, then no prefixes are declared. In CSS, namespace prefixes are declared with the @namespace rule. [CSS3NAMESPACE]

5. Groups of selectors

A comma-separated list of selectors represents the union of all elements selected by each of the individual selectors in the list. (A comma is U+002C.) For example, in CSS when several selectors share the same declarations, they may be grouped into a comma-separated list. White space may appear before and/or after the comma.

CSS example:

In this example, we condense three rules with identical declarations into one. Thus,

h1 { font-family: sans-serif }
h2 { font-family: sans-serif }
h3 { font-family: sans-serif }

is equivalent to:

h1, h2, h3 { font-family: sans-serif }

Warning: the equivalence is true in this example because all the selectors are valid selectors. If just one of these selectors were invalid, the entire group of selectors would be invalid. This would invalidate the rule for all three heading elements, whereas in the former case only one of the three individual heading rules would be invalidated.

Invalid CSS example:

h1 { font-family: sans-serif }
h2..foo { font-family: sans-serif }
h3 { font-family: sans-serif }

is not equivalent to:

h1, h2..foo, h3 { font-family: sans-serif }

because the above selector (h1, h2..foo, h3) is entirely invalid and the entire style rule is dropped. (When the selectors are not grouped, only the rule for h2..foo is dropped.)

6. Simple selectors

6.1. Type selector

A type selector is the name of a document language element type written using the syntax of CSS qualified names [CSS3NAMESPACE]. A type selector represents an instance of the element type in the document tree.

Example:

The following selector represents an h1 element in the document tree:

h1

6.1.1. Type selectors and namespaces

Type selectors allow an optional namespace component: a namespace prefix that has been previously declared may be prepended to the element name separated by the namespace separator "vertical bar" (U+007C, |). (See, e.g., [XML-NAMES] for the use of namespaces in XML.)

The namespace component may be left empty (no prefix before the namespace separator) to indicate that the selector is only to represent elements with no namespace.

An asterisk may be used for the namespace prefix, indicating that the selector represents elements in any namespace (including elements with no namespace).

Element type selectors that have no namespace component (no namespace separator) represent elements without regard to the element's namespace (equivalent to "*|") unless a default namespace has been declared for namespaced selectors (e.g. in CSS, in the style sheet). If a default namespace has been declared, such selectors will represent only elements in the default namespace.

A type selector containing a namespace prefix that has not been previously declared for namespaced selectors is an invalid selector.

In a namespace-aware client, the name part of element type selectors (the part after the namespace separator, if it is present) will only match against the local part of the element's qualified name.

In summary:

ns|E
elements with name E in namespace ns
*|E
elements with name E in any namespace, including those without a namespace
|E
elements with name E without a namespace
E
if no default namespace has been declared for selectors, this is equivalent to *|E. Otherwise it is equivalent to ns|E where ns is the default namespace.

CSS examples:

@namespace foo url(http://www.example.com);
 foo|h1 { color: blue }  /* first rule */
 foo|* { color: yellow } /* second rule */
 |h1 { color: red }      /* ...*/
 *|h1 { color: green }
 h1 { color: green }

The first rule (not counting the @namespace at-rule) will match only h1 elements in the "http://www.example.com" namespace.

The second rule will match all elements in the "http://www.example.com" namespace.

The third rule will match only h1 elements with no namespace.

The fourth rule will match h1 elements in any namespace (including those without any namespace).

The last rule is equivalent to the fourth rule because no default namespace has been defined.

6.2. Universal selector

The universal selector, written as a CSS qualified name [CSS3NAMESPACE] with an asterisk (* U+002A) as the local name, represents the qualified name of any element type. It represents any single element in the document tree in any namespace (including those without a namespace) if no default namespace has been specified for selectors. If a default namespace has been specified, see Universal selector and Namespaces below.

If a universal selector represented by * (i.e. without a namespace prefix) is not the only component of a sequence of simple selectors selectors or is immediately followed by a pseudo-element, then the * may be omitted and the universal selector's presence implied.

Examples:

  • *[hreflang|=en] and [hreflang|=en] are equivalent,
  • *.warning and .warning are equivalent,
  • *#myid and #myid are equivalent.

Note: it is recommended that the * not be omitted, because it decreases the potential confusion between, for example, div :first-child and div:first-child. Here, div *:first-child is more readable.

6.2.1. Universal selector and namespaces

The universal selector allows an optional namespace component. It is used as follows:

ns|*
all elements in namespace ns
*|*
all elements
|*
all elements without a namespace
*
if no default namespace has been specified, this is equivalent to *|*. Otherwise it is equivalent to ns|* where ns is the default namespace.

A universal selector containing a namespace prefix that has not been previously declared is an invalid selector.

6.3. Attribute selectors

Selectors allow the representation of an element's attributes. When a selector is used as an expression to match against an element, attribute selectors must be considered to match an element if that element has an attribute that matches the attribute represented by the attribute selector.

6.3.1. Attribute presence and value selectors

CSS2 introduced four attribute selectors:

[att]
Represents an element with the att attribute, whatever the value of the attribute.
[att=val]
Represents an element with the att attribute whose value is exactly "val".
[att~=val]
Represents an element with the att attribute whose value is a whitespace-separated list of words, one of which is exactly "val". If "val" contains whitespace, it will never represent anything (since the words are separated by spaces). Also if "val" is the empty string, it will never represent anything.
[att|=val]
Represents an element with the att attribute, its value either being exactly "val" or beginning with "val" immediately followed by "-" (U+002D). This is primarily intended to allow language subcode matches (e.g., the hreflang attribute on the a element in HTML) as described in BCP 47 ([BCP47]) or its successor. For lang (or xml:lang) language subcode matching, please see the :lang pseudo-class.

Attribute values must be CSS identifiers or strings. [CSS21] The case-sensitivity of attribute names and values in selectors depends on the document language.

Examples:

The following attribute selector represents an h1 element that carries the title attribute, whatever its value:

h1[title]

In the following example, the selector represents a span element whose class attribute has exactly the value "example":

span[class="example"]

Multiple attribute selectors can be used to represent several attributes of an element, or several conditions on the same attribute. Here, the selector represents a span element whose hello attribute has exactly the value "Cleveland" and whose goodbye attribute has exactly the value "Columbus":

span[hello="Cleveland"][goodbye="Columbus"]

The following CSS rules illustrate the differences between "=" and "~=". The first selector would match, for example, an a element with the value "copyright copyleft copyeditor" on a rel attribute. The second selector would only match an a element with an href attribute having the exact value "http://www.w3.org/".

a[rel~="copyright"] { ... }
a[href="http://www.w3.org/"] { ... }

The following selector represents an a element whose hreflang attribute is exactly "fr".

a[hreflang=fr]

The following selector represents an a element for which the value of the hreflang attribute begins with "en", including "en", "en-US", and "en-scouse":

a[hreflang|="en"]

The following selectors represent a DIALOGUE element whenever it has one of two different values for an attribute character:

DIALOGUE[character=romeo]
DIALOGUE[character=juliet]

6.3.2. Substring matching attribute selectors

Three additional attribute selectors are provided for matching substrings in the value of an attribute:

[att^=val]
Represents an element with the att attribute whose value begins with the prefix "val". If "val" is the empty string then the selector does not represent anything.
[att$=val]
Represents an element with the att attribute whose value ends with the suffix "val". If "val" is the empty string then the selector does not represent anything.
[att*=val]
Represents an element with the att attribute whose value contains at least one instance of the substring "val". If "val" is the empty string then the selector does not represent anything.

Attribute values must be CSS identifiers or strings. [CSS21] The case-sensitivity of attribute names in selectors depends on the document language.

Examples:

The following selector represents an HTML object, referencing an image:

object[type^="image/"]

The following selector represents an HTML anchor a with an href attribute whose value ends with ".html".

a[href$=".html"]

The following selector represents an HTML paragraph with a title attribute whose value contains the substring "hello"

p[title*="hello"]

6.3.3. Attribute selectors and namespaces

The attribute name in an attribute selector is given as a CSS qualified name: a namespace prefix that has been previously declared may be prepended to the attribute name separated by the namespace separator "vertical bar" (|). In keeping with the Namespaces in the XML recommendation, default namespaces do not apply to attributes, therefore attribute selectors without a namespace component apply only to attributes that have no namespace (equivalent to "|attr"; these attributes are said to be in the "per-element-type namespace partition"). An asterisk may be used for the namespace prefix indicating that the selector is to match all attribute names without regard to the attribute's namespace.

An attribute selector with an attribute name containing a namespace prefix that has not been previously declared is an invalid selector.

CSS examples:

@namespace foo "http://www.example.com";
[foo|att=val] { color: blue }
[*|att] { color: yellow }
[|att] { color: green }
[att] { color: green }

The first rule will match only elements with the attribute att in the "http://www.example.com" namespace with the value "val".

The second rule will match only elements with the attribute att regardless of the namespace of the attribute (including no namespace).

The last two rules are equivalent and will match only elements with the attribute att where the attribute is not in a namespace.

6.3.4. Default attribute values in DTDs

Attribute selectors represent attribute values in the document tree. How that document tree is constructed is outside the scope of Selectors. In some document formats default attribute values can be defined in a DTD or elsewhere, but these can only be selected by attribute selectors if they appear in the document tree. Selectors should be designed so that they work whether or not the default values are included in the document tree.

For example, a XML UA may, but is not required to read an "external subset" of the DTD but is required to look for default attribute values in the document's "internal subset." (See, e.g., [XML10] for definitions of these subsets.) Depending on the UA, a default attribute value defined in the external subset of the DTD might or might not appear in the document tree.

A UA that recognizes an XML namespace may, but is not required to use its knowledge of that namespace to treat default attribute values as if they were present in the document. (For example, an XHTML UA is not required to use its built-in knowledge of the XHTML DTD. See, e.g., [XML-NAMES] for details on namespaces in XML 1.0.)

Note: Typically, implementations choose to ignore external subsets. This corresponds to the behaviour of non-validating processors as defined by the XML specification.

Example:

Consider an element EXAMPLE with an attribute radix that has a default value of "decimal". The DTD fragment might be

<!ATTLIST EXAMPLE radix (decimal,octal) "decimal">

If the style sheet contains the rules

EXAMPLE[radix=decimal] { /*... default property settings ...*/ }
EXAMPLE[radix=octal]   { /*... other settings...*/ }

the first rule might not match elements whose radix attribute is set by default, i.e. not set explicitly. To catch all cases, the attribute selector for the default value must be dropped:

EXAMPLE                { /*... default property settings ...*/ }
EXAMPLE[radix=octal]   { /*... other settings...*/ }

Here, because the selector EXAMPLE[radix=octal] is more specific than the type selector alone, the style declarations in the second rule will override those in the first for elements that have a radix attribute value of "octal". Care has to be taken that all property declarations that are to apply only to the default case are overridden in the non-default cases' style rules.

6.4. Class selectors

Working with HTML, authors may use the "period" notation (also known as "full stop", U+002E, .) as an alternative to the ~= notation when representing the class attribute. Thus, for HTML, div.value and div[class~=value] have the same meaning. The attribute value must immediately follow the full stop (.).

UAs may apply selectors using the period (.) notation in XML documents if the UA has namespace-specific knowledge that allows it to determine which attribute is the "class" attribute for the respective namespace. One such example of namespace-specific knowledge is the prose in the specification for a particular namespace (e.g. SVG 1.0 [SVG11] describes the SVG class attribute and how a UA should interpret it, and similarly MathML 1.01 [MATHML] describes the MathML class attribute.)

CSS examples:

We can assign style information to all elements with class~="pastoral" as follows:

*.pastoral { color: green }  /* all elements with class~=pastoral */

or just

.pastoral { color: green }  /* all elements with class~=pastoral */

The following assigns style only to H1 elements with class~="pastoral":

H1.pastoral { color: green }  /* H1 elements with class~=pastoral */

Given these rules, the first H1 instance below would not have green text, while the second would:

<H1>Not green</H1>
<H1 class="pastoral">Very green</H1>

The following rule matches any P element whose class attribute has been assigned a list of whitespace-separated values that includes both pastoral and marine:

p.pastoral.marine { color: green }

This rule matches when class="pastoral blue aqua marine" but does not match for class="pastoral blue".

Note: Because CSS gives considerable power to the "class" attribute, authors could conceivably design their own "document language" based on elements with almost no associated presentation (such as DIV and SPAN in HTML) and assigning style information through the "class" attribute. Authors should avoid this practice since the structural elements of a document language often have recognized and accepted meanings and author-defined classes may not.

Note: If an element has multiple class attributes, their values must be concatenated with spaces between the values before searching for the class. As of this time the working group is not aware of any manner in which this situation can be reached, however, so this behavior is explicitly non-normative in this specification.

6.5. ID selectors

Document languages may contain attributes that are declared to be of type ID. What makes attributes of type ID special is that no two such attributes can have the same value in a conformant document, regardless of the type of the elements that carry them; whatever the document language, an ID typed attribute can be used to uniquely identify its element. In HTML all ID attributes are named "id"; XML applications may name ID attributes differently, but the same restriction applies.

An ID-typed attribute of a document language allows authors to assign an identifier to one element instance in the document tree. An ID selector contains a "number sign" (U+0023, #) immediately followed by the ID value, which must be an CSS identifiers. An ID selector represents an element instance that has an identifier that matches the identifier in the ID selector.

Selectors does not specify how a UA knows the ID-typed attribute of an element. The UA may, e.g., read a document's DTD, have the information hard-coded or ask the user.

Examples:

The following ID selector represents an h1 element whose ID-typed attribute has the value "chapter1":

h1#chapter1

The following ID selector represents any element whose ID-typed attribute has the value "chapter1":

#chapter1

The following selector represents any element whose ID-typed attribute has the value "z98y".

*#z98y

Note: In XML 1.0 [XML10], the information about which attribute contains an element's IDs is contained in a DTD or a schema. When parsing XML, UAs do not always read the DTD, and thus may not know what the ID of an element is (though a UA may have namespace-specific knowledge that allows it to determine which attribute is the ID attribute for that namespace). If a style sheet author knows or suspects that a UA may not know what the ID of an element is, he should use normal attribute selectors instead: [name=p371] instead of #p371.

If an element has multiple ID attributes, all of them must be treated as IDs for that element for the purposes of the ID selector. Such a situation could be reached using mixtures of xml:id, DOM3 Core, XML DTDs, and namespace-specific knowledge.

6.6. Pseudo-classes

The pseudo-class concept is introduced to permit selection based on information that lies outside of the document tree or that cannot be expressed using the other simple selectors.

A pseudo-class always consists of a "colon" (:) followed by the name of the pseudo-class and optionally by a value between parentheses.

Pseudo-classes are allowed in all sequences of simple selectors contained in a selector. Pseudo-classes are allowed anywhere in sequences of simple selectors, after the leading type selector or universal selector (possibly omitted). Pseudo-class names are case-insensitive. Some pseudo-classes are mutually exclusive, while others can be applied simultaneously to the same element. Pseudo-classes may be dynamic, in the sense that an element may acquire or lose a pseudo-class while a user interacts with the document.

6.6.1. Dynamic pseudo-classes

Dynamic pseudo-classes classify elements on characteristics other than their name, attributes, or content, in principle characteristics that cannot be deduced from the document tree.

Dynamic pseudo-classes do not appear in the document source or document tree.

User agents commonly display unvisited links differently from previously visited ones. Selectors provides the pseudo-classes :link and :visited to distinguish them:

Test runner

Warning! For accurate results, please disable Firebug before running the tests. (Why?)

Java applet disabled.

Testing in unknown unknown
Test Ops/sec
bind setup
$('.bind-setup').on('click', handler);
pending…
delegation setup
$(document).on('.delegate-setup', '.pattern', handler);
pending…
bind trigger
bindTrigger.click()
pending…
delegate trigger
delegateTrigger.click()
pending…

You can edit these tests or add even more tests to this page by appending /edit to the URL.

Compare results of other browsers

0 comments

Add a comment