在 Internet Explorer 中的曲线路径上为 SVG 设置动画

Posted

技术标签:

【中文标题】在 Internet Explorer 中的曲线路径上为 SVG 设置动画【英文标题】:Animating SVG on a curved path in Internet Explorer 【发布时间】:2021-05-26 03:57:43 【问题描述】:

我正在尝试根据这篇文章沿路径制作动画:move SVG group on path trail based on percentage of whole path trail

它在除 Internet Explorer 之外的所有浏览器中都能完美运行。我已经阅读了很多关于 IE 缺乏支持的帖子,但我仍然有足够的用户使用它,我需要考虑它。我可以将其转换为另一种方法吗?

这是我的代码(这里是简化的图标,CodePen 中的图标更复杂):

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Jeep Test 5</title>
    <style type="text/css">
        #carRightvisibility: visible;
        #carLeftvisibility: hidden;
        #carRightIsoBack visibility: hidden;
        #carRightIsoFront visibility: hidden;
        #carLeftIsoBack visibility: hidden;
        #carLeftIsoFront visibility: hidden;
    </style>
    <script src="../SiteAssets/js/jquery-1.8.1.min.js"></script>
</head>

<body>
    <input type="range" id="theRange" value="0"/>
<div id="percentage"></div>
    
    <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
     viewBox="0 0 459 257" style="enable-background:new 0 0 459 257;" xml:space="preserve">
<style type="text/css">
    #percentageborder:1px solid red; padding: 5px;
svgborder:1px solid;overflow:visible; width:95vh; display:block; margin:1em auto;
    .st0fill:none;stroke:#F1EA0D;stroke-width:5;stroke-miterlimit:10;
    .st1fill:#1A1A1A;
    .st2fill:#FF0000;

</style>

<defs>
<g id="carRight" transform="translate(-90, -240)">
        <circle class="st3" cx="134.5" cy="215.2" r="12"/>
</g>
</defs>
        <path id="path" class="st0" d="M20.5,249.5c0,0,27,0,54,1s47.36-5,61-13c40.32-23.66,50.1-50.05,3-82c-35.12-23.83-65-19-97-44
    c-22.4-17.5-21.92-28.85-1-41c31-18,101.15-43.54,158-27c55,16,48,30,45,61s-8,39-13,60s5.09,40.12,17,56c18,24,56.49,26.8,81,17
    c10-4,33-17,29-48c-3.36-26.03-15-34-30-53s-4.97-25.67,7-27c18-2,32.57-1.81,59,7c24,8,54,9,65,4s1-22-9-32s-14-17-30-24
    s-34-8-53-3s-28,11-44,14s-26-10-18-25s22-28,42-38c4-2,9-4,9-4"/>
            <use id="theUse_car_right"  transform="translate(0,20)" xlink:href="#carRight" />

    </svg>

<script type="text/javascript">
    let pathlength = path.getTotalLength();
    let pos = path.getPointAtLength(0);

    theUse_car_right.setAttributeNS(null,"x", pos.x);
    theUse_car_right.setAttributeNS(null,"y", pos.y);

    document.getElementById("percentage").textContent = "Completion=0%";

    theRange.addEventListener("input", ()=>
      let perc = parseInt(theRange.value);
      let leng = pathlength * perc/100;
      pos = path.getPointAtLength(leng);
      theUse_car_right.setAttributeNS(null,"x", pos.x);
      theUse_car_right.setAttributeNS(null,"y", pos.y);

        
    document.getElementById("percentage").textContent = "Completion=" + perc + "%";
       ) 
  
</script>
</body>
</html>

在这里演示:https://codepen.io/mrsgorgon/pen/ExNbEPN

【问题讨论】:

宇舟,完美解决!我赞成它,但我太新了,无法展示。您是否推荐任何有关在 IE 中不起作用的功能的指南?不幸的是,我需要支持它。 关于在 IE 中不起作用的功能,没有列表。通常,IE 不支持 ES6 及以上的语法。如果 IE 不支持该功能,控制台会显示错误。您可以在IE中使用F12开发工具来检查是否有任何错误。 对于“theRange”,即动画路径的百分比,我需要使用从数据库加载的数字,而不是在范围表单元素上选择的数字。动画将在页面加载时播放。我试图弄清楚我会逐渐增加什么,直到长度 = theRange。我是否会逐渐增加 perc 直到它等于 pathlength * perc / 100; 【参考方案1】:

您的代码的问题在于 JavaScript。

    Arrow function =&gt; 在 IE 中不受支持。您需要使用传统的函数表达式。

    输入范围上的input 事件不会在 IE 中触发。您需要使用change 事件来监控输入范围的变化。但是change事件不会在其他现代浏览器中触发,所以我们需要将这两个事件处理函数结合起来。

    我将函数定义为moveit,并像这样组合两个事件处理程序:

    <input type="range" id="theRange" value="0" oninput="moveit()" onchange="moveit()" />
    

完整的示例代码如下:

let pathlength = path.getTotalLength();
let pos = path.getPointAtLength(0);

theUse_car_right.setAttributeNS(null, "x", pos.x);
theUse_car_right.setAttributeNS(null, "y", pos.y);

document.getElementById("percentage").textContent = "Completion=0%";

function moveit() 
  let perc = parseInt(theRange.value);
  let leng = pathlength * perc / 100;
  pos = path.getPointAtLength(leng);
  theUse_car_right.setAttributeNS(null, "x", pos.x);
  theUse_car_right.setAttributeNS(null, "y", pos.y);
  document.getElementById("percentage").textContent = "Completion=" + perc + "%";
#carRight 
  visibility: visible;


#carLeft 
  visibility: hidden;


#carRightIsoBack 
  visibility: hidden;


#carRightIsoFront 
  visibility: hidden;


#carLeftIsoBack 
  visibility: hidden;


#carLeftIsoFront 
  visibility: hidden;


#percentage 
  border: 1px solid red;
  padding: 5px;


svg 
  border: 1px solid;
  overflow: visible;
  width: 95vh;
  display: block;
  margin: 1em auto;


.st0 
  fill: none;
  stroke: #F1EA0D;
  stroke-width: 5;
  stroke-miterlimit: 10;


.st1 
  fill: #1A1A1A;


.st2 
  fill: #FF0000;
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<input type="range" id="theRange" value="0" oninput="moveit()" onchange="moveit()" />
<div id="percentage"></div>
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 459 257" style="enable-background:new 0 0 459 257;" xml:space="preserve">
<defs>
<g id="carRight" transform="translate(-90, -240)">
    <circle class="st3" cx="134.5" cy="215.2" r="12" />
</g>
</defs>
    <path id="path" class="st0" d="M20.5,249.5c0,0,27,0,54,1s47.36-5,61-13c40.32-23.66,50.1-50.05,3-82c-35.12-23.83-65-19-97-44
    c-22.4-17.5-21.92-28.85-1-41c31-18,101.15-43.54,158-27c55,16,48,30,45,61s-8,39-13,60s5.09,40.12,17,56c18,24,56.49,26.8,81,17
    c10-4,33-17,29-48c-3.36-26.03-15-34-30-53s-4.97-25.67,7-27c18-2,32.57-1.81,59,7c24,8,54,9,65,4s1-22-9-32s-14-17-30-24
    s-34-8-53-3s-28,11-44,14s-26-10-18-25s22-28,42-38c4-2,9-4,9-4" />
    <use id="theUse_car_right" transform="translate(0,20)" xlink:href="#carRight" />
    </svg>

【讨论】:

以上是关于在 Internet Explorer 中的曲线路径上为 SVG 设置动画的主要内容,如果未能解决你的问题,请参考以下文章

Internet Explorer 中的 addEventListener

Internet Explorer 11 中的光标偏移

Internet Explorer 中的 CSS“未设置”/“初始”

Internet Explorer 中的日期选择器出错

在 Internet Explorer 中的动态内容上自动增长 jQuery 插件

Internet Explorer 中的渐进式表格呈现