2016-05-23 26 views
2

Ich möchte alle <img> Elemente auszuwählen, die innerhalb eines <article> sind und nicht in ein <figure>CSS: mit Negation * alle Elemente

Nach diesen 2: How to create a css rule for all elements except one class?

https://www.w3.org/TR/css3-selectors/#negation

Alle <img> sind eingewickelt in <a> oder <p>. Es scheint, es könnte mit Negation gemacht werden. Meine Regel sieht jetzt so aus:

article *:not(figure) img { border: 2px solid red; } 

Irgendwelche Tipps Tricks, warum das nicht funktioniert?

+1

Können Sie HTML-Code posten, um das Problem zu reproduzieren? – Pugazh

+4

Warum nicht einfach verschiedene Regeln für 'article img' vs.' figure img' angeben? https://jsfiddle.net/ds33989g/ – alex

+0

@alex dachte darüber nach, würde eine etwas schlauere Art bevorzugen – Vaino

Antwort

3

Es funktioniert, aber Sie sagen dem Browser, dass img Elemente in etwas verpackt werden müssen. So img Tags direkt in der article Tag wird nicht funktionieren, aber alles geschachtelt z. in einem div Willen:

article *:not(figure) img { 
 
    border: 2px solid red; 
 
}
<article> 
 
    <img src="//placehold.it/50"> 
 
    <figure class="x"> 
 
    <img src="//placehold.it/50"> 
 
    </figure> 
 
    <div> 
 
    <img src="//placehold.it/50"> 
 
    </div> 
 
</article>

Was Sie wahrscheinlich brauchen:

article *:not(figure) img, 
 
article > img{ 
 
    border: 2px solid red; 
 
}
<article> 
 
    <img src="//placehold.it/50"> 
 
    <figure class="x"> 
 
    <img src="//placehold.it/50"> 
 
    </figure> 
 
    <div> 
 
    <img src="//placehold.it/50"> 
 
    </div> 
 
</article>

Bitte, den Rat aus den Kommentaren betrachten und sehen, ob Ihre Situation erlaubt keine alternative Lösung, die t nicht verwendet er * Universal und :not Selektor. Z.B.

article img { 
 
    border: 2px solid red; 
 
} 
 

 
article figure img { 
 
    border: none; 
 
}
<article> 
 
    <img src="//placehold.it/50"> 
 
    <figure class="x"> 
 
    <img src="//placehold.it/50"> 
 
    </figure> 
 
    <div> 
 
    <img src="//placehold.it/50"> 
 
    </div> 
 
</article>

Aber ob das verwendbar für Sie ist abhängig von der gesamten Kontext: dies kann viel einfacher sein.

+0

Der universelle Selektor ist blitzschnell - es ist eine garantierte Übereinstimmung und wird wahrscheinlich in diesem Zusammenhang sowieso vom Browser ignoriert. Es ist das: not(), das ist "langsam", weil es eine zusätzliche Anweisung an den Browser ist, und es ist nur "langsam", da es nicht für einen kritischen Pfad optimiert ist, im Gegensatz zu Tagnamen, IDs und Klassen. Die Kaskade hier zu nutzen ist einfach ein Kinderspiel - Sie brauchen sich nicht wirklich einen Grund dafür zu überlegen. – BoltClock

+0

@BoltClock Vielen Dank für Ihr Feedback. Es macht intuitiv Sinn + Ich werde dein Wort dafür nehmen. Auf jeden Fall nehme ich nicht an, viel über die relative Leistung von Selektoren zu wissen. Ich habe meine Antwort leicht umgeschrieben, geschwächt/entfernt Behauptungen über die Geschwindigkeit von Selektoren. Soweit ich das beurteilen kann, sollte die Post, auch ohne Angaben zur Perf, in der Lage sein, OP zu helfen. – Jeroen