【问题标题】:Is it possible to morph SVG's paths using Velocity.js?是否可以使用 Velocity.js 变形 SVG 的路径?
【发布时间】:2017-03-16 17:52:25
【问题描述】:

是否可以使用 Velocity.js 变形 SVG 的路径?

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

"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', ??????);
    }
});

【问题讨论】:

    标签: svg velocity.js


    【解决方案1】:

    编辑:请注意,我是 2016 年启用此功能的代码的作者,因此这是官方支持的方式!

    差不多,应该是这样的:

    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);
        }
    });

    【讨论】:

    • 请注意,在 Velocity 1.4.3 之前,负数作为字符串的一部分被窃听
    【解决方案2】:

    编辑:Velocity 内置了一些字符串动画支持,请参阅下面的 Rycochets 回答。

    如果没有,您可以自己尝试,将路径字符串分解为一个数组。

    一种方法是在polyfill 使用路径数据polyfill(因为Chrome 已弃用该功能以便轻松访问数组点)。然后你可以通过路径点进行类似于下面的循环并进行插值。

    您也可以尝试使用一些正则表达式来拆分然后构建备份,一个简单的示例可能类似于以下内容。它可能不完整(我还没有真正测试过正则表达式,如果有一些我没有想到的字符,你可能会得到不同数量的元素)。

    $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

    【讨论】:

    • 抱歉 - 不得不投反对票 - 我在几个月前添加了 Velocity 处理字符串->字符串动画的功能,但是我无法访问文档来添加它。见github.com/julianshapiro/velocity/issues/697
    • github.com/julianshapiro/velocity/commit/… - 尽管此后进行了一些修复。将我的示例粘贴到 JSFiddle 示例中(并将其记录到控制台)非常适合以下值:jsfiddle.net/jgmxy0yc - 只需先打开控制台...
    • 没有“必须”投反对票,但由于您是速度代码的作者,我当然尊重它:)。不过,根据 SO 要求,我仍然认为我的回答是“有用的”,因此请找到一个有点苛刻的反对意见,但生命很短:)。请注意,我认为您的示例不适用于例如从正面过渡到负面(但我可能错了),因此我认为拥有自定义替代方案仍然很有用。
    • 遗憾的是,当它过于复杂时,您的答案被投了赞成票,并且是复制内置 Velocity 代码的手动方式(它还处理非分数 rgb/rgba() 值以及负数) .不幸的是,像这样使用 RegExp 往往会导致以后的错误 - 但更准确的 RegExp(用于路径等)可读性较差 - /(-?[0-9]+(?:\.[0-9]*)|-?\.[0-9]+|[^0-9\.-]+|\.|-)/g - 为什么内部代码不使用 RegExp,并且还知道何时 from 和 to 相同保存它们之间的处理等。
    • 嗯,刚刚做了一个测试,因为它应该适用于底片 - 并发现它实际上是一个错误,它没有 - 没有足够的人意识到这一点,因此没有足够的测试并且它通过了。 ..真的希望我有足够的时间来修复它并在这个周末发布一个新版本...
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 2022-10-24
    • 2018-04-24
    • 2016-12-26
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 2018-04-20
    相关资源
    最近更新 更多