Каков порядок применения нескольких режимов наложения?
У меня есть следующий код CSS:
div {
background: url('image-url'), linear-gradient(gradient), url('image-url-2');
background-blend-mode: blend-mode-1, blend-mode-2;
}
Положение градиентов или фонов URL может измениться. Я думаю, что это должно повлиять на порядок смешивания. Мой вопрос: как эти режимы применяются для расчета окончательного значения?
Применяются ли в первую очередь браузеры blend-mode-1
на url('image-url')
а также linear-gradient(gradient)
и позже применить blend-mode-2
по результатам первого и url('image-url-2')
Или это наоборот?
Использую ли я правильное количество background-blend-mode или мне нужно указать 3 из них?
2 ответа
Порядок размещения фоновых изображений является ключевым фактором здесь.
Ваши фоновые изображения располагаются в обратном порядке, причем первое в списке является самым верхним в стеке рендеринга.
Режимы наложения применяются как любое разделенное запятыми свойство, применяемое к фонам, первое к первому изображению, второе ко второму и т. Д.
в вашем примере
div {
background: url('image-url'), linear-gradient(gradient), url('image-url-2');
background-blend-mode: blend-mode-1, blend-mode-2;
}
url2 находится внизу.
Над ним у вас есть градиент с примененным blend-mode-2.
И над ним, URL-адрес изображения с blend-mode-1.
Вы можете установить третий режим background-blend-mode. В этом случае он будет применяться к смеси между image-url-2 и background-color (что вы не установили в своем примере, но это можно было бы установить)
Смешивание происходит сзади наперед.
Другими словами, каждый элемент (изображение или градиент) смешивается с результатом смешивания всех нижележащих элементов.
Это важно, поскольку многие режимы наложения не являются ассоциативными . Пример - разница. Предположим, у вас есть 3 элемента:
- А = сплошной цвет
#fff
(передний элемент; ближайший к пользователю) - В = сплошной цвет
- С = сплошной цвет
#666
(задний элемент; самый дальний от пользователя)
Произойдет следующее:
- Смешение В с С; результат черный(
#666 - #666 = #000
). - Смешивание A с результатом предыдущего шага (черный цвет); результат белый(
#fff - #000 = #fff
).
Если бы смешивание началось с переднего элемента, то результатом был бы «темный уголь»:
(#fff - #666) - #666 = #333
.
Живая демонстрация:
Вот что об этом говорят спецификации. Из :
Концептуально цвета исходного элемента смешиваются с фоном.
а также:
Фон — это содержимое позади элемента и то, из чего состоит этот элемент. Это означает, что фон является результатом компоновки всех предыдущих элементов.
Все еще немного расплывчато; состав и смешивание связаны, но не одно и то же. Но логичная интерпретация такова: смешивание должно работать сзади наперед. Я думаю, что все основные поставщики браузеров последовали этой интерпретации.
Имеет смысл указать третий режим наложения.
Как уже указывалось в vals, можно указать третий режим наложения, чтобы смешать третий элемент с файлом . Этот шаг смешивания всегда будет первым, поскольку цвет фона всегда находится за любым из элементов, указанных в
background-image
. Можно сказать, действует как четвертый элемент.
Однако отсутствие третьего режима смешивания не означает «не смешивать»! Из уровня композиции и смешивания 2уровня композитинга и смешивания 2 :
Если у свойства недостаточно значений, разделенных запятыми, чтобы соответствовать количеству слоев, ПА должен вычислить используемое значение, повторяя список значений, пока их не будет достаточно.
Другими словами,
background-blend-mode: <bm1>, <bm2>
автоматически расширяется в:
background-blend-mode: <bm1>, <bm2>, <bm1>
Я не буду отрицать, что этот третий режим наложения не имеет никакого эффекта, но это по совершенно другой причине: отсутствие
background-color
. Из того же документа:
Все в CSS, что создает контекст стека, должно рассматриваться как «изолированная» группа.
а также:
В изолированной группе исходный фон должен быть черным и полностью прозрачным.
а также:
Cs = (1 - αb) x Cs + αb x B(Cb, Cs)
Полностью прозрачный фон (αb = 0) приводит к отбрасыванию результата смешивания и сохранению цвета исходного элемента (здесь: третьего элемента). Вот что происходит, когда не указан цвет фона.
Всегда есть вероятность, что кто-нибудь позже добавит фоновый цвет. Чтобы избежать неожиданных изменений цвета, я бы рекомендовал всегда указывать явный режим наложения для элемента сзади. Если вы не хотите смешиваться с фоновым цветом (если он есть), то просто скажите об этом, добавив
normal
в конец списка режимов наложения. Это может предотвратить неприятные сюрпризы в будущем, особенно когда
<bm1>
(режим наложения спереди, который автоматически занимает пустое место сзади) — это своего рода экзотическая смесь.