Если бы не нужно было анимировать каждый символ отдельно - можно было бы попробовать сделать через
::before и
::after, куда в правило
content запихиваешь содержимое кнопки.
::before позиционируем таким образом, чтобы мы его видели в центре кнопки, а
::after за его пределами. При наведении на кнопку
::before уводишь наверх, а
::after выводишь на середину кнопки.
Если же нужно обязательно анимировать посимвольно - проделываешь тот же самый алгоритм, но уже без
::before и
::after, а делая на вложенных элементах, типа такого:
<button class="button">
<div class="button-primary-text">
<span class="button-symbol">D</span>
<span class="button-symbol">O</span>
<span class="button-symbol">N</span>
<span class="button-symbol">A</span>
<span class="button-symbol">T</span>
<span class="button-symbol">E</span>
</div>
<div class="button-secondary-text">
<span class="button-symbol">D</span>
<span class="button-symbol">O</span>
<span class="button-symbol">N</span>
<span class="button-symbol">A</span>
<span class="button-symbol">T</span>
<span class="button-symbol">E</span>
</div>
</button>
По идее стили будут несложные, через
:nth-child задать некоторые задержки для символов внутри кнопки, а сам текст двигать с помощью
transform: translate(...)
Возможно можно как-то и без "дублирования" кода, поигравшись как-то с
transition, но, например, когда я смотрел всякие дизайнерские сайты на
awwwards, то подобная анимация была сделала именно через дублирование