Вложенные системы координат

Автор: Евгений Рыжков и Тимур Лисица Дата публикации: 21.11.2010

Вы можете создать новую область просмотра со своей системой координат в любое время, вложив еще один элемент <svg> элемент в Ваш SVG-документ. Создается эффект «мини-холста», поверх которого Вы можете рисовать. Мы использовали данную технику для создания этой иллюстрации:

пример использования вложенных систем координат

Вместо того, чтобы рисовать прямоугольники, потом изменять масштаб и положение кота внутри каждого из них (грубый метод), мы предпринимаем следующие действия:

  • рисуем голубые прямоугольники на основном холсте;
  • для каждого прямоугольника определяем новый элемент <svg> с соответствующим атрибутом preserveAspectRatio;
  • рисуем кота на новых холстах (применяем <use>) и пусть SVG делает всю тяжелую работу.

На более простом примере разберем как можно применить вложенные <svg>. Нарисуем две фигуры: круг и прямоугольник на основном холсте. И добавим новый холст, который будет расположен внутри прямоугольника.

пример использования вложенных систем координат

Сначала создаем SVG для основной системы координат и для круга. Обратите, внимание, что пользовательская система координат совпадает с основной:

<svg width="200" height="200" viewBox="0 0 200 200">
	<circle cx="25" cy="25" r="25" style="stroke: black; fill: none;" />
</svg>
круг

Теперь рисуем границы, которыми обозначим, где будет новое окно просмотра:

<svg width="200" height="200" viewBox="0 0 200 200">
	<circle cx="25" cy="25" r="25" style="stroke: black; fill: none;" />
	<rect x="100" y="5" width="30" height="80" style="stroke: blue; fill: none;" />
</svg>
круг и контур для нового холста

Сейчас, добавляем еще один элемент <svg> для новой области просмотра. Вдобавок к определению viewBox, width, height и preserveAspectRatio, Вы можете также определить атрибуты х и у. Это будут координаты положения нового холста относительно родительского <svg> элемента. По умолчанию они равны нулю.

<svg width="200" height="200" viewBox="0 0 200 200">
	<circle cx="25" cy="25" r="25" style="stroke: black; fill: none;" />
	<rect x="100" y="5" width="30" height="80" style="stroke: blue; fill: none;" />
	<svg x="100px" y="5px" width="30px" height="80px" viewBox="0 0 50 50" preserveAspectRatio="xMaxYMax meet">
	</svg>
</svg>

Новая система координат вложенного <svg> позволит добавить круг точно в прямоугольник без изменений кода для круга:

<svg width="200" height="200" viewBox="0 0 200 200">
	<circle cx="25" cy="25" r="25" style="stroke: black; fill: none;" />
	<rect x="100" y="5" width="30" height="80" style="stroke: blue; fill: none;" />
	<svg x="100px" y="5px" width="30px" height="80px" viewBox="0 0 50 50" preserveAspectRatio="xMaxYMax meet">
		<circle cx="25" cy="25" r="25" style="stroke: black; fill: none;"/>
	</svg>
</svg>

Куда дальше