Поддержка SVG в Internet Explorer существенно отставала от современных браузеров, что напрямую влияло на работу библиотек, построенных вокруг анимации векторной графики, включая Vivus. Основная проблема заключалась не только в отсутствии части возможностей стандарта SVG, но и в нестабильной реализации DOM API, на котором строится вся логика управления путями и их динамическим изменением.
Internet Explorer 9–11 поддерживает SVG частично, однако поведение
многих ключевых механизмов отличается от спецификации. Vivus опирается
на изменение параметров stroke-dasharray и
stroke-dashoffset, что требует корректной работы вычисления
геометрии пути и обновления стилей в реальном времени.
В IE наблюдаются следующие критические ограничения:
stroke-dashoffset при
динамических измененияхgetTotalLengthgetBBoxЭти особенности приводят к тому, что стандартный механизм поэтапного «рисования» линий может выглядеть рывками или полностью нарушаться.
Internet Explorer полностью игнорирует SMIL-анимации
(<animate>, <animateTransform>),
что исторически делало невозможным декларативную анимацию SVG.
Vivus изначально не использует SMIL, однако эта особенность важна в контексте fallback-решений. Многие альтернативные библиотеки опирались на SMIL как резервный механизм, тогда как в IE такой вариант отсутствует полностью.
По этой причине единственным рабочим подходом остаётся JavaScript-манипуляция атрибутами, что увеличивает нагрузку на главный поток и требует оптимизации таймингов.
Ключевой механизм Vivus — синхронизация анимации с кадровым циклом
через requestAnimationFrame. В IE9–IE10 его поддержка
отсутствует, а в IE11 работает с ограничениями производительности.
Типичная проблема:
Используется полифилл:
window.requestAnimationFrame =
window.requestAnimationFrame ||
window.msRequestAnimationFrame ||
function (callback) {
return setTimeout(callback, 16);
};
Однако setTimeout не обеспечивает стабильного
кадрирования, что приводит к визуальному «дрожанию» линий при
отрисовке.
Vivus активно взаимодействует с DOM-элементами SVG, добавляя классы и
изменяя атрибуты. В старых версиях Internet Explorer отсутствует
classList, что ломает стандартные методы управления
состоянием элементов.
Альтернативная реализация:
function addClass(el, className) {
if (el.classList) {
el.classList.add(className);
} else {
el.className += ' ' + className;
}
}
Дополнительные ограничения:
querySelectorAll работает медленнее и не всегда
корректно обрабатывает SVG-узлыaddEventListener заменяется на
attachEventЭто приводит к необходимости писать обёртки, полностью дублирующие поведение стандартных API.
Vivus критически зависит от вычисления длины пути для построения анимации. В IE возникают проблемы с:
getBBox() возвращающим некорректные значения для
скрытых или не вставленных в DOM элементовgetTotalLength() иногда возвращающим 0 для сложных
кривыхОсобенно проблемными оказываются пути, созданные динамически через JavaScript, а не загруженные как статический SVG.
Решение обычно заключается в принудительном reflow:
el.getBoundingClientRect();
или временном добавлении элемента в DOM перед вычислением.
Internet Explorer имеет собственную модель трансформаций, отличную от стандартной SVG transform.
Проблемы включают:
transform-origin в SVGtransform и SVG
transformscale и translate в
некоторых контекстахVivus редко использует трансформации напрямую, но при комбинировании с внешними стилями анимации возникают конфликты, особенно при попытке масштабирования SVG-контейнеров.
В IE наблюдаются серьёзные ограничения при работе с внешними
SVG-файлами (<img src="file.svg"> или
<object>):
stroke-dasharrayVivus требует inline SVG для полноценной работы, так как только в
этом случае доступен полный контроль над элементами
<path>.
Даже при корректной реализации API Internet Explorer демонстрирует низкую производительность при:
Основная причина — синхронное обновление layout при каждом изменении атрибута. В отличие от современных браузеров, IE чаще вызывает перерасчёт стилей и геометрии.
Типичный эффект:
stroke-dashoffset и
визуальным обновлениемМеханизм Vivus основан на следующем принципе:
stroke-dasharray устанавливается равным длинеstroke-dashoffset уменьшается по времениВ Internet Explorer:
stroke-dashoffset может не приводить к
мгновенной перерисовкеЭто создаёт эффект «ступенчатой» анимации, особенно на кривых высокой плотности.
Для стабильной работы Vivus в IE требуется набор полифиллов:
requestAnimationFrameclassListArray.prototype.forEach (для IE8–IE9 сценариев)Object.keysSVGElement.getTotalLength (частично или через
fallback-обёртки)Дополнительно часто вводится ручная эмуляция событий:
function triggerEvent(el, eventName) {
var event = document.createEvent('Event');
event.initEvent(eventName, true, true);
el.dispatchEvent(event);
}
В Internet Explorer библиотека часто переводится в упрощённый режим работы:
sync,
delayed)Особенно режим oneByOne, который визуально наиболее
требователен, может терять точность тайминга и выглядеть
несогласованным.
Дополнительным фактором является отсутствие GPU-ускорения для SVG в IE, что делает всю отрисовку полностью CPU-зависимой.
Совокупность ограничений приводит к тому, что Vivus в Internet Explorer работает функционально, но с заметными визуальными компромиссами: