vectoriales software online lite gráficos edición crear svg path gradient

software - ¿Puedo aplicar un degradado a lo largo de una ruta SVG?



inkscape rar (4)

Me gustaría poner un indicador de carga simple en mi sitio web que se desencadena por un script. Debería ser un arco circular simple que tiene un gradiente y está girando mientras el usuario está esperando. No he probado la parte de la animación, pero me quedé atrapado en el estilo estático por ahora. Esto es lo que tengo hasta ahora:

<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" width="100" height="100"> <defs> <linearGradient id="grad1"> <stop offset="0%" stop-color="red"/> <stop offset="100%" stop-color="transparent"/> </linearGradient> </defs> <path d="M50 10 A40 40 0 1 0 90 50" stroke="url(#grad1)" stroke-width="10" fill="transparent"/> </svg>

Dibuja el arco, desde el borde superior en sentido antihorario hasta el borde derecho (270 °), pero el gradiente es incorrecto. En lugar de seguir la ruta de modo que el comienzo (borde superior, 0 °) sea opaco y el extremo (borde derecho, 270 °) transparente, la imagen resultante de la carrera del arco se colorea de izquierda a derecha en el espacio de la pantalla.

¿Cómo puedo hacer que el degradado siga mi trayectoria de arco?


Este tipo de gradiente no es fácil de lograr en SVG, ver gradiente angular SVG .

Además, transparent no es un color válido en SVG. Debería indicar stop-opacity como en este ejemplo: http://jsfiddle.net/WF2CS/

Me temo que la solución más fácil podría ser una serie de pequeños caminos de arco con opacidad variable.


Lamento haber llegado tan tarde aquí, esto podría ser útil para alguien, lo obtuve de https://github.com/ryanallen/articles/blob/master/img/svg/svg-loading-icon.svg

<svg version="1.1" id="svg-loading-1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 80 80" xml:space="preserve"> <path id="loading-spinner" fill="#338833" d="M 40,72 C 22.4,72,8,57.6,8,40 C 8,22.4,22.4,8,40,8 c 17.6,0,32,14.4,32,32 c 0,1.1-0.9,2-2,2 s -2-0.9-2-2 c 0-15.4-12.6-28-28-28 S 12,24.6,12,40 s 12.6,28,28,28 c 1.1,0,2,0.9,2,2 S 41.1,72,40,72 z" > <animateTransform attributeType="xml" attributeName="transform" type="rotate" from="0 40 40" to="360 40 40" dur="1.5s" repeatCount="indefinite" /> </path> </svg>


Mike Bostock descubrió una manera, aunque no es fácil: https://bl.ocks.org/mbostock/4163057

Básicamente, esta técnica usa getPointAtLength para getPointAtLength el trazo en muchos trazos cortos, especificar paradas de color interpoladas para cada una, y luego aplicar un degradado a cada trazo corto entre esas paradas.

Buena suerte si estás preparado para el desafío;)


Otra forma es hacer dos medios círculos y aplicar el gradiente lineal opuesto al trazo de cada uno, y asegurarse de que ambos estén contenidos en el elemento ag. (En mi ejemplo, el gradiente combinado no es 270 grados sino 360. Dos semicírculos se apilan verticalmente. El primer degradado (aplicado al trazo del semicírculo superior) sería 100-50% de opacidad, luego el siguiente tendría 0 % a 50%. Ambos degradados tienen el vector de unidad establecido en x1, y1, y2 = 0 y x2 = 1, haciéndolos correr de izquierda a derecha). Luego aplique transform = rotate (deg, ctrX, ctrY) al g.