显示动画线的箭头

时间:2018-11-15 23:33:34

标签: css html5 webkit

我正在用https://jsfiddle.net/arungeorgez/r9x6vhcb/4/为从点1到点2的线设置动画。如何在同一行上添加箭头?

<style>
  .key-anim1 {
    -webkit-animation: Drawpath 1s linear forwards;
    animation: Drawpath 1s linear forwards;
    stroke-dasharray: 0, 600;
  }

  @-webkit-keyframes Drawpath {
    from {
      stroke-dasharray: 0, 600;
    }
    to {
      stroke-dasharray: 600, 600;
    }
  }
  @keyframes Drawpath {
    from {
      stroke-dasharray: 0, 600;
    }
    to {
      stroke-dasharray: 600, 600;
    }
  }
  </style>

1 个答案:

答案 0 :(得分:0)

<animate attributeType="XML" 
         attributeName="opacity" 
         from="0" to="1" 
         dur=".08s" begin=".23s" 
         repeatCount="0" fill="freeze" 
/>

由于箭头很小,因此似乎可以为您的情况带来不错的效果。但是,对于更好的解决方案,根据情况,可以使用<animateTransform><animateMotion>而不是<animate>

这是SMIL Animations的规格。

虽然CSS动画很容易达到这种效果(最后,我只对opacity进行了动画处理),但我倾向于推荐<svg>的SMIL动画,因为它们提供了更多功能用于控制动画各个方面的选项,远远优于CSS选项IMHO。

function makeSVG(tag, attrs) {
  var el = document.createElementNS('http://www.w3.org/2000/svg', tag);
  for (var k in attrs)
    el.setAttribute(k, attrs[k]);
  return el;
}

$(document).ready(function() {
  var line = makeSVG('line', {
    id: "-",
    class: "key-anim1",
    x1: 20,
    y1: 20,
    x2: 120,
    y2: 120,
    stroke: 'black',
    'stroke-width': 2,
    'marker-end': "url(#arrow)"
  });
  document.getElementById("svg").appendChild(line);
});
.key-anim1 {
    -webkit-animation: Drawpath 1s linear forwards;
    animation: Drawpath 1s linear forwards;
    stroke-dasharray: 0, 600;
  }

  @-webkit-keyframes Drawpath {
    from {
      stroke-dasharray: 0, 600;
    }
    to {
      stroke-dasharray: 600, 600;
    }
  }
  @keyframes Drawpath {
    from {
      stroke-dasharray: 0, 600;
    }
    to {
      stroke-dasharray: 600, 600;
    }
  }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<svg height="600" width="600" id="svg">
  <defs>
    <marker id="arrow" markerWidth="10" markerHeight="10" refX="0" refY="3" orient="auto" markerUnits="strokeWidth" opacity="0">
      <path d="M0,0 L0,6 L9,3 z" fill="#000" />
      <animate attributeType="XML" attributeName="opacity" from="0" to="1" dur=".08s" begin=".23s" repeatCount="0" fill="freeze" />
    </marker>
  </defs>
</svg>

注意::微调 任何 动画的简单方法是将速度降低10倍。这样,您就可以使其完美,并在对慢速10倍的性能感到满意后再将其增加。有时,在加快速度进行备份时,您需要对其“技术上正确”的方式进行细微调整,以抵消光学幻觉(但这常常是“看不见的细节”之地的时代)。


如果要使制造商可见并沿线移动,则需要删除破折号数组(因为现在您的线从动画的开始到结束具有相同的长度,但是它是用虚线绘制的,并且再简单地移动虚线中的间隙,使其看起来正在增长)。相反,您需要先使其变短,然后使其变长。

这是一个例子:

<svg height="600" width="600" id="svg">
  <defs>
    <marker id="arrow" markerWidth="10" markerHeight="10" refX="0" refY="3" orient="auto" markerUnits="strokeWidth">
      <path d="M0,0 L0,6 L9,3 z" fill="#000" opacity="0">
        <animate attributeType="XML" attributeName="opacity" from="0" to="1" dur=".1s" repeatCount="0" fill="freeze" />
      </path>
    </marker>
  </defs>
  <line id="-" x1="20" y1="20" x2="21" y2="21" stroke="black" stroke-width="2" marker-end="url(#arrow)">
      <animate attributeType="XML" attributeName="x2" from="21" to="120" dur="1s" repeatCount="0" fill="freeze" />
      <animate attributeType="XML" attributeName="y2" from="21" to="120" dur="1s" repeatCount="0" fill="freeze" />
  </line>
</svg>