Pro
Setup
Info
Info
Включено в подписку
Настройки
[
Написать в поддержку
Telegram: @sonneto_support
Кастомизация
]
Sonneto Design
Setup
Info
Info
Теги

Модификация

#

CSS

#

Текст

#

Эффект

#
Настройки модификации

  • Открываем Zero Block и заходим в режим редактирования.

  • Вставляем текст на страницу и назначаем ему класс: btn-sonneto-blur

  • Далее добавляем блок T123 и вставляем в него подготовленный код.

Модификатор используется как альтернатива печатной машинке.

<script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.9.1/gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.9.1/ScrollTrigger.min.js"></script>

<style>
.btn-sonneto-blur .tn-atom {
display: block;
white-space: normal;
word-break: break-word;
}

.btn-sonneto-blur .tn-atom span {
display: inline-block; /* Чтобы сохранялся перенос */
white-space: inherit;
}
</style>

<script>
document.addEventListener("DOMContentLoaded", function () {
gsap.registerPlugin(ScrollTrigger);

document.querySelectorAll(".btn-sonneto-blur .tn-atom").forEach((Ttext) => {
const originalHTML = Ttext.innerHTML;
Ttext.innerHTML = "";

function wrapNodes(node) {
if (node.nodeType === Node.TEXT_NODE) {
return node.nodeValue.split(/(\s+)/).map(word => {
if (word.trim() === "") return document.createTextNode(word); // Сохраняем пробелы

const wordSpan = document.createElement("span");
wordSpan.style.display = "inline-block"; // Оставляем переносы

word.split("").forEach(char => {
const charSpan = document.createElement("span");
charSpan.textContent = char;
wordSpan.appendChild(charSpan);
});

return wordSpan;
});
} else if (node.nodeType === Node.ELEMENT_NODE && node.tagName !== "BR") {
const newElement = document.createElement(node.tagName);
Array.from(node.attributes).forEach(attr => newElement.setAttribute(attr.name, attr.value));
node.childNodes.forEach(child => wrapNodes(child).forEach(span => newElement.appendChild(span)));
return [newElement];
} else if (node.tagName === "BR") {
return [document.createElement("br")];
}
return [];
}

const tempDiv = document.createElement("div");
tempDiv.innerHTML = originalHTML;
tempDiv.childNodes.forEach(node => wrapNodes(node).forEach(span => Ttext.appendChild(span)));

const Tletters = Ttext.querySelectorAll("span span");

gsap.from(Tletters, {
filter: "blur(0.15em)",
stagger: { from: "left", each: 0.05 }, // Анимация по буквам
duration: 1.25,
ease: "power2.inOut",
scrollTrigger: {
trigger: Ttext,
start: "top 80%",
toggleActions: "play none none none"
}
});

gsap.from(Tletters, {
xPercent: 10,
opacity: 0,
stagger: { from: "left", each: 0.05 },
duration: 1,
ease: "power2.out",
scrollTrigger: {
trigger: Ttext,
start: "top 80%",
toggleActions: "play none none none"
}
});
});
});

</script>

Появление текста из блюра

81510846
id:
Скопировано!
Скопировать код
Базовые настройки
  • Элемент с анимацией → .btn-sonneto-blur .tn-atom

  • Стили текста → display: block; white-space: normal; word-break: break-word

  • Стили вложенных span → display: inline-block; white-space: inherit (сохраняет переносы слов)

  • Фильтр размытия → filter: blur(0.15em)

  • Скорость анимации появления букв → duration: 1.25s (blur) и 1s (смещение и прозрачность)

  • Смещение букв по оси X → xPercent: 10

  • Прозрачность начального состояния → opacity: 0

  • Интервал появления букв → stagger: 0.05 (каждая буква с задержкой 0.05s)

  • Ритм анимации → ease: “power2.inOut” для blur и “power2.out” для смещения
Технические советы
  • Обязательно проверять корректность закрытия скриптов (в коде есть " и >, могут вызывать ошибки)

  • При большом количестве букв или длинном тексте анимация может нагружать браузер, стоит тестировать производительность

  • Для кроссбраузерности проверять поддержку filter: blur и CSS свойств inline-block

  • Если текст многострочный или содержит , wrapNodes корректно обрабатывает переносы

  • Тестировать на мобильных устройствах, чтобы анимация была плавной и не вызывала сдвига контента
Подключение скриптов

Для корректной работы модификации необходимо, чтобы на странице была подключена библиотека jQuery, так как скрипт использует $(document).ready() и .each().

Информация о кастомизации кода доступна только в веб-версии сайта.

Сделать это можно в разделе: Настройки сайта - Ещё - Подключить jQuery на страницах сайта.
В Zero Block скрипты рекомендуется вставлять только после полной загрузки контента страницы, чтобы все элементы блока были доступны для обработки.
Текст скопирован в буфер обмена!
Текст скопирован в буфер обмена!