Внедрение SVG изображений на страницу

В простейшем случае svg-картинка внедряется следующим способом:
<object type="image/svg+xml" data="pucture.svg">
</object>

Это работает везде, кроме ИЕ, который SVG изначально не поддерживает. Для него надо установить следующий плагин:
download.adobe.com/pub/adobe/magic/svgviewer/win/3.x/3.03/en/SVGView.exe

Его следует прописать в аттрибуте codebase. Тогда при заходе на страницу пользователю будет предложено установить его. Пара кликов, перезагрузка страницы, одобрение использования плагина на сайте, и можно наслаждаться поддержкой SVG графики.

Но ссылка на плагин слишком длинная для использования в вёрстке, поэтому лучше её укоротить. Простейший вариант укорачивателя на php, например, выглядит так:
<?php header( 'Location: download.adobe.com/pub/adobe/magic/svgviewer/win/3.x/3.03/en/SVGView.exe', 301 );

В связи с какой-то ошибкой, ишак всё-равно не сможет нарисовать картинку из-за указанного миме-типа. Оно и к лучшему, ибо через object он рисует её с белым фоном и псевдотрёхмерной рамкой. Поэтому для него вставим внутрь embed:
<object type="image/svg+xml" data="picture.svg" codebase="install-svg.php">
        <embed src="picture.svg" wmode="transparent" />
</object>

Аттрибут wmode необходим для убирания белого фона. Однако, вебкитам всё ни по чём — белый фон и при object и при embed, поэтому для них будем отслеживать в доме появление object-ов с помощью CComponent, ломать их и вставлять внутрь img с соответствующей картинкой:
if( /webkit/i.test( navigator.userAgent ) ) CComponent(
{       tag: 'object'
,       factory: function( obj ){
                if( obj.type !== 'image/svg+xml' ) return null
                var img= new Image
                img.src= obj.data
                obj.type= obj.data= obj.innerHTML= ''
            obj.appendChild( img )
        }
})

Чтобы размеры img и embed соответствовали заданным для object нужно добавить стили:
object embed ,
object img {
        width: 100%;
        height: 100%
        }

Ну, и, наконец, живой примерчик.
+17
16 июля 2010, 02:37
56
tenshi –27,1

комментарии (45)

+1
Octane #
А <embed> не нужно в условные комментарии заключить, например для будущего IE9, который возможно нормально будет отображать (а может уже в альфа-версии все хорошо?) рисунок из без <embed>, т.к. будет встроенная поддержка SVG?
0
tenshi #
он отобразит через object, как остальные браузеры, проигнорировав embed
+3
Johan #
Уверены ли Вы, речь, ведь, идет об IE. =)
+1
tenshi #
я надеюсь на лучшее.
+1
Zitrix #
embed тут в качестве альтернативного контента.
вставляли когда-нибудь флешку руками (object/@data) и писали внутри object'а: «установите флеш-плеер»? тут тоже самое.
+1
dev0ur #
В Опере картинка отобразилась без установки плагина.
+2
tenshi #
респект опере! *О*
НЛО прилетело и опубликовало эту надпись здесь
+2
tenshi #
какое удивительное совпадение! *о*
а у меня типа безграмотно? х)
+1
smashercosmo #
поэтому для них будем отслеживать в доме появление object-ов с помощью CComponent, ломать их и вставлять внутрь img с соответствующей картинкой

Не могли бы вы поподробней объяснить вот этот момент? Что такое CComponent? И что значит вставлять внутрь img? Когда я просматриваю код в хроме через Web Inspector, то он показывает два object'a (или Web Inspector просто не показывает динамически измененный html?).
0
tenshi #
там в статье ссылка на статью о CComponent

вместо embed вставляется img

да, хром показывает svg вставленный через img как элемент svg
+2
tenshi #
мдя… а ссылка-то битая =_=" хабр писали какие-то долбоёбы…
+1
tenshi #
поправил
+1
smashercosmo #
спасибо
+1
smashercosmo #
Не, ссылка всё-равно не помогла. Ваш специфический метод изложения + количество градусов на улице как-то не способствуют лёгкому восприятию материала. )
0
tenshi #
что там может непонятного? ._."
+1
smashercosmo #
Ааа… кажется дошло… это как бы аналог джекверевских методов live и die, только применительно к виджетам.
0
tenshi #
ну, типа того. только live отслеживает события на дочерних элементах, а CComponent отслеживает появление их и исчезновение.
+1
smashercosmo #
Тогда при заходе на страницу пользователю будет предложено установить его.

А в предыдущей статье автор писал, что это нифига не работает как задумано.
0
tenshi #
не работает pluginspage, а вот codebase вполне себе работает
0
tenshi #
pluginspage — это я так понимаю нетскейповская фича. лень проверять…
+1
root_sashok #
Во всех топиках о HTML обязательно упоминается, что в IE для этого нужен костыль ;)
+2
Aux #
SVG следует вставлять также, как и обычные картинки. Все нормальные браузеры это понимают. А как костылить IE — неважно. Ембеды, блин, обжекты…
0
tenshi #
рыжая панда не умеет вставлять через img
+3
Aux #
Я чтоли виноват, что они не читают доки ( www.w3.org/TR/2003/REC-SVG11-20030114/concepts.html#UsageOptions )? Рекомендация утверждена в январе 2003-го года, за семь лет могли бы и почитать доки, раз орут о стандартах на каждом углу. Мы, стандарто-ориентированные веб-разработчики, таки засставили Microsoft поддерживать стандарты. Почему мы не можем прессовать рыжих? Можем! И даже нужно! Не отображается мою SVG? Please download better browser: Chrome, Opera or Safari. Разговор короткий.
–1
tenshi #
я не фанатик ._."
+1
Aux #
А я не фанатик костылей. За семь лет в индустрии меня эти костыли уже до смерти задолбали. Кто не хочет жить мирно, тот идёт лесом.
+1
tenshi #
без костылей работа была бы скучной и однообразной
+1
Zitrix #
я, куда деваться, за стандарты (они явно лучше нестабильных багов проприоритарного ие)… но почему-то у меня выражение «стандарт-ориентированный разработчик» как-то само собой разворачивается в «человек, которому стандарт-ориентированностью проели мозги фанаты фокса» — может, по-этому выражение у меня «Почему мы не можем прессовать рыжих?» как-то само собой разворачивается в «Почему мы не можем бежать по рельсам навстречу паровозу?»
+1
Aux #
Ну, каждому своё. Я просто устал от вечных костылей.
+1
torbasow #
Все нормальные браузеры — это одна «Опера»? Нет, в данном контексте она меня не огорчала, но именно, что она одна. «Хром» и «Сафари» такие эсвэгэшки не скриптуют, увы.
0
Aux #
Я не скажу за сафари, но хром понимает svg как картинки и какое-то время обратно начал понимать svg в фоне. Что-то мне подсказывает, что сафари тоже. Также в фон можно сунуть vml-конверт из svg, тогда и ие6 наш друг. Остаётся только лис в стороне…
+1
torbasow #
Они понимают. Но они их не скриптуют.
+1
Aux #
В смысле? Я, наверное, туплю… Но не понимаю о чём вы.
+1
torbasow #
О скриптах же! Элементы (DOM-узлы) таких SVG невозможно сделать интерактивными: Уэбкит-браузеры не вызывают на них события и не применяют к ним операции. А это же едва ли не самое интересное в SVG.
+3
bladebf #
в чем смысл клонирования вчерашнего топика про SVG ( habrahabr.ru/blogs/svg/99143/ )?
0
tenshi #
наверно в том, что это не мой топик х)))
0
tenshi #
брр… «вчерашнего» прочитал как «вчерашнего вашего» ._." диагональный метод чтения сбоит иногда…
0
tenshi #
чтобы понять смысл достаточно прочитать содержимое, а не только заголовок
+2
stoune #
Adobe прекратила поддержку Adobe SVG несколько лет назад.
0
tenshi #
спасибо, кэп.
+1
Veterinar #
Но ссылка на плагин слишком длинная для использования в вёрстке

Простите, я как-то этого вот совсем не понял. Что значит «слишком длинная ссылка» и как это мешает верстке?
0
tenshi #
слишком громоздкая запись тогда получается
+2
Veterinar #
Я трижды извиняюсь за непонятливость, но правильно ли я вас понял? Вы предлагаете делать отдельную страничку с редиректом для того, чтобы в исходном коде ссылка была короче?
0
tenshi #
да

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.