SVG-графика в Webkit-браузерах

Jun 05, 2010 15:28


Расследуя использование SVG-графики в различных браузерах, я утверждал, что наилучшим на нынешний момент способом является её внедрение через элемент object (со всякими примочками для IE).

Google Chrome и Safari, однако, обнаруживают две проблемы. Для начала, они не обеспечивают пропорционального масштабирования SVG-картинки, если у элемента svg не заданы атрибуты width и height. Но это ладно, можно и задать.

Вторая проблема серьёзней: если у вставленной через object SVG-картинки прозрачный фон, он заливается белым (это баг! причём очень старый, более чем двухлетней давности - и в новейших 5-х версиях этих браузеров он не исправлен).

Если использовать не object, а img, то всё отлично, но Firefox пока что такого способа вставки SVG-картинки не понимает. Поэтому пишем для Webkit-браузеров скрипт (смирившись с белым фоном в ненормальной ситуации отключенного Javascript), подменяющий в загруженном документе object с SVG-картинкой на img:

if(/AppleWebKit/.test(navigator.userAgent)) window.addEventListener( "load", function(){ var objects=document.getElementsByTagName("object"); for(var objectNumber=objects.length, objectNode, codebase, imageNode, attrNumber, attrNode; objectNumber--;){ objectNode=objects[objectNumber]; if(objectNode.getAttribute("type")==="image/svg+xml"){ imageNode=document.createElement("img"); codebase=objectNode.getAttribute("codebase"); imageNode.setAttribute("src", ((null===codebase)?"":codebase)+objectNode.getAttribute("data")); imageNode.setAttribute("alt", "SVG");//совсем без alt нельзя по стандарту HTML for(attrNumber=objectNode.attributes.length; attrNumber--;){ attrNode=objectNode.attributes[attrNumber]; if(-1===["declare","classid","codebase","data","type","codetype","archive","standby","tabindex"].indexOf(attrNode.name)) imageNode.setAttribute(attrNode.name, attrNode.value); } objectNode.parentNode.replaceChild(imageNode, objectNode); } } }, false );
Вроде, работает, как должно (но тут такая беда, что на вставленных таким образом картинках перестают работать скрипты!). Пусть пока так и будет, а как Firefox и Opera подтянутся, переведём всех на img, так оно и семантичней будет, и будем аналогичным способом решать уже обратную задачу для старых версий браузеров.

Кстати, в IE, по меньшей мере, при использовании Adobe SVG Viewer имеем ту же проблему; лечится добавлением embed-элементу атрибута wmode со значением transparent.

А сейчас у меня другая проблема. Не могу добиться отображения в Firefox размещённых на сервере провайдера gzip-ованных SVG-картинок. Расследование показало, что в ответе сервера отсутствуют правильные заголовки Content-Type: image/svg+xml и Content-Encoding: gzip (Opera это по фиг, но она вообще много на себя берёт, что не правильно, на мой взгляд). Попытка прописать их обычным путём успехом увенчивается наполовину: директива AddType срабатывает, а AddEncoding - нет.

Я так понял, что у провайдера перед Apache стоит фронт-ендом nginx, что неким образом ограничивает возможность использования директив Apache. Разумеется, раздел «Помощь» на сайте провайдера не содержит про эту закавыку ни слова и даже вообще ни единого упоминания про nginx. Воззвал к их техподдержке, жду.

webkit, apache, chrome, safari, http, браузеры, gzip, nginx, svg

Previous post Next post
Up