Как реализовать на SVG подобный пример с игрой теней и изменением z-index элементов?
Для полного эффекта развернуть на весь экран и кликнуть для просмотра анимации.
const shadows = document.getElementsByClassName("shadows")[0];
const shadowsChildren = shadows.children;
let count = 0;
let left = false;
shadows.addEventListener("click", function() {
let interval = setInterval(function() {
!left ? count++ : count--;
shadowsChildren[left ? count : count - 1].style.zIndex = left ? count : shadowsChildren.length - count;
shadowsChildren[left ? count : count - 1].className = !left ? 'span' : '';
if (count === shadowsChildren.length) {
left = true;
clearInterval(interval);
}
if (count === 0) {
left = false;
clearInterval(interval);
}
}, 100);
});
* {
margin: 0;
padding: 0;
}
html,
body {
width: 100%;
height: 100%;
background: #272727;
}
.container {
position: fixed;
width: 100vw;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background: orange;
}
.shadows {
cursor: pointer;
background: orange;
position: relative;
text-shadow: -15px 5px 20px #303030;
width: 80vw;
color: orange;
text-align: center;
letter-spacing: -20px;
transition: all 0.25s ease-out .2s;
font-family: fantasy;
font-size: 200px;
}
span {
position: relative;
margin-left: -10px;
transition: all 0.25s ease-out;
}
span.span {
text-shadow: 15px 5px 20px #303030;
transition: all 0.25s ease-out;
}
Вариант css:hover
* { margin: 0; padding: 0; } html, body { width: 100%; height: 100%; background: #272727; } .container { position: fixed; width: 100vw; height: 100vh; display: flex; align-items: center; justify-content: center; background: orange; } .shadows { cursor: pointer; background: orange; position: relative; text-shadow: -15px 5px 20px #303030; width: 80vw; color: orange; text-align: center; letter-spacing: -20px; transition: all 0.25s ease-out .2s; font-family: fantasy; font-size: 200px; } span { position: relative; margin-left: -18px; transition: all 0.25s ease-out; } .shadows:hover span { text-shadow: 15px 5px 20px #303030; } .shadows:hover span:nth-child(1) { z-index: 8; } .shadows:hover span:nth-child(2) { z-index: 7; } .shadows:hover span:nth-child(3) { z-index: 6; } .shadows:hover span:nth-child(4) { z-index: 5; } .shadows:hover span:nth-child(5) { z-index: 4; } .shadows:hover span:nth-child(6) { z-index: 3; } .shadows:hover span:nth-child(7) { z-index: 2; } .shadows:hover span:nth-child(8) { z-index: 1; }
Ответ
Сложная анимация перемещения
Основа этой анимации - перемещение отдельной буквы вместе с фильтрами, создающими тень.
На первом этапе все буквы из начальных позиций собираются в середину
слова.
На втором этапе буквы разбегаются из середины на исходные позиции
Все перемещения букв реализуются командой изменения значения атрибута "X", задающего горизонтальную координату буквы:
Чтобы не запутаться в последовательности начала и окончания разных анимаций, необходимо продумать систему присвоения имен уникальных идентификаторов анимаций.
В данном примере команда начала анимации для каждой буквы включает
название буквы. Например: begin="anC", begin="anL"
Для анимаций возврата букв на исходную позицию:
begin="anBackC", begin="anBackL"
Логика последовательности выполнения анимаций реализуется при помощи
конструкции: begin="anBackC.end+0.25s" Словами это звучит так, -
анимация возврата буквы "L" начнется после окончания анимации
возврата буквы "C", после паузы равной 0.25s (секунды)
Смотреть интересней в полно-экраном режиме снипета
* {
margin: 0;
padding: 0;
}
text {
text-align: center;
font-family: sans-serif;
font-size: 200px;
font-weight: 900;
fill: #FFA500;
-webkit-filter: url(#shadowLetter);
filter: url(#shadowLetter);
}
Комментариев нет:
Отправить комментарий