Хочу начать с самого простого и надежного вида анимации, которая корректно отображается почти во всех браузерах, даже в IE6 🙂
это – “animateTransform attributeName=”transform” type=”rotate” – поворот объекта на заданный угол вокруг точки.
Для вращения стрелки на полный оборот необходимо изменять угол с “0” до “360” градусов. И еще нужно найти центр относительно, которого будет вращаться стрелка, в нашем случае при размерах рабочей области 200×200 px это – (100,100). Для простоты я совместил центр квадрата и центр линии. На практике нужно искать центр линии.
1 2 3 4 5 6 |
<animateTransform attributeName="transform" type="rotate" from="0 100 100" to="360 100 100" begin="startButton.mouseover" dur="4s" repeatCount="2" restart="whenNotActive" /> |
В листинге выше, 4 строка кода – это команда начать анимацию при наведении мышки на объект startButton В качестве объекта, запускающего анимацию, может быть любая фигура документа SVG, в том числе и кнопка, которой нужно присвоить уникальное имя в параметре id =”..” Следующий параметр: dur=”4s” – длительность одного цикла анимации в секундах.
5 строка – указывает, что будет два цикла (два оборота стрелки) за 4 сек. каждый. Параметр restart=”whenNotActive” – запрещает новый запуск пока анимация не закончится.
Строки 27-31 листинга ниже создают кнопку “Start” (id=”startButton”).
Строки 36-42 реализуют анимацию – поворот стрелки на два оборота.
Строки 45-50 отвечают за отрисовку 3-х линий формирующих стрелку.
Остальной код – графическое оформление.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg version = "1.1" baseProfile="full" xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink" xmlns:ev = "http://www.w3.org/2001/xml-events" height = "200px" width = "200px" viewBox="0 0 200 200" preserveAspectRatio="none"> <title>animation line SVG</title> <!-- animation line using the rotate transformation http://svg-art.ru --> <defs> <pattern id="newpattern" x="0" y="0" width="20" height="20" patternUnits="userSpaceOnUse" > <g fill="#85D2FF" stroke-width="1px" stroke="none"> <rect x="0" y="0" width="10" height="10" /> <rect x="10" y="10" width="10" height="10" /> </g> </pattern> </defs> <!-- area fill pattern --> <rect id="rectX" x="0" y="0" width="100%" height="100%" style="stroke: #000000; fill: url(#newpattern);" /> <g id="startButton"> <rect x="137" y="2" rx="3" ry="3" width="60" height="20" fill="orangered" stroke="dodgerblue" /> <text x="167" y="17" font-size="16" font-weight="bold" font-family="Arial" text-anchor="middle" fill="white" >Start</text> </g> <!-- a large circle under the arrow --> <circle cx="100" cy="100" r="75" fill="turquoise" fill-opacity="0.45" stroke-width="12px" stroke="dodgerblue" stroke-dasharray="4,28" /> <g style="stroke: #E15720; stroke-width: 4px;"> <animateTransform attributeName="transform" type="rotate" from="0 100 100" to="360 100 100" begin="startButton.mouseover" dur="4s" repeatCount="2" restart="whenNotActive" /> <circle cx="100" cy="100" r="7" fill="yellow" stroke-width="2px" stroke="grey" /> <circle cx="100" cy="167" r="6" fill="#E15720" stroke-width="2px" stroke="grey" /> <!-- Vertical line --> <line x1="100" y1="30" x2="100" y2="170" /> <!-- Left Diagonal line --> <line x1="100" y1="30" x2="95" y2="55" /> <!-- Right Diagonal line --> <line x1="100" y1="30" x2="105" y2="55" /> </g> </svg> |
Анимация запускается после клика по любой кнопке.
Кнопка “Х1” – первая скорость, которая задается параметром dur=”4s”
“Х2” – вторая скорость задается dur=”2s”
“Х4” – третья скорость задается dur=”0.5s”
Видна сразу зависимость, – чем короче цикл, заданный параметром “dur”, тем выше скорость.
Идея, как реализовать этот алгоритм состоит в следующем: каждой кнопке присваивается уникальное имя id=”startButtonNN” строки листинга ниже: 30, 35,40.
begin=”startButton.click” dur=”4s”. Далее эта группа заворачивается во вторую группу и затем обе группы входят в третью группу. Внутри каждой группы своя анимация со своим значением длительности цикла. Начало работы каждой анимации инициируется каждой своей привязанной по уникальному имениid=”..” кнопкой. Таким образом каждая кнопка вызывает свою анимацию со своим значением длительности цикла, а следовательно и скоростью вращения стрелки.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg version = "1.1" baseProfile="full" xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink" xmlns:ev = "http://www.w3.org/2001/xml-events" height = "200px" width = "200px" viewBox="0 0 200 200" preserveAspectRatio="none" style ="border: 0px solid blue;"> <title>animation line SVG with control</title> <!-- animation line using the rotate transformation with control speed http://svg-art.ru --> <defs> <pattern id="newpattern" x="0" y="0" width="20" height="20" patternUnits="userSpaceOnUse" > <g fill="#85D2FF" stroke-width="1px" stroke="none" fill-opacity="0.7"> <rect x="0" y="0" width="10" height="10" /> <rect x="10" y="10" width="10" height="10" /> </g> </pattern> </defs> <!-- area fill pattern --> <rect id="rectX" x="0" y="0" width="100%" height="100%" style="stroke: #000000; fill: url(#newpattern);" /> <!-- The block of three buttons that control the speed (x1 and x2 and X3) --> <g id="startButton"> <rect x="173" y="178" rx="3" ry="3" width="24" height="20" fill="dodgerblue" stroke="dodgerblue" /> <text x="185" y="193" font-size="16" font-weight="bold" font-family="Arial" text-anchor="middle" fill="white" >x1</text> </g> <g id="startButton2"> <rect x="143" y="178" rx="3" ry="3" width="24" height="20" fill="green" stroke="dodgerblue" /> <text x="155" y="193" font-size="16" font-weight="bold" font-family="Arial" text-anchor="middle" fill="white" >x2</text> </g> <g id="startButton4"> <rect x="113" y="178" rx="3" ry="3" width="24" height="20" fill="orangered" stroke="dodgerblue" /> <text x="125" y="193" font-size="16" font-weight="bold" font-family="Arial" text-anchor="middle" fill="white" >x4</text> </g> <!-- a large circle under the arrow --> <circle cx="100" cy="100" r="75" fill="dodgerblue" fill-opacity="0.5" stroke-width="10px" stroke="#647783" stroke-dasharray="4,28" /> <circle cx="100" cy="100" r="80" fill="none" fill-opacity="0.5" stroke-width="1px" stroke="#647783" /> <circle cx="100" cy="100" r="70" fill="none" fill-opacity="0.5" stroke-width="1px" stroke="#647783" /> <!-- The block of three animations, each of which runs its button when you click the mouse --> <g> <animateTransform attributeName="transform" type="rotate" from="0 100 100" to="360 100 100" begin="startButton4.click" dur="0.5s" repeatCount="2" restart="whenNotActive" /> <g> <animateTransform attributeName="transform" type="rotate" from="0 100 100" to="360 100 100" begin="startButton2.click" dur="2s" repeatCount="1" restart="whenNotActive" /> <g style="stroke: #E15720; stroke-width: 4px;"> <animateTransform attributeName="transform" type="rotate" from="0 100 100" to="360 100 100" begin="startButton.click" dur="4s" repeatCount="1" restart="whenNotActive" /> <circle cx="100" cy="100" r="7" fill="yellow" stroke-width="2px" stroke="grey" /> <circle cx="100" cy="167" r="6" fill="#E15720" stroke-width="2px" stroke="grey" /> <line x1="93" y1="100" x2="107" y2="100" stroke-width="1px" stroke="black" /> <!-- Vertical line --> <line x1="100" y1="30" x2="100" y2="170" /> <!-- Left Diagonal line --> <line x1="100" y1="30" x2="95" y2="55" /> <!-- Right Diagonal line --> <line x1="100" y1="30" x2="105" y2="55" /> <circle cx="100" cy="100" r="3" fill="#E15720" stroke-width="1px" stroke="black" /> </g> <!-- the end of the first block animation speed "x1" --> </g> <!-- the end of the second block animation speed "x2" --> </g> <!-- the end of the third block animation speed "x4" --> </svg> |
⇚ Анимация маркера Анимация линии часть 2 ⇛