- Заполнение строки svg элемента окружностями
- Заполнение строки одной, двумя, n окружностями
- Заполнение строки шестью окружностями
- Анимация спирали со строкой, состоящих из кружков
- Анимация изменения формы рамки
- Создаем облака с помощью двух строк stroke-linecap/a>
- Создаем анимацию краев облака
При совместном использование атрибутов stroke-dasharray и stroke-linecap=”round”, можно получить интересные эффекты визуализации.
У stroke-dasharray. два параметра – stroke-dasharray=”черта, пробел”
1. Заполнение строки svg элемента окружностями
для этого необходимо:
- длину черты установить равную нулю – stroke-dasharray=”0, пробел”
- а пробел установить равным ширине строки stroke-width
Итого:
stroke-dasharray=”0, 35″ stroke-width=”35″
при таких значениях параметров, строка элемента будет заполнена окружностями
1 2 3 4 5 |
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400" viewBox="0 0 400 400"> <circle cx="200" cy="200" r="150" fill="none" stroke="dodgerblue" stroke-dasharray="0, 35" stroke-width="35" stroke-linecap="round"/> </svg> |
2. Заполнение строки одной, двумя, n окружностями
Идея заключается в том, чтобы поделить всю длину строки SVG элемента на количество сегментов равное количеству выводимых окружностей.
Для вывода одной окружности на большой окружности, нужно брать полную длину строки большой окружности
perimeter = 2*Math.PI*R , где
PI – число ПИ
R – радиус окружности, на которой будут размещены маленькие окружности
1 2 3 4 5 6 7 8 |
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400" viewBox="0 0 400 400"> <!-- Большая окружность --> <circle cx="200" cy="200" r="150" fill="none" stroke="grey" stroke-width="2" /> <!-- Один синий кружок --> <circle cx="200" cy="200" r="150" fill="none" stroke="dodgerblue" stroke-dasharray="0, 942" stroke-width="35" stroke-linecap="round"/> </svg> |
3. Заполнение строки шестью окружностями
Код точно такой же, как и в примере с одной окружностью, но нужно поделить длину большой окружности на шесть равных частей
perimeter = 2*Math.PI*R / 6 = 157
stroke-dasharray=”0, 157″
1 2 3 4 5 6 7 8 |
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="400" height="400" viewBox="0 0 400 400"> <!-- Большая окружность --> <circle cx="200" cy="200" r="150" fill="none" stroke="grey" stroke-width="2" /> <!-- Шесть синих кружков --> <circle cx="200" cy="200" r="150" fill="none" stroke="dodgerblue" stroke-dasharray="0, 157" stroke-width="35" stroke-linecap="round"/> </svg> |
Для других (некруглых) фигур, чтобы узнать полную длину пути, можно использовать метод Javascript getTotalLength()
4. Анимация спирали со строкой, состоящих из кружков
Идея состоит в том, что строку спирали с кружками, изначально закрывает маска, которая будет постепенно открывать строку с кружками.
Для реализации анимации строки маски, используется прием изменения атрибутов “stroke-dashoffset от максимального значения – “6265px” до нуля, реализуя тем самым постепенный рост видимой линии от нуля до максимума.
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 |
<svg id="svg1" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="600" height="800" viewBox="0 150 744 1052"> <style> #path1 { fill:none; stroke:white; stroke-width:25; stroke-dasharray:6265; stroke-dashoffset:6265; } #path2 { fill:none; stroke:white; stroke-width:25; stroke-linecap:round; stroke-dasharray:0,25; } </style> <defs> <mask id="msk"> <!-- Маска, изначально закрывающая строку с кружками --> <path id="path1" d="m351 487c0 8-11 4-14-1-6-11 4-24 15-27 19-5 37 11 40 30 4 27-18 50-44 53-35 4-64-25-66-59-3-42 32-77 73-79 50-3 90 39 92 88 2 57-46 104-102 105-65 2-117-53-119-117-1-72 60-131 131-132 80-1 144 67 145 146 1 87-74 158-160 158-95 0-171-81-171-175 0-102 88-185 190-184 110 1 198 95 197 204C557 615 456 709 340 708 215 706 115 598 117 475 119 342 233 236 364 238 504 240 616 361 614 500 611 648 484 766 337 763 182 760 58 626 61 472 65 309 206 179 367 183c170 4 306 151 302 320-4 178-158 319-335 315" > <!-- анимация строки маски открывающая строку с кружками --> <animate id="an" attributeName="stroke-dashoffset" values="6265;0;0;6265" begin="svg1.click" dur="18s" fill="freeze" repeatCount="2" restart="whenNotActive" /> </path> </mask> </defs> <!-- Фон --> <rect width="100%" height="100%" style="fill: dodgerblue" /> <!-- Строка с кружками --> <path id="path2" mask="url(#msk)" d="m351 487c0 8-11 4-14-1-6-11 4-24 15-27 19-5 37 11 40 30 4 27-18 50-44 53-35 4-64-25-66-59-3-42 32-77 73-79 50-3 90 39 92 88 2 57-46 104-102 105-65 2-117-53-119-117-1-72 60-131 131-132 80-1 144 67 145 146 1 87-74 158-160 158-95 0-171-81-171-175 0-102 88-185 190-184 110 1 198 95 197 204C557 615 456 709 340 708 215 706 115 598 117 475 119 342 233 236 364 238 504 240 616 361 614 500 611 648 484 766 337 763 182 760 58 626 61 472 65 309 206 179 367 183c170 4 306 151 302 320-4 178-158 319-335 315"/> <text x="12" y="225" font-size="32px" fill="white" >Click me </text> </svg> |
Анимация спирали начнется после клика
5. Анимация изменения формы рамки
Морфинг формы рамки из окружности в треугольник и затем в прямоугольник, основан на анимации атрибута “d” path
Пути всех фигур рисуются в векторном редакторе. Чтобы анимация была гладкой, без рывков, необходимо выполнить два условия при создании path:
- Количество узловых точек должно быть одинаковым во всех фигурах
- Тип узловых точек с одинаковым расположением от начала, должен быть одинаковым во всех фигурах
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 |
<svg id="svg1" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="600" height="600" viewBox="0 0 400 400" > <rect width="100%" height="100%" fill="#2772C7" /> <path style="stroke:white; fill:none;stroke-width:18; stroke-linecap:round; stroke-dasharray:0,15" d="m 350,200 c 0,27.23032 -7.25588,52.76593 -19.93968,74.77889 C 304.15623,319.7359 255.6124,350 200,350 144.67416,350 96.344223,320.04698 70.34191,275.47268 57.409394,253.30319 50,227.51687 50,200 50,117.15729 117.15729,50 200,50 c 82.84271,0 150,67.15729 150,150 z"> <!-- Анимация морфинга круга в треугольник и прямоугольник --> <animate attributeName="d" begin="svg1.click" dur="3s" fill="freeze" repeatCount="3" restart="whenNotActive" values=" m 350,200 c 0,27.23032 -7.25588,52.76593 -19.93968,74.77889 C 304.15623,319.7359 255.6124,350 200,350 144.67416,350 96.344223,320.04698 70.34191,275.47268 57.409394,253.30319 50,227.51687 50,200 50,117.15729 117.15729,50 200,50 c 82.84271,0 150,67.15729 150,150 z; m 285,200 c 15,25 55,90 65,110 -45,0 -94.3876,0 -150,0 -55.32584,0 -85,0 -150,-0.0962 C 64.378221,285 99.019238,225 113.45299,200 153.86751,130 170,100 200,50 c 45,79.01924 48.45299,85 85,150 z; m 285,200 c 15,25 55,90 65,110 -45,0 -94.3876,0 -150,0 -55.32584,0 -85,0 -150,-0.0962 C 64.378221,285 99.019238,225 113.45299,200 153.86751,130 170,100 200,50 c 45,79.01924 48.45299,85 85,150 z; m 350,50 c 0,40 0,240 0,260 -45,0 -94.3876,0 -150,0 -55.32584,0 -85,0 -150,-0.0962 C 50,285 50,85 50,50 c 70,0 105,0 150,0 80,0 100,0 150,0 z; m 350,50 c 0,40 0,240 0,260 -45,0 -94.3876,0 -150,0 -55.32584,0 -85,0 -150,-0.0962 C 50,285 50,85 50,50 c 70,0 105,0 150,0 80,0 100,0 150,0 z; m 350,200 c 0,27.23032 -7.25588,52.76593 -19.93968,74.77889 C 304.15623,319.7359 255.6124,350 200,350 144.67416,350 96.344223,320.04698 70.34191,275.47268 57.409394,253.30319 50,227.51687 50,200 50,117.15729 117.15729,50 200,50 c 82.84271,0 150,67.15729 150,150 z; m 350,200 c 0,27.23032 -7.25588,52.76593 -19.93968,74.77889 C 304.15623,319.7359 255.6124,350 200,350 144.67416,350 96.344223,320.04698 70.34191,275.47268 57.409394,253.30319 50,227.51687 50,200 50,117.15729 117.15729,50 200,50 c 82.84271,0 150,67.15729 150,150z" /> </path> </svg> |
Анимация морфинга начнется после клика
6. Создаем облака с помощью двух строк stroke-linecap
Идея состоит в том, чтобы использовать два эллипса с очень широкими строками, у которых stroke-dasharray имеет первый параметр (черта) равный нулю и использовать атрибут stroke-linecap=”round”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<svg id="svg1" xmlns="http://www.w3.org/2000/svg" width="600" height="600" viewBox="0 0 600 600"> <defs> <linearGradient id="grad" x2="0%" y2="100%" gradientUnits="userSpaceOnUse"> <stop offset="0%" stop-color="#1E589A" /> <stop offset="100%" stop-color="#7db9e8" /> </linearGradient> </defs> <rect width="100%" height="100%" fill="url(#grad)" /> <!-- Меньшие зелёные окружности размер задает stroke-width="70" --> <ellipse id="el" cx="300" cy="300" rx="200" ry="100" fill="#fff" stroke="green" stroke-width="70" stroke-dasharray="0,60" stroke-linecap="round"> </ellipse> <!-- Большие жёлтые окружности размер задает stroke-width="100" --> <ellipse id="an_e2" cx="300" cy="300" rx="200" ry="100" fill="#fff" stroke="gold" opacity="0.8" stroke-width="100" stroke-dasharray="0,100" stroke-linecap="round"> </ellipse> </svg> |
Чтобы увидеть, как располагаются эти широкие строки, они закрашены в разные цвета.
Далее делаем все цвета белыми, две строки сливаются, образуя неровные края облака
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<svg id="svg1" xmlns="http://www.w3.org/2000/svg" width="600" height="600" viewBox="0 0 600 600"> <defs> <linearGradient id="grad" x2="0%" y2="100%" gradientUnits="userSpaceOnUse"> <stop offset="0%" stop-color="#1E589A" /> <stop offset="100%" stop-color="#7db9e8" /> </linearGradient> </defs> <rect width="100%" height="100%" fill="url(#grad)" /> <!-- Меньшие белые окружности, размер задает stroke-width="70" --> <ellipse id="el" cx="300" cy="300" rx="200" ry="100" fill="#fff" stroke="green" stroke-width="70" stroke-dasharray="0,60" stroke-linecap="round"> </ellipse> <!-- Большие белые окружности, размер задает stroke-width="100" --> <ellipse id="an_e2" cx="300" cy="300" rx="200" ry="100" fill="#fff" stroke="gold" opacity="0.8" stroke-width="100" stroke-dasharray="0,100" stroke-linecap="round"> </ellipse> </svg> |
7. Создаем анимацию краев облака
Для реализации анимации используем изменение размеров rx эллипса
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<svg id="svg1" xmlns="http://www.w3.org/2000/svg" width="600" height="600" viewBox="0 0 600 600"> <defs> <linearGradient id="grad" x2="0%" y2="100%" gradientUnits="userSpaceOnUse"> <stop offset="0%" stop-color="#1E589A" /> <stop offset="100%" stop-color="#7db9e8" /> </linearGradient> </defs> <rect width="100%" height="100%" fill="url(#grad)" /> <ellipse id="el" cx="300" cy="300" rx="200" ry="100" fill="#fff" stroke="white" stroke-width="70" stroke-dasharray="0,60" stroke-linecap="round"> <animate id="an_e1" attributeName="rx" begin="svg1.click" dur="30s" values="200;250;200;200" fill="freeze" repeatCount="indefinite"/> </ellipse> <ellipse id="an_e2" cx="300" cy="300" rx="200" ry="100" fill="#fff" stroke="white" stroke-width="100" stroke-dasharray="0,100" stroke-linecap="round"> <animate attributeName="rx" begin="svg1.click" dur="20s" values="200;150;200;200" fill="freeze" repeatCount="indefinite" /> </ellipse> <text x="12" y="145" font-size="32px" fill="silver" >Click me </text> </svg> |
⇚ Анимация рисования линии Анимации с использованием stroke-dasharray и stroke-dashoffset ⇛