#html5 #svg #css_animation #svg_animation #snapsvg
Вот пример. Я пытаюсь сделать анимацию для 'path', используя атрибуты dasharray \ dashoffset. Но Snap Svg неправильно вычисляет длину path. Svg изображение, создано с помощью составного контура в Adobe Illustrator. Я что-то неправильно делаю, или это bug, о котором я должен сообщить? Есть ли способ рассчитать длину правильно? /*First svg*/ var path = Snap('#svg path'); var pathLength = Snap.path.getTotalLength(path); //calc length path.attr({ "stroke-dashoffset": 0, "stroke-dasharray": pathLength }); $("#total").text(pathLength); /*path.animate({"stroke-dashoffset": pathLength}, 3500, mina.ease);*/ Snap.animate(0, pathLength, function(value) { path.attr({ 'stroke-dashoffset': value }); $("#len").text(value); }, 5000, mina.easeinout); /*Second svg*/ var path2 = Snap('#svg2 path'); var selectedLength = 112; //select length by playing with styles in browser path2.attr({ "stroke-dashoffset": 0, "stroke-dasharray": selectedLength }); $("#total2").text(selectedLength); Snap.animate(0, selectedLength, function(value) { path2.attr({ 'stroke-dashoffset': value }); $("#len2").text(value); }, 5000, mina.easeinout); .wrap { width: 100px; float: left; margin: 0 20px 0 0; } #svg, #svg2 { fill-opacity: 0; stroke: #000; stroke-width: 2px; stroke-linecap: round; stroke-linejoin: round; } .body:after { content: ''; clear: both; display: block; } .panel { font-family: Arial; line-height: 1.3em; }Length calc by Snap.path.getTotalLengthStroke dashoffset during animationLength selected by me testing in browserStroke dashoffset during animation
Ответы
Ответ 1
Анимация svg изображения, нарисованная одним пером. Между анимациями нет паузы. Ниже пример анимация SVG иконки,выполненной несколькими патчами, поэтому рисование идет одновременно несколькими перьями. Обратите внимание, что между анимациями из-за одновременного рисования появилась пауза, которая равна разнице по времени между рисованием одним пером и рисованием несколькими перьями одновременно.Ответ 2
Я пытаюсь сделать анимацию для 'path', используя атрибуты dasharray \ dashoffset. Немного теории: Эффекты рисования с чистого листа или наоборот плавное стирание линий достигаются использованием приема, когда взаимодействуют между собой: stroke-dasharray = TotalLength() stroke-dashoffset = TotalLength(), где stroke-dasharray(5 5) - прерывистая линия с длиной штриха и пробелами между ними равно 5 пикселей. При равенстве этих двух параметров можно записывать stroke-dasharray(5) stroke-dashoffset - отступ от начала линии TotalLength - полная длина линии. Поэтому рисование с чистого листа начнется, при начальном условии, когда длина линии будет равна отступу от начала линии. Отступ постепенно уменьшается и линия растёт. При стирании линии - отступ будет постепенно увеличиваться. Есть ли способ рассчитать длину правильно? Есть, но и нюансы тоже есть. Ниже пример как рассчитать длину для вашего примера. В принципе решение подойдет для других файлов SVG, для этого нужно будет, только подставлять свои значения в параметр "d" Path Ниже реализация анимации стирания линий. Начало анимации- клик по иконке.Ответ 3
Решение JS Такую иконку, как у вас, одним патчем d="M..." не нарисовать. Так как есть переходы от одного замкнутого контура к другому, и если не будет второго "M" (moveto) переход ко второму контуру с поднятием пера, то будут соединяющие линии между замкнутыми контурами. Выход один - прятать паузу. В этом скрипте, хоть финальных точек не остается по сравнению с применением библиотеки snap.svgОтвет 4
Спасибо Alexandr_T. Он объяснил с точки зрения теории почему анимация ломалась. Я переписал составной path в несколько маленьких pathов. Начало каждого pathа начинается с d="M..." (moveto). Правки сделал в блокноте. Вот код с использованием Snap SVG. /*First svg*/ var path = Snap('#svg path'); var pathLength = Snap.path.getTotalLength(path); //calc length path.attr({ "stroke-dashoffset": 0, "stroke-dasharray": pathLength }); $("#total").text(pathLength); /*path.animate({"stroke-dashoffset": pathLength}, 3500, mina.ease);*/ Snap.animate(0, pathLength, function(value) { path.attr({ 'stroke-dashoffset': value }); $("#len").text(value); }, 5000, mina.easeinout); /*Second svg*/ var svg2 = Snap('#svg2'); var paths = svg2.selectAll("path"); var maxLength = 0; var tempLength = 0; for (key in paths.items) { tempLength = Snap.path.getTotalLength(paths.items[key]); if (maxLength < tempLength) { maxLength = tempLength; } } svg2.attr({ "stroke-dashoffset": 0, "stroke-dasharray": maxLength }); $("#total2").text(maxLength); Snap.animate(0, maxLength, function(value) { svg2.attr({ 'stroke-dashoffset': value }); $("#len2").text(value); }, 5000, mina.easeinout); .wrap { width: 100px; float: left; margin: 0 20px 0 0; } #svg, #svg2 { fill-opacity: 0; stroke: #000; stroke-width: 2px; stroke-linecap: round; stroke-linejoin: round; } .body:after { content: ''; clear: both; display: block; } .panel { font-family: Arial; line-height: 1.3em; }Length calc by getTotalLength() from combined pathStroke dashoffset during animationI rewrite compound path to small paths. Begining of each path is d="M..." (moveto)Max length of svg paths getted by getTotalLength();Stroke dashoffset during animation
Комментариев нет:
Отправить комментарий