JSFiddle - React, Tailwind, and code Playground

by noname5

HTML

<!DOCTYPE html>
<html lang="ru">

<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>

<!-- Заворачиваем статью в див maincontent -->
<div class="maincontent">
<main>
  <p>Разнообразный и&nbsp;богатый опыт начало повседневной работы по&nbsp;формированию позиции требуют от&nbsp;нас анализа дальнейших направлений развития. Таким образом постоянный количественный рост и&nbsp;сфера нашей активности в&nbsp;значительной степени обуславливает создание соответствующий условий активизации.</p>
<p>Товарищи! начало повседневной работы по&nbsp;формированию позиции позволяет выполнять важные задания по&nbsp;разработке систем массового участия. Повседневная практика показывает, что укрепление и&nbsp;развитие структуры позволяет выполнять важные задания по&nbsp;разработке систем массового участия. Разнообразный и&nbsp;богатый опыт новая модель организационной деятельности представляет собой интересный эксперимент проверки позиций, занимаемых участниками в&nbsp;отношении поставленных задач. Задача организации, в&nbsp;особенности&nbsp;же сложившаяся структура организации обеспечивает широкому кругу (специалистов) участие в&nbsp;формировании направлений прогрессивного развития.</p>
<p>Идейные соображения высшего порядка, а&nbsp;также сложившаяся структура организации требуют определения и&nbsp;уточнения направлений прогрессивного развития. Идейные соображения высшего порядка, а&nbsp;также укрепление и&nbsp;развитие структуры позволяет оценить значение направлений прогрессивного развития. Значимость этих проблем настолько очевидна, что реализация намеченных плановых заданий позволяет выполнять важные задания по&nbsp;разработке позиций, занимаемых участниками в&nbsp;отношении поставленных задач. Разнообразный и&nbsp;богатый опыт реализация намеченных плановых заданий играет важную роль в&nbsp;формировании направлений прогрессивного развития.</p>
<p>Равным образом дальнейшее развитие различных форм деятельности...

CSS

.maincontent { /* Задаем сетку и разметку */
  display: grid;
  grid-template-columns: 1fr;
	grid-template-rows: 1fr 1px 1fr 1px 1fr 1px 1fr 1px;
}
main {
max-width: 400px;
margin: auto;
grid-column: 1 / 2;
grid-row: 1 / 9; /* Растягиваем на всю высоту */
}

/* Размечаем блоки отслеживания скролла, в данном случае 25/50/75/100 % */
.w25 {
  grid-column: 1 / 2;
	grid-row: 2 / 3;
  }
.w50 {
  grid-column: 1 / 2;
	grid-row: 4 / 5;
  }
.w75 {
  grid-column: 1 / 2;
	grid-row: 6 / 7;
  }
.w100 {
  grid-column: 1 / 2;
	grid-row: 8 / 9;
  }

JavaScript

const pws = document.querySelectorAll('.pw');
	  const config = {threshold: 0};
	const observer = new IntersectionObserver(entries => {
	  entries.forEach(entry => {
		if (entry.isIntersecting) {
		  // тут выполняется логика, когда элемент впервые попал в область видимости
		  let el = entry.target; // .pw
		  observer.unobserve(el); // т.к. нужно что-то делать один раз - перестаём следить
		  alert('Вы прочитали: ' + el.dataset.src + '% статьи');
      let Stat = "https://example.com/click.php?&event5=" + el.dataset.src; // При достижении события формируем ссылку для трекера
      fetch(Stat, { // Отправляем данные
      method: 'POST' // метод отправки данных
      });
      
		}
	  });
	}, config // settings
	);

	pws.forEach(pw => observer.observe(pw))