Озадаченный SVG viewBox, width, height и т. д
Если бы мое понимание SVG было правильным, следующие два описания SVG привели бы к идентичным изображениям, но они этого не делают. (Примечание: два списка кода отличаются только значениями координат в их svg
теги. Более конкретно, для каждого (x, y) пара в первом списке есть (x-205, y-55) пара во втором листинге.)
<!DOCTYPE html>
<html>
<head><title>title</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
x="0" y="0" width="210" height="60" viewBox="0 0 210 60">
<g style="stroke: black; fill: none;">
<path d="M 5 5 Q 105 55 205 55"/>
</g>
</svg>
</body>
</html>
<!DOCTYPE html>
<html>
<head><title>title</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
x="-205" y="-55" width="210" height="60" viewBox="-205 -55 5 5">
<g style="stroke: black; fill: none;">
<path d="M -200 -50 Q -100 0 0 0"/>
</g>
</svg>
</body>
</html>
на самом деле, согласно Firefox по крайней мере, они выглядят совсем по другому. Рендеринг, который я ожидал для обоих из них, - это то, что Firefox предоставляет для первого (а именно, кривая, плавно наклоняющаяся слева направо, с начальным наклоном -1/2 и конечным наклоном 0). Я совершенно сбит с толку тем, что FF производит для второго, потому что, AFAICT, вторая спецификация-это простой оптовый ("жесткий") перевод вектором (-205, -55) первого.
почему два дисплея не выглядят идентичные?
3 ответов
потому что координаты viewbox не x1, y1, x2, y2 - они шалунья, miny, ширина и высота.
для precis на viewBox см. (только) рисунок в этой статье:https://software.intel.com/en-us/html5/blogs/viewbox-a-window-into-the-soul-of-svg, inlined ниже для удобства:
эта картина стоит 1000 слов объяснения.
параметры ширины и высоты, а также видовое окно в терминологии W3C-это другое. Но нет в приведенном выше примере. Существует немного сложный алгоритм для определения, действительно ли ширина и высота из SVG что-либо делают, потому что они могут быть переопределены, например,<object>
тег, который вставляет SVG в HTML-страницу. Есть больше угловых случаев, объясненных в http://www.w3.org/TR/SVG/coords.html#ViewportSpace. Для более визуально ориентированного (и, возможно, более доступного) объяснения этой проблемы видового экрана вы также можете обратиться к руководству Inkscape http://tavmjong.free.fr/INKSCAPE/MANUAL/html/Web-SVG-Positioning.html (в стороне, есть расширение, доступное, чтобы установить viewBox визуально из Inkscape http://pernsteiner.org/inkscape/viewbox/; вам действительно не нужно редактировать XML напрямую, как говорится в руководстве Inkscape [still].)
очень поздно на этот раз, но чтобы прояснить момент, Майкл сделал выше для будущих зрителей:
если вы измените некоторые из номеров, но не много, вы получите тот же результат.
одна проблема, с которой вы сталкиваетесь, заключается в том, что вы думаете, что min-x + width
должен быть одинаковым в любом узле svg. min-x
и min-y
- это левая и верхняя координаты viewBox
- эффективно изменить 0, 0
позицию min-x, min-y
, и действительно только для система координат viewBox(and by extension to your
путь's
dпанели viewBox`.
кроме того, положение x и y svg
node действительны, но игнорируются и не имеют ничего общего с любым размещением.
таким образом, чтобы ваш второй путь выглядел как ваш первый, вы можете удалить x
и y
атрибуты, и изменить width
и height
номера внутриviewBox
чтобы соответствовать первому:
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
width="210" height="60" viewBox="-205 -55 210 60">
<g style="stroke: black; fill: none;">
<path d="M -200 -50 Q -100 0 0 0"/>
</g>
</svg>