【问题标题】:Drawing a curved dashed line SVG on scroll在滚动上绘制弯曲的虚线 SVG
【发布时间】:2016-06-23 23:06:56
【问题描述】:

我的任务是添加一条虚线来链接页面上的一堆插图。我已经搜索了一段时间,遇到了一些没有破折号的法线绘制示例,例如我以前使用过的http://cbron.github.io/blog/2013/12/30/draw-svg-path-on-scroll-tutorial/

据我所知,这种技术不适用于虚线,因为它使用笔划虚线数组来实际绘制线条的动画。也许我错了?

有人知道用虚线实现相同效果的方法吗?另一件需要注意的是,这条线会在不同的颜色背景上移动。

任何建议将不胜感激。

更新: 工作解决方案

var line;
var subPaths = [];

window.onload = function(){
    line = Snap(document.getElementById("drawMe"));
    getSubPaths();
}

window.addEventListener("scroll", drawLine);

function drawLine() {
  var percentDrawn = (document.body.scrollTop + document.documentElement.scrollTop) / (document.documentElement.scrollHeight - document.documentElement.clientHeight);
  var percentDrawn = Math.round(percentDrawn * 100);

  line.attr({
      d: subPaths[percentDrawn]
  });

}

function getSubPaths(){
    var maxLength = line.getTotalLength();
    for(var i = 0; i<101; i++){
        var currentLength = maxLength*i/100;
        subPaths[i] = line.getSubpath(0, currentLength);
    }
}

【问题讨论】:

  • 您可以在要绘制的线条上放置一条虚线,并为其赋予背景颜色:jsfiddle.net/t9kqudxo 但是,由于您在不同颜色的背景之间移动,您可能希望将这条线分割成更小的块......真的取决于你的情况,你也可以将你的背景副本放在线条上并“剪切透明破折号”。这并不完美,但我希望能给你一些想法。
  • @yoshi 干杯!是的,我添加了关于不同背景的部分,因为我偶然发现了这种技术。我想知道 snap.svg 是否可以像演示 snapsvg.io/demos/#globe 那样通过动画 d 属性来处理它,但我认为它不适用于滚动交互。
  • 有一种更简单的方法可以使用虚线掩码。 See this answer for a demonstration

标签: javascript svg


【解决方案1】:

通过您指向 Snap.svg 的链接,我想出了这个解决方案:

<script src="./snap.svg.js"></script>
<script>

    var line;
    var subPaths = [];
    var percentDrawn = 0;

    window.onload = function(){
        line = Snap(document.getElementById("drawMe"));
        getSubPaths();
        loop();
    }

    function loop(){
        setTimeout(function(){
            line.attr({
                d: subPaths[percentDrawn]
            });
            percentDrawn++;
            if( percentDrawn < 101) loop();
        }, 50);
    }

    function getSubPaths(){
        var maxLength = line.getTotalLength();
        for(var i = 0; i<101; i++){
            var currentLength = maxLength*i/100;
            subPaths[i] = line.getSubpath(0, currentLength);
        }
    }
</script>

所以我们要做的是建立一个数组,其中包含从开始到总长度的 x% 的原始行的子路径:getSubPaths()。 为此,我们实际上需要 Snap.svg,因为它为我们提供了getSubpath(0, currentLength) 功能。

这就是所有的魔法! loop() 函数只是一个 setTimeout 块,在我们完成绘图后具有中止条件。然而,实际绘图是将先前存储的数组中的相应 subPath 应用到您的行的 d 属性。

【讨论】:

  • 不错,谢谢!你认为这有可能在滚动上工作吗?那么这条线是在用户滚动时绘制的吗?我还没有测试你发布的内容,但当我重新工作时会测试。
  • 不客气 :) 至于滚动,这应该很容易转换。百分比是来自计时器还是滚动都无关紧要 - 您可以从问题中提供的链接中获取逻辑。如果您存储超过 100 个子路径,您甚至可以通过相应地修改 getSubPaths 来获得更流畅的动画。如果出现进一步的问题,请告诉我:)
  • 试过那个代码,效果很好!谢谢!一旦我陷入滚动版本,将报告。
  • 让滚动版本正常工作。我已经用工作代码更新了我的问题。再次感谢!
猜你喜欢
  • 2019-12-31
  • 1970-01-01
  • 2014-06-14
  • 2017-01-25
  • 1970-01-01
  • 2016-02-01
  • 2014-07-24
  • 1970-01-01
  • 2017-03-19
相关资源
最近更新 更多