Анимация текста, плавное появление букв
Подскажите как добиться такой анимации текста, как на этом сайте - https://alethemes.com/ale-fashion/ . Появление текста "upcoming collection...". Возможно ли такого добиться на чистом css? Или может есть какие-то сайты, ресурсы с готовыми подобными решениями.
Ответы (2 шт):
Вы такого хотели?
let text = 'upcoming collection...'
for (let i in [...text]) {
let letter = document.createElement('span')
letter.textContent = [...text][i]
if(letter.textContent.match(/\s/)) {
letter.style.margin = 'auto 3px'
}
letter.style.animationDelay = i/10+'s'
content.appendChild(letter)
}
* {
font-family: 'Segoe UI';
}
#content {
display: flex;
}
span {
text-transform: uppercase;
font-weight: 500;
animation: .3s 0s 1 text normal both running linear;
display: block;
}
@keyframes text {
0% {
transform: translateY(-40px) rotate(45deg);
opacity: .5;
}
}
<div id="content">
</div>
Объяснение
Нельзя просто взять и написать
document.querySelector('div с текстом'), нужно использоватьtextContent(илиinnerText, но лучшеtextContent), чтобы получилось примерно так:document.querySelector('Какой-то селектор').textContent[...text]- это spread syntax, для "выворачивания" данных, в данном случае это текст, мы "выворачиваем" текст (...text), тоесть получаем каждую букву отдельно (Пример...'hello'->h e l l o), а дальше это всё мы получаем в массиве т.к. всё завёртнуто в квадратные скобки.
Полное объяснение кода:
Сначала берём текст (строку), далее в цикле for...in, на каждой итерации получаем индекс текущего элемента массива. Создаём новый элемент <span>, в текст ему записываем текущую букву обращаясь к [...text] и если текущий символ это пробел, тогда добавляем ему в стили margin: auto 3px, далее в стилях также указываем задержку для анимации чтобы буквы воявлялись постепенно, сначала берём текущий индекс и делим его 10, чтобы задержка была не слишком долгая, и в самом конце просто обращаемся к content, к слову, необязательно записывать в отдельную переменную элемент у которого есть id, можно просто написать его id чтобы сразу к нему обратиться, и конечно же в content добавляем текущий элемент. (Через девтул (инструменты разработчика) вы можете конкретно увидеть результат в HTML)
let text = 'upcoming collection...'
let content = document.querySelector('#content')
for (let i in [...text]) {
let letter = document.createElement('span')
letter.textContent = [...text][i]
if(letter.textContent.match(/\s/)) {
letter.style.margin = 'auto 3px'
}
letter.style.animationDelay = i/10+'s'
content.appendChild(letter)
}
* {
font-family: 'Segoe UI';
}
#content {
display: flex;
}
span {
text-transform: uppercase;
font-weight: 500;
animation: .3s 0s 1 text normal both running linear;
display: block;
}
@keyframes text {
0% {
transform: translateY(-40px) rotate(45deg);
opacity: .5;
}
}
<div id="content"><div>