частичное окрашивание текста

Пытаюсь менять цвет текста sticky элемента, когда он накладывается на другие элементы. Цвет должен меняться только у той части текста, которая уже наложена на какой-то элемент. Mix-blend-mode, к сожалению, не дает выбрать цвет текста. какие есть варианты? Демо с mix-blend-mode:

.container {
  width: 60%;
  margin: 0 auto;
  height: 1000px;
}

img {
  max-width: 100%;
}

header {
  font-size: 3rem;
  position: sticky;
  top: 0;
  mix-blend-mode: overlay;
}
<div class="container">
  <header>Lorem ipsum dolor sit amet.</header>
  <main>
    <img src="https://images.unsplash.com/photo-1583364493238-248032147fbd?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1567&q=80" alt="">
  </main>
</div>

ожидаемый результат: введите сюда описание изображения


Ответы (2 шт):

Автор решения: al-bulat

Как вариант можно попробовать средствами JS, если позволяют обстоятельства. Но занимаясь достаточное время с css/scss я не видел стабильных и хорошо поддерживаемых средств, чтобы реализовать твою задачу. Иногда даже, казалось бы простые вещи, но на Safari выглядит непредсказуемо. JS в твоём случае более гибкий инструмент для решений подобных тасков. Особо не выделывался с JS, цель была - показать принцип. Надеюсь мой ответ чем-то поможет, удачи.

P.S. Для красоты перехода можно добавить разные анимашки, transition на цвет. И будет красота ))

body {
  margin: 0;
}

.container {
  width: 60%;
  margin: 0 auto;
  height: 1000px;
}

img {
  max-width: 100%;
}

.header {
  font-size: 3rem;
  position: sticky;
  top: 0;
  //mix-blend-mode: overlay;
}

.extra {
  color: white;
}
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <link rel="stylesheet" type="text/css" href="css.css">
</head>

<body>
  <div class="container">
    <header class="header">Lorem ipsum dolor sit amet.</header>
    <main>
      <img src="https://images.unsplash.com/photo-1583364493238-248032147fbd?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1567&q=80" alt="">
    </main>
  </div>
</body>
<script>
  var el = document.getElementsByClassName('header')[0];
  var heightEl = el.clientHeight;

  document.body.onscroll = function() {

    var scrollEl = el.offsetTop;

    if (scrollEl > heightEl && scrollEl < heightEl * 3) {
      document.querySelector('.header').classList.add('extra')
    } else {
      document.querySelector('.header').classList.remove('extra')
    }
  }
</script>

</html>

→ Ссылка
Автор решения: Sevastopol'

Как один из вариантов, есть над чем подумать. Но это если совсем ничего не изобретать, хотя можно.

h1 {
  font-size: 40vh;
  font-family: Arial, sans-serif;
  font-weight: bold;
  text-align: center;
  letter-spacing: 20px;
}

.background {
  background: cornflowerblue;
}

.text {
  position: relative;
  color: black;
}

.invert {
  background: red;
  mix-blend-mode: difference;
}

.invert,
.background {
  position: absolute;
  right: 0;
  bottom: 0;
  left: 0;
  height: 0;
  animation: slide 4s ease-in-out infinite alternate;
}

@keyframes slide {
  from {
    height: 0;
  }
  to {
    height: 100%;
  }
}
<h1>
  <span class="background"></span>
  <span class="invert"></span>
  <span class="text">Пушкин</span>
  <span class="invert"></span>
</h1>

→ Ссылка