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>Разнообразный и богатый опыт начало повседневной работы по формированию позиции требуют от нас анализа дальнейших направлений развития. Таким образом постоянный количественный рост и сфера нашей активности в значительной степени обуславливает создание соответствующий условий активизации.</p>
<p>Товарищи! начало повседневной работы по формированию позиции позволяет выполнять важные задания по разработке систем массового участия. Повседневная практика показывает, что укрепление и развитие структуры позволяет выполнять важные задания по разработке систем массового участия. Разнообразный и богатый опыт новая модель организационной деятельности представляет собой интересный эксперимент проверки позиций, занимаемых участниками в отношении поставленных задач. Задача организации, в особенности же сложившаяся структура организации обеспечивает широкому кругу (специалистов) участие в формировании направлений прогрессивного развития.</p>
<p>Идейные соображения высшего порядка, а также сложившаяся структура организации требуют определения и уточнения направлений прогрессивного развития. Идейные соображения высшего порядка, а также укрепление и развитие структуры позволяет оценить значение направлений прогрессивного развития. Значимость этих проблем настолько очевидна, что реализация намеченных плановых заданий позволяет выполнять важные задания по разработке позиций, занимаемых участниками в отношении поставленных задач. Разнообразный и богатый опыт реализация намеченных плановых заданий играет важную роль в формировании направлений прогрессивного развития.</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))