¿Puedo escribir un selector CSS seleccionando elementos QUE NO tienen una clase determinada?


Me gustaría escribir una regla selector CSS que selecciona todos los elementos que no tienen una clase determinada. Por ejemplo, dado el siguiente 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>

Me gustaría escribir un selector que seleccione todos los elementos que no tienen la clase "imprimible" que, en este caso, son los elementos nav y a.

Es esto posible?

NOTA: en el HTML real donde me gustaría usar esto, va a haber muchos más elementos que no tenga la clase "imprimible" que hacer (me doy cuenta de que es al revés en el ejemplo anterior).

Author: BoltClock, 2012-02-02

9 answers

Normalmente se agrega un selector de clase a la pseudo-clase :not() de la siguiente manera:

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

Pero si necesita un mejor soporte del navegador (IE8 y anteriores no soportan :not()), probablemente sea mejor crear reglas de estilo para elementos que hacen tienen la clase "imprimible". Si incluso eso no es factible a pesar de lo que dices sobre tu marcado real, es posible que tengas que trabajar tu marcado alrededor de esa limitación.

Tenga en cuenta que, dependiendo de las propiedades que esté configurando en esta regla, algunos de ellos pueden ser heredados por descendientes que son .printable, o de otra manera afectarlos de una manera u otra. Por ejemplo, aunque display no es heredado, establecer display: none en un :not(.printable) evitará que él y todos sus descendientes se muestren, ya que elimina el elemento y su subárbol del diseño por completo. A menudo puede evitar esto usando visibility: hidden en su lugar, lo que permitirá que se muestren los descendientes visibles, pero los elementos ocultos seguirán afectando al diseño como lo hicieron originalmente. En resumen, ten cuidado.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-09 13:14:14
:not([class])

En realidad, esto seleccionará cualquier cosa que no tenga una clase css (class="css-selector") aplicada a ella.

Hice un 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>

¿Es esto compatible? Sí : Caniuse.com (accessed 25 Aug 2014):

  • Soporte: 88.85%
  • Soporte parcial: 4.36%
  • Total: 93,21%

Divertido editar, yo estaba buscando en Google lo contrario de :no. CSS negación?

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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-28 01:59:01

El :not pseudo clase de negación

La pseudo-clase CSS de negación, :not(X), es una notación funcional tomando un selector simple X como argumento. Coincide con un elemento que no está representado por el argumento. X no debe contener otro selector de negación.

Puede usar :not para excluir cualquier subconjunto de elementos coincidentes, ordenados como lo haría con los selectores CSS normales.


Ejemplo simple: excluir por clase

div:not(.class)

Seleccionaría todos los elementos div sin la clase .class

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

Ejemplo complejo: exclusión por tipo / jerarquía

:not(div) > div

Seleccionaría todos los elementos div que no son hijos de otro div

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

Ejemplo complejo: encadenamiento de pseudo selectores

Con la notable excepción de no poder encadenar/anidar :not selectores y pseudo elementos, se puede utilizar junto con otros pseudo selectores.

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

Soporte del navegador, etc.

:not es un CSS3 selector de nivel, la principal excepción en términos de apoyo es que es IE9+

La especificación también hace un punto interesante:

El pseudo :not() permite escribir selectores inútiles. Para instance :not(*|*), que no representa ningún elemento en absoluto, o foo:not(bar), que es equivalente a foo pero con una mayor especificidad.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-02 12:43:25

Creo que esto debería funcionar:

:not(.printable)

Desde respuesta"selector css negativo" .

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:16

Al igual que contribuir que las respuestas anteriores de: not () pueden ser muy eficaces en formas angulares, en lugar de crear efectos o ajustar la vista/DOM,

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

Asegura que al cargar su página, los campos de entrada solo mostrarán los no válidos (bordes o fondos rojos, etc.) si tienen datos agregados (es decir, ya no están prístinos) pero no son válidos.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-06 01:02:13

Ejemplo

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

/ / Opacidad 0.6 todo "sección -" pero no "nombre-de-sección"

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-21 06:35:27

Puede usar el selector :not(.class) como se mencionó anteriormente.

Si te importa la compatibilidad con Internet explorer, te recomiendo usar http://selectivizr.com/.

Pero recuerde ejecutarlo bajo apache de lo contrario no verá el efecto.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-09 16:07:32

Usando la pseudo clase :not():

Para seleccionar todo menos un determinado elemento (o elementos). Podemos usar el :not() Pseudo clase CSS . La pseudo clase :not() requiere un selector CSS como argumento. El selector aplicará los estilos a todos los elementos excepto a los elementos que se especifican como argumento.

Ejemplos:

/* 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>

Ya podemos ver el poder de esta pseudo clase, nos permite convenientemente multa ajuste nuestros selectores excluyendo ciertos elementos. Además, esta pseudo clase aumenta la especificidad del selector. Por ejemplo:

/* 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-18 18:22:56

Como otros dijeron, simplemente pon :no(.clase). Para los selectores CSS, recomiendo visitar este enlace, ha sido muy útil a lo largo de mi viaje: https://code.tutsplus.com/tutorials/the-30-css-selectors-you-must-memorize--net-16048

  1. X: not (selector)

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

La pseudo clase negación es particularmente útil. Digamos que quiero seleccionar todos los divs, a excepción de la uno que tiene un id de contenedor. El fragmento de código anterior manejará esa tarea perfectamente.

O, si quisiera seleccionar cada elemento (no aconsejado) excepto las etiquetas de párrafo, podríamos hacer:

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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-12 03:55:30