Как сделать анимацию обводки букв
Будет использована последовательная анимация прорисовки контуров букв.
Для анимации прорисовки будет применена техника изменения атрибута stroke-dashoffset от максимального значения, до нуля. Соответственно контур буквы будет прорисовываться от нуля до полного появления линии.
#1 Получение патчей каждой буквы
Есть очень простой способ сделать это
- Открываем
Inkscape
Выбираем из меню текст, устанавливаем нужный размер и пишем слово LOREM
- В верхнем меню редактора выбираем - контур/ оконтурить объект
Shpft+Ctrl+C
- Сохраняем файл
- Теперь у каждой буквы есть свой персональный патч
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" width="850" height="800" viewBox="0 0 850 800" preserveAspectRatio="xMinYMin meet" border="1">
<path d="M20.4 58.1H198.9L427.9 59.3 658 58.1H819.8L822.2 406.9 819.8 760.4H646L427.9 760.5 179.8 760.4H20.4l0-353.5z" class="s0" />
<g aria-label="LOREM" style="fill:none; stroke:white; stroke-width:2; font-family:sans-serif;font-size:192;letter-spacing:0;line-height:1.3;word-spacing:0">
<path id="L" d="M175.4 406.9H87.1V267.3h18.6v123.1h69.8zM296.1 283.3"/>
<path id="O" d="m296.1 283.3q8.5 9.4 13 23 4.6 13.6 4.6 30.8 0 17.3-4.7 30.9-4.6 13.6-12.9 22.7-8.6 9.5-20.4 14.3-11.7 4.8-26.8 4.8-14.7 0-26.8-4.9-12-4.9-20.4-14.2-8.4-9.3-13-22.8-4.5-13.5-4.5-30.8 0-17.1 4.5-30.6 4.5-13.6 13.1-23.2 8.3-9.2 20.4-14.1 12.3-4.9 26.7-4.9 15 0 26.9 5 12 4.9 20.3 14zm-1.7 53.8q0-27.2-12.2-41.9-12.2-14.8-33.3-14.8-21.3 0-33.5 14.8-12.1 14.7-12.1 41.9 0 27.5 12.4 42.1 12.4 14.5 33.2 14.5 20.8 0 33.1-14.5 12.4-14.6 12.4-42.1z"/>
<path id="R" d="m458.7 406.9h-24.1l-46.7-55.5h-26.2v55.5h-18.6V267.3h39.1q12.7 0 21.1 1.7 8.4 1.6 15.2 5.8 7.6 4.8 11.8 12.1 4.3 7.2 4.3 18.4 0 15.1-7.6 25.3-7.6 10.1-20.9 15.3zm-43.4-100.3q0-6-2.2-10.6-2.1-4.7-6.9-7.9-4-2.7-9.6-3.7-5.5-1.1-13-1.1h-21.8v52.7h18.8q8.8 0 15.4-1.5 6.6-1.6 11.2-5.8 4.2-3.9 6.2-9 2.1-5.2 2.1-13z"/>
<path id="E" d="M568.7 406.9H476.7V267.3h92v16.5h-73.4v38.3h73.4v16.5h-73.4v51.8h73.4z"/>
<path id="M" d="m722.5 406.9h-18.6V286.6l-38.8 81.8h-11.1L615.5 286.6V406.9H598.2V267.3h25.3l37.2 77.7 36-77.7h25.8z"/>
</g>
</svg>
Присваиваем каждому патчу свой ID Например патчу буквы - L присваиваем:
id="L" и в будущем присвоим анимации этой буквы id="an_L"
- Далее для анимации контуров букв необходимо точно узнать их длину
Для этого используем функцию JS - TotalLength()
Ниже пример определения длины контура для буквы M
function TotalLength(){
var path = document.querySelector('#check');
var len = Math.round(path.getTotalLength() );
alert("Длина пути - " + len);
};
<input type="button" value="Total" onclick="TotalLength()"/>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
width="850" height="800" viewBox="0 0 850 800" >
<path id="check" fill= "none" stroke ="grey" stroke-width ="1"
d="m722.5 406.9h-18.6V286.6l-38.8 81.8h-11.1L615.5 286.6V406.9H598.2V267.3h25.3l37.2 77.7 36-77.7h25.8z" />
</svg>
Пишем код анимации
Для буквы L максимальная длина линии - 458px поэтому анимируемый параметр stroke-dashoffset будет изменяться от максимума до нуля values="458;0"
Более подробно об этой технике здесь
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="850" height="800" viewBox="0 0 850 800" preserveAspectRatio="xMinYMin meet" border="1">
<path d="M20.4 58.1H198.9L427.9 59.3 658 58.1H819.8L822.2 406.9 819.8 760.4H646L427.9 760.5 179.8 760.4H20.4l0-353.5z" class="s0" />
<g aria-label="LOREM" style="fill:none; stroke:white; stroke-width:2; font-family:sans-serif;font-size:192;letter-spacing:0;line-height:1.3;word-spacing:0">
<path id="L" stroke-dashoffset="458" stroke-dasharray="458" d="M175.4 406.9H87.1V267.3h18.6v123.1h69.8zM296.1 283.3">
<animate id="an_L"
attributeName="stroke-dashoffset"
values="458;0"
dur="0.8s"
begin="0s;"
fill="freeze"/>
</path>
</svg>
.container {
width:50%;
height:50%;
}
<div class="container">
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 850 800" preserveAspectRatio="xMinYMin meet" border="1">
<path d="M20.4 58.1H198.9L427.9 59.3 658 58.1H819.8L822.2 406.9 819.8 760.4H646L427.9 760.5 179.8 760.4H20.4l0-353.5z" class="s0" />
<g aria-label="LOREM" style="fill:none; stroke:white; stroke-width:2; font-family:sans-serif;font-size:192;letter-spacing:0;line-height:1.3;word-spacing:0">
<g id="letter" stroke-width="3">
<path id="L" stroke-dashoffset="458" stroke-dasharray="458" d="M175.4 406.9H87.1V267.3h18.6v123.1h69.8zM296.1 283.3">
<animate id="an_L"
attributeName="stroke-dashoffset"
values="458;0"
dur="0.8s"
begin="0s;"
fill="freeze"/>
</path>
<path id="O" stroke-dashoffset="770" stroke-dasharray="770" d="m296.1 283.3q8.5 9.4 13 23 4.6 13.6 4.6 30.8 0 17.3-4.7 30.9-4.6 13.6-12.9 22.7-8.6 9.5-20.4 14.3-11.7 4.8-26.8 4.8-14.7 0-26.8-4.9-12-4.9-20.4-14.2-8.4-9.3-13-22.8-4.5-13.5-4.5-30.8 0-17.1 4.5-30.6 4.5-13.6 13.1-23.2 8.3-9.2 20.4-14.1 12.3-4.9 26.7-4.9 15 0 26.9 5 12 4.9 20.3 14zm-1.7 53.8q0-27.2-12.2-41.9-12.2-14.8-33.3-14.8-21.3 0-33.5 14.8-12.1 14.7-12.1 41.9 0 27.5 12.4 42.1 12.4 14.5 33.2 14.5 20.8 0 33.1-14.5 12.4-14.6 12.4-42.1z">
<animate id="an_O"
attributeName="stroke-dashoffset"
values="770;0"
dur="1s"
begin="an_L.end"
fill="freeze"/>
</path>
<path id="R" stroke-dashoffset="774" stroke-dasharray="774" d="m458.7 406.9h-24.1l-46.7-55.5h-26.2v55.5h-18.6V267.3h39.1q12.7 0 21.1 1.7 8.4 1.6 15.2 5.8 7.6 4.8 11.8 12.1 4.3 7.2 4.3 18.4 0 15.1-7.6 25.3-7.6 10.1-20.9 15.3zm-43.4-100.3q0-6-2.2-10.6-2.1-4.7-6.9-7.9-4-2.7-9.6-3.7-5.5-1.1-13-1.1h-21.8v52.7h18.8q8.8 0 15.4-1.5 6.6-1.6 11.2-5.8 4.2-3.9 6.2-9 2.1-5.2 2.1-13z">
<animate id="an_R"
attributeName="stroke-dashoffset"
values="740;0"
dur="1s"
begin="an_O.end"
fill="freeze"/>
</path>
<path id="E" stroke-dashoffset="757" stroke-dasharray="757" d="M568.7 406.9H476.7V267.3h92v16.5h-73.4v38.3h73.4v16.5h-73.4v51.8h73.4z">
<animate id="an_E"
attributeName="stroke-dashoffset"
values="757;0"
dur="1s"
begin="an_R.end"
fill="freeze"/>
</path>
<path id="M" stroke-dashoffset="971" stroke-dasharray="971" d="m722.5 406.9h-18.6V286.6l-38.8 81.8h-11.1L615.5 286.6V406.9H598.2V267.3h25.3l37.2 77.7 36-77.7h25.8z">
<animate id="an_M"
attributeName="stroke-dashoffset"
values="971;0"
dur="1s"
begin="an_E.end"
fill="freeze"/>
</path>
</g>
<animate
attributeName="fill"
xlink:href="#letter"
begin="an_M.end"
dur="3s"
values="black;red"
fill="freeze"/>
</svg>
</div>
Объединяем два примера анимации
Трансформацию фигур и прорисовку контуров букв
Смотреть интересней в полноформатном окне. Для просмотра нажмите кнопку "Start"
.container {
width:50%;
height:50%;
}
<div class="container">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
width="850" height="800" viewBox="0 0 850 800" preserveAspectRatio="xMinYMin meet" style="border:1px solid grey;" >
<path fill="none" stroke="black" stroke-dashoffset="0" stroke-dasharray="3986" d="M20.4 58.1H198.9L427.9 323 658 58.1H819.8L499.8 404.5 819.8 760.4H646L415.9 492 179.8 760.4H20.4L340.4 410.5Z" class="s0">
<!-- Анимация рисования контура "X" -->
<animate id="an_sd"
attributeName="stroke-dashoffset"
begin="start.click"
values="3986;0"
dur="4s"
restart="whenNotActive"/>
<!-- Анимация заполнения цветом "X" -->
<animate id="an_fill"
attributeName="fill"
values="white;black"
dur="2s"
begin="an_sd.end"
fill="freeze"
restart="whenNotActive"/>
<!-- Анимация из "X" в чёрный квадрат -->
<animate id="an_rec"
attributeName="d" values="M20.4 58.1H198.9L427.9 323 658 58.1H819.8L499.8 404.5 819.8 760.4H646L415.9 492 179.8 760.4H20.4L340.4 410.5Z;M20.4 58.1H198.9L427.9 59.3 658 58.1H819.8L822.2 406.9 819.8 760.4H646L427.9 760.5 179.8 760.4H20.4l0-353.5z"
dur="4s"
begin="an_fill.end"
fill="freeze"
restart="whenNotActive"/>
</path>
<g aria-label="LOREM" style="fill:none; stroke:white; stroke-width:2; font-family:sans-serif;font-size:192;letter-spacing:0;line-height:1.3;word-spacing:0">
<g id="letter" stroke-width="3">
<path id="L" stroke-dashoffset="458" stroke-dasharray="458" d="M175.4 406.9H87.1V267.3h18.6v123.1h69.8zM296.1 283.3">
<!-- Анимация первой буквы "L" слова "LOREM" -->
<animate id="an_L"
attributeName="stroke-dashoffset"
values="458;0"
dur="0.8s"
begin="an_rec.end;"
fill="freeze"
restart="whenNotActive"/>
</path>
<path id="O" stroke-dashoffset="770" stroke-dasharray="770" d="m296.1 283.3q8.5 9.4 13 23 4.6 13.6 4.6 30.8 0 17.3-4.7 30.9-4.6 13.6-12.9 22.7-8.6 9.5-20.4 14.3-11.7 4.8-26.8 4.8-14.7 0-26.8-4.9-12-4.9-20.4-14.2-8.4-9.3-13-22.8-4.5-13.5-4.5-30.8 0-17.1 4.5-30.6 4.5-13.6 13.1-23.2 8.3-9.2 20.4-14.1 12.3-4.9 26.7-4.9 15 0 26.9 5 12 4.9 20.3 14zm-1.7 53.8q0-27.2-12.2-41.9-12.2-14.8-33.3-14.8-21.3 0-33.5 14.8-12.1 14.7-12.1 41.9 0 27.5 12.4 42.1 12.4 14.5 33.2 14.5 20.8 0 33.1-14.5 12.4-14.6 12.4-42.1z">
<!-- Анимация второй буквы "О" слова "LOREM" -->
<animate id="an_O"
attributeName="stroke-dashoffset"
values="770;0"
dur="1s"
begin="an_L.end"
fill="freeze"
restart="whenNotActive"/>
</path>
<path id="R" stroke-dashoffset="774" stroke-dasharray="774" d="m458.7 406.9h-24.1l-46.7-55.5h-26.2v55.5h-18.6V267.3h39.1q12.7 0 21.1 1.7 8.4 1.6 15.2 5.8 7.6 4.8 11.8 12.1 4.3 7.2 4.3 18.4 0 15.1-7.6 25.3-7.6 10.1-20.9 15.3zm-43.4-100.3q0-6-2.2-10.6-2.1-4.7-6.9-7.9-4-2.7-9.6-3.7-5.5-1.1-13-1.1h-21.8v52.7h18.8q8.8 0 15.4-1.5 6.6-1.6 11.2-5.8 4.2-3.9 6.2-9 2.1-5.2 2.1-13z">
<animate id="an_R"
attributeName="stroke-dashoffset"
values="740;0"
dur="1s"
begin="an_O.end"
fill="freeze"
restart="whenNotActive"/>
</path>
<path id="E" stroke-dashoffset="757" stroke-dasharray="757" d="M568.7 406.9H476.7V267.3h92v16.5h-73.4v38.3h73.4v16.5h-73.4v51.8h73.4z">
<animate id="an_E"
attributeName="stroke-dashoffset"
values="757;0"
dur="1s"
begin="an_R.end"
fill="freeze"restart="whenNotActive"
/>
</path>
<path id="M" stroke-dashoffset="971" stroke-dasharray="971" d="m722.5 406.9h-18.6V286.6l-38.8 81.8h-11.1L615.5 286.6V406.9H598.2V267.3h25.3l37.2 77.7 36-77.7h25.8z">
<animate id="an_M"
attributeName="stroke-dashoffset"
values="971;0"
dur="1s"
begin="an_E.end"
fill="freeze"
restart="whenNotActive"/>
</path>
</g>
<!-- Анимация анимация закраски слова "LOREM" -->
<animate
attributeName="fill"
xlink:href="#letter"
begin="an_M.end"
dur="3s"
values="black;red"
fill="freeze"
restart="whenNotActive"/>
</g>
<!-- Кнопка запуска анимации -->
<g id="start">
<rect x="20" y="10" rx="5" width="80" height="30" fill="transparent" stroke="black"/>
<text x="36" y="32" font-size="24">Start</text>
</g>
</svg>
</div>
LOREM1. анимация opacity или 2.прорисовка контуров букв слова 3. Или слово должно приехать в центр? – Alexandr_TT Dec 13 '18 at 07:06