Movatterモバイル変換


[0]ホーム

URL:


  1. Web
  2. CSS
  3. Reference
  4. Selectors
  5. :not()

:not()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

The:not()CSSpseudo-class represents elements that do not match a list of selectors. Since it prevents specific items from being selected, it is known as thenegation pseudo-class.

Try it

p:not(.irrelevant) {  font-weight: bold;}p > strong,p > b.important {  color: crimson;}p > :not(strong, b.important) {  color: darkmagenta;}
<p>  <b>Mars</b> is one of the most Earth-like planets. <b>Mars</b> day is almost  the same as an Earth day, only <strong>37 minutes</strong> longer.</p><p>  <b>NASA</b>'s Jet <del>Momentum</del> Propulsion Laboratory  is designing mission concepts to survive the <b>Venus</b> extreme temperatures  and atmospheric pressure.</p>

The:not() pseudo-class has a number ofquirks, tricks, and unexpected results that you should be aware of before using it.

Syntax

css
:not(<complex-selector-list>) {  /* ... */}

Parameters

The:not() pseudo-class requires aselector list, a comma-separated list of one or more selectors, as its argument. The list must not contain apseudo-element, but any other simple, compound, and complex selectors are allowed.

Description

There are several unusual effects and outcomes when using:not() that you should keep in mind when using it:

  • Useless selectors can be written using this pseudo-class. For example,:not(*) matches any element which is not an element, which is obviously nonsense, so the accompanying rule will never be applied.
  • This pseudo-class can increase thespecificity of a rule. For example,#foo:not(#bar) will match the same element as the simpler#foo, but has the higher specificity of twoid selectors.
  • The specificity of the:not() pseudo-class is replaced by the specificity of the most specific selector in its comma-separated argument of selectors; providing the same specificity as if it had been written:not(:is(argument)).
  • :not(.foo) will match anything that isn't.foo,including<html> and<body>.
  • This selector will match everything that is "not an X". This may be surprising when used withdescendant combinators, since there are multiple paths to select a target element. For instance,body :not(table) a will still apply to links inside a<table>, since<tr>,<tbody>,<th>,<td>,<caption>, etc. can all match the:not(table) part of the selector. To avoid this, you can usebody a:not(table a) instead, which will only apply to links that are not descendants of a table.
  • You can negate several selectors at the same time. Example::not(.foo, .bar) is equivalent to:not(.foo):not(.bar).
  • If any selector passed to the:not() pseudo-class is invalid or not supported by the browser, the whole rule will be invalidated. The effective way to overcome this behavior is to use:is() pseudo-class, which accepts a forgiving selector list. For example:not(.foo, :invalid-pseudo-class) will invalidate a whole rule, but:not(:is(.foo, :invalid-pseudo-class)) will match any (including<html> and<body>) element that isn't.foo.

Examples

Using :not() with valid selectors

This example shows a few ways of using:not().

HTML

html
<p>I am a paragraph.</p><p>I am so very fancy!</p><div>I am NOT a paragraph.</div><h2>  <span>foo inside h2</span>  <span>bar inside h2</span></h2>

CSS

css
.fancy {  text-shadow: 2px 2px 3px gold;}/* <p> elements that don't have a class `.fancy` */p:not(.fancy) {  color: green;}/* Elements that are not <p> elements */body :not(p) {  text-decoration: underline;}/* Elements that are not <div>s or `.fancy` */body :not(div):not(.fancy) {  font-weight: bold;}/* Elements that are not <div>s or `.fancy` */body :not(div, .fancy) {  text-decoration: overline underline;}/* Elements inside an <h2> that aren't a <span> with a class of `.foo` */h2 :not(span.foo) {  color: red;}

Result

Using :not() with invalid selectors

This example shows the use of:not() with invalid selectors and how to prevent invalidation.

HTML

html
<p>I am a paragraph with .foo</p><p>I am a paragraph with .bar</p><div>I am a div without a class</div><div>I am a div with .foo</div><div>I am a div with .bar</div><div>I am a div with .foo and .bar</div>

CSS

css
/* Invalid rule, does nothing */p:not(.foo, :invalid-pseudo-class) {  color: red;  font-style: italic;}/* Select all <p> elements without the `foo` class */p:not(:is(.foo, :invalid-pseudo-class)) {  color: green;  border-top: dotted thin currentColor;}/* Select all <div> elements without the `foo` or the `bar` class */div:not(.foo, .bar) {  color: red;  font-style: italic;}/* Select all <div> elements without the `foo` or the `bar` class */div:not(:is(.foo, .bar)) {  border-bottom: dotted thin currentColor;}

Result

Thep:not(.foo, :invalid-pseudo-class) rule is invalid because it contains an invalid selector. The:is() pseudo-class accepts a forgiving selector list, so the:is(.foo, :invalid-pseudo-class) rule is valid and equivalent to:is(.foo). Thus, thep:not(:is(.foo, :invalid-pseudo-class)) rule is valid and equivalent top:not(.foo).

If:invalid-pseudo-class was a valid selector, the first two rules above would still be equivalent (the last two rules showcase that). The use of:is() makes the rule more robust.

Specifications

Specification
Selectors Level 4
# negation

Browser compatibility

See also

Help improve MDN

Learn how to contribute

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2026 Movatter.jp