Плавное горизонтальное окрашивание текста

202
15 августа 2017, 14:30

Мне нужно чтобы при загрузке страницы, при скролле к тексту, он единожды окрашивался в черный цвет. Грубо говоря заливался.

https://www.werkstatt.fr/project/citroen-origins

Подскажите, как это можно реализовать? Или расскажите как там это сделано.

Анимация закрашивания должна идти слева направо.

Answer 1

В общих чертах оно работает следующим образом.

  • Создается контейнер, в котором есть исходный текст.
  • Затем, на каждую строчку создается отдельный элемент, который содержит в себе одну строчку. Этот элемент имеет абсолютное позиционирование и расположен точно над исходным текстом. Также он скрыт и обрезан (clip).
  • При каком-то событии (в данном случае при скролле), наш отдельный элемент становится видимым и запускается анимация для изменения области обрезки(clip).

Пример на jsfiddle.

Соответственно этот код конечно нужно еще улучшить - узнать ширину элемента, отступ сверху для следующей строчки, а также время запуска следующей анимации. Также, на приведенной Вами в качестве примера странице, используют анимацию на jQuery.

function addClass() { 
  var $overlay = document.querySelector('.overlay'); 
  $overlay.style.clip =  'rect(0 '+$overlay.clientWidth+'px 24px 0)'; 
} 
 
function removeClass() { 
  var $overlay = document.querySelector('.overlay'); 
  $overlay.style.clip =  'rect(0 0 24px 0)'; 
}
.conteiner { 
  position: relative; 
} 
 
.origin { 
  display: block; 
  text-align: start; 
  color: gray; 
  background-color: white; 
} 
 
.overlay { 
  display: block; 
  text-align: start; 
  position: absolute; 
  top: 0; 
  left: 0; 
  clip: rect(0px 0px 24px 0px); 
  transform: translate3d(0px, 0px, 1px); 
  transition: clip 10s linear; 
  background-color: white; 
}
<div class="conteiner"> 
  <div class="origin"> 
    Notre feuille de route était claire : valoriser l’incroyable apport</div> 
  <div class="overlay">Notre feuille de route était claire : valoriser l’incroyable apport </div> 
</div> 
<div> 
  <button onclick="addClass()"> 
    Paint 
  </button> 
 
  <button onclick="removeClass()"> 
    unPaint 
  </button> 
</div>

Answer 2

Вам понадобятся:

  1. Определитель попадания элемента во вьюпорт (в этой демке не представлен), который будет навешивать класс на нужные вам элементы.
  2. Псевдоэлемент ::before - именно он будет являться заливкой
  3. Анимация трансформации масштабирования этого псевдоэлемента. Трансформация используется потому что это одно из двух свойств, которое можно безболезненно анимировать.

document.querySelector('button').onclick = function () { 
  document.querySelector('.fill').classList.toggle('fill--filled'); 
}
.fill { 
  position: relative; 
  padding: 2px 4px; 
  display: inline-block; 
} 
 
.fill--filled:before { 
  position: absolute; 
  content: " "; 
  width: 100%; 
  height: 100%; 
  background: yellow; 
  z-index: -1; 
  left: 0; 
  top: 0; 
  transform-origin: 0 0; 
  animation: fill .5s; 
} 
 
@keyframes fill { 
  0% { 
    transform: scaleX(0); 
  }, 
   
  100% { 
    transform: scaleX(1); 
  } 
}
<p class=fill>Какой-то текст</p> 
 
<button>Toggle fill</button>

READ ALSO
Хранение не целых чисел mysql

Хранение не целых чисел mysql

В mysql записываются дробные числаОни должны хранится в базе до точностью на n ое количество после запятой

238
Выборка строк из базы, таким образом чтобы их сумма была не больше заданной

Выборка строк из базы, таким образом чтобы их сумма была не больше заданной

Есть таблица mysql В ней есть поле ценаСуществует ли способ выбрать только те ячейки сумма, которых не превышает заданное число и при этом находится...

194
BCryptPasswordEncoder IllegalStateException

BCryptPasswordEncoder IllegalStateException

Соответствии с этим гайдом сделал себе регистрацию на сайтеВсе прекрасно работало до вчерашнего вечера когда в какой то момент (вот это пропустил...

298