【问题标题】:How to get dashed line svg animation on accordingly scroll?如何在相应的滚动上获得虚线 svg 动画?
【发布时间】:2021-02-10 12:09:39
【问题描述】:

每当我在虚线 svg 上应用滚动动画时,它都会转换为没有虚线的简单线。

我想要当前正在运行的相同动画,但行将是 dashed-line,如下例中的 Svg Before animation 所示。

// Get the id of the <path> element and the length of <path>
var triangle = document.getElementById("dashed-path");
var length = triangle.getTotalLength();

// The start position of the drawing
triangle.style.strokeDasharray = length;

// Hide the triangle by offsetting dash. Remove this line to show the triangle before scroll draw
triangle.style.strokeDashoffset = length;

// Find scroll percentage on scroll (using cross-browser properties), and offset dash same amount as percentage scrolled
window.addEventListener("scroll", myFunction);

function myFunction() {
var scrollpercent = (document.body.scrollTop + document.documentElement.scrollTop) / (document.documentElement.scrollHeight - document.documentElement.clientHeight);

  var draw = length * scrollpercent;
  
  // Reverse the drawing (when scrolling upwards)
  triangle.style.strokeDashoffset = length - draw;
}
.height-div{
        height: 500px; width: 100%; background:#eeeeee; 
    }
    .desktop-pattern-wrap{display: inline-block;vertical-align: top;width: 100%;}
    .desktop-pattern-wrap > div{float: left;width: 50%;}
<div class="desktop-pattern-wrap">
        <div class="desktop-pattern">
            <h2>Svg after animation</h2>
            <svg width="198px" height="1458px" viewBox="0 0 198 1458" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
                <defs>
                    <linearGradient x1="50%" y1="7.06935325%" x2="50%" y2="100%" id="linearGradient-1">
                        <stop stop-color="#DE1652" offset="0%"></stop>
                        <stop stop-color="#F37121" offset="50.2239948%"></stop>
                        <stop stop-color="#FBAB26" offset="100%"></stop>
                    </linearGradient>
                </defs>
                <g id="Homepage" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-dasharray="12,16" stroke-linejoin="round">
                    <g id="Desktop-Homepage-1" transform="translate(-646.000000, -825.000000)" stroke="url(#linearGradient-1)" stroke-width="4">
                        <g id="content" transform="translate(0.000000, 560.000000)">
                            <path d="M702,266 C682,424 795.064639,474.307498 716,600 C599,786 769,821 688,988 C548.560405,1275.48657 822.815807,1223 840.843207,1373 C858.870608,1523 605.485477,1528 687.610302,1728" id="dashed-path"></path>
                        </g>
                    </g>
                </g>
            </svg>
        </div>
        <div class="desktop-pattern-right">
            <h2>Svg Before animation</h2>
            <svg width="198px" height="1458px" viewBox="0 0 198 1458" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
                <defs>
                    <linearGradient x1="50%" y1="7.06935325%" x2="50%" y2="100%" id="linearGradient-1">
                        <stop stop-color="#DE1652" offset="0%"></stop>
                        <stop stop-color="#F37121" offset="50.2239948%"></stop>
                        <stop stop-color="#FBAB26" offset="100%"></stop>
                    </linearGradient>
                </defs>
                <g id="Homepage" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-dasharray="12,16" stroke-linejoin="round">
                    <g id="Desktop-Homepage-1" transform="translate(-646.000000, -825.000000)" stroke="url(#linearGradient-1)" stroke-width="4">
                        <g id="content" transform="translate(0.000000, 560.000000)">
                            <path d="M702,266 C682,424 795.064639,474.307498 716,600 C599,786 769,821 688,988 C548.560405,1275.48657 822.815807,1223 840.843207,1373 C858.870608,1523 605.485477,1528 687.610302,1728" id="dashed-path"></path>
                        </g>
                    </g>
                </g>
            </svg>
        </div>
    </div>
    <div class="height-div">
        
    </div>

【问题讨论】:

    标签: javascript html jquery css animation


    【解决方案1】:

    这可以通过添加 SVG mask 然后在路径上绘制来完成:

    var path = document.getElementById("thePath");
    var mask = document.getElementById("maskPath");
    
    var pathLength = path.getTotalLength();
    var maskLength = 1050;
    
    mask.style.strokeDashoffset = maskLength;
    
    window.addEventListener("scroll", myFunction);
    
    function myFunction() {
      var scrollpercent = (document.body.scrollTop + document.documentElement.scrollTop) / (document.documentElement.scrollHeight - document.documentElement.clientHeight);
    
      var draw = pathLength * scrollpercent;
    
      mask.style.strokeDashoffset = maskLength - draw;
    }
    <h1>Scroll down</h1>
    <svg width="198px" height="1458px" viewBox="0 0 198 1458">
      <defs>
        <linearGradient x1="50%" y1="7.06935325%" x2="50%" y2="100%" id="linearGradient-1">
        <stop stop-color="#DE1652" offset="0%"></stop>
        <stop stop-color="#F37121" offset="50.2239948%"></stop>
        <stop stop-color="#FBAB26" offset="100%"></stop>
        </linearGradient>
        <mask id="theMask" maskUnits="userSpaceOnUse">
          <path id="maskPath"
          d="M702,266 C682,424 795.064639,474.307498 716,600 C599,786 769,821 688,988 C548.560405,1275.48657 822.815807,1223 840.843207,1373 C858.870608,1523 605.485477,1528 687.610302,1728"
          fill="none"
          fill-rule="evenodd"
          stroke-dasharray="1637"
          stroke-dashoffset="1050"
          transform="translate(-646.000000, -825.000000)"
          stroke-width="4"
          stroke="#fff"/>
        </mask>
      </defs>
      <g id="content" mask="url(#theMask)">
        <path id="thePath"
          d="M702,266 C682,424 795.064639,474.307498 716,600 C599,786 769,821 688,988 C548.560405,1275.48657 822.815807,1223 840.843207,1373 C858.870608,1523 605.485477,1528 687.610302,1728"
          fill="none"
          fill-rule="evenodd"
          stroke-dasharray="12,16"
          transform="translate(-646.000000, -825.000000)"
          stroke-width="4"
          stroke="url(#linearGradient-1)"
        ></path>
      </g>
    </svg>

    Codepen Example

    【讨论】:

    • 是的,它工作正常,但我没有得到正确的渐变颜色。当我尝试应用渐变时,它需要一些不透明度或我不知道其中发生了什么?
    • 我更新了答案,所以它也适用于渐变。
    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 2023-01-15
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 2016-06-23
    相关资源
    最近更新 更多