ПРИМЕР работы анимации (на мобильных устройствах срабатывает при скролле страницы)
эффект перебора букв в тексте / 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 с помощью кода.
Создаю проекты с вниманием к деталям, обеспечивая удобство и эстетичность.
Готовы начать? Оставьте контакты, и я обязательно свяжусь с вами
Heiligenweb [ 2026 ]
Создаю проекты с вниманием к деталям, обеспечивая удобство и эстетичность.
Готовы начать? Оставьте контакты, и я обязательно свяжусь с вами
Heiligenweb [ 2026 ]
Создаю проекты с вниманием к деталям, обеспечивая удобство и эстетичность.
Готовы начать? Оставьте контакты, и я обязательно свяжусь с вами
Heiligenweb [ 2026 ]
Made on
Tilda