csssr-project-template icon indicating copy to clipboard operation
csssr-project-template copied to clipboard

Неуникальные id внутри svg-спрайта

Open jt3k opened this issue 8 years ago • 3 comments

Проблема

Часто внутри svg-спрайта попадаются неуникальные id. например кто-то называет свой градиент как id="a" а затем его использует как style="fill:url(#a);".

Если таких имён будет не одно, то возникает коллизия, и один из градиентов просто не отображается.

Решение

Предлагаю "зауникалить" айдишники внутри svg-спрайта добавив к ним префикс в виде имени исходного svg-файла. Это можно сделать например при помощи svgo. Ссылка на решение с svgo

jt3k avatar Jul 27 '17 09:07 jt3k

Уникальные имена не помогут, т.к. #a резолвится будет в рамках текущей страницы. В то время как сам градиент объявлен внутри спрайта. Т.е. градиенты не работают сейчас вообще. Соответственно уникальные имена никак и не помогут.

Решение — это инлайнить спрайт целиком, тогда градиенты будут объявлены в рамках страницы и они работать будут. Но, если я правильно помню, градиенты объявленные в символах (т.е. svg>symbol>defs) всё равно не заработают. А значит defs нужно выносить в корень. Т.е. суммарно получаются довольно сильные переделки работы с иконками, причем свои минусы в этом тоже будут (например, проблемы с кешированием спрайта).

И учитывая, что иконки с градиентами требуются редко, то необходимости в внедрении такого решения мало. А так как активная разработка этого шаблона не ведется (Наши силы брошены на разработку Rispa.), то это внедрятся не будет..

dzhiriki avatar Jan 22 '18 18:01 dzhiriki

Дык мне и нужно для встраивания в страницу. -- я использую эти спрайты в режиме полифилла -- это когда плагин вытягивает свг-файл xhr-запросом и вставляет в страницу.

Кажется проблема возникает когда на странице появляется два элемента с градиентами имеющими одинаковые айдишки.

Пример вот здесь https://widget.ruru.ru/partner?way=mobile&order_id=afb33c4d0e7d&service_id=19360&captcha=0&success_url=http%3A%2F%2Fkinohod.ru%2Forder%2Fafb33c4d0e7d%2Fprocess%2F&amount=350&failure_url=http%3A%2F%2Fkinohod.ru%2Forder%2Fafb33c4d0e7d%2Fprocess%2F&is_self_redirect=1&partner_id=1102

Сверху есть логотип билайна у которого градиент когда-то конфликтовал с градиентом карты мир ). Теперь не конфликтует т.к я починил сборку.

Давай всё-же починим и тут)?

jt3k avatar Jan 25 '18 23:01 jt3k

я использую эти спрайты в режиме полифилла

Это конкретно у тебя так. А вообще не предполагалось такое использование повсеместно (svg4everybody только для старых IE подразумевался). С другой стороны, хуже (для тех кто не будет использовать svg4everybody для всех) от изменения айдишников в конфиге сборки не будет.

В общем, ишью открою. Если есть желание — будем рады ПРу. А свои силы брошены на Rispa.

dzhiriki avatar Feb 12 '18 16:02 dzhiriki