Откуда берется белый фон при использовании режима смешивания?

body {
  background: #060f11;
}
<div style = "position:relative;z-index:0">
  <div style = "background:#060f11">
    <div style = "background:linear-gradient(0deg, rgba(0,0,0,1), rgba(0,0,0,0) 50%), linear-gradient(90deg, rgba(0,0,0,1), rgba(0,0,0,0) 50%), linear-gradient(180deg, rgba(0,0,0,1), rgba(0,0,0,0) 50%), linear-gradient(270deg, rgba(0,0,0,1), rgba(0,0,0,0) 50%), url(&quot;data:image/svg+xml,%3Csvg viewBox='0 0 500 500' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E&quot;);filter:contrast(200%) brightness(1000%) invert(100%);height:200px;mix-blend-mode:multiply;position:relative;transform:rotateZ(45deg);width:200px"></div>
  </div>
</div>

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

Похоже, что это вызвано z-index на родителе, но почему?

переполнение: скрыто от родителя?

Temani Afif 28.08.2024 15:58

У div нет белого фона.

Frank Fiegel 28.08.2024 16:57

Вы использовали инвертирование для темных цветов. а затем повернул белый div transform: rotateZ(45deg);. Однако overflow: hidden работает нормально.

NINE 28.08.2024 17:12

Я все еще в замешательстве. Почему удаление z-index приводит к его исчезновению? Я не думаю, что это причина.

Frank Fiegel 28.08.2024 17:42
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
0
4
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Откуда берется белый фон при использовании режима смешивания?

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

Что вызывает режим смешивания.

Извините, что цитирую другой ответ.

Я не хочу принимать.

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

Размер div был определен как 200 пикселей, но при его повороте размер фактического элемента меняется.

body {
  background: #060f11;
}

p {
  color: white;
  font-weight: bold;
  margin-bottom: 40px;
  font-size: 2rem;
}

#with-z-index {
  position: relative;
  z-index: 0;
}

#with-z-index .filter-bg {
  position: relative;
  background: #060f11;
  height: 300px;
}

#with-z-index .filter-content {
  filter: contrast(200%) brightness(1000%) invert(100%);
  mix-blend-mode: multiply;
  position: absolute;
  top: 0;
  left: 0;
  transform: translate(25%,25%) rotateZ(45deg);
  height: 200px;
  width: 200px;
}

/* if-not-filter */
#if-not-filter {
  position: relative;
  z-index: 0;
}

#if-not-filter .square-bg {
  position: relative;
  background: red;
  height: 300px;
}

#if-not-filter .square {
  filter: contrast(200%) brightness(1000%) invert(100%);
  position: relative;
  transform: translate(25%,25%) rotateZ(45deg);
  width: 200px;
  height: 200px;
}
<!DOCTYPE html>
<html lang = "en">
<head>
  <meta charset = "UTF-8">
  <meta name = "viewport" content = "width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel = "stylesheet" href = "style.css">
</head>
<body>
  <p>With blend mode</p>
  <div id = "with-z-index" style = "">
    <div class = "filter-bg">
      <div class = "filter-content" style = "background:linear-gradient(0deg, rgba(0,0,0,1), rgba(0,0,0,0) 50%), linear-gradient(90deg, rgba(0,0,0,1), rgba(0,0,0,0) 50%), linear-gradient(180deg, rgba(0,0,0,1), rgba(0,0,0,0) 50%), linear-gradient(270deg, rgba(0,0,0,1), rgba(0,0,0,0) 50%), url(&quot;data:image/svg+xml,%3Csvg viewBox='0 0 500 500' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E&quot;);"></div>
    </div>
  </div>
  
  <p>Without blend mode</p>
  <div id = "if-not-filter" style = "">
    <div class = "square-bg">
      <div class = "square" style = "background:linear-gradient(0deg, rgba(0,0,0,1), rgba(0,0,0,0) 50%), linear-gradient(90deg, rgba(0,0,0,1), rgba(0,0,0,0) 50%), linear-gradient(180deg, rgba(0,0,0,1), rgba(0,0,0,0) 50%), linear-gradient(270deg, rgba(0,0,0,1), rgba(0,0,0,0) 50%), url(&quot;data:image/svg+xml,%3Csvg viewBox='0 0 500 500' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E&quot;);"></div>
    </div>
  </div>
</body>
</html>

Вопрос, который вроде бы был и исчез по z-index

Я оставлю информацию о стекировании контекста, потому что она будет полезна другим.

Проверьте контекст стека при использовании CSS-фильтра или непрозрачности.

Чего вам никто не говорил о Z-Index_[Филип Уолтон — инженер @ Google]

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

Все еще не объясняет, почему добавление z-index приводит к появлению белого фона, тогда как без него он не появляется, т. е. я хочу избавиться от белого фона при использовании z-index.

Frank Fiegel 28.08.2024 19:35

Кажется, это сложная проблема, в которой нечего смешивать, складывая контекст. Пожалуйста, проверьте исправленный ответ :)

NINE 29.08.2024 03:30
Ответ принят как подходящий

Ваш самый внутренний <div> повёрнут и mix-blend-mode: multiply применён. Итак, вопрос: на что оно будет умножаться? И ответ таков: все, что ниже этого значения, в том же контексте стекирования.

Как сказано в спецификации,

Затем эту группу необходимо смешать и скомпоновать с контекстом стекирования, содержащим элемент.

Итак, предположим, что вы не установили z-index для внешнего элемента. Это означает, что он может объединяться с контекстом корневого стека. Поскольку filter() превращает необычный фон вашего внутреннего элемента в белый, умножение темного фона страницы на белый (единство) дает тот же цвет, что и темный фон. Поскольку вывод имеет тот же цвет, что и фон, вы его не видите.

Но добавление z-index к родительскому элементу между вашим необычным элементом и фоном создает новый контекст наложения. (Вы можете продемонстрировать это, потому что получите тот же результат, избавившись от z-index и установив isolation: isolate для этого родителя.) Теперь белому цвету повернутого элемента не с чем смешиваться за пределами контекста наложения, созданного средним элементом div. Поскольку ему не с чем смешиваться, он просто выводит исходный цвет — белый.

Как говорили другие, способ предотвратить это - в первую очередь не дать повернутому элементу высовываться из своего родителя, установив overflow: hidden на одном из родителей.

Спасибо. Это мне очень помогло. Было приятно учиться :)

NINE 29.08.2024 03:26

Наконец-то кто-то действительно ответил на вопрос. Очень ценю это. Многому научился!

Frank Fiegel 29.08.2024 11:56

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