Примените шкалу яркости css -webkit-filter перед использованием background-blend-mode, сохраняя цвет

Я пытаюсь добиться монохромного цветного изображения при наведении мыши, где цвета изображения преобразуются в оттенки серого, а серые оттенки впоследствии заменяются оттенком цвета, с которым я смешиваюсь.

Это может выглядеть так

Чтобы смоделировать это в фотошопе, вы можете добавить изображение в градациях серого, добавить желаемый цветовой слой сверху и смешать его с режимом экрана.

Насколько я понимаю, у css есть такой потенциал, если вы объедините фильтр css и режим background-blend-mode, но результат всегда будет в градациях серого, если вы используете фильтр.

Поэтому я спрашиваю, есть ли другие способы получить эту смесь или изображения в градациях серого раньше без фильтра CSS

1 ответ

Решение

Вы можете сделать это за один шаг, используя яркость в качестве режима наложения.

В этом режиме яркость берется из переднего слоя (изображения), а оттенок и насыщенность берутся из фона (здесь, сплошной цвет)

Следующая демонстрация дает вам также возможность назначить цветовой фильтр через класс

.test {
    width: 400px;
    height: 200px;    
    margin: 10px;
    background-size: cover;
    background-image:  url(http://placekitten.com/1000/750);
}

.test:hover {
    background-blend-mode: luminosity;
}

.red {
    background-color: red;
}

.green {
    background-color: greenyellow;
}
<div class="test red"></div>
<div class="test green"></div>

Другое решение, где черный на изображении дает полный насыщенный цвет (вместо черного). Немного сложнее в настройке, но достижимо.

.test {
    width: 400px;
    height: 200px;    
    background-size: cover;
    background-color: white;
    background-image: linear-gradient(red, red), url(http://placekitten.com/1000/750);
    background-blend-mode: screen, luminosity;
}
<div class="test"></div>

Способ получить этот эффект как класс многократного использования. Изображение уже находится в элементе, и мы просто установили класс для установки эффекта и отдельный класс для цвета.

Итак, последовательность должна быть:

  • первый слой = белый
  • второй слой изображения, с смесью, установленной на яркость. Таким образом, яркость изображения комбинируется с белым, что дает белый для высокой яркости и черный для низкой яркости (то есть фильтр в градациях серого)
  • третий слой, сплошной цвет, с наложением на экран. это сохраняет белый цвет белым, но меняет цвет на черный.

Нам нужно использовать псевдоэлемент для окончательного смешивания, чтобы было легко установить все это с помощью независимого класса. это будет установлено с помощью mix-blend вместо background-blend:

#cat {
    width: 760px;
    height: 560px;
    background-image: url(http://placekitten.com/1000/750); 
}

.test {
    background-color: white;
    background-position: 0px 0px;
    background-size: cover;
    background-blend-mode: luminosity;
    position: relative;
}

.test:after {
    content: "";
    position: absolute;
    left: 0px;
    top: 0px;
    right: 0px;
    bottom: 0px;
    mix-blend-mode: screen;
    pointer-events: none;
}

.blue:after {
    background-color: blue;
}
<div class="test blue" id="cat"></div>

Другие вопросы по тегам