ПРИМЕР работы анимации (на мобильных устройствах срабатывает при скролле страницы)
эффект перебора букв в тексте / shuffle letter effect
Перебор букв в тексте можно использовать в качестве ховера для ссылок или как анимацию при появлении текста на экране. Я применил этот эффект для анимации заголовков. Этот прием отличная альтернатива стандартным анимациям появления текста для околотехнических проектов 👍
В коде есть комментарии по настройкам анимации. По умолчанию она срабатывает по наведению и при появлении 1/3 высоты текста на экране. При желании вы можете легко поменять эти настройки 😉
Вставить в блок T123 копируемый код;
При срабатывании анимации Тильда сбрасывает свойства текста (меняет размер и начертание на значения по умолчанию). Поэтому важно вставить отдельный код, где будут прописаны css-свойства для анимируемого текста (здесь они прописаны вторым блоком с кодом для используемого css-класса).
Присвоить css-класс нужному тексту (у меня это класс '.t-heading', если будете менять, то будьте внимательны и не забудьте поменять класс в коде);
<script>
// Кириллические символы для перемешивания
const CYRILLIC_CHARS = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя123 456 789!?.:;";
function getRandomChar () {
return CYRILLIC_CHARS[Math.floor (Math.random () * CYRILLIC_CHARS.length)];
}
// Функция scramble (перемешивание → оригинал)
function scrambleText (element, finalText, onComplete) {
if (element.dataset.scrambling === "1") return;
element.dataset.scrambling = "1";
const original = finalText;
let step = 0;
const maxSteps = 14; // сколько "кадров" хаоса
const intervalMs = 35; // скорость
const timer = setInterval (() => {
step++;
let scrambled = "";
for (let i = 0; i < original. length; i++) {
// Чем дальше шаг — тем больше символов становятся правильными
if (Math.random () < (step / maxSteps) * 1.4) {
scrambled += original[i];
} else {
scrambled += getRandomChar ();
}
}
element. textContent = scrambled;
if (step >= maxSteps) {
clearInterval (timer);
element. textContent = original;
// Защита от повторного срабатывания слишком быстро
setTimeout (() => {
element.dataset.scrambling = "";
}, 1800);
if (onComplete) onComplete ();
}
}, intervalMs);
}
// Основная логика
document.addEventListener ("DOMContentLoaded", () => {
// Подбери свои селекторы — здесь пример для твоего случая
const titles = document. querySelectorAll (
'.t-heading'
);
if (!titles.length) {
console. warn ("Заголовки для scramble не найдены — проверь селекторы");
return;
}
const observer = new IntersectionObserver ((entries) => {
entries. forEach (entry => {
// Элемент вошёл в зону видимости (≥ 30% видно)
if (entry.isIntersecting) {
const el = entry. target;
const originalText = el.textContent.trim ();
// Запускаем анимацию
scrambleText (el, originalText);
// Опционально: отключить наблюдение после первого раза
// observer. unobserve (el);
}
});
}, {
root: null, // viewport
rootMargin: "0px", // без отступов
threshold: 0.3 // срабатывает, когда ≥30% элемента видно
});
titles. forEach (title => {
// Сохраняем оригинальный текст (на случай, если нужно)
title.dataset.original = title.textContent.trim ();
// Наблюдаем за каждым заголовком
observer. observe (title);
// Оставляем hover как бонус (если хочешь)
title. addEventListener ("mouseenter", () => {
if (title.dataset.scrambling ≠= "1") {
scrambleText (title, title.dataset.original || title.textContent.trim ());
}
});
});
});
</script>
<style>
.t-heading {
@media screen and (min-width: 1200px) {
font-size: 23px !important;
line-height: 0.82 !important;
};
@media screen and (max-width: 1199px) {
font-size: 23px !important;
line-height: 0.82 !important;
};
@media screen and (max-width: 639px) {
font-size: 18px !important;
line-height: 0.82 !important;
};
};
</style>
Простые и рабочие лайфхаки по кастомизации сайтов на Tilda с помощью кода.