Как стать автором
Обновить

Комментарии 21

Спасибо, на самом деле очень интересно! Нравится мне native-way.

Можете разъяснить: по сути ваша реализация позволяет заменить <img src="images/image_name.svg"> на <svg-icon name="image_name">? Какие-то еще фишки можно сделать?

Да, все верно, можем заменить img src=icon_name на svg-icon name=icon-name по поводу фишек - какие вы бы хотели видеть? пишите, я подумаю чем смогу помочь и можно ли это реализовать.

Честно говоря я справляюсь теми инструментами, что использую. Но поговорим об идеях :)

Вот попадались такие кейсы как особое отображение svg-иконки, если темная тема. Можно динамически менять тело svg или стили при смене цветового режима.

Еще одну идею дам. При описании в верстке svg-иконок приходится указывать атрибуты width, height, а также viewbox. Это бойлерплейт. Через веб-компоненты можно решить это неудобство.

Смотрите, как бы это парадоксально не казалось на первый взгляд, но inline вставка svg работает шустрее чем использование спрайтов - https://cloudfour.com/thinks/svg-icon-stress-test/

Еще к минусам svg-спрайтов можно отнести, то что через css не получается цвета svg менять

Так что можно добавить атрибут который указывает использовать спрайт или вставлять inline

Работает быстрее, только есть и минусы у подхода к инклудами

  1. Вы привязаны к шаблонизатору и необходимо использовать доп. инструменты сборки

  2. Время сборки проекта становится чуть медленее из-на инклудов

  3. Общий вес страницы становится больше т.к. иконки не переиспользуются. На большом количестве иконок разница в размере страницы будет очень существенной

Не тот кейс, где можно как-то просесть в производительности, если только вы не пишите сайт сток для свг иконок

Так что можно добавить атрибут который указывает использовать спрайт или вставлять inline

Здравая идея, возможно обновлю контент немного позже.

Еще к минусам svg-спрайтов можно отнести, то что через css не получается цвета svg менять

Какое невежство таких вещей не знать, но все работает отлично. Попробуйте стиль в CSS применить svg-icon svg { fill: ff00ff; } и лично убедиться, что все работает и цвет меняется отлично.

Какое невежство таких вещей не знать, но все работает отлично. Попробуйте стиль в CSS применить svg-icon svg { fill: ff00ff; } и лично убедиться

Попробовал и лично убедился что не работает - потому что спрайт - потому что там тег use в котором уже shadow dom(к которому доступа нет из css ) и только потом целевая svg


поэтому нужно inline вставлять а не через спрайт

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

Как видите все перекрасилось

Спасибо! Интересное поведение, да, цвета меняются. Но вот если в самом SVG атрибут fill у path прописан то его не получается переопределить через css в случае если SVG вставлено через спрайт, то есть картинку надо ещё немного подготовить после экспорта из фигмы например, стереть все fill из SVG.

При этом если вставлять inline - то не важно что внутри картинки задан атрибут fill , css его переопределяет

Ссылка на материал годная. Однако, мы видимо по-разному считываем графики. Чем меньше диаграмма, тем лучше, разве нет? Длина столбца - это время загрузки svg.

В этом случае inline-svg - худшее решение, потому что столбец самый длинный. А юзать тег img - лучшее.

В статье ссылка на страничку с тестом https://svg-icon-stress-test.netlify.app/

там есть и другие методы вставки картинок можете изучить


я так понимаю в случае с inline браузер сам что-то оптимизирует лучше спрайта , тут вот честно хз как это работает в деталях , сам удивился когда узнал

Я бы сказал, что результаты примерно идентичны и можно получить и обратные значения. На телефоне аналогично, иногда вариант symbol sprite срабатывает побыстрее чем предыдущий тест с inline svg. Спрайт будет выигрывать по общему весу страницы, а также за счет того, что иконка загружается по хуку connectionCallback т.е. уже после отображения первичного контента страницы, что в теории тоже на какие-то копейки улучшает FCP параметр. Но это все крохоборство в целом, хотя на тесте в 100000 иконок разница в пользу инлайна более ощутима, но таких кейсов в жизни на 100к иконок я не встречал

А почему так скромно? Надо по 100_000 ставить. И самое смешное, что Inline SVG и External Image примерно одинаковые. Походу исследование уже не очень актуально :)

без спрайта достаточно будет только тега веб-компонента - и не вставлять этот div еще отдельный

так основной смысл данного подхода из статьи как раз в спрайте и отсутствии повторных запросов по сети. Если вам это не нравится или не подходит, можно просто использовать img тег) ну или инклудить средствами сборщика\шаблонизатора свгшки

вы можете выложить рабочий код компонента куда-нибудь типа codepen?

он так просто не пашет ... вот это else кажется лишнее - https://github.com/webislife/svg-icon/blob/main/svg-icon.ts#L65

на гитхаб же дал ссылку в статье, или вам нужна javascript версия?

нужна была рабочая версия ) в общем я уже поправил и проверил

https://replit.com/join/hkvuzlpdcd-alexstep2

А вообще вам бы пойти поучить современные фреймворки, а не заниматься велосипедостроением, там эта проблема давно решена :D

SVG иконки на проекте не являются какой-то проблемой, а также сами веб-компоненты вполне современный подход на который все больше обращают внимание крупные компании. Как раз в плюсах у компонента то, что он способен пережить множество версий фреймворков и уже это успешно делают. У одного только реакта за время существования веб-компонентов прошло десяток релизов, а этот веб-компонент в целом оставался бы неизменным последние 5 лет точно и спокойно переживал изменения сборщиков webpack > rollup > vite

Это решается бандлерами в первую очередь. Фреймворки тут рядом просто.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории