|
<< Click to Display Table of Contents >> Navigation: Создание окон для клиента визуализации > Рекомендации по созданию окон > Динамизация SVG элементов > Практические сценарии динамизации > Вращение SVG иконки |
Сценарий: Вращать SVG-иконку с помощью CSS-анимации.
Ссылка на ресурсы документации: https://disk.yandex.ru/d/4FoWnt4_QXEVPQ
1.Текущий код SVG:
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M9.26368 22L8.86567 18.8C8.65008 18.7167 8.44693 18.6167 8.25622 18.5C8.06551 18.3833 7.87894 18.2583 7.69652 18.125L4.73632 19.375L2 14.625L4.56219 12.675C4.54561 12.5583 4.53731 12.4458 4.53731 12.3375V11.6625C4.53731 11.5542 4.54561 11.4417 4.56219 11.325L2 9.375L4.73632 4.625L7.69652 5.875C7.87894 5.74167 8.06965 5.61667 8.26866 5.5C8.46766 5.38333 8.66667 5.28333 8.86567 5.2L9.26368 2H14.7363L15.1343 5.2C15.3499 5.28333 15.5531 5.38333 15.7438 5.5C15.9345 5.61667 16.1211 5.74167 16.3035 5.875L19.2637 4.625L22 9.375L19.4378 11.325C19.4544 11.4417 19.4627 11.5542 19.4627 11.6625V12.3375C19.4627 12.4458 19.4461 12.5583 19.4129 12.675L21.9751 14.625L19.2388 19.375L16.3035 18.125C16.1211 18.2583 15.9303 18.3833 15.7313 18.5C15.5323 18.6167 15.3333 18.7167 15.1343 18.8L14.7363 22H9.26368ZM11.005 20H12.9701L13.3184 17.35C13.8325 17.2167 14.3093 17.0208 14.7488 16.7625C15.1882 16.5042 15.5904 16.1917 15.9552 15.825L18.4179 16.85L19.3881 15.15L17.2488 13.525C17.3317 13.2917 17.3897 13.0458 17.4229 12.7875C17.4561 12.5292 17.4726 12.2667 17.4726 12C17.4726 11.7333 17.4561 11.4708 17.4229 11.2125C17.3897 10.9542 17.3317 10.7083 17.2488 10.475L19.3881 8.85L18.4179 7.15L15.9552 8.2C15.5904 7.81667 15.1882 7.49583 14.7488 7.2375C14.3093 6.97917 13.8325 6.78333 13.3184 6.65L12.995 4H11.0299L10.6816 6.65C10.1675 6.78333 9.69071 6.97917 9.25124 7.2375C8.81177 7.49583 8.40962 7.80833 8.04478 8.175L5.58209 7.15L4.61194 8.85L6.75124 10.45C6.66833 10.7 6.61028 10.95 6.57711 11.2C6.54395 11.45 6.52736 11.7167 6.52736 12C6.52736 12.2667 6.54395 12.525 6.57711 12.775C6.61028 13.025 6.66833 13.275 6.75124 13.525L4.61194 15.15L5.58209 16.85L8.04478 15.8C8.40962 16.1833 8.81177 16.5042 9.25124 16.7625C9.69071 17.0208 10.1675 17.2167 10.6816 17.35L11.005 20ZM12.0498 15.5C13.0116 15.5 13.8325 15.1583 14.5124 14.475C15.1924 13.7917 15.5323 12.9667 15.5323 12C15.5323 11.0333 15.1924 10.2083 14.5124 9.525C13.8325 8.84167 13.0116 8.5 12.0498 8.5C11.0713 8.5 10.2463 8.84167 9.57463 9.525C8.90299 10.2083 8.56716 11.0333 8.56716 12C8.56716 12.9667 8.90299 13.7917 9.57463 14.475C10.2463 15.1583 11.0713 15.5 12.0498 15.5Z" fill="black"/> </svg> |

2.В первую очередь обратим внимание на тег path:
В него нужно добавить новый атрибут id со значением rotate_icon, чтобы XML смог к нему обратиться. Записывается это следующим образом: id="rotate_icon".
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path id="rotate_icon" d="M9.26368 22L8.86567 18.8C8.65008 18.7167 8.44693 18.6167 8.25622 18.5C8.06551 18.3833 7.87894 18.2583 7.69652 18.125L4.73632 19.375L2 14.625L4.56219 12.675C4.54561 12.5583 4.53731 12.4458 4.53731 12.3375V11.6625C4.53731 11.5542 4.54561 11.4417 4.56219 11.325L2 9.375L4.73632 4.625L7.69652 5.875C7.87894 5.74167 8.06965 5.61667 8.26866 5.5C8.46766 5.38333 8.66667 5.28333 8.86567 5.2L9.26368 2H14.7363L15.1343 5.2C15.3499 5.28333 15.5531 5.38333 15.7438 5.5C15.9345 5.61667 16.1211 5.74167 16.3035 5.875L19.2637 4.625L22 9.375L19.4378 11.325C19.4544 11.4417 19.4627 11.5542 19.4627 11.6625V12.3375C19.4627 12.4458 19.4461 12.5583 19.4129 12.675L21.9751 14.625L19.2388 19.375L16.3035 18.125C16.1211 18.2583 15.9303 18.3833 15.7313 18.5C15.5323 18.6167 15.3333 18.7167 15.1343 18.8L14.7363 22H9.26368ZM11.005 20H12.9701L13.3184 17.35C13.8325 17.2167 14.3093 17.0208 14.7488 16.7625C15.1882 16.5042 15.5904 16.1917 15.9552 15.825L18.4179 16.85L19.3881 15.15L17.2488 13.525C17.3317 13.2917 17.3897 13.0458 17.4229 12.7875C17.4561 12.5292 17.4726 12.2667 17.4726 12C17.4726 11.7333 17.4561 11.4708 17.4229 11.2125C17.3897 10.9542 17.3317 10.7083 17.2488 10.475L19.3881 8.85L18.4179 7.15L15.9552 8.2C15.5904 7.81667 15.1882 7.49583 14.7488 7.2375C14.3093 6.97917 13.8325 6.78333 13.3184 6.65L12.995 4H11.0299L10.6816 6.65C10.1675 6.78333 9.69071 6.97917 9.25124 7.2375C8.81177 7.49583 8.40962 7.80833 8.04478 8.175L5.58209 7.15L4.61194 8.85L6.75124 10.45C6.66833 10.7 6.61028 10.95 6.57711 11.2C6.54395 11.45 6.52736 11.7167 6.52736 12C6.52736 12.2667 6.54395 12.525 6.57711 12.775C6.61028 13.025 6.66833 13.275 6.75124 13.525L4.61194 15.15L5.58209 16.85L8.04478 15.8C8.40962 16.1833 8.81177 16.5042 9.25124 16.7625C9.69071 17.0208 10.1675 17.2167 10.6816 17.35L11.005 20ZM12.0498 15.5C13.0116 15.5 13.8325 15.1583 14.5124 14.475C15.1924 13.7917 15.5323 12.9667 15.5323 12C15.5323 11.0333 15.1924 10.2083 14.5124 9.525C13.8325 8.84167 13.0116 8.5 12.0498 8.5C11.0713 8.5 10.2463 8.84167 9.57463 9.525C8.90299 10.2083 8.56716 11.0333 8.56716 12C8.56716 12.9667 8.90299 13.7917 9.57463 14.475C10.2463 15.1583 11.0713 15.5 12.0498 15.5Z" fill="black"/> </svg> |
3.Теперь внутри SVG нужно вызвать новый тег style, для того, чтобы в нем прописать селектор, который активирует поворот и анимацию поворота.
Важно! Если в SVG используется тег style, то для него нужно обязательно добавить экранирование <![CDATA[]]>. Это предотвращает возможные ошибки при импорте SVG.
Пример экранирования для style:
<style type="text/css"><![CDATA[
/* Здесь ваш CSS код */
]]>
</style>
Итоговый код с добавлением style и экранирования:
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <style type="text/css"><![CDATA[ /* Здесь ваш CSS код */ ]]> </style> <path id="rotate_icon" d="M9.26368 22L8.86567 18.8C8.65008 18.7167 8.44693 18.6167 8.25622 18.5C8.06551 18.3833 7.87894 18.2583 7.69652 18.125L4.73632 19.375L2 14.625L4.56219 12.675C4.54561 12.5583 4.53731 12.4458 4.53731 12.3375V11.6625C4.53731 11.5542 4.54561 11.4417 4.56219 11.325L2 9.375L4.73632 4.625L7.69652 5.875C7.87894 5.74167 8.06965 5.61667 8.26866 5.5C8.46766 5.38333 8.66667 5.28333 8.86567 5.2L9.26368 2H14.7363L15.1343 5.2C15.3499 5.28333 15.5531 5.38333 15.7438 5.5C15.9345 5.61667 16.1211 5.74167 16.3035 5.875L19.2637 4.625L22 9.375L19.4378 11.325C19.4544 11.4417 19.4627 11.5542 19.4627 11.6625V12.3375C19.4627 12.4458 19.4461 12.5583 19.4129 12.675L21.9751 14.625L19.2388 19.375L16.3035 18.125C16.1211 18.2583 15.9303 18.3833 15.7313 18.5C15.5323 18.6167 15.3333 18.7167 15.1343 18.8L14.7363 22H9.26368ZM11.005 20H12.9701L13.3184 17.35C13.8325 17.2167 14.3093 17.0208 14.7488 16.7625C15.1882 16.5042 15.5904 16.1917 15.9552 15.825L18.4179 16.85L19.3881 15.15L17.2488 13.525C17.3317 13.2917 17.3897 13.0458 17.4229 12.7875C17.4561 12.5292 17.4726 12.2667 17.4726 12C17.4726 11.7333 17.4561 11.4708 17.4229 11.2125C17.3897 10.9542 17.3317 10.7083 17.2488 10.475L19.3881 8.85L18.4179 7.15L15.9552 8.2C15.5904 7.81667 15.1882 7.49583 14.7488 7.2375C14.3093 6.97917 13.8325 6.78333 13.3184 6.65L12.995 4H11.0299L10.6816 6.65C10.1675 6.78333 9.69071 6.97917 9.25124 7.2375C8.81177 7.49583 8.40962 7.80833 8.04478 8.175L5.58209 7.15L4.61194 8.85L6.75124 10.45C6.66833 10.7 6.61028 10.95 6.57711 11.2C6.54395 11.45 6.52736 11.7167 6.52736 12C6.52736 12.2667 6.54395 12.525 6.57711 12.775C6.61028 13.025 6.66833 13.275 6.75124 13.525L4.61194 15.15L5.58209 16.85L8.04478 15.8C8.40962 16.1833 8.81177 16.5042 9.25124 16.7625C9.69071 17.0208 10.1675 17.2167 10.6816 17.35L11.005 20ZM12.0498 15.5C13.0116 15.5 13.8325 15.1583 14.5124 14.475C15.1924 13.7917 15.5323 12.9667 15.5323 12C15.5323 11.0333 15.1924 10.2083 14.5124 9.525C13.8325 8.84167 13.0116 8.5 12.0498 8.5C11.0713 8.5 10.2463 8.84167 9.57463 9.525C8.90299 10.2083 8.56716 11.0333 8.56716 12C8.56716 12.9667 8.90299 13.7917 9.57463 14.475C10.2463 15.1583 11.0713 15.5 12.0498 15.5Z" fill="black"/> </svg> |
4.Добавим два селектора, первый селектор #rotate_icon.Off будет отвечать за отключенное состояние, второй #rotate_icon.On - за включенное.
Для "#rotate_icon.Off" выставим отключенную анимацию, делается это с помощью свойства "animation: none;"
Для "#rotate_icon.On" выставим анимацию для запуска вращения с помощью свойства animation: "animation: rotate360 2s linear infinite;"
rotate360 отвечает за имя анимации, которое добавим позже, 2s продолжительность одного цикла анимации, linear - линейная скорость анимации (равномерное вращение), infinite указывает, что анимация будет бесконечной.
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <style type="text/css"><![CDATA[ #rotate_icon.Off { animation: none; } #rotate_icon.On { animation: rotate360 2s linear infinite; } ]]> </style> <path id="rotate_icon" d="M9.26368 22L8.86567 18.8C8.65008 18.7167 8.44693 18.6167 8.25622 18.5C8.06551 18.3833 7.87894 18.2583 7.69652 18.125L4.73632 19.375L2 14.625L4.56219 12.675C4.54561 12.5583 4.53731 12.4458 4.53731 12.3375V11.6625C4.53731 11.5542 4.54561 11.4417 4.56219 11.325L2 9.375L4.73632 4.625L7.69652 5.875C7.87894 5.74167 8.06965 5.61667 8.26866 5.5C8.46766 5.38333 8.66667 5.28333 8.86567 5.2L9.26368 2H14.7363L15.1343 5.2C15.3499 5.28333 15.5531 5.38333 15.7438 5.5C15.9345 5.61667 16.1211 5.74167 16.3035 5.875L19.2637 4.625L22 9.375L19.4378 11.325C19.4544 11.4417 19.4627 11.5542 19.4627 11.6625V12.3375C19.4627 12.4458 19.4461 12.5583 19.4129 12.675L21.9751 14.625L19.2388 19.375L16.3035 18.125C16.1211 18.2583 15.9303 18.3833 15.7313 18.5C15.5323 18.6167 15.3333 18.7167 15.1343 18.8L14.7363 22H9.26368ZM11.005 20H12.9701L13.3184 17.35C13.8325 17.2167 14.3093 17.0208 14.7488 16.7625C15.1882 16.5042 15.5904 16.1917 15.9552 15.825L18.4179 16.85L19.3881 15.15L17.2488 13.525C17.3317 13.2917 17.3897 13.0458 17.4229 12.7875C17.4561 12.5292 17.4726 12.2667 17.4726 12C17.4726 11.7333 17.4561 11.4708 17.4229 11.2125C17.3897 10.9542 17.3317 10.7083 17.2488 10.475L19.3881 8.85L18.4179 7.15L15.9552 8.2C15.5904 7.81667 15.1882 7.49583 14.7488 7.2375C14.3093 6.97917 13.8325 6.78333 13.3184 6.65L12.995 4H11.0299L10.6816 6.65C10.1675 6.78333 9.69071 6.97917 9.25124 7.2375C8.81177 7.49583 8.40962 7.80833 8.04478 8.175L5.58209 7.15L4.61194 8.85L6.75124 10.45C6.66833 10.7 6.61028 10.95 6.57711 11.2C6.54395 11.45 6.52736 11.7167 6.52736 12C6.52736 12.2667 6.54395 12.525 6.57711 12.775C6.61028 13.025 6.66833 13.275 6.75124 13.525L4.61194 15.15L5.58209 16.85L8.04478 15.8C8.40962 16.1833 8.81177 16.5042 9.25124 16.7625C9.69071 17.0208 10.1675 17.2167 10.6816 17.35L11.005 20ZM12.0498 15.5C13.0116 15.5 13.8325 15.1583 14.5124 14.475C15.1924 13.7917 15.5323 12.9667 15.5323 12C15.5323 11.0333 15.1924 10.2083 14.5124 9.525C13.8325 8.84167 13.0116 8.5 12.0498 8.5C11.0713 8.5 10.2463 8.84167 9.57463 9.525C8.90299 10.2083 8.56716 11.0333 8.56716 12C8.56716 12.9667 8.90299 13.7917 9.57463 14.475C10.2463 15.1583 11.0713 15.5 12.0498 15.5Z" fill="black"/> </svg> |
5.Теперь добавим анимацию под названием rotate360 с помощью ключевого слова @keyframes.
Внутри нее пропишем from - начальное состояние анимации поворота 0 градусов и to - конечное состояние анимации поворота 360 градусов.
Само свойство transform: rotate() отвечает за трансформацию поворота SVG в градусах.
@keyframes rotate360 { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } |
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <style type="text/css"><![CDATA[ #rotate_icon.Off { animation: none; } #rotate_icon.On { animation: rotate360 2s linear infinite; } @keyframes rotate360 { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } ]]> </style> <path id="rotate_icon" d="M9.26368 22L8.86567 18.8C8.65008 18.7167 8.44693 18.6167 8.25622 18.5C8.06551 18.3833 7.87894 18.2583 7.69652 18.125L4.73632 19.375L2 14.625L4.56219 12.675C4.54561 12.5583 4.53731 12.4458 4.53731 12.3375V11.6625C4.53731 11.5542 4.54561 11.4417 4.56219 11.325L2 9.375L4.73632 4.625L7.69652 5.875C7.87894 5.74167 8.06965 5.61667 8.26866 5.5C8.46766 5.38333 8.66667 5.28333 8.86567 5.2L9.26368 2H14.7363L15.1343 5.2C15.3499 5.28333 15.5531 5.38333 15.7438 5.5C15.9345 5.61667 16.1211 5.74167 16.3035 5.875L19.2637 4.625L22 9.375L19.4378 11.325C19.4544 11.4417 19.4627 11.5542 19.4627 11.6625V12.3375C19.4627 12.4458 19.4461 12.5583 19.4129 12.675L21.9751 14.625L19.2388 19.375L16.3035 18.125C16.1211 18.2583 15.9303 18.3833 15.7313 18.5C15.5323 18.6167 15.3333 18.7167 15.1343 18.8L14.7363 22H9.26368ZM11.005 20H12.9701L13.3184 17.35C13.8325 17.2167 14.3093 17.0208 14.7488 16.7625C15.1882 16.5042 15.5904 16.1917 15.9552 15.825L18.4179 16.85L19.3881 15.15L17.2488 13.525C17.3317 13.2917 17.3897 13.0458 17.4229 12.7875C17.4561 12.5292 17.4726 12.2667 17.4726 12C17.4726 11.7333 17.4561 11.4708 17.4229 11.2125C17.3897 10.9542 17.3317 10.7083 17.2488 10.475L19.3881 8.85L18.4179 7.15L15.9552 8.2C15.5904 7.81667 15.1882 7.49583 14.7488 7.2375C14.3093 6.97917 13.8325 6.78333 13.3184 6.65L12.995 4H11.0299L10.6816 6.65C10.1675 6.78333 9.69071 6.97917 9.25124 7.2375C8.81177 7.49583 8.40962 7.80833 8.04478 8.175L5.58209 7.15L4.61194 8.85L6.75124 10.45C6.66833 10.7 6.61028 10.95 6.57711 11.2C6.54395 11.45 6.52736 11.7167 6.52736 12C6.52736 12.2667 6.54395 12.525 6.57711 12.775C6.61028 13.025 6.66833 13.275 6.75124 13.525L4.61194 15.15L5.58209 16.85L8.04478 15.8C8.40962 16.1833 8.81177 16.5042 9.25124 16.7625C9.69071 17.0208 10.1675 17.2167 10.6816 17.35L11.005 20ZM12.0498 15.5C13.0116 15.5 13.8325 15.1583 14.5124 14.475C15.1924 13.7917 15.5323 12.9667 15.5323 12C15.5323 11.0333 15.1924 10.2083 14.5124 9.525C13.8325 8.84167 13.0116 8.5 12.0498 8.5C11.0713 8.5 10.2463 8.84167 9.57463 9.525C8.90299 10.2083 8.56716 11.0333 8.56716 12C8.56716 12.9667 8.90299 13.7917 9.57463 14.475C10.2463 15.1583 11.0713 15.5 12.0498 15.5Z" fill="black"/> </svg> |
Проведем отладку кода, чтобы убедиться, что анимация CSS работает.
Временно добавим в path атрибут class и в него напишем "On":
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <style type="text/css"><![CDATA[ #rotate_icon.Off { animation: none; } #rotate_icon.On { animation: rotate360 2s linear infinite; } @keyframes rotate360 { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } ]]> </style> <path id="rotate_icon" class="On" d="M9.26368 22L8.86567 18.8C8.65008 18.7167 8.44693 18.6167 8.25622 18.5C8.06551 18.3833 7.87894 18.2583 7.69652 18.125L4.73632 19.375L2 14.625L4.56219 12.675C4.54561 12.5583 4.53731 12.4458 4.53731 12.3375V11.6625C4.53731 11.5542 4.54561 11.4417 4.56219 11.325L2 9.375L4.73632 4.625L7.69652 5.875C7.87894 5.74167 8.06965 5.61667 8.26866 5.5C8.46766 5.38333 8.66667 5.28333 8.86567 5.2L9.26368 2H14.7363L15.1343 5.2C15.3499 5.28333 15.5531 5.38333 15.7438 5.5C15.9345 5.61667 16.1211 5.74167 16.3035 5.875L19.2637 4.625L22 9.375L19.4378 11.325C19.4544 11.4417 19.4627 11.5542 19.4627 11.6625V12.3375C19.4627 12.4458 19.4461 12.5583 19.4129 12.675L21.9751 14.625L19.2388 19.375L16.3035 18.125C16.1211 18.2583 15.9303 18.3833 15.7313 18.5C15.5323 18.6167 15.3333 18.7167 15.1343 18.8L14.7363 22H9.26368ZM11.005 20H12.9701L13.3184 17.35C13.8325 17.2167 14.3093 17.0208 14.7488 16.7625C15.1882 16.5042 15.5904 16.1917 15.9552 15.825L18.4179 16.85L19.3881 15.15L17.2488 13.525C17.3317 13.2917 17.3897 13.0458 17.4229 12.7875C17.4561 12.5292 17.4726 12.2667 17.4726 12C17.4726 11.7333 17.4561 11.4708 17.4229 11.2125C17.3897 10.9542 17.3317 10.7083 17.2488 10.475L19.3881 8.85L18.4179 7.15L15.9552 8.2C15.5904 7.81667 15.1882 7.49583 14.7488 7.2375C14.3093 6.97917 13.8325 6.78333 13.3184 6.65L12.995 4H11.0299L10.6816 6.65C10.1675 6.78333 9.69071 6.97917 9.25124 7.2375C8.81177 7.49583 8.40962 7.80833 8.04478 8.175L5.58209 7.15L4.61194 8.85L6.75124 10.45C6.66833 10.7 6.61028 10.95 6.57711 11.2C6.54395 11.45 6.52736 11.7167 6.52736 12C6.52736 12.2667 6.54395 12.525 6.57711 12.775C6.61028 13.025 6.66833 13.275 6.75124 13.525L4.61194 15.15L5.58209 16.85L8.04478 15.8C8.40962 16.1833 8.81177 16.5042 9.25124 16.7625C9.69071 17.0208 10.1675 17.2167 10.6816 17.35L11.005 20ZM12.0498 15.5C13.0116 15.5 13.8325 15.1583 14.5124 14.475C15.1924 13.7917 15.5323 12.9667 15.5323 12C15.5323 11.0333 15.1924 10.2083 14.5124 9.525C13.8325 8.84167 13.0116 8.5 12.0498 8.5C11.0713 8.5 10.2463 8.84167 9.57463 9.525C8.90299 10.2083 8.56716 11.0333 8.56716 12C8.56716 12.9667 8.90299 13.7917 9.57463 14.475C10.2463 15.1583 11.0713 15.5 12.0498 15.5Z" fill="black"/> </svg> |
6.При отладке можно заметить, что SVG иконка вращается, но только от левого верхнего угла SVG (опорной точки по умолчанию).
7.Изменим опорную точку, чтобы она находилась в центре с помощью свойства transform-origin: center;
Для этого создадим новый селектор, который будет ссылаться только на id="rotate_icon":
<style type="text/css"><![CDATA[ #rotate_icon { transform-origin: center; } #rotate_icon.Off { animation: none; } #rotate_icon.On { animation: rotate360 2s linear infinite; } @keyframes rotate360 { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } ]]> </style> |
Вновь проверяем SVG, теперь она вращается от центра:
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <style type="text/css"><![CDATA[ #rotate_icon { transform-origin: center; } #rotate_icon.Off { animation: none; } #rotate_icon.On { animation: rotate360 2s linear infinite; } @keyframes rotate360 { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } ]]> </style> <path id="rotate_icon" class="On" d="M9.26368 22L8.86567 18.8C8.65008 18.7167 8.44693 18.6167 8.25622 18.5C8.06551 18.3833 7.87894 18.2583 7.69652 18.125L4.73632 19.375L2 14.625L4.56219 12.675C4.54561 12.5583 4.53731 12.4458 4.53731 12.3375V11.6625C4.53731 11.5542 4.54561 11.4417 4.56219 11.325L2 9.375L4.73632 4.625L7.69652 5.875C7.87894 5.74167 8.06965 5.61667 8.26866 5.5C8.46766 5.38333 8.66667 5.28333 8.86567 5.2L9.26368 2H14.7363L15.1343 5.2C15.3499 5.28333 15.5531 5.38333 15.7438 5.5C15.9345 5.61667 16.1211 5.74167 16.3035 5.875L19.2637 4.625L22 9.375L19.4378 11.325C19.4544 11.4417 19.4627 11.5542 19.4627 11.6625V12.3375C19.4627 12.4458 19.4461 12.5583 19.4129 12.675L21.9751 14.625L19.2388 19.375L16.3035 18.125C16.1211 18.2583 15.9303 18.3833 15.7313 18.5C15.5323 18.6167 15.3333 18.7167 15.1343 18.8L14.7363 22H9.26368ZM11.005 20H12.9701L13.3184 17.35C13.8325 17.2167 14.3093 17.0208 14.7488 16.7625C15.1882 16.5042 15.5904 16.1917 15.9552 15.825L18.4179 16.85L19.3881 15.15L17.2488 13.525C17.3317 13.2917 17.3897 13.0458 17.4229 12.7875C17.4561 12.5292 17.4726 12.2667 17.4726 12C17.4726 11.7333 17.4561 11.4708 17.4229 11.2125C17.3897 10.9542 17.3317 10.7083 17.2488 10.475L19.3881 8.85L18.4179 7.15L15.9552 8.2C15.5904 7.81667 15.1882 7.49583 14.7488 7.2375C14.3093 6.97917 13.8325 6.78333 13.3184 6.65L12.995 4H11.0299L10.6816 6.65C10.1675 6.78333 9.69071 6.97917 9.25124 7.2375C8.81177 7.49583 8.40962 7.80833 8.04478 8.175L5.58209 7.15L4.61194 8.85L6.75124 10.45C6.66833 10.7 6.61028 10.95 6.57711 11.2C6.54395 11.45 6.52736 11.7167 6.52736 12C6.52736 12.2667 6.54395 12.525 6.57711 12.775C6.61028 13.025 6.66833 13.275 6.75124 13.525L4.61194 15.15L5.58209 16.85L8.04478 15.8C8.40962 16.1833 8.81177 16.5042 9.25124 16.7625C9.69071 17.0208 10.1675 17.2167 10.6816 17.35L11.005 20ZM12.0498 15.5C13.0116 15.5 13.8325 15.1583 14.5124 14.475C15.1924 13.7917 15.5323 12.9667 15.5323 12C15.5323 11.0333 15.1924 10.2083 14.5124 9.525C13.8325 8.84167 13.0116 8.5 12.0498 8.5C11.0713 8.5 10.2463 8.84167 9.57463 9.525C8.90299 10.2083 8.56716 11.0333 8.56716 12C8.56716 12.9667 8.90299 13.7917 9.57463 14.475C10.2463 15.1583 11.0713 15.5 12.0498 15.5Z" fill="black"/> </svg> |
8.Перед тем как перейти к настройке XML нужно изменить отладочный атрибут на class="Off".
Это нужно для того, чтобы в выпадающем списке было два элемента: "Off" и "On" и по умолчанию выбранный будет "Off".
Если не задать класс, то по умолчанию будет выбрано пустое состояние, которое в данном сценарии не используется.
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <style type="text/css"><![CDATA[ #rotate_icon { transform-origin: center; } #rotate_icon.Off { animation: none; } #rotate_icon.On { animation: rotate360 2s linear infinite; } @keyframes rotate360 { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
]]> </style> <path id="rotate_icon" class="Off" d="M9.26368 22L8.86567 18.8C8.65008 18.7167 8.44693 18.6167 8.25622 18.5C8.06551 18.3833 7.87894 18.2583 7.69652 18.125L4.73632 19.375L2 14.625L4.56219 12.675C4.54561 12.5583 4.53731 12.4458 4.53731 12.3375V11.6625C4.53731 11.5542 4.54561 11.4417 4.56219 11.325L2 9.375L4.73632 4.625L7.69652 5.875C7.87894 5.74167 8.06965 5.61667 8.26866 5.5C8.46766 5.38333 8.66667 5.28333 8.86567 5.2L9.26368 2H14.7363L15.1343 5.2C15.3499 5.28333 15.5531 5.38333 15.7438 5.5C15.9345 5.61667 16.1211 5.74167 16.3035 5.875L19.2637 4.625L22 9.375L19.4378 11.325C19.4544 11.4417 19.4627 11.5542 19.4627 11.6625V12.3375C19.4627 12.4458 19.4461 12.5583 19.4129 12.675L21.9751 14.625L19.2388 19.375L16.3035 18.125C16.1211 18.2583 15.9303 18.3833 15.7313 18.5C15.5323 18.6167 15.3333 18.7167 15.1343 18.8L14.7363 22H9.26368ZM11.005 20H12.9701L13.3184 17.35C13.8325 17.2167 14.3093 17.0208 14.7488 16.7625C15.1882 16.5042 15.5904 16.1917 15.9552 15.825L18.4179 16.85L19.3881 15.15L17.2488 13.525C17.3317 13.2917 17.3897 13.0458 17.4229 12.7875C17.4561 12.5292 17.4726 12.2667 17.4726 12C17.4726 11.7333 17.4561 11.4708 17.4229 11.2125C17.3897 10.9542 17.3317 10.7083 17.2488 10.475L19.3881 8.85L18.4179 7.15L15.9552 8.2C15.5904 7.81667 15.1882 7.49583 14.7488 7.2375C14.3093 6.97917 13.8325 6.78333 13.3184 6.65L12.995 4H11.0299L10.6816 6.65C10.1675 6.78333 9.69071 6.97917 9.25124 7.2375C8.81177 7.49583 8.40962 7.80833 8.04478 8.175L5.58209 7.15L4.61194 8.85L6.75124 10.45C6.66833 10.7 6.61028 10.95 6.57711 11.2C6.54395 11.45 6.52736 11.7167 6.52736 12C6.52736 12.2667 6.54395 12.525 6.57711 12.775C6.61028 13.025 6.66833 13.275 6.75124 13.525L4.61194 15.15L5.58209 16.85L8.04478 15.8C8.40962 16.1833 8.81177 16.5042 9.25124 16.7625C9.69071 17.0208 10.1675 17.2167 10.6816 17.35L11.005 20ZM12.0498 15.5C13.0116 15.5 13.8325 15.1583 14.5124 14.475C15.1924 13.7917 15.5323 12.9667 15.5323 12C15.5323 11.0333 15.1924 10.2083 14.5124 9.525C13.8325 8.84167 13.0116 8.5 12.0498 8.5C11.0713 8.5 10.2463 8.84167 9.57463 9.525C8.90299 10.2083 8.56716 11.0333 8.56716 12C8.56716 12.9667 8.90299 13.7917 9.57463 14.475C10.2463 15.1583 11.0713 15.5 12.0498 15.5Z" fill="black"/> </svg> |
9.SVG готов. Теперь с помощью XML настроем выбор нужного класса "Off" или "On".
10.Сделаем базовый импорт SVG, чтобы автоматически сгенерировался начальный XML, который потом нужно изменить. В окне импорта создадим Параметр и присвоим ему следующие значения:
Имя параметра |
Id элемента SVG |
Атрибут элемента SVG |
Вращение |
rotate_icon |
class |

Нажимаем Применить.
В MasterSCADA 4D добавился параметр как поле ввода:

Уже на данном этапе можно использовать SVG. Трудность заключается в том, что в конвертации связей нужно вручную прописать какой селектор использовать для запуска SVG.
Пример как это будет выглядеть в конвертации связей:
Источник |
Приемник |
False |
Off |
True |
On |

Но сценарий предполагает использовать выпадающий список, а не поле ввода.
Изменим поле ввода на выпадающий список.
11.Перейдем в XML файл settings.xml:
<?xml version="1.0" encoding="utf-8"?> <SvgDef xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" CreateCommonAvary="false"> <ParameterDefs> <ParameterDef DisplayName="Вращение" Type="STRING" ParamType="Attribute" ItemId="rotate_icon" Path="class" /> </ParameterDefs> </SvgDef> |
12.Обратим внимание на тег ParameterDef с атрибутами DisplayName, Type, ParamType, ItemId, Path.
После всех атрибутов в конце тега присутствует закрывающий слэш "/". Его нужно убрать, потому что для выпадающего списка необходимо создать полноценный закрывающий тег </ParameterDef>:
<?xml version="1.0" encoding="utf-8"?> <SvgDef xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" CreateCommonAvary="false"> <ParameterDefs> <ParameterDef DisplayName="Вращение" Type="STRING" ParamType="Attribute" ItemId="rotate_icon" Path="class"> </ParameterDef> </ParameterDefs> </SvgDef> |
Важно! ParameterDefs и ParameterDef - это два разных тега. ParameterDefs нужен для создания списка всех параметров и не содержит в себе какие-либо атрибуты. ParameterDef - уникальный параметр, который содержит в себе атрибуты для настройки параметра, например: DisplayName, Type, ParamType, ItemId, Path и т.д.
13.Теперь между открывающим и закрывающим тегом ParameterDef добавим два новых тега Value.
Для XML это означает, что был создан выпадающий список. Где каждый отдельный Value - элемент списка.
- Первый: <Value DisplayName="Выкл">Off</Value>;
- Второй: <Value DisplayName="Вкл">On</Value>.
На примере <Value DisplayName="Выкл">Off</Value> нужно обратить внимание, что "Off" - это текстовое содержимое тега Value, поэтому для него нужно обязательно указывать закрывающий тег </Value>.
<?xml version="1.0" encoding="utf-8"?> <SvgDef xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" CreateCommonAvary="false"> <ParameterDefs> <ParameterDef DisplayName="Вращение" Type="STRING" ParamType="Attribute" ItemId="rotate_icon" Path="class"> <Value DisplayName="Выкл">Off</Value> <Value DisplayName="Вкл">On</Value> </ParameterDef> </ParameterDefs> </SvgDef> |
14.Повторно импортируем SVG. Теперь благодаря настройке XML появится выпадающий список.
В самом окне импорта просто нажмем Применить.

15.После импорта в панели свойств появится выпадающий список со значением по умолчанию "Off":

Если его раскрыть, то можно увидеть только "Off" и "On":

16.Сделаем небольшое окно для проверки. Разместим в него кнопку с фиксацией и SVG:

17.Теперь связываем с помощью зажатия ПК мыши свойство Нажата кнопки с фиксацией со свойством Вращение SVG:

Нажмем на SVG и проверим конвертер связей:

18.Выставляем тип конвертации Точечная и следующие настройки, если они не выставились автоматически:
Источник |
Приемник |
False |
Off |
True |
On |

Закрываем окно конвертации.
19.Назначаем Окно как стартовое и запускаем проект на исполнение:
При нажатии на кнопку с фиксацией у начинает вращаться SVG и при повторном нажатии SVG останавливается.

