Единственный браузер, в котором он работает, это Safari (5.1.4). В Opera 11.62 градиент черный, в IE 9 и Firefox 12 - белый. В Chrome 19 это работает, если вы не укажете ширину / высоту SVG в%. Я бы сказал, что это скорее странность, чем реальная особенность. Это крутая находка.
toniedzwiedz
4
Правильно ... все же мне не терпится увидеть выражения лиц моих коллег, когда я показываю им такого милого маленького монстра, как этот, так что еще раз спасибо за показ, что это возможно. Я просто пошел к стандартной спецификации и заявил, что это практически невозможно, что оказалось ошибкой (вроде как)
toniedzwiedz
18
«Несовместимость браузера» здесь в основном заключается в отсутствии правильного экранирования URL, все внутри url()должно быть экранировано. См. Jsfiddle.net/6WAtQ для примера, который прекрасно работает в Opera, Firefox и Safari.
Эрик Дальстрем
3
Есть ли разница в совместимости между SV64 в кодировке SVG и не Base64? Base64 раздувает мой css файл, я думаю просто использовать встроенные svgs ..
enapupe
4
Обратите внимание, что стандартный способ указать набор символов - это «; charset = UTF-8» вместо «; utf8». tools.ietf.org/html/rfc2397
Кит Шоу,
240
Немного поздно, но если кто-то из вас сходит с ума, пытаясь использовать встроенный SVG в качестве фона , экранирующие предложения, приведенные выше, не совсем работают. С одной стороны, он не работает в IE, и в зависимости от содержимого вашего SVG методика вызовет проблемы в других браузерах, таких как FF.
Если вы base64 кодируете svg (не весь URL, а только тег svg и его содержимое!), Это работает во всех браузерах. Вот тот же пример jsfiddle в base64: http://jsfiddle.net/vPA9z/3/
CSS теперь выглядит так:
body { background-image:
url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxMCcgaGVpZ2h0PScxMCc+PGxpbmVhckdyYWRpZW50IGlkPSdncmFkaWVudCc+PHN0b3Agb2Zmc2V0PScxMCUnIHN0b3AtY29sb3I9JyNGMDAnLz48c3RvcCBvZmZzZXQ9JzkwJScgc3RvcC1jb2xvcj0nI2ZjYycvPiA8L2xpbmVhckdyYWRpZW50PjxyZWN0IGZpbGw9J3VybCgjZ3JhZGllbnQpJyB4PScwJyB5PScwJyB3aWR0aD0nMTAwJScgaGVpZ2h0PScxMDAlJy8+PC9zdmc+");
Не забудьте удалить любой URL-адрес перед преобразованием в base64. Другими словами, в приведенном выше примере показано, что color = '# fcc' преобразовано в color = '% 23fcc', вы должны вернуться к #.
Причина, по которой base64 работает лучше, состоит в том, что он устраняет все проблемы с одинарными и двойными кавычками и экранированием URL
Если вы используете JS, вы можете использовать window.btoa()для создания вашего base64 svg; и если он не работает (он может жаловаться на недопустимые символы в строке), вы можете просто использовать https://www.base64encode.org/ .
Спасибо чувак. Решение с Base64 сработало отлично, а у меня возникли проблемы с принятым ответом.
Марсель
1
Вы спасли мою жизнь. У меня было изображение границы SVG, которое работало в Chrome, но не на FF. Теперь это работает! : D
Папипо
Мне также помогли (после потери времени, пробуя принятый ответ) - это определенно должен быть принятый ответ.
Катаи
Если это все еще не работает для вас - убедитесь, что у вас есть xmlnsатрибут, установленный для svgэлемента, прежде чем вы закодируете base64, как <svg xmlns="http://www.w3.org/2000/svg">...</svg>браузеры иногда разбивают его на части без него, когда svg находится непосредственно в HTML - это НЕ так :)
Для людей, которые все еще борются, мне удалось заставить это работать на всех современных браузерах IE11 и выше.
Base64 не был для меня вариантом, потому что я хотел использовать SASS для генерации SVG-иконок на основе любого заданного цвета. Например: @include svg_icon(heart, #FF0000);таким образом я могу создать определенную иконку любого цвета, и мне нужно только внедрить форму SVG в CSS. (с base64 вам нужно будет встраивать SVG в каждый цвет, который вы хотите использовать)
Есть три вещи, о которых вам нужно знать:
URL ENCODE YOUR SVG
Как уже предлагали другие, вам нужно URL кодировать всю строку SVG, чтобы она работала в IE11. В моем случае я пропустил значения цвета в таких полях, как fill="#00FF00"и, stroke="#FF0000"и заменил их на переменную SASS, fill="#{$color-rgb}"чтобы их можно было заменить на нужный мне цвет. Вы можете использовать любой онлайн-конвертер, чтобы URL кодировал остальную часть строки. В итоге вы получите строку SVG:
ИСПОЛЬЗУЙТЕ RGB () ВМЕСТО цветов HEX Firefox не любит # в коде SVG. Так что вам нужно заменить значения цвета в шестнадцатеричном формате на RGB.
NOT fill = "# FF0000", НО fill = "rgb (255,0,0)"
В моем случае я использую SASS для преобразования данного гекса в действительное значение RGB. Как указано в комментариях, лучше всего URL-кодировать и вашу строку RGB (так что запятая становится% 2C)
Я понимаю, что это может быть не лучшим решением для очень сложных SVG (встроенный SVG в этом случае никогда не бывает), но для плоских значков с несколькими цветами это действительно отлично работает.
Мне удалось опустить весь растровый рисунок спрайта и заменить его встроенным SVG в моем CSS, который оказался только около 25 КБ после сжатия. Так что это отличный способ ограничить количество запросов, которые должен выполнять ваш сайт, без раздувания вашего CSS-файла.
Кстати, поправьте меня, если я ошибаюсь, но rgb(255,0,0)должен стать rgb(255%2C0%2C0)однажды закодированным.
Капсула
1
Я имел в виду, что я не кодирую строку RGB, и она все еще работает. Но кодирование, как вы упомянули, возможно, лучше.
Дэви Бэрт
1
Ну, на самом деле, я только что проверил и %23ff0000отлично работает #ff0000в Firefox
Capsule
1
@ Капсула Я не знаю, что происходит, но% 23ff0000 - ЕДИНСТВЕННЫЙ метод, который работает для меня как на Chrome, так и на FF. # ff0000 не работает, равно как и методы RGB (255,0,0) и rgb (255% 2C0% 2C0).
Читателям: пожалуйста, прокомментируйте свое мнение, а не просто проголосуйте, чтобы этот ответ можно было улучшить с вашим сотрудничеством! Сотрудничество на сайтах вопросов и ответов очень важно. Спасибо!
Аракс
2
@LorDex ссылка, которую вы указали в своем комментарии, такая же, как и в моем ответе :)
araks
10
Я разработал демонстрационную версию CodePen, у которой была та же проблема со встроенным SVG в CSS. Решение, которое работает с SCSS, заключается в создании простой функции кодирования URL.
Функция замены строки может быть создана из встроенных функций str-slice, str-index (см. Трюки css , благодаря Hugo Giraudel).
Тогда, просто заменить %, <, >, ", ', с %xxкодами:
Я также создал перо, которое позволяет вам конвертировать строки svg в правильное фоновое значение css: s.codepen.io/LukyVj/debug/693cbcc30258bf67b8c30047cce060eb Итак, в основном, вы вставляете ваш текст<svg><path></svg> в верхнюю текстовую область, и он напрямую выводит очищенный путь в пределах url()значения.
LukyVj
1
Это сработало потрясающе. Спасибо. Одна запись. Вам нужно использовать; charset = utf8, чтобы заставить это работать в IE.
Даниэль Лефевр
4
Встроенный SVG, поступающий из сторонних источников (таких как диаграммы Google), может не содержать атрибута пространства имен XML ( xmlns="http://www.w3.org/2000/svg") в элементе SVG (или, возможно, он удаляется после визуализации SVG - ни инспектор браузера, ни команды jQuery из консоли браузера не показывают пространство имен в элементе SVG).
Когда вам нужно переопределить эти фрагменты svg для других ваших нужд (background-image в CSS или элемент img в HTML), следите за отсутствующим пространством имен. Без пространства имен браузеры могут отказаться отображать SVG (независимо от кодировки utf8 или base64).
Я нашел одно решение для SVG. Но это работа только для Webkit, я просто хочу поделиться с вами своим обходным путем. В моем примере показано, как использовать элемент SVG из DOM в качестве фона через фильтр (background-image: url ('# glyph') не работает).
Функции, необходимые для визуализации иконки SVG:
Применение эффектов фильтра SVG к элементам HTML с использованием CSS (IE и Edge не поддерживаются)
Поддержка загрузки фрагмента feImage (Firefox не поддерживает)
<img>
тегами HTML и другими случаями, если SVG представляет собой сочетание нескольких изображений (если они не встроены), посмотрите фоновое изображение SVG с маской, использующей внешнее изображение , и конкретно ограничения на SVG, используемые как изображение .Ответы:
Да, это возможно. Попробуй это:
(Обратите внимание, что контент SVG должен быть экранирован по URL, чтобы это работало, например,
#
заменяется на%23
.)Это работает в IE 9 (который поддерживает SVG) . URL-адреса данных также работают в более старых версиях IE (с ограничениями), но изначально не поддерживают SVG.
источник
url()
должно быть экранировано. См. Jsfiddle.net/6WAtQ для примера, который прекрасно работает в Opera, Firefox и Safari.Немного поздно, но если кто-то из вас сходит с ума, пытаясь использовать встроенный SVG в качестве фона , экранирующие предложения, приведенные выше, не совсем работают. С одной стороны, он не работает в IE, и в зависимости от содержимого вашего SVG методика вызовет проблемы в других браузерах, таких как FF.
Если вы base64 кодируете svg (не весь URL, а только тег svg и его содержимое!), Это работает во всех браузерах. Вот тот же пример jsfiddle в base64: http://jsfiddle.net/vPA9z/3/
CSS теперь выглядит так:
Не забудьте удалить любой URL-адрес перед преобразованием в base64. Другими словами, в приведенном выше примере показано, что color = '# fcc' преобразовано в color = '% 23fcc', вы должны вернуться к #.
Причина, по которой base64 работает лучше, состоит в том, что он устраняет все проблемы с одинарными и двойными кавычками и экранированием URL
Если вы используете JS, вы можете использовать
window.btoa()
для создания вашего base64 svg; и если он не работает (он может жаловаться на недопустимые символы в строке), вы можете просто использовать https://www.base64encode.org/ .Пример установки фона div:
С JS вы можете генерировать SVG на лету, даже изменяя его параметры.
Одна из лучших статей об использовании SVG находится здесь: http://dbushell.com/2013/02/04/a-primer-to-front-end-svg-hacking/
Надеюсь это поможет
Майк
источник
xmlns
атрибут, установленный дляsvg
элемента, прежде чем вы закодируете base64, как<svg xmlns="http://www.w3.org/2000/svg">...</svg>
браузеры иногда разбивают его на части без него, когда svg находится непосредственно в HTML - это НЕ так :)Для людей, которые все еще борются, мне удалось заставить это работать на всех современных браузерах IE11 и выше.
Base64 не был для меня вариантом, потому что я хотел использовать SASS для генерации SVG-иконок на основе любого заданного цвета. Например:
@include svg_icon(heart, #FF0000);
таким образом я могу создать определенную иконку любого цвета, и мне нужно только внедрить форму SVG в CSS. (с base64 вам нужно будет встраивать SVG в каждый цвет, который вы хотите использовать)Есть три вещи, о которых вам нужно знать:
URL ENCODE YOUR SVG Как уже предлагали другие, вам нужно URL кодировать всю строку SVG, чтобы она работала в IE11. В моем случае я пропустил значения цвета в таких полях, как
fill="#00FF00"
и,stroke="#FF0000"
и заменил их на переменную SASS,fill="#{$color-rgb}"
чтобы их можно было заменить на нужный мне цвет. Вы можете использовать любой онлайн-конвертер, чтобы URL кодировал остальную часть строки. В итоге вы получите строку SVG:% 3Csvg% 20xmlns% 3D% 27http% 3A% 2F% 2Fwww.w3.org% 2F2000% 2Fsvg% 27% 20viewBox% 3D% 270% 200% 20494,572% 20494,572% 27% 20width% 3D% 27512% 27% 20height% 3D % 27512% 27% 3E% 0A% 20% 20% 3Cpath% 20d% 3D% 27M257.063% 200C127.136% 200% 2021,808% 20105,33% 2021,808% 20235.266c0% 2041,012% 2010,535% 2079,541% 2028,973% 20113.104L3.825 % 20464.586c345% 2012.797% 2041.813% 2012.797% 2015.467% 200% 2029.872-4.721% 2041.813-12.797v158.184z% 27% 20fill% 3D% 27 # {$ color-rgb} % 27% 2F% 3E% 3C% 2Fsvg% 3E
ПУТЕШЕСТВУЙТЕ CHARSET UTF8 В URL-адресе данных. При создании URL-адреса данных необходимо не использовать кодировку, чтобы он работал в IE11.
НЕ фоновое изображение: url (данные: image / svg + xml; utf-8,% 3Csvg% 2 ....)
НО фоновое изображение: url (данные: image / svg + xml,% 3Csvg% 2 ... .)
ИСПОЛЬЗУЙТЕ RGB () ВМЕСТО цветов HEX Firefox не любит # в коде SVG. Так что вам нужно заменить значения цвета в шестнадцатеричном формате на RGB.
NOT fill = "# FF0000",
НО fill = "rgb (255,0,0)"
В моем случае я использую SASS для преобразования данного гекса в действительное значение RGB. Как указано в комментариях, лучше всего URL-кодировать и вашу строку RGB (так что запятая становится% 2C)
Я понимаю, что это может быть не лучшим решением для очень сложных SVG (встроенный SVG в этом случае никогда не бывает), но для плоских значков с несколькими цветами это действительно отлично работает.
Мне удалось опустить весь растровый рисунок спрайта и заменить его встроенным SVG в моем CSS, который оказался только около 25 КБ после сжатия. Так что это отличный способ ограничить количество запросов, которые должен выполнять ваш сайт, без раздувания вашего CSS-файла.
источник
rgb(255,0,0)
должен статьrgb(255%2C0%2C0)
однажды закодированным.%23ff0000
отлично работает#ff0000
в FirefoxВ Mac / Linux вы можете легко преобразовать файл SVG в закодированное в base64 значение для атрибута фона CSS с помощью этой простой команды bash:
Протестировано на Mac OS X. Таким образом вы также избежите путаницы с URL.
Помните, что base64-кодировка SVG-файла увеличивает его размер, см. Сообщение в блоге css-tricks.com .
источник
Я разработал демонстрационную версию CodePen, у которой была та же проблема со встроенным SVG в CSS. Решение, которое работает с SCSS, заключается в создании простой функции кодирования URL.
Функция замены строки может быть создана из встроенных функций str-slice, str-index (см. Трюки css , благодаря Hugo Giraudel).
Тогда, просто заменить
%
,<
,>
,"
,'
,с
%xx
кодами:В
image-inline
Compass также доступна вспомогательная функция, но, поскольку она не поддерживается в CodePen, это решение может быть полезным.Демонстрация на CodePen: http://codepen.io/terabaud/details/PZdaJo/
источник
<svg><path></svg>
в верхнюю текстовую область, и он напрямую выводит очищенный путь в пределахurl()
значения.Встроенный SVG, поступающий из сторонних источников (таких как диаграммы Google), может не содержать атрибута пространства имен XML (
xmlns="http://www.w3.org/2000/svg"
) в элементе SVG (или, возможно, он удаляется после визуализации SVG - ни инспектор браузера, ни команды jQuery из консоли браузера не показывают пространство имен в элементе SVG).Когда вам нужно переопределить эти фрагменты svg для других ваших нужд (background-image в CSS или элемент img в HTML), следите за отсутствующим пространством имен. Без пространства имен браузеры могут отказаться отображать SVG (независимо от кодировки utf8 или base64).
источник
Я нашел одно решение для SVG. Но это работа только для Webkit, я просто хочу поделиться с вами своим обходным путем. В моем примере показано, как использовать элемент SVG из DOM в качестве фона через фильтр (background-image: url ('# glyph') не работает).
Функции, необходимые для визуализации иконки SVG:
Еще одно решение - использовать url encode
источник