216

In CSS, * will match any element.

Frequently, *|* is used instead of * to match all elements. This is generally used for testing purposes.

What is the difference between * and *|* in CSS?

1

3 Answers 3

218

As per W3C Selector Spec:

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.

So, no * and *|* are not always the same. If a default name space is provided then * selects only elements that are part of that namespace.


You can visually see the differences using the below two snippets. In the first, a default namespace is defined and so the * selector applies the beige colored background only to the element which is part of that namsepace whereas the *|* applies the border to all elements.

@namespace "http://www.w3.org/2000/svg";

* {
  background: beige;
}
*|* {
  border: 1px solid;
}
<a href="#">This is some link</a>

<svg xmlns="http://www.w3.org/2000/svg">
  <a xlink:href="#">
    <text x="20" y="20">This is some link</text>
  </a>
</svg>

In the below snippet no default namespace is defined and so both * and *|* applies to all elements and so all of them get both the beige background and the black border. In other words, they work the same way when no default namespace is specified.

* {
  background: beige;
}
*|* {
  border: 1px solid;
}
<a href="#">This is some link</a>

<svg xmlns="http://www.w3.org/2000/svg">
  <a xlink:href="#">
    <text x="20" y="20">This is some link</text>
  </a>
</svg>


As BoltClock points out in comments (1,2), initially namespaces applied only to XML based languages such as XHTML, SVG etc but as per latest specs, all HTML elements (that is, elements in the HTML namespace) are namespaced to http://www.w3.org/1999/xhtml. Firefox follows this behavior and it is consistent across all HTML5 user agents. You can find more information in this answer.

3
  • 4
    Do namespaces apply only to XHTML or to HTML as well?
    – Flimm
    Commented Jan 26, 2016 at 14:44
  • 8
    @Flimm: Only XML-based languages, such as XHTML and SVG. But note that some browsers, like Firefox (not sure about others), apply the XHTML namespace even in text/html, for the purposes of CSS. See for example jsfiddle.net/BoltClock/5ta6yvvc, and for more info this answer.
    – BoltClock
    Commented Jan 26, 2016 at 16:19
  • 3
    Addendum - Firefox's behavior is by spec, and is consistent across all HTML5 user agents. All HTML elements (i.e. elements in the HTML namespace) are namespaced to http://www.w3.org/1999/xhtml
    – BoltClock
    Commented Jan 28, 2016 at 2:10
44

*|* represents the selector of "all elements in any namespace". According to W3C, the selector is divided into:

ns|E

Where ns is the namespace and E is the element. By default, no namespaces are declared. So unless a namespace is declared explicitly, *|* and * will select the same elements.

-4

In CSS, * will match any element.

| is used to match select specific elements. Both are selector used for our testing purpose

1
  • 3
    Can you provide an example?
    – Ky -
    Commented Jan 28, 2016 at 15:55

Not the answer you're looking for? Browse other questions tagged or ask your own question.