2015-03-08 5 views
2

У меня есть файл svg, состоящий из пучка путей, которые я оживляю по методу here. Это стандартный метод анимации путей - тот, у которого есть смещение тире, а что нет.Анимация связанного svg не работает; Работает отлично, когда inline

Я протестировал код, и он отлично работает в моем svg-файле, когда он написан inline, то есть код для путей svg записывается непосредственно в тот же документ, что и скрипт. Вы можете увидеть это в действии here. Скрипт используется это:

$(document).ready(function(){ 

    var path = document.getElementsByTagName('path'); 
    var length; 
    var anim = document.getElementsByTagName('animate'); 

    for(i = 0; i < path.length; i++){ 
     length = path[i].getTotalLength().toString(); 
     path[i].setAttribute('stroke-dasharray',length+','+length); 
     anim[i].setAttribute('values','-'+length+';0'); 
    } 

}); 

Однако при попытке заставить его работать с файлом SVG в <object>, я не так повезло. Я правильно разместил файл, и он отображается хорошо. Когда я запускаю измененный скрипт, он работает нормально и присваивает значения длины, а не каждому элементу <path> и <animate>, как и следовало бы (вы можете проверить это, проверив элементы svg - свойство stroke-dasharray должно иметь значение, равное длине каждого пути).

Проблема заключается в том, что, несмотря на правильное изменение значений, что должно запускать анимацию, ничего не оживляет. Я не уверен, почему это было бы, поскольку код работает точно так же, как и встроенный, за исключением поиска в документе svg, а не в текущем документе ... здесь приведена модифицированная версия скрипта (для работы с нагруженный SVG, а не встроенный один):

$(document).ready(function(){ 
    var a = document.getElementById("logoSVG"); 
    //it's important to add an load event listener to the object, as it will load the svg doc asynchronously 
    a.addEventListener("load",function(){ 
     var svgDoc = a.contentDocument; //get the inner DOM of .svg 
     var path = svgDoc.getElementsByClassName('line'); 
     var length; 
     var anim = svgDoc.getElementsByTagName('animate'); 

     for(i = 0; i < path.length; i++){ 
      length = path[i].getTotalLength().toString(); 
      path[i].setAttribute('stroke-dasharray',length+','+length); 
      anim[i].setAttribute('values','-'+length+';0'); 
     } 
    },false); 
}); 

Если вы хотели бы видеть приведенный выше код в действии (где он будет загружен в, а не инлайн), то есть here.

ответ

1

Ваша проблема в том, что стили, определенные в родительском документе (правила stroke-dasharray и stroke-dashoffset), не применяются к внедренным объектам. CSS не каскадируется в объекты.

Вы можете либо добавить правила стиля непосредственно к объекту с помощью JavaScript, либо вставлять правила CSS во внешний SVG-файл вместо родительского документа.

This question имеет более подробную информацию.

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