2015-07-05 3 views
4

Мне нужен фильтр CSS для применения ко всем элементам в контейнере, за исключением конкретных. Быстрый пример, чтобы объяснить ситуацию:Применение CSS-фильтра для всех, кроме определенных подэлементов

<div class="container"> 
<img class="one" src="blah" /> 
<img class="two" src="blah" /> 
<img class="three" src="blah" /> 
</div> 

Тогда я подаю фильтры, как так:

.container { 
    -webkit-filter: grayscale(100%); 
    filter: grayscale(100%); 
} 

Так контейнер имеет полутоновый фильтр, примененный к нему, и всем IMG в нем поседела. Тем не менее, я хочу, чтобы один из img не переключился на серый:

.two { 
-webkit-filter: grayscale(0); 
filter: grayscale(0); 
} 

Однако, это не работает. Фильтр контейнера, по-видимому, перекрывает фильтр содержащегося элемента. Любые идеи, как я могу обойти это? Есть ли простой способ, или мне нужно написать некоторый jQuery, чтобы посмотреть на все элементы, которые не являются «.two», и применять фильтр к ним, а не к контейнеру?

Обновление: Я забыл упомянуть о важном предостережении. Контейнер должен быть серого, из-за которого имеет свойство background-image, которое также должно быть серого. Этот маленький фрагмент является частью большего количества контейнеров, все из которых также идут в оттенках серого, я просто пытаюсь выяснить, есть ли способ получить исключение из правила для родителя, поскольку родитель должен иметь это правило как Что ж.

+3

Довольно просто ... НЕТ. 'filter', как' opacity', применяется к родительскому и ** всем * * дочерним элементам и не может быть перенаправлен, установив стиль конкуренции на дочерний элемент. –

+0

Это то, чего я боялся. Ну что ж! Угадайте, что это нужно сделать более сложным способом. – SpaceMouse

ответ

2

Согласно CSS specifity правилам -

Либо поставить .two после .container в CSS,

Или сделать более .two специфичностью, т.е. img.two

UPDATE

.container правило находится на div itse lf - не на изображениях. Таким образом, контейнер переходит в оттенки серого независимо от того, что вы скажете изображениям. Попробуйте изменить это на .container img, а затем попробуйте включить полученные ответы.

+0

Независимо от того, где я размещаю css для .two в файле, фильтр применяется ко всем элементам контейнера. – SpaceMouse

+0

@SpaceMouse, см. Мое обновление – JNF

+0

К сожалению, этот ответ не сработает. Как я уже упоминал в другом комментарии, на контейнере должен быть фильтр, так как он имеет свойство background-image. Извините за то, что я не понял это в своем оригинальном посте! – SpaceMouse

2

Использование :not исключить .two

Отрицание CSS псевдо-класс, а не: (X), является функциональной нотации принимает простой селектор X в качестве аргумента. Он соответствует элементу, который не представлен аргументом. X не должен содержать другого переключателя отрицания.

.container img:not(.two) { 
    -webkit-filter: grayscale(100%); 
    filter: grayscale(100%); 
} 
+0

Это не работает. У контейнера также должен быть фильтр, поэтому фильтр применяется к его фоновому изображению. Здесь также больше контейнеров на более высоких уровнях, которые также будут иметь фильтр. – SpaceMouse

3

использование>, чтобы указать изображение, которое является дочерним .container использования: не указать, что вы не хотите, второго изображения серого

.container > img:not(.two) { 
 
    -webkit-filter: grayscale(100%); 
 
    filter: grayscale(100%); 
 
}
<div class="container"> 
 
<img class="one" src="http://lorempixel.com/400/200" /> 
 
<img class="two" src="http://lorempixel.com/400/200" /> 
 
<img class="three" src="http://lorempixel.com/400/200" /> 
 
</div>

jsfiddle

.container > img:not(.two) { 
-webkit-filter: grayscale(100%); 
filter: grayscale(100%); 
} 
Смежные вопросы