Décima primeira das doze animações.
Animações de Carregamento (série de 13 partes)
Animação
Resultado final:
Introdução
Criei esta animação em SVG, seguindo uma estrutura semelhante às anteriores:
<!-- definições de tamanho --><svg> <!-- plano de fundo --> <rect></rect> <!-- onze círculos que se movem --> <ellipse> <!-- animação que move o círculo --> <animateMotion></animateMotion> <!-- animações que esticam o círculo --> <animate></animate> <animate></animate> </ellipse></svg>Como funciona
Omiti alguns elementos e atributos nos blocos a seguir para manter a explicação mais concisa.
Tamanho
Mantive o mesmo tamanho usado nas animações anteriores.
Resultado
Código
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" width="200" height="200"> <rect width="199" height="199" x="0.5" y="0.5" fill="white" stroke="lightgray" strokeWidth="1" rx="6" /></svg>Caminho
A animação utiliza onze caminhos dispostos radialmente em um círculo. Os calculei da seguinte forma:
Resultado
Código
// dimensão do svgconst WIDTH = 200;const HEIGHT = 200;// centro do svgconst X_OFFSET = WIDTH / 2;const Y_OFFSET = HEIGHT / 2;const INNER_RADIUS = 28; // onde a linha começaconst OUTER_RADIUS = 58; // onde a linha terminaconst TAU = 2 * Math.PI; // uma rotação completa em radianosconst CIRCLES_COUNT = 11;const ANGLE_STEP = TAU / CIRCLES_COUNT;const paths = [];for (let i = 0; i < CIRCLES_COUNT; i++) { const angle = i * ANGLE_STEP; const x1 = OUTER_RADIUS * Math.sin(angle) + X_OFFSET; const y1 = OUTER_RADIUS * Math.cos(angle) + Y_OFFSET; const x2 = INNER_RADIUS * Math.sin(angle) + X_OFFSET; const y2 = INNER_RADIUS * Math.cos(angle) + Y_OFFSET; const d = `M${x1},${y1} L${x2},${y2}`; paths.push(d);}/*[ "M100,158 L100,128", "M131.35716741242464,148.7927049042085 L115.13794288875673,123.55509891927308", "M152.75865573056205,124.09407075410941 L125.46969586992651,111.63162036405282", "M157.4096436290941,91.74573938014947 L127.71500037266611,96.01518452834802", "M143.83347531254697,62.018077431173474 L121.16098808191923,81.66389944953202", "M116.34048829680292,44.34940753035915 L107.88851159156003,73.13419673879407", "M83.6595117031971,44.349407530359144 L92.11148840843998,73.13419673879407", "M56.16652468745303,62.01807743117346 L78.83901191808077,81.66389944953201", "M42.5903563709059,91.74573938014946 L72.28499962733389,96.01518452834802", "M47.241344269437924,124.0940707541094 L74.53030413007349,111.63162036405281", "M68.64283258757536,148.7927049042085 L84.86205711124327,123.55509891927308"]*/<svg> <rect></rect> <path fill="none" stroke="lightgray" stroke-width="1" d="M100,158 L100,128" ></path> <path fill="none" stroke="lightgray" stroke-width="1" d="M131.35716741242464,148.7927049042085 L115.13794288875673,123.55509891927308" ></path> <path fill="none" stroke="lightgray" stroke-width="1" d="M152.75865573056205,124.09407075410941 L125.46969586992651,111.63162036405282" ></path> <path fill="none" stroke="lightgray" stroke-width="1" d="M157.4096436290941,91.74573938014947 L127.71500037266611,96.01518452834802" ></path> <path fill="none" stroke="lightgray" stroke-width="1" d="M143.83347531254697,62.018077431173474 L121.16098808191923,81.66389944953202" ></path> <path fill="none" stroke="lightgray" stroke-width="1" d="M116.34048829680292,44.34940753035915 L107.88851159156003,73.13419673879407" ></path> <path fill="none" stroke="lightgray" stroke-width="1" d="M83.6595117031971,44.349407530359144 L92.11148840843998,73.13419673879407" ></path> <path fill="none" stroke="lightgray" stroke-width="1" d="M56.16652468745303,62.01807743117346 L78.83901191808077,81.66389944953201" ></path> <path fill="none" stroke="lightgray" stroke-width="1" d="M42.5903563709059,91.74573938014946 L72.28499962733389,96.01518452834802" ></path> <path fill="none" stroke="lightgray" stroke-width="1" d="M47.241344269437924,124.0940707541094 L74.53030413007349,111.63162036405281" ></path> <path fill="none" stroke="lightgray" stroke-width="1" d="M68.64283258757536,148.7927049042085 L84.86205711124327,123.55509891927308" ></path></svg>Círculos e suas animações
Animações que percorrem o caminho
Cada círculo utiliza um elemento animateMotion para percorrer o caminho definido. O único atributo que varia entre os círculos é o begin, que define um atraso para cada círculo iniciar sua animação.
Os elementos ellipse compartilham os seguintes atributos:
fill="black": cor de preenchimento da elipserx="8": raio horizontal da elipsery="8": raio vertical da elipse
Os elementos animateMotion compartilham os seguintes atributos:
repeatCount="indefinite": a animação se repete indefinidamenterotate="auto": faz com que o círculo siga a rotação do caminho, mantendo a orientação corretacalcMode="spline": usa uma curva de Bézier para a interpolaçãokeyPoints="0; 1; 0": pontos-chave da animaçãokeyTimes="0; 0.5; 1": tempos correspondentes aos pontos-chavekeySplines="0.42, 0, 0.58, 1; 0.42, 0, 0.58, 1": curvas de Bézier para a interpolaçãodur="1500ms": duração total da animação
keyTimes | keyPoints | keySplines |
|---|---|---|
| 0 | 0 | 0.42, 0, 0.58, 1 |
| 0.5 | 1 | 0.42, 0, 0.58, 1 |
| 1 | 0 | - |
Ou seja, a animação percorre o caminho do início ao fim e volta ao início.
Calculei o atraso de início (begin) de cada círculo da seguinte forma:
Resultado
Código
const ANIMATION_DURATION = 1_500;const CIRCLES_COUNT = 11;const FACTOR = 2; // com FACTOR > 1 os atrasos ficam mais espaçadosconst TIME_STEP = (ANIMATION_DURATION / CIRCLES_COUNT) * FACTOR;const begins = [];for (let i = 0; i < CIRCLES_COUNT; i++) { const delay = i * TIME_STEP; begins.push(`-${delay}ms`);}/*[ "-0ms", "-272.72727272727275ms", "-545.4545454545455ms", "-818.1818181818182ms", "-1090.909090909091ms", "-1363.6363636363637ms", "-1636.3636363636365ms", "-1909.0909090909092ms", "-2181.818181818182ms", "-2454.545454545455ms", "-2727.2727272727275ms"]*/<svg> <rect></rect> <path></path> <path></path> <path></path> <path></path> <path></path> <path></path> <path></path> <path></path> <path></path> <path></path> <path></path> <ellipse rx="8" ry="8"> <animateMotion repeatCount="indefinite" rotate="auto" calcMode="spline" keyTimes="0; 0.5; 1" keyPoints="0; 1; 0" keySplines="0.42, 0, 0.58, 1; 0.42, 0, 0.58, 1" path="M100,158 L100,128" begin="-0ms" dur="1500ms" ></animateMotion> </ellipse> <ellipse rx="8" ry="8"> <animateMotion repeatCount="indefinite" rotate="auto" calcMode="spline" keyTimes="0; 0.5; 1" keyPoints="0; 1; 0" keySplines="0.42, 0, 0.58, 1; 0.42, 0, 0.58, 1" path="M131.35716741242464,148.7927049042085 L115.13794288875673,123.55509891927308" begin="-272.72727272727275ms" dur="1500ms" ></animateMotion> </ellipse> <ellipse rx="8" ry="8"> <animateMotion repeatCount="indefinite" rotate="auto" calcMode="spline" keyTimes="0; 0.5; 1" keyPoints="0; 1; 0" keySplines="0.42, 0, 0.58, 1; 0.42, 0, 0.58, 1" path="M152.75865573056205,124.09407075410941 L125.46969586992651,111.63162036405282" begin="-545.4545454545455ms" dur="1500ms" ></animateMotion> </ellipse> <ellipse rx="8" ry="8"> <animateMotion repeatCount="indefinite" rotate="auto" calcMode="spline" keyTimes="0; 0.5; 1" keyPoints="0; 1; 0" keySplines="0.42, 0, 0.58, 1; 0.42, 0, 0.58, 1" path="M157.4096436290941,91.74573938014947 L127.71500037266611,96.01518452834802" begin="-818.1818181818182ms" dur="1500ms" ></animateMotion> </ellipse> <ellipse rx="8" ry="8"> <animateMotion repeatCount="indefinite" rotate="auto" calcMode="spline" keyTimes="0; 0.5; 1" keyPoints="0; 1; 0" keySplines="0.42, 0, 0.58, 1; 0.42, 0, 0.58, 1" path="M143.83347531254697,62.018077431173474 L121.16098808191923,81.66389944953202" begin="-1090.909090909091ms" dur="1500ms" ></animateMotion> </ellipse> <ellipse rx="8" ry="8"> <animateMotion repeatCount="indefinite" rotate="auto" calcMode="spline" keyTimes="0; 0.5; 1" keyPoints="0; 1; 0" keySplines="0.42, 0, 0.58, 1; 0.42, 0, 0.58, 1" path="M116.34048829680292,44.34940753035915 L107.88851159156003,73.13419673879407" begin="-1363.6363636363637ms" dur="1500ms" ></animateMotion> </ellipse> <ellipse rx="8" ry="8"> <animateMotion repeatCount="indefinite" rotate="auto" calcMode="spline" keyTimes="0; 0.5; 1" keyPoints="0; 1; 0" keySplines="0.42, 0, 0.58, 1; 0.42, 0, 0.58, 1" path="M83.6595117031971,44.349407530359144 L92.11148840843998,73.13419673879407" begin="-1636.3636363636365ms" dur="1500ms" ></animateMotion> </ellipse> <ellipse rx="8" ry="8"> <animateMotion repeatCount="indefinite" rotate="auto" calcMode="spline" keyTimes="0; 0.5; 1" keyPoints="0; 1; 0" keySplines="0.42, 0, 0.58, 1; 0.42, 0, 0.58, 1" path="M56.16652468745303,62.01807743117346 L78.83901191808077,81.66389944953201" begin="-1909.0909090909092ms" dur="1500ms" ></animateMotion> </ellipse> <ellipse rx="8" ry="8"> <animateMotion repeatCount="indefinite" rotate="auto" calcMode="spline" keyTimes="0; 0.5; 1" keyPoints="0; 1; 0" keySplines="0.42, 0, 0.58, 1; 0.42, 0, 0.58, 1" path="M42.5903563709059,91.74573938014946 L72.28499962733389,96.01518452834802" begin="-2181.818181818182ms" dur="1500ms" ></animateMotion> </ellipse> <ellipse rx="8" ry="8"> <animateMotion repeatCount="indefinite" rotate="auto" calcMode="spline" keyTimes="0; 0.5; 1" keyPoints="0; 1; 0" keySplines="0.42, 0, 0.58, 1; 0.42, 0, 0.58, 1" path="M47.241344269437924,124.0940707541094 L74.53030413007349,111.63162036405281" begin="-2454.545454545455ms" dur="1500ms" ></animateMotion> </ellipse> <ellipse rx="8" ry="8"> <animateMotion repeatCount="indefinite" rotate="auto" calcMode="spline" keyTimes="0; 0.5; 1" keyPoints="0; 1; 0" keySplines="0.42, 0, 0.58, 1; 0.42, 0, 0.58, 1" path="M68.64283258757536,148.7927049042085 L84.86205711124327,123.55509891927308" begin="-2727.2727272727275ms" dur="1500ms" ></animateMotion> </ellipse></svg>Animações que esticam
Os círculos também têm animações de deformação que fazem com que eles estiquem e encolham suavemente durante o movimento.
Os elementos animate compartilham os seguintes atributos:
repeatCount="indefinite": a animação se repete indefinidamentedur="1500ms": duração total da animação
As animações de raio são configuradas com:
rx | ry | Descrição |
|---|---|---|
| 8 | 8 | Raio original |
| 8.4 | 7.6 | Estica horizontalmente e encolhe verticalmente |
| 8 | 8 | Retorna ao tamanho original |
| 8.4 | 7.6 | Estica horizontalmente e encolhe verticalmente |
| 8 | 8 | Retorna ao tamanho original |
O atributo begin é o mesmo usado na animação de movimento para sincronizar as duas animações.
Ou seja, os círculos esticam ao se mover de um ponto a outro.
Resultado
Código
<svg> <rect></rect> <path></path> <path></path> <path></path> <path></path> <path></path> <path></path> <path></path> <path></path> <path></path> <path></path> <path></path> <ellipse> <animateMotion></animateMotion> <animate attributeName="rx" repeatCount="indefinite" values="8; 8.4; 8; 8.4; 8" begin="-0ms" dur="1500ms" ></animate> <animate attributeName="ry" repeatCount="indefinite" values="8; 7.6; 8; 7.6; 8" begin="-0ms" dur="1500ms" ></animate> </ellipse> <ellipse> <animateMotion></animateMotion> <animate attributeName="rx" repeatCount="indefinite" values="8; 8.4; 8; 8.4; 8" begin="-272.72727272727275ms" dur="1500ms" ></animate> <animate attributeName="ry" repeatCount="indefinite" values="8; 7.6; 8; 7.6; 8" begin="-272.72727272727275ms" dur="1500ms" ></animate> </ellipse> <ellipse> <animateMotion></animateMotion> <animate attributeName="rx" repeatCount="indefinite" values="8; 8.4; 8; 8.4; 8" begin="-545.4545454545455ms" dur="1500ms" ></animate> <animate attributeName="ry" repeatCount="indefinite" values="8; 7.6; 8; 7.6; 8" begin="-545.4545454545455ms" dur="1500ms" ></animate> </ellipse> <ellipse> <animateMotion></animateMotion> <animate attributeName="rx" repeatCount="indefinite" values="8; 8.4; 8; 8.4; 8" begin="-818.1818181818182ms" dur="1500ms" ></animate> <animate attributeName="ry" repeatCount="indefinite" values="8; 7.6; 8; 7.6; 8" begin="-818.1818181818182ms" dur="1500ms" ></animate> </ellipse> <ellipse> <animateMotion></animateMotion> <animate attributeName="rx" repeatCount="indefinite" values="8; 8.4; 8; 8.4; 8" begin="-1090.909090909091ms" dur="1500ms" ></animate> <animate attributeName="ry" repeatCount="indefinite" values="8; 7.6; 8; 7.6; 8" begin="-1090.909090909091ms" dur="1500ms" ></animate> </ellipse> <ellipse> <animateMotion></animateMotion> <animate attributeName="rx" repeatCount="indefinite" values="8; 8.4; 8; 8.4; 8" begin="-1363.6363636363637ms" dur="1500ms" ></animate> <animate attributeName="ry" repeatCount="indefinite" values="8; 7.6; 8; 7.6; 8" begin="-1363.6363636363637ms" dur="1500ms" ></animate> </ellipse> <ellipse> <animateMotion></animateMotion> <animate attributeName="rx" repeatCount="indefinite" values="8; 8.4; 8; 8.4; 8" begin="-1636.3636363636365ms" dur="1500ms" ></animate> <animate attributeName="ry" repeatCount="indefinite" values="8; 7.6; 8; 7.6; 8" begin="-1636.3636363636365ms" dur="1500ms" ></animate> </ellipse> <ellipse> <animateMotion></animateMotion> <animate attributeName="rx" repeatCount="indefinite" values="8; 8.4; 8; 8.4; 8" begin="-1909.0909090909092ms" dur="1500ms" ></animate> <animate attributeName="ry" repeatCount="indefinite" values="8; 7.6; 8; 7.6; 8" begin="-1909.0909090909092ms" dur="1500ms" ></animate> </ellipse> <ellipse> <animateMotion></animateMotion> <animate attributeName="rx" repeatCount="indefinite" values="8; 8.4; 8; 8.4; 8" begin="-2181.818181818182ms" dur="1500ms" ></animate> <animate attributeName="ry" repeatCount="indefinite" values="8; 7.6; 8; 7.6; 8" begin="-2181.818181818182ms" dur="1500ms" ></animate> </ellipse> <ellipse> <animateMotion></animateMotion> <animate attributeName="rx" repeatCount="indefinite" values="8; 8.4; 8; 8.4; 8" begin="-2454.545454545455ms" dur="1500ms" ></animate> <animate attributeName="ry" repeatCount="indefinite" values="8; 7.6; 8; 7.6; 8" begin="-2454.545454545455ms" dur="1500ms" ></animate> </ellipse> <ellipse> <animateMotion></animateMotion> <animate attributeName="rx" repeatCount="indefinite" values="8; 8.4; 8; 8.4; 8" begin="-2727.2727272727275ms" dur="1500ms" ></animate> <animate attributeName="ry" repeatCount="indefinite" values="8; 7.6; 8; 7.6; 8" begin="-2727.2727272727275ms" dur="1500ms" ></animate> </ellipse></svg>Playground
Experimente diferentes valores para o atributo factor para ver como ele afeta o espaçamento dos atrasos de início das animações.
- Os comportamentos se repetem a cada 11 passos, que é o número de círculos. O comportamento para factor 2 é igual para 13, por exemplo.
- Para factor igual a metade do número de círculos (11 / 2 = 5.5), não há oscilação.
- Para factor 5.6 à 11, o comportamento é o inverso de 0 à 5.4. Factor 2 e 9, por exemplo.
Conclusão
Assim como nas outras animações da série, minha ideia era usar elementos simples para tentar chegar em um resultado interessante. A animação de novembro segue a mesma lógica explorada nas versões anteriores: caminhos simples e pequenos ajustes de atraso e deformação para criar movimento. Como nos meses anteriores, utilizei JavaScript para calcular tanto as coordenadas desses caminhos quanto os atrasos utilizados em cada círculo.
Resultado
Código
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" width="200" height="200"> <rect width="199" height="199" rx="6" x="0.5" y="0.5" fill="white" stroke-width="1" stroke="lightgray" ></rect> <ellipse rx="8" ry="8"> <animateMotion repeatCount="indefinite" rotate="auto" calcMode="spline" keyTimes="0; 0.5; 1" keyPoints="0; 1; 0" keySplines="0.42, 0, 0.58, 1; 0.42, 0, 0.58, 1" path="M100,158 L100,128" begin="-0ms" dur="1500ms" ></animateMotion> <animate attributeName="rx" repeatCount="indefinite" values="8; 8.4; 8; 8.4; 8" begin="-0ms" dur="1500ms" ></animate> <animate attributeName="ry" repeatCount="indefinite" values="8; 7.6; 8; 7.6; 8" begin="-0ms" dur="1500ms" ></animate> </ellipse> <ellipse rx="8" ry="8"> <animateMotion repeatCount="indefinite" rotate="auto" calcMode="spline" keyTimes="0; 0.5; 1" keyPoints="0; 1; 0" keySplines="0.42, 0, 0.58, 1; 0.42, 0, 0.58, 1" path="M131.35716741242464,148.7927049042085 L115.13794288875673,123.55509891927308" begin="-272.72727272727275ms" dur="1500ms" ></animateMotion> <animate attributeName="rx" repeatCount="indefinite" values="8; 8.4; 8; 8.4; 8" begin="-272.72727272727275ms" dur="1500ms" ></animate> <animate attributeName="ry" repeatCount="indefinite" values="8; 7.6; 8; 7.6; 8" begin="-272.72727272727275ms" dur="1500ms" ></animate> </ellipse> <ellipse rx="8" ry="8"> <animateMotion repeatCount="indefinite" rotate="auto" calcMode="spline" keyTimes="0; 0.5; 1" keyPoints="0; 1; 0" keySplines="0.42, 0, 0.58, 1; 0.42, 0, 0.58, 1" path="M152.75865573056205,124.09407075410941 L125.46969586992651,111.63162036405282" begin="-545.4545454545455ms" dur="1500ms" ></animateMotion> <animate attributeName="rx" repeatCount="indefinite" values="8; 8.4; 8; 8.4; 8" begin="-545.4545454545455ms" dur="1500ms" ></animate> <animate attributeName="ry" repeatCount="indefinite" values="8; 7.6; 8; 7.6; 8" begin="-545.4545454545455ms" dur="1500ms" ></animate> </ellipse> <ellipse rx="8" ry="8"> <animateMotion repeatCount="indefinite" rotate="auto" calcMode="spline" keyTimes="0; 0.5; 1" keyPoints="0; 1; 0" keySplines="0.42, 0, 0.58, 1; 0.42, 0, 0.58, 1" path="M157.4096436290941,91.74573938014947 L127.71500037266611,96.01518452834802" begin="-818.1818181818181ms" dur="1500ms" ></animateMotion> <animate attributeName="rx" repeatCount="indefinite" values="8; 8.4; 8; 8.4; 8" begin="-818.1818181818181ms" dur="1500ms" ></animate> <animate attributeName="ry" repeatCount="indefinite" values="8; 7.6; 8; 7.6; 8" begin="-818.1818181818181ms" dur="1500ms" ></animate> </ellipse> <ellipse rx="8" ry="8"> <animateMotion repeatCount="indefinite" rotate="auto" calcMode="spline" keyTimes="0; 0.5; 1" keyPoints="0; 1; 0" keySplines="0.42, 0, 0.58, 1; 0.42, 0, 0.58, 1" path="M143.83347531254697,62.018077431173474 L121.16098808191923,81.66389944953202" begin="-1090.909090909091ms" dur="1500ms" ></animateMotion> <animate attributeName="rx" repeatCount="indefinite" values="8; 8.4; 8; 8.4; 8" begin="-1090.909090909091ms" dur="1500ms" ></animate> <animate attributeName="ry" repeatCount="indefinite" values="8; 7.6; 8; 7.6; 8" begin="-1090.909090909091ms" dur="1500ms" ></animate> </ellipse> <ellipse rx="8" ry="8"> <animateMotion repeatCount="indefinite" rotate="auto" calcMode="spline" keyTimes="0; 0.5; 1" keyPoints="0; 1; 0" keySplines="0.42, 0, 0.58, 1; 0.42, 0, 0.58, 1" path="M116.34048829680295,44.34940753035916 L107.88851159156005,73.13419673879407" begin="-1363.6363636363635ms" dur="1500ms" ></animateMotion> <animate attributeName="rx" repeatCount="indefinite" values="8; 8.4; 8; 8.4; 8" begin="-1363.6363636363635ms" dur="1500ms" ></animate> <animate attributeName="ry" repeatCount="indefinite" values="8; 7.6; 8; 7.6; 8" begin="-1363.6363636363635ms" dur="1500ms" ></animate> </ellipse> <ellipse rx="8" ry="8"> <animateMotion repeatCount="indefinite" rotate="auto" calcMode="spline" keyTimes="0; 0.5; 1" keyPoints="0; 1; 0" keySplines="0.42, 0, 0.58, 1; 0.42, 0, 0.58, 1" path="M83.6595117031971,44.349407530359144 L92.11148840843998,73.13419673879407" begin="-1636.3636363636363ms" dur="1500ms" ></animateMotion> <animate attributeName="rx" repeatCount="indefinite" values="8; 8.4; 8; 8.4; 8" begin="-1636.3636363636363ms" dur="1500ms" ></animate> <animate attributeName="ry" repeatCount="indefinite" values="8; 7.6; 8; 7.6; 8" begin="-1636.3636363636363ms" dur="1500ms" ></animate> </ellipse> <ellipse rx="8" ry="8"> <animateMotion repeatCount="indefinite" rotate="auto" calcMode="spline" keyTimes="0; 0.5; 1" keyPoints="0; 1; 0" keySplines="0.42, 0, 0.58, 1; 0.42, 0, 0.58, 1" path="M56.16652468745303,62.01807743117346 L78.83901191808077,81.66389944953201" begin="-1909.090909090909ms" dur="1500ms" ></animateMotion> <animate attributeName="rx" repeatCount="indefinite" values="8; 8.4; 8; 8.4; 8" begin="-1909.090909090909ms" dur="1500ms" ></animate> <animate attributeName="ry" repeatCount="indefinite" values="8; 7.6; 8; 7.6; 8" begin="-1909.090909090909ms" dur="1500ms" ></animate> </ellipse> <ellipse rx="8" ry="8"> <animateMotion repeatCount="indefinite" rotate="auto" calcMode="spline" keyTimes="0; 0.5; 1" keyPoints="0; 1; 0" keySplines="0.42, 0, 0.58, 1; 0.42, 0, 0.58, 1" path="M42.5903563709059,91.74573938014946 L72.28499962733389,96.01518452834802" begin="-2181.818181818182ms" dur="1500ms" ></animateMotion> <animate attributeName="rx" repeatCount="indefinite" values="8; 8.4; 8; 8.4; 8" begin="-2181.818181818182ms" dur="1500ms" ></animate> <animate attributeName="ry" repeatCount="indefinite" values="8; 7.6; 8; 7.6; 8" begin="-2181.818181818182ms" dur="1500ms" ></animate> </ellipse> <ellipse rx="8" ry="8"> <animateMotion repeatCount="indefinite" rotate="auto" calcMode="spline" keyTimes="0; 0.5; 1" keyPoints="0; 1; 0" keySplines="0.42, 0, 0.58, 1; 0.42, 0, 0.58, 1" path="M47.241344269437946,124.09407075410944 L74.53030413007349,111.63162036405284" begin="-2454.5454545454545ms" dur="1500ms" ></animateMotion> <animate attributeName="rx" repeatCount="indefinite" values="8; 8.4; 8; 8.4; 8" begin="-2454.5454545454545ms" dur="1500ms" ></animate> <animate attributeName="ry" repeatCount="indefinite" values="8; 7.6; 8; 7.6; 8" begin="-2454.5454545454545ms" dur="1500ms" ></animate> </ellipse> <ellipse rx="8" ry="8"> <animateMotion repeatCount="indefinite" rotate="auto" calcMode="spline" keyTimes="0; 0.5; 1" keyPoints="0; 1; 0" keySplines="0.42, 0, 0.58, 1; 0.42, 0, 0.58, 1" path="M68.6428325875753,148.79270490420848 L84.86205711124325,123.55509891927306" begin="-2727.272727272727ms" dur="1500ms" ></animateMotion> <animate attributeName="rx" repeatCount="indefinite" values="8; 8.4; 8; 8.4; 8" begin="-2727.272727272727ms" dur="1500ms" ></animate> <animate attributeName="ry" repeatCount="indefinite" values="8; 7.6; 8; 7.6; 8" begin="-2727.272727272727ms" dur="1500ms" ></animate> </ellipse></svg>