2017-02-14 6 views
0

Ist es möglich, SVG-Pfade mit Velocity.js zu morphen?Ist es möglich, SVG-Pfade mit Velocity.js zu morphen?

VON "M292,129c55.2,0,193,125.8,193,181S365.7,506,310.5,506S136,355.2,136,300S236.8,129,292,129z"

TO "M230,38c55.2,0,348,57.8,348,113S391.2,569,336,569S55,456.2,55,401S174.8,38,230,38z"

var path = document.querySelectorAll('svg path'); 

Velocity(path[0], { 
    tween: 1000 
}, { 
    duration: 6000, 
    easing: 'easeOutBounce', 
    progress: function (el, c, r, s, t) { 
     el[0].setAttribute('d', ??????); 
    } 
}); 

Antwort

-1

EDIT: Bitte beachten Sie, ich der Autor des Codes bin, dass dies im Jahr 2016 aktiviert, so dass es die offiziellen Weg, es zu tun unterstützt wird!

Fast, sollte wie folgt sein:

var path = document.querySelectorAll('svg path'), 
 
    from = "M292,129c55.2,0,193,125.8,193,181S365.7,506,310.5,506S136,355.2,136,300S236.8,129,292,129z", 
 
    to = "M230,38c55.2,0,348,57.8,348,113S391.2,569,336,569S55,456.2,55,401S174.8,38,230,38z"; 
 

 
Velocity(path[0], { 
 
    tween: [to, from] 
 
}, { 
 
    duration: 6000, 
 
    easing: 'easeOutBounce', 
 
    progress: function(elements, complete, remaining, start, tweenValue) { 
 
     elements[0].setAttribute('d', tweenValue); 
 
    } 
 
});

+0

Bitte beachten Sie, dass negative Zahlen als Teil der Zeichenfolge bis Geschwindigkeit 1.4.3 – Rycochet

0

Edit: Velocity hat eine Schnur Animation Unterstützung eingebaut, siehe unten Rycochets beantworten.

Wenn nicht, können Sie es selbst versuchen, indem Sie die Pfadzeichenfolge in ein Array aufteilen.

Eine Möglichkeit ist die Verwendung des Pfaddaten-Polyfill (da Chrome diese Funktion verwehrt hat, um einen einfachen Zugriff auf die Array-Punkte zu ermöglichen) unter polyfill. Dann könntest du ähnlich wie unten durch die Pfadpunkte schleifen und interpolieren.

Sie könnten auch versuchen, einige Regex zu teilen und dann wieder aufzubauen, ein schnelles Beispiel könnte etwas wie das Folgende sein. Es ist wahrscheinlich nicht vollständig (ich habe die Regex nicht wirklich getestet, und Sie können unterschiedliche Anzahl von Elementen erhalten, wenn es einige Zeichen gibt, an die ich nicht gedacht habe).

$velocity=$("#mypath"); 

var fromPath = "M292,129c55.2,0,193,125.8,193,181S365.7,506,310.5,506S136,355.2,136,300S236.8,129,292,129z"; 
var toPath = "M230,38c55.2,0,348,57.8,348,113S391.2,569,336,569S55,456.2,55,401S174.8,38,230,38z"; 

var re = /(([+-]?[0-9\.]+)|[a-z]|\s+)([eE][-+]?[0-9]+)?/gi 

var fromMatch = fromPath.match(re) 
var toMatch = toPath.match(re) 

$velocity.velocity(
    { opacity: 0.5, tween: [0,1] }, 
    { progress: function(el, complete, remaining, start, tweenValue) { 
     var interpPath = ''; 
     for(c=0; c<fromMatch.length; c++) { 
     if(!isNaN(fromMatch[c])) { 
      interpPath += (toMatch[c] - fromMatch[c]) * tweenValue + +fromMatch[c] 
     } else { 
      interpPath += toMatch[c] 
     } 
     } 
     el[0].setAttribute('d', interpPath) 
    } } 
) 

jsfiddle

+0

Leider abgehört wurden - musste downvote - Ich habe die Fähigkeit, für Geschwindigkeit zu handhaben Saiten-> string Animationen mehrere Monate Vorhin habe ich keinen Zugriff auf die Dokumentation, um sie dort aber hinzuzufügen. Siehe https://github.com/julianshapiro/velocity/issues/697 – Rycochet

+0

https://github.com/julianshapiro/velocity/commit/7b196f548a27bdbd909e0d82cf89f8ed8c427edf - obwohl es seither ein paar Fixes gab. Das Einfügen meines Beispiels in das JSFiddle-Beispiel (und das Protokollieren in der Konsole) funktioniert perfekt für die Werte: https://jsfiddle.net/jgmxy0yc/ - öffnen Sie einfach zuerst Ihre Konsole ... – Rycochet

+0

Nicht "haben", um zu downvote , aber da du ein Autor des Velocity-Codes bist, respektiere ich es auf jeden Fall :). Ich denke immer noch, dass meine Antwort "nützlich" ist, wie es die SO-Anforderungen verlangen, also finde einen Downvote ein bisschen hart, aber das Leben ist kurz :). Beachten Sie, dass Ihr Beispiel, denke ich, nicht für den Übergang von einem positiven zu einem negativen Beispiel funktionieren würde (aber ich könnte falsch liegen), also denke ich, dass es nützlich ist, immer noch eine benutzerdefinierte Alternative zu haben. – Ian

Verwandte Themen