Хобрук: Ваш путь к мастерству в программировании

Обнаружение поддержки браузером CSS-анимированного SVG

Я играюсь с CSS-анимированными SVG элементами и столкнулся с проблемой, что хотя все технологии, которые используются, поддерживаются некоторыми браузерами, комбинация не работает, т.е. CSS-анимированные DIV работают, а SVG элементы не работают. Мне интересно, есть ли способ определить, способен ли браузер анимировать элементы SVG с помощью CSS.

Вот jsFiddle с примером. Он работает в последних версиях Chrome, Firefox и Safari. Но при открытии его, например. В Firefox 5 вращается только div, а rect нет.


  • Пытались ли вы исследовать Modernizr с этой целью? 22.07.2015
  • Я не нашел ни одного теста, который бы проверял, работают ли CSS-анимации с SVG. 22.07.2015
  • @robjez Я тоже только что посмотрел и не нашел способа определить, работает ли анимация CSS с SVG. Это хороший вопрос. F Lekschas, ты когда-нибудь разбирался в этом? 14.09.2015
  • @JKillian К сожалению, я ничего не нашел. 14.09.2015
  • Очень плохо. Собираюсь добавить награду к вопросу для удовольствия 15.09.2015
  • В репозитории Modernizr есть ошибка. 16.09.2015
  • это, вероятно, больше проблема поддержки свойства преобразования; 16.09.2015
  • @maioman Вы правы, см. jsfiddle.net/x4go2uaL в IE11 и connect.microsoft.com/IE/feedback /детали/811744/. Есть ли интерес к редактированию вопроса немного F Lekschas? 16.09.2015
  • Я думаю, что вопрос достаточно ясен. Кроме того, ваш пример не работает в FF5, хотя FF5 может анимировать DIV, используя тот же фрагмент CSS. jsfiddle.net/v1oh3d99/2 Так что дело не только в преобразовании. 16.09.2015
  • Хорошая точка зрения. Тогда похоже, что это многосторонняя проблема. 16.09.2015
  • работает ли анимация через <animateTransform> на FF5 (должна)? 16.09.2015
  • Я считаю, что процесс проверки поддержки будет довольно сложным, и я думаю, что большинство современных браузеров поддерживают анимацию svg, поэтому, возможно, вы могли бы просто проверить версию браузера и вернуть анимацию svg или уродливую анимацию div. 18.09.2015

Ответы:


1

Вы можете добавить прослушиватель событий для проверки завершения итерации анимации, а в соответствующем обработчике событий установить флаг, например supportsSVGKeyFramedAnimatedProps = true (если итерация никогда не завершается, значит, она не анимируется).

elem.addEventListener('animationiteration', eventHandler, false)

Это позволит вам «упасть вперед» к вашей SVG-анимации вместо того, чтобы обеспечивать запасной вариант.

31.08.2016
  • Не уверен, что вы имеете в виду под падением вперед, поскольку я бы, вероятно, вернулся к SMIL, но идея отличная! Я бы, вероятно, использовал animationstart, так как это должно срабатывать только один раз. 13.12.2018

  • 2

    Мне интересно, есть ли способ определить, способен ли браузер анимировать элементы SVG с помощью CSS.

    Простой ответ: Да, вы можете, как сказал @jhpratt.

    Вы можете определить, поддерживает ли браузер функциональность CSS, используя только CSS. Ат-правило @supports CSS позволяет указать объявления, которые зависят от поддержки браузером одной или нескольких определенных функций CSS. Это называется функциональным запросом.

    Пример:

    @supports (display: flex) {
      div {
        display: flex;
      }
    }
    @supports not (display: flex) {
      div {
        float: right;
      }
    }
    

    Ссылка MDN: https://developer.mozilla.org/de/docs/Web/CSS/@supports

    Длинный ответ:

    У вас всегда будут некоторые cross-browser проблемы. Проблема, с которой вы столкнулись, беспокоит каждого веб-разработчика. Тем не менее, есть способы обойти эту проблему с поддержкой браузера:

    <сильный>1. Вы можете проверить "можно ли использовать" на предмет совместимости:

    Ссылка: http://caniuse.com/ Рекомендуется искать любую сомнительную функциональность, например анимацию.

    <сильный>2. Используйте автопрефиксер в своем рабочем процессе:

    С помощью автопрефиксера вам не нужно большую часть времени беспокоиться об использовании CSS с префиксом, таким как -moz-, -webkit- и т. д. Этот крошечный помощник сделает свое дело за вас, вы даже можете указать некоторые автопрефиксы какие браузеры вы хотите поддерживать.

    <сильный>3. Пользовательские сторонние библиотеки:

    Существует множество библиотек, которые вы можете использовать для определения браузера и версии. Если вы хотите быть уверены, что ваша анимация безопасна для использования, вы можете просто использовать предоставленную анимацию из библиотек и, конечно же, предварительно проверить совместимость на соответствующих веб-сайтах.

    Некоторые громкие имена:

    есть еще много, просто ищите во всемирной паутине.

    <сильный>4. Используйте CSS-хаки для определения конкретных браузеров:

    Можно использовать так называемые CSS-хаки. Это специальные вызовы CSS, которые применяются только в определенных браузерах.

    Некоторые примеры:

    Internet Explorer/Edge 8 only: @media \0screen {}
    
    firefox ≥ 3.6 only: @media screen and (-moz-images-in-menus:0) {}
    
    Opera ≤ 9.27 AND Safari 2: html:first-child .selector {}
    

    Вы можете найти больше Browserhacks здесь: http://browserhacks.com/

    Вывод:

    Можно определить определенные браузеры, но невозможно определить, поддерживает ли браузер данную функцию только с помощью CSS. Вот почему у вас всегда будут трудные времена с поддержкой браузера.

    Надеюсь это поможет. С Уважением

    31.05.2016
  • Обратите внимание, что вы можете полностью проверить, поддерживается ли функция только в CSS. Это правило @supports, и оно широко поддерживается. 05.01.2018
  • В целом это отличные советы, но есть ли у вас конкретный пример, где что-то из этого помогает обнаружить поддержку CSS-анимации для элементов SVG? 13.12.2018
  • @FLekschas вы хотите создать своего рода тест для автоматизации вашей проверки? Или вы просто хотите быть уверены, что анимация будет работать, а если нет альтернативы? Что бы это ни было, вы можете просто проверить это здесь: developer.mozilla .org/en-US/docs/Web/CSS/@supports#Examples 20.12.2018

  • 3

    Я считаю, что обнаружение анимации SMIL в modernizr должно сделать это. https://modernizr.com/download?smil-setclasses

    Я использую его в довольно сложном наборе анимаций диаграмм css/SVG. Просто оберните запасной вариант в следующий тег:

    .no-smil{    }
    

    http://codepen.io/msbtterswrth/pen/greWzy

    05.05.2016
  • Этот вопрос касается анимации SVG на основе CSS, а не анимации на основе SMIL. 05.05.2016
  • я знаю, но я успешно использовал этот тест и для CSS-анимации. У меня была та же проблема, когда я не мог заставить свои svg преобразовываться в определенных браузерах, и этот тест помог мне успешно обнаружить их и код вокруг них. 05.05.2016

  • 4

    Я сделал не совсем то, что вы ищете, но что-то похожее (предоставление анимированного пути клипа, как определено SVG, когда браузер поддерживает его, и откат назад, когда это не так). Вы можете использовать медиа-запросы для поиска соотношений пикселей, чтобы определить, является ли браузер moz или webkit, и предоставить резервную анимацию вне медиа-запроса, а также предоставить предпочтительную анимацию в медиа-запросах, которые указывают браузер, который ее поддерживает.

    //fallback animation here
    
    @media (-webkit-min-device-pixel-ratio: 0) {
      // webkit animation here 
    }
    

    Что касается более старых версий Firefox? Я не знаю, как это сделать в CSS, но я не уверен, что возврат к более чем нескольким версиям Firefox или Chrome является распространенным вариантом использования.

    21.09.2015
  • Суть моего вопроса не в том, чтобы выяснить, как поддерживать один конкретный браузер, такой как FF5. Мне любопытно, знает ли кто-нибудь способ вообще проверить поддержку анимации SVG на основе CSS в браузере. 06.05.2016
  • Новые материалы

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

    Расистский и сексистский робот, обученный в Интернете
    Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

    Управление состоянием в микрофронтендах
    Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..

    Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
    LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

    Структуры данных в C ++ - Часть 1
    Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..