Safari historically демонстрирует ряд специфических особенностей при работе с SVG-анимациями, особенно когда используется подход на основе манипуляции свойствами stroke-dasharray и stroke-dashoffset, на котором строится библиотека Vivus. Эти особенности проявляются как на уровне движка рендеринга, так и на уровне JavaScript-реализации DOM и графического пайплайна.
Одной из ключевых операций Vivus является получение длины пути через
getTotalLength(). В Safari этот метод может вести себя
менее стабильно при сложных путях.
Особенности:
getTotalLength() может быть равен 0 до следующего
кадра.Практический эффект — анимация Vivus может стартовать с «обнулённой» геометрией или с резким скачком первого кадра.
Решение на уровне интеграции заключается в отложенном инициализации
после первого requestAnimationFrame:
requestAnimationFrame(() => {
new Vivus('svg-id', { duration: 200 });
});
Safari использует собственный путь рендеринга SVG, который отличается от Blink и Gecko в обработке дробных значений stroke.
Ключевые различия:
Vivus, основанный на точной сегментации пути, может демонстрировать:
Особенно заметно при использовании type: 'delayed' или
type: 'oneByOne', где каждый сегмент рассчитывается
отдельно.
Safari по-другому управляет композитными слоями для SVG по сравнению с Chromium.
Особенности:
transform: translateZ(0) не гарантирует
ускорение SVG-узловВ Vivus-анимациях с большим количеством линий это приводит к:
Часто применяют принудительную изоляцию слоя:
svg {
will-change: transform;
transform: translate3d(0, 0, 0);
}
Однако Safari может игнорировать will-change для SVG,
поэтому эффект нестабилен.
Safari, особенно на iOS, имеет особенности планирования кадров.
Наблюдается:
requestAnimationFrame при
низком battery modeVivus, рассчитывающий прогресс анимации по времени, может демонстрировать:
При использовании временных функций Vivus (start,
progress) важно учитывать, что Safari может возвращать
скачкообразные deltatime значения.
Safari имеет различия в обработке inline SVG и SVG, загруженных через
<img> или <object>.
Vivus работает только с inline SVG, но даже в этом случае:
Особенность Safari заключается в более позднем применении computed styles к SVG-элементам, что влияет на начальные значения stroke.
Safari по-другому интерпретирует subpixel rendering внутри SVG при
изменении viewBox.
Проблемы:
Vivus-анимации, зависящие от точной геометрии пути, могут выглядеть «плавающими».
Часто помогает фиксация shape-rendering:
svg path {
shape-rendering: geometricPrecision;
}
Однако Safari может игнорировать или частично применять это свойство.
Safari имеет отличия в рендеринге соединений линий:
round cap может визуально увеличивать длину путиmiter join может давать неожиданные острые
артефактыVivus, который визуально «раскрывает» путь, может демонстрировать:
Эффект усиливается на сложных логотипах и иконках с тонкими линиями.
Safari чувствителен к частым обращениям к layout API:
getBoundingClientRectoffsetWidthclientHeightVivus в некоторых режимах может триггерить повторные расчёты геометрии при каждом шаге анимации, если SVG вложен в сложный DOM.
Это приводит к:
Особенно заметно при одновременной анимации нескольких SVG.
Оптимизация заключается в изоляции SVG в отдельный слой DOM без частых измерений.
Mobile Safari накладывает дополнительные ограничения:
Vivus-анимации на сложных иллюстрациях могут:
Также наблюдается различие между Safari и WKWebView: внутри приложений поведение может быть более агрессивно ограниченным.
Vivus иногда используется вместе с clipPath или mask для усиления эффекта рисования.
Safari имеет особенности:
На сложных сценах возможен эффект «двойного прорисовывания», когда часть пути уже видна вне синхронизации с маской.
Safari пересчитывает SVG viewBox при ресайзе с задержкой.
В результате:
Особенно это заметно при responsive SVG внутри flex/grid контейнеров.
Safari чаще демонстрирует микрофризы при SVG-анимациях из-за особенностей работы рендеринг-пайплайна:
Причина заключается в сочетании:
При работе с Vivus в Safari критически важно учитывать задержки и особенности SVG-пайплайна:
Safari требует более строгого контроля за моментом старта анимации и количеством одновременно активных SVG-элементов, иначе визуальная целостность Vivus-анимаций нарушается даже при корректной логике JavaScript.