2016-04-08 4 views
1

Я пытаюсь оживить (перейти) к «чертежу» пути/линии SVG. Конкретная строка, которую я хочу сделать, будет идти 300px вправо, а затем продолжить 100px вниз, а затем 200px влево. Но это была бы одна непрерывная линия без кривых или перерывов.Анимация непрерывной линии по горизонтали и по вертикали

В настоящее время я могу заставить его работать, построив линии индивидуально и применяя переход. Начните с X1, Y1/X2, Y2 - переход на новый X2, Y2 - для этой продолжительности с этой задержкой и повторением, повторением и повторением.

Есть ли более простой способ сделать это? Например, используя один элемент SVG вместо 3 и, например, заполнить координаты X/Y из массива?

Любые конкретные примеры или указание на меня в общем направлении будут оценены.

Благодаря

+0

Вот очень простой [скрипка] (https://jsfiddle.net/armarchm/c1bcc0xd/) показывая, как вы можете использовать «путь» в сочетании с «штрих-дашара» для анимации рисунка. «Dasharray» указывает, как долго «поглаженные» и негладкие части пути. Мы начинаем с '0,1000' (некоторое сколь угодно большое значение) и переходим к первому значению, пока оно не охватит весь путь. Надеюсь это поможет! Примечание: для равномерного рисования добавьте '.ease (" linear ")' к переходу. – JSBob

ответ

1

Это вполне возможно, хотя это немного изворотливым, чтобы получить эффект, который вы хотите. Это связано с установкой очень большого stroke-dash-array (фактически всей длины вашего пути), а затем установки dash-offset (также длины вашей фигуры). Вы устанавливаете это так, чтобы ни одна из строк не была изначально видимой, и измените мерцание так, чтобы линия попадала в поле зрения.

Существует очень хорошая статья об CSS-трюках SVG Line Animation, которая объясняет принцип. Я написал маленький помощник, чтобы сделать это для меня в D3 который выглядит следующим образом:

d3.selectAll(".draw") 
 
    .style("stroke-dasharray", function() { return this.getTotalLength(); }) 
 
    .style("stroke-dashoffset", function() { return this.getTotalLength(); }) 
 
    .transition() 
 
    .duration(3000) 
 
    .style("stroke-dashoffset", 0);
.draw { 
 
    fill: #232a29; 
 
    stroke: #232a29; 
 
    stroke-width: 2px; 
 
    fill-rule:nonzero; 
 
    fill-opacity:0; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script> 
 
<svg width="500" height="500"> 
 
    <g> 
 
     <g transform="translate(0,600)scale(1,-1)"> 
 
      <!-- Circle --> 
 
      <path class="draw circle" d="m 97.44,308.52 c 0,90.53 73.42,163.92 163.98,163.92 90.56,0 163.98,-73.39 163.98,-163.92 0,-90.53 -73.42,-163.92 -163.98,-163.92 -90.56,0 -163.98,73.39 -163.98,163.92 z" /> 
 
      </g> 
 
    </g> 
 
</svg>

+0

Ян - спасибо за ответ. Раньше я видел dasharray/dashoffset, но он всегда казался неуклюжим. Ваша модификация делает ее намного проще в использовании. Один болезненный вопрос новичков: я не могу заставить анимацию работать в моем браузере IE/Edge. Он отлично работает на этой странице, и я вставил его в JSFiddle, и он работает там также. Не могли бы вы взглянуть на мой HTML-файл и посмотреть, что я делаю неправильно? [link] (https://jsfiddle.net/JSFdaniel/Lbnxe447/). Впервые я ответил в SO или использовал JSFiddle. Еще раз спасибо. Dan – Dank

+0

@ Dank Я бы попросил задать другой вопрос, если вы не можете это решить. Лучше всего задавать вопрос. Если ответ был полезен, пожалуйста, не стесняйтесь голосовать и/или принимать его. – Ian

Смежные вопросы