Czy mogę napisać selektor CSS wybierający elementy nie posiadające określonej klasy?

Chciałbym napisać regułę selektora CSS, która wybiera wszystkie elementy, które nie mają określonej klasy. Na przykład, biorąc pod uwagę następujący HTML:

<html class="printable">
    <body class="printable">
        <h1 class="printable">Example</h1>
        <nav>
            <!-- Some menu links... -->
        </nav>
        <a href="javascript:void(0)" onclick="javascript:self.print()">Print me!</a>
        <p class="printable">
            This page is super interresting and you should print it!
        </p>
    </body>
</html>

Chciałbym napisać selektor, który wybiera wszystkie elementy, które nie mają klasy "printable", które w tym przypadku są elementami nav i a.

Czy to możliwe?

Uwaga: w rzeczywistym HTML, w którym chciałbym tego użyć, będzie o wiele więcej elementów, które nie mają klasę "printable" niż zrobić (zdaję sobie sprawę, że jest odwrotnie w powyższym przykładzie).

Author: BoltClock, 2012-02-02

9 answers

Zazwyczaj dodaje się selektor klasy do pseudo-klasy :not() w ten sposób:

:not(.printable) {
    /* Styles */
}

Ale jeśli potrzebujesz lepszej obsługi przeglądarki (IE8 i starsze nie obsługują :not()), prawdopodobnie lepiej będzie stworzyć reguły stylu dla elementów, które mają klasę "printable". Jeśli nawet to nie jest wykonalne, pomimo tego, co mówisz o rzeczywistych marżach, być może będziesz musiał pracować nad marżami wokół tego ograniczenia.

Pamiętaj, że w zależności od właściwości, które ustawiasz w tej regule, niektóre z nich mogą być dziedziczone przez potomków, którzy .printable, lub w inny sposób wpływać na nich w ten czy inny sposób. Na przykład, chociaż display nie jest dziedziczone, ustawienie display: none na :not(.printable) uniemożliwi wyświetlanie go i wszystkich jego potomków, ponieważ całkowicie usuwa element i jego poddrzewo z układu. Często można to obejść, używając zamiast tego visibility: hidden, co pozwoli wyświetlać widoczne potomkinie, ale ukryte elementy nadal będą wpływać na układ tak, jak pierwotnie. Krótko mówiąc, Bądź ostrożny.

 651
Author: BoltClock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-09 13:14:14
:not([class])

W rzeczywistości wybierze to wszystko, co nie ma zastosowanej klasy css (class="css-selector").

Zrobiłem jsfiddle demo

    h2 {color:#fff}
    :not([class]) {color:red;background-color:blue}
    .fake-class {color:green}
    <h2 class="fake-class">fake-class will be green</h2>
    <h2 class="">empty class SHOULD be white</h2>
    <h2>no class should be red</h2>
    <h2 class="fake-clas2s">fake-class2 SHOULD be white</h2>
    <h2 class="">empty class2 SHOULD be white</h2>
    <h2>no class2 SHOULD be red</h2>

Czy to jest obsługiwane? tak : Caniuse.com [dostęp 25 sierpnia 2011] 2014):

  • wsparcie: 88.85%
  • częściowe poparcie: 4.36%
  • razem:93.21%

Funny edit, szukałam w Googlach przeciwieństwa: nie. Negacja CSS?

selector[class]  /* the oposite of :not[]*/
 137
Author: Milche Patern,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-28 01:59:01

The :not negacja pseudo Klasa

Pseudoklasa negacji CSS, :not(X), jest notacją funkcjonalną biorąc prosty selektor X jako argument. Pasuje do elementu, który nie jest reprezentowany przez argument. X nie może zawierać innego selektor negacji.

Możesz użyć :not, aby wykluczyć dowolny podzbiór dopasowanych elementów, uporządkowany tak, jak normalny selektor CSS.


Prosty przykład: wyłączenie przez Klasa

div:not(.class)

Wybierze wszystkie div elementy bez klasy .class

div:not(.class) {
  color: red;
}
<div>Make me red!</div>
<div class="class">...but not me...</div>

Przykład złożony: wykluczenie według typu / hierarchii

:not(div) > div

Wybierze wszystkie div elementy, które nie są potomkami innych div

div {
  color: black
}
:not(div) > div {
  color: red;
}
<div>Make me red!</div>
<div>
  <div>...but not me...</div>
</div>

Przykład złożony: łańcuchowanie pseudo selektorów

Z wyjątkiem braku możliwości łączenia/zagnieżdżania :not selektorów i pseudo elementy, można używać w połączeniu z innymi pseudo selektorami.

div {
  color: black
}
:not(:nth-child(2)){
  color: red;
}
<div>
  <div>Make me red!</div>
  <div>...but not me...</div>
</div>

Obsługa przeglądarki , itp.

:not jest selektor poziomu CSS3, głównym wyjątkiem pod względem wsparcia jest to, że jest to IE9+

Spec również czyni interesujący punkt:

Pseudo :not() pozwala na pisanie bezużytecznych selektorów. Na instancja :not(*|*), która nie reprezentuje żadnego elementu, lub foo:not(bar), co jest równoważne foo, ale z wyższym specyficzność.

 83
Author: SW4,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-02 12:43:25

Myślę, że to powinno zadziałać:

:not(.printable)

From " negative css selector " answer .

 16
Author: Eregrith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:16

Po prostu chciałbym dodać, że powyższe odpowiedzi: not() mogą być bardzo skuteczne w kątowych formach, zamiast tworzyć efekty lub dostosowywać widok / DOM,

input.ng-invalid:not(.ng-pristine) { ... your css here i.e. border-color: red; ...}

Zapewnia, że podczas ładowania strony pola wejściowe będą wyświetlać nieprawidłowe (czerwone obramowania lub tła itp.) tylko wtedy, gdy mają dodane dane (tzn. nie są już nieskazitelne), ale są nieprawidłowe.

 5
Author: BaneStar007,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-06 01:02:13

Przykład

  [class*='section-']:not(.section-name) {
    @include opacity(0.6);
    // Write your css code here
  }

/ / nieprzezroczystość 0.6 wszystkie " sekcja -", ale nie "nazwa sekcji"

 2
Author: Hakan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-21 06:35:27

Możesz użyć selektora :not(.class), jak wspomniano wcześniej.

Jeśli zależy ci na kompatybilności z Internet Explorerem, polecam użycie http://selectivizr.com/.

Ale pamiętaj, aby uruchomić go pod apache inaczej nie zobaczysz efektu.

 1
Author: MelkorNemesis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-09 16:07:32

Using the :not() pseudo class:

Do wybierania wszystkiego oprócz określonego elementu (lub elementów). Możemy użyć :not() CSS pseudo class . Pseudo klasa :not() wymaga selektora CSS jako argumentu. Selektor zastosuje style do wszystkich elementów z wyjątkiem elementów, które są określone jako argument.

Przykłady:

/* This query selects All div elements except for   */
div:not(.foo) {
  background-color: red;
}


/* Selects all hovered nav elements inside section element except
   for the nav elements which have the ID foo*/
section nav:hover:not(#foo) {
  background-color: red;
}


/* selects all li elements inside an ul which are not odd */
ul li:not(:nth-child(odd)) { 
  color: red;
}
<div>test</div>
<div class="foo">test</div>

<br>

<section>
  <nav id="foo">test</nav>
  <nav>Hover me!!!</nav>
</section>
<nav></nav>

<br>

<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
</ul>

Widzimy już potęgę tej pseudo klasy, pozwala nam to wygodnie dostrajamy nasze selektory, wykluczając pewne elementy. Ponadto ta pseudo Klasa zwiększa specyficzność selektora. Na przykład:

/* This selector has a higher specificity than the #foo below */
#foo:not(#bar) {
  color: red;
}

/* This selector is lower in the cascade but is overruled by the style above */
#foo {
  color: green;
}
<div id="foo">"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
  in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."</div>
 0
Author: Willem van der Veen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-18 18:22:56

Jak mówili inni, po prostu: nie(.klasy). Dla selektorów CSS, polecam odwiedzenie tego linku, to było bardzo pomocne w całej mojej podróży: https://code.tutsplus.com/tutorials/the-30-css-selectors-you-must-memorize--net-16048

  1. X: not (selektor)

    1. div: not (#container) {
    2. color: blue;
    3. }

Pseudo Klasa negacji jest szczególnie pomocna. Powiedzmy, że chcę wybrać wszystkie divy, z wyjątkiem taki, który ma identyfikator kontenera. Powyższy fragment doskonale poradzi sobie z tym zadaniem.

Lub, jeśli chciałem wybrać każdy pojedynczy element (nie zaleca się) z wyjątkiem znaczników akapitu, możemy zrobić:

1. *:not(p) {
2. color: green;
3. }
 -1
Author: HBhering,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-12 03:55:30