Битуация, ΠΊΠΎΠ³Π΄Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ viewBox Π² SVG-Ρ„Π°ΠΉΠ»Π΅ пСрСстаСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ игнорируСтся Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠΌ, часто ставит Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π² Ρ‚ΡƒΠΏΠΈΠΊ. Π’ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎ это проявляСтся Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π»ΠΈΠ±ΠΎ Π½Π΅ отобраТаСтся вовсС, Π»ΠΈΠ±ΠΎ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ всю Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, тСряя свои ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΈ. Π’ Π»ΠΎΠ³Π°Ρ… консоли ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ странныС сообщСния ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ источник Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅Π΄ΠΎΠ²Π΅Ρ€ΠΈΠ΅ ΠΈΠ»ΠΈ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°ΠΌΠΈ бСзопасности.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° кроСтся Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² синтаксичСских ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, Π½ΠΎ ΠΈ Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ соврСмСнныС Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ Ρ‚Ρ€Π°ΠΊΡ‚ΡƒΡŽΡ‚ внСшниС ссылки ΠΈ встроСнныС рСсурсы. Когда CSP (Content Security Policy) ΠΈΠ»ΠΈ настройки CORS Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ, Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ просто Π½Π΅ примСняСтся. ΠœΡ‹ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Β«Π½Π΅Π΄ΠΎΠ²Π΅Ρ€ΠΈΠ΅Β» ΠΊ источнику ΠΈ ΠΊΠ°ΠΊ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ.

Часто Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π·Π°Π±Ρ‹Π²Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ отсутствиС явного объявлСния пространства ΠΈΠΌΠ΅Π½ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ парсСр Π½Π΅ распознаСт SVG-элСмСнты ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ. Π’ этом случаС Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ считаСт Ρ„Π°ΠΉΠ» ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½Π½Ρ‹ΠΌ ΠΈΠ»ΠΈ нСбСзопасным для Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π°. ПониманиС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ XML ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ошибок, связанных с исчСзновСниСм viewBox.

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ игнорирования viewBox Π² соврСмСнных Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ…

Основной ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ viewBox Β«ΠΏΡ€ΠΎΠΏΠ°Π΄Π°Π΅Ρ‚Β», являСтся ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ ΠΌΠ΅ΠΆΠ΄Ρƒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ ΡˆΠΈΡ€ΠΈΠ½Ρ‹/высоты ΠΈ самим ΠΎΠΊΠ½ΠΎΠΌ просмотра. Если Π² SVG ТСстко Π·Π°Π΄Π°Π½Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Π² пиксСлях, Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ viewBox содСрТит ΡΠΈΠ½Ρ‚Π°ΠΊΡΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π­Ρ‚ΠΎ Π·Π°Ρ‰ΠΈΡ‚Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Π½ΠΈΠ΅ бСсконСчного Ρ†ΠΈΠΊΠ»Π° пСрСрисовки.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π²Π°ΠΆΠ½Ρ‹ΠΉ аспСкт β€” это ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° Ρ„Π°ΠΉΠ»Π°. Если SVG загруТаСтся ΠΊΠ°ΠΊ внСшний рСсурс ΠΈ сСрвСр ΠΎΡ‚Π΄Π°Π΅Ρ‚ Π΅Π³ΠΎ с Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ Content-Type, Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ стили ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ позиционирования. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях источник считаСтся Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌ, ΠΈ Π΄Π²ΠΈΠΆΠΎΠΊ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ слоТныС инструкции ΠΏΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ.

Π‘Ρ‚ΠΎΠΈΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ автоматичСски ΠΎΡ‡ΠΈΡ‰Π°ΡŽΡ‚ DOM-Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΎΡ‚ Β«ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ…Β» Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΏΡ€ΠΈ Π³ΠΈΠ΄Ρ€Π°Ρ‚Π°Ρ†ΠΈΠΈ. Если ваш viewBox динамичСски подмСняСтся ΠΈΠ»ΠΈ содСрТит выраТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ рСактивная систСма счССт опасными, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ ΠΈΠ· ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.

Google Chrome ΠΈ Firefox ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ SVG с ошибками Π² Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°Ρ…. Π’ Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΡƒΠ³Π°Π΄Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΈ, Π΄Ρ€ΡƒΠ³ΠΎΠΉ просто скроСт элСмСнт. Π­Ρ‚ΠΎ создаСт иллюзию Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ источник Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½ ΠΈΠ»ΠΈ Π΅ΠΌΡƒ Β«Π½Π΅ Π΄ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚Β».

πŸ“Š Π‘Ρ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡŒ Π»ΠΈ Π²Ρ‹ с исчСзновСниСм viewBox Π² SVG?
  • Π”Π°, часто игнорируСтся
  • НСт, всСгда Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚
  • Волько Π² IE/Edge
  • ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π±Ρ‹Π»Π° Π² CSS

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ довСрия ΠΊ источникам: CORS ΠΈ CSP

Когда Ρ€Π΅Ρ‡ΡŒ Π·Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΎ Β«Π½Π΅Π΄ΠΎΠ²Π΅Ρ€ΠΈΠΈ ΠΊ источникам», Ρ‡Π°Ρ‰Π΅ всСго подразумСваСтся Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ SVG-Ρ„Π°ΠΉΠ»Π° с Π΄ΠΎΠΌΠ΅Π½Π°, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ. Π‘Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ строго ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ CORS (Cross-Origin Resource Sharing). Если сСрвСр Π½Π΅ отправляСт Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Access-Control-Allow-Origin, скрипты ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ SVG ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Ρ‹.

ОсобСнно ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ это для inline-SVG, Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· JavaScript ΠΈΠ»ΠΈ fetch-запросы. Если Π²Ρ‹ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ SVG динамичСски, Π° источник ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ cross-origin Π±Π΅Π· ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ viewBox ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΡΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ доступ ΠΊ внутрСнностям Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Ρ€Π°Π΄ΠΈ бСзопасности.

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ИспользованиС SVG ΠΈΠ· Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Ρ… источников Π±Π΅Π· санитайзинга (очистки) ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡƒΡ‚ΡŒ для XSS-Π°Ρ‚Π°ΠΊ. Π‘Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ Ρ‚Π°ΠΊΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΡ€Π΅Π²Π΅Π½Ρ‚ΠΈΠ²Π½ΠΎ.

ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° бСзопасности ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° (CSP) ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ скриптов с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π΄ΠΎΠΌΠ΅Π½ΠΎΠ². Если ваш SVG пытаСтся ΠΏΠΎΠ΄Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΡˆΡ€ΠΈΡ„Ρ‚ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ external reference, ΠΈ этот рСсурс Π½Π΅ внСсСн Π² whitelist, вСсь Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠΏΡ€ΠΎΠΌΠ΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ viewBox игнорируСтся, Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ схлопываСтся.

Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ сСрвСр Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΠΎΡ‚Π΄Π°Π²Π°Π» ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ бСзопасности. Π’Π°ΠΊΠΆΠ΅ стоит ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ CSP Π² ΠΌΠ΅Ρ‚Π°-Ρ‚Π΅Π³Π°Ρ… ΠΈΠ»ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°Ρ… HTTP, ΡƒΠ±Π΅Π΄ΠΈΠ²ΡˆΠΈΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ рСсурсы для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ отобраТСния Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ.

πŸ’‘

ВсСгда провСряйтС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π° сСрвСра для SVG-Ρ„Π°ΠΉΠ»ΠΎΠ². ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ Content-Type: image/svg+xml ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» ΠΊΠ°ΠΊ plain text, игнобируя всС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹.

БинтаксичСскиС ошибки ΠΈ валидация SVG

Часто ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° кроСтся Π² банальной ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠ΅. Атрибут viewBox чувствитСлСн ΠΊ рСгистру: ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ с малСнькой Β«bΒ» (camelCase). НаписаниС ViewBox ΠΈΠ»ΠΈ VIEWBOX ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ζŒ‡δ»€, посчитав Π΅Π³ΠΎ нСизвСстным ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ.

Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ³Ρ€Π°ΡŽΡ‚ Ρ€ΠΎΠ»ΡŒ. Π₯отя стандарт допускаСт использованиС запятых, ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΌ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… чисСл: min-x min-y width height. Если вмСсто числа Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‚ΠΎΡΡ‚ΡŒ пустая строка ΠΈΠ»ΠΈ Π½Π΅Π²Π°Π»ΠΈΠ΄Π½Ρ‹ΠΉ символ, вСсь Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ станСт Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ.

Π’ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ распространСнныС ошибки ΠΈ ΠΈΡ… влияниС Π½Π° Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³:

Ошибка Π² ΠΊΠΎΠ΄Π΅ Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ Бтатус довСрия
ViewBox="0 0 100 100" Атрибут игнорируСтся Низкий (синтаксис)
viewBox="0,0,100,100" Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½ΠΎ Π½Π΅ Π²ΠΎ всСх Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… Π‘Ρ€Π΅Π΄Π½ΠΈΠΉ
viewBox="0 0 100" ПолноС ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ (Π½Π΅ 4 числа) Низкий
viewBox="0 0 0 0" Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ схлопываСтся Высокий (Π²Π°Π»ΠΈΠ΄Π½ΠΎ, Π½ΠΎ пусто)

Π’Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€Ρ‹ SVG, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ инструмСнт ΠΎΡ‚ W3C, ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Π²Ρ‹ΡΠ²ΠΈΡ‚ΡŒ эти ошибки Π΄ΠΎ deployment. Однако, Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ Π²Π°Π»ΠΈΠ΄Π½ΠΎΠΌ синтаксисС, Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΡΡ‚ΡŒ элСмСнтов ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ€ΡƒΡˆΠ°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ наслСдования. Если viewBox Π·Π°Π΄Π°Π½ Π½Π° Π³Ρ€ΡƒΠΏΠΏΠ΅ <g>, Π° Π½Π΅ Π½Π° ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ элСмСнтС <svg>, ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ³ΠΎ.

β˜‘οΈ Диагностика ошибок viewBox

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ: 0 / 4

ВлияниС CSS ΠΈ наслСдования свойств

Бтилизация Ρ‡Π΅Ρ€Π΅Π· CSS ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ SVG. Если для элСмСнта Π·Π°Π΄Π°Π½ΠΎ свойство width: 100% ΠΈ height: auto, Π½ΠΎ ΠΏΡ€ΠΈ этом отсутствуСт явный viewBox ΠΈΠ»ΠΈ ΠΎΠ½ Π½Π΅ читаСтся Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠΌ, ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°Ρ€ΡƒΡˆΠ΅Π½Ρ‹. CSS ΠΈΠΌΠ΅Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ высокий ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… сцСнариях Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π°, Ρ‡Π΅ΠΌ встроСнныС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹.

Π’Π°ΠΊΠΆΠ΅ стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° свойство preserveAspectRatio. Если ΠΎΠ½ΠΎ установлСно Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΡŽΡ‰Π΅Π΅ с ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ, ΠΈΠ»ΠΈ Ссли Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π΅Π³ΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΈΠ·-Π·Π° ошибок Π² viewBox, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ€Π΅Π·Π°Π½ΠΎ ΠΈΠ»ΠΈ растянуто. Π­Ρ‚ΠΎ часто воспринимаСтся ΠΊΠ°ΠΊ потСря Π΄Π°Π½Π½Ρ‹Ρ… ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ.

Π’ случаях, ΠΊΠΎΠ³Π΄Π° SVG ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ background-image, Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ viewBox Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ для ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Ρ‡Π΅Ρ€Π΅Π· CSS-свойства. Π—Π΄Π΅ΡΡŒ источником истины становятся Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ самого Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ свойства background-size. ΠŸΡƒΡ‚Π°Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ inline-SVG ΠΈ Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΌΠΈ изобраТСниями β€” частая ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Β«ΠΏΡ€ΠΎΠΏΠ°ΠΆΠΈΒ» Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π°.

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ SVG Π² качСствС background-image, Ссли Π²Π°ΠΌ трСбуСтся ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΈΠ»ΠΈ динамичСскоС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ†Π²Π΅Ρ‚ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· CSS. Π’ этом Ρ€Π΅ΠΆΠΈΠΌΠ΅ источник считаСтся просто ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΎΠΉ.

НаслСдованиС стилСй ΠΎΡ‚ родитСля Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‹Π³Ρ€Π°Ρ‚ΡŒ Π·Π»ΡƒΡŽ ΡˆΡƒΡ‚ΠΊΡƒ. Если Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΈΠΌΠ΅Π΅Ρ‚ display: none Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ скрипта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ рассчитываСт Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹, viewBox ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ рассчитан Π½Π΅Π²Π΅Ρ€Π½ΠΎ (ΠΊΠ°ΠΊ 0x0). ΠŸΡ€ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ исправлСниС ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ автоматичСски.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ viewBox Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π²Π½ΡƒΡ‚Ρ€ΠΈ shadow DOM?

Π’Π½ΡƒΡ‚Ρ€ΠΈ Shadow DOM Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ viewport ΠΌΠΎΠ³ΡƒΡ‚ вСсти сСбя ΠΈΠ½Π°Ρ‡Π΅. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ SVG Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ фиксированных Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΡŽΡ‚ с Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌΠΈ хоста shadow root.

ДинамичСскоС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈ JavaScript**

ΠŸΡ€ΠΈ манипуляциях Ρ‡Π΅Ρ€Π΅Π· JavaScript Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° viewBox Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ‚ΠΎΠ΄ setAttribute ΠΈΠ»ΠΈ прямоС ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ свойству viewBox.baseVal. ΠŸΡ€ΡΠΌΠΎΠ΅ присваиваниС строки ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ пСрСрисовку Π² старых Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… ΠΈΠ»ΠΈ спСцифичных срСдах выполнСния.

Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Ρ€ΠΎΠ΄Π΅ React, Vue ΠΈΠ»ΠΈ Angular, ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ имя Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° написано Π² camelCase (viewBox), Π° Π½Π΅ Π² kebab-case (view-box), хотя Π² HTML это допустимо. Π€Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ строго Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ DOM-ΡƒΠ·Π»Ρ‹ ΠΈ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нСизвСстныС ΠΈΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, считая ΠΈΡ… ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ опасными.

ДинамичСская ΠΏΠΎΠ΄Π³Ρ€ΡƒΠ·ΠΊΠ° SVG Ρ‡Π΅Ρ€Π΅Π· fetch ΠΈ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· innerHTML Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ остороТности. Π‘Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ источник Π½Π΅Π΄ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ, особСнно Ссли ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ с Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π°. Π’ этом случаС скрипты Π²Π½ΡƒΡ‚Ρ€ΠΈ SVG выполнятся Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚, Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ санитайзированы.

Для бСзопасной Ρ€Π°Π±ΠΎΡ‚Ρ‹ с динамичСским ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ DOMParser. Π­Ρ‚ΠΎ позволяСт Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρƒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ XML-структуру Π΄ΠΎ внСдрСния Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚, Ρ‡Ρ‚ΠΎ сниТаСт риск Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°ΠΌΠΈ бСзопасности.

const parser = new DOMParser();

const svgDoc = parser.parseFromString(svgString, "image/svg+xml");

const svgElement = svgDoc.documentElement;

Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ viewBox Π±ΡƒΠ΄Π΅Ρ‚ распарсСн ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, ΠΈ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Β«Π½Π΅Π΄ΠΎΠ²Π΅Ρ€Ρ‡ΠΈΠ²ΠΎΒ» ΠΎΡ‚Π½ΠΎΡΠΈΡ‚ΡŒΡΡ ΠΊ структурС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°.

πŸ’‘

ИспользованиС DOMParser для вставки SVG Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ namespaces ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², избСгая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с security policy.

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈ оптимизация**

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с Β«Π½Π΅Π΄ΠΎΠ²Π΅Ρ€ΠΈΠ΅ΠΌΒ» ΠΈ исчСзновСниСм viewBox, слСдуйтС ΠΏΡ€Π°Π²ΠΈΠ»Ρƒ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΠ·ΠΌΠ°. УдаляйтС лишниС ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΈ скрипты ΠΈΠ· SVG-Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½ΠΎΠΌ. Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π²Ρ€ΠΎΠ΄Π΅ SVGO ΠΈΠ»ΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ для Webpack ΠΈ Vite ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΡΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ с этой Π·Π°Π΄Π°Ρ‡Π΅ΠΉ.

ВсСгда явно ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΠΉΡ‚Π΅ пространство ΠΈΠΌΠ΅Π½ xmlns="http://www.w3.org/2000/svg" Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ элСмСнтС. Π‘Π΅Π· этого Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ Π½ΠΈΠΌ SVG, ΠΈ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС спСцифичныС инструкции, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΎΠΊΠ½ΠΎ просмотра.

Если ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° сохраняСтся, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ явно Π·Π°Π΄Π°Ρ‚ΡŒ width ΠΈ height Π² ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΅Π΄ΠΈΠ½ΠΈΡ†Π°Ρ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 100%) вмСстС с viewBox. Π­Ρ‚ΠΎ даст Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρƒ Ρ‡Π΅Ρ‚ΠΊΠΈΠΉ сигнал ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚, устраняя Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ.

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ использования SVG с Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΡˆΠΈΡ€ΠΈΠ½ΠΎΠΉ ΠΈΠ»ΠΈ высотой. Π”Π°ΠΆΠ΅ Ссли viewBox Π·Π°Π΄Π°Π½, Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ элСмСнт Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ ΠΈ Π½Π΅ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ рСсурсы Π½Π° Π΅Π³ΠΎ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³.

РСгулярно тСстируйтС свои SVG Π² Ρ€Π°Π·Π½Ρ‹Ρ… Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… ΠΈ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… устройствах. Π’ΠΎ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Chrome Π½Π° дСсктопС, ΠΌΠΎΠΆΠ΅Ρ‚ вСсти сСбя ΠΈΠ½Π°Ρ‡Π΅ Π² мобильном Safari ΠΈΠ·-Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΉ Π² Π΄Π²ΠΈΠΆΠΊΠ°Ρ… Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° WebKit ΠΈ Blink.

Π‘Π΅ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ ΠΎΡ€ΡƒΠΆΠΈΠ΅

SVG Sprite. ОбъСдинСниС ΠΈΠΊΠΎΠ½ΠΎΠΊ Π² спрайт часто Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с CORS, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ„Π°ΠΉΠ» грузится ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ локально Ρ‡Π΅Ρ€Π΅Π· ID.

FAQ: Часто Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ вопросы

ΠŸΠΎΡ‡Π΅ΠΌΡƒ viewBox игнорируСтся, Ссли Ρ„Π°ΠΉΠ» ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ локально?

ΠŸΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» file:// Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ строгиС ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ бСзопасности, блокируя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Π²Π½Π΅ΡˆΠ½ΠΈΡ… рСсурсов ΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° ограничивая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» SVG. РСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ сСрвСр (localhost).

ΠœΠΎΠΆΠ΅Ρ‚ Π»ΠΈ антивирус Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ viewBox?

Π‘Π°ΠΌ ΠΏΠΎ сСбС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ viewBox Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ антивирусом. Однако, Ссли SVG содСрТит скрипты ΠΈΠ»ΠΈ ссылки Π½Π° ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ рСсурсы, Π·Π°Ρ‰ΠΈΡ‚Π½ΠΎΠ΅ ПО ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Ρ„Π°ΠΉΠ»Π° Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ.

Как ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π²ΠΈΠ΄ΠΈΡ‚ Π»ΠΈ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ viewBox?

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ инструмСнты Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° (DevTools). НайдитС элСмСнт <svg> Π² DOM-Π΄Π΅Ρ€Π΅Π²Π΅ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π²ΠΊΠ»Π°Π΄ΠΊΡƒ Styles ΠΈΠ»ΠΈ Computed. Если Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π΅ΡΡ‚ΡŒ Π² HTML, Π½ΠΎ Π½Π΅ примСняСтся, ΠΈΡ‰ΠΈΡ‚Π΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ Π² CSS ΠΈΠ»ΠΈ ошибки Π² консоли.

ВлияСт Π»ΠΈ вСрсия SVG Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ viewBox?

Атрибут viewBox являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ спСцификации SVG 1.1 ΠΈ 2.0. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΎΡ‡Π΅Π½ΡŒ старыми Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°ΠΌΠΈ (IE8 ΠΈ Π½ΠΈΠΆΠ΅), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ SVG Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΈΠ»ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Π±Π°Π³ΠΈ Π² парсСрС.

Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ссли viewBox "ΠΌΠΈΠ³Π°Π΅Ρ‚" ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅?

Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ CSS загруТаСтся ΠΏΠΎΠ·ΠΆΠ΅ HTML, ΠΈΠ»ΠΈ JavaScript мСняСт Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° послС ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ отрисовки. Π‘Ρ‚Π°Ρ€Π°ΠΉΡ‚Π΅ΡΡŒ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ явно ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ CSS contain для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ пСрСрисовки.