SVG-фигуры и трансформации

← Начало про SVG

Писать SVG довольно просто. Используются фигуры: rect, polygon, circle, ellipse, а также line, polyline и path. Задаем выбранную фигуру, определяем её размеры и координаты, затем добавляем фон и обводку.

Следует отметить, что писать код руками совершенно не обязательно: с этим гораздо лучше справятся векторные редакторы, например, мощный, но платный Adobe Illustrator, бесплатный, но не такой удобный Inkscape, немного платный, но довольно симпатичный Sketch. Но имеет смысл хотя бы попробовать, потому что это а) интересно, б) полезно: навыки могут пригодиться, если надо нарисовать что-то простое, подправить код в отсутствие векторного редактора или вы хотите взаимодействовать с SVG через JavaScript.

Размеры и координаты задаются для разных фигур по-разному, а вот фон и обводка — одинаковы для всех:

fill — заливка. Можно задать цвет любым способом. Прозрачность — none или transparent. Цвет по умолчанию — черный; stroke — цвет обводки; stroke-width — толщина обводки, по умолчанию — 1. Без stroke не работает.

Больше параметров можно найти в спецификации w3.org/TR/SVG/painting.html#StrokeProperties.

Ниже можно увидеть примеры простых SVG-фигур и трансформации, которые к ним можно применить.

Rect

<svg width="230" height="140">
    <rect x="5" y="5" width="220" height="130"
          fill="skyblue" stroke="steelblue" stroke-width="5" />
</svg>

x,y — координаты левого верхнего угла фигуры; width, height — ширина и высота прямоугольника.

Закругленные уголки задаются параметрами rx и ry. Если задан только один из параметров, скругление по вертикали и по горизонтали будет одинаковым:

<svg width="230" height="140">
    <rect x="5" y="5" width="220" height="130" rx="20"
          fill="yellowgreen" stroke="green" stroke-width="5" />
</svg>

Если заданы оба параметра (и они таки разные), радиус скругления будет разным:

<svg width="230" height="140">
    <rect x="5" y="5" width="220" height="130" rx="10" ry="50"
          fill="khaki" stroke="darkkhaki" stroke-width="5" />
</svg>

Polygon

<svg width="230" height="140">
    <polygon points="5,135 115,5 225,135"
             fill="violet" stroke="purple" stroke-width="5" />
</svg>
<svg width="140" height="130">
    <polygon points="70,5 90,41 136,48 103,80 111,126 70,105 29,126 36,80 5,48 48,41"
             fill="turquoise" stroke="lightseagreen" stroke-width="5" />
</svg>
  

В points задаются x,y-координаты вершин фигуры, через пробел.

polygon замыкается сам по себе, последнюю точку можно не указывать.

Circle

<svg width="140" height="140">
     <circle r="65" cx="70" cy="70"
             fill="orangered" stroke="crimson" stroke-width="5" />
</svg>

r — радиус круга; cx, cy — координаты центра круга.

<svg width="230" height="140">
     <ellipse rx="110" ry="60" cx="115" cy="70"
              fill="gold" stroke="orange" stroke-width="5" />
</svg>

rx, ry — горизонтальный и вертикальный радиусы эллипса; cx, cy — координаты центра эллипса.

Более сложные фигуры можно сделать из сочетания простых:

При этом стиль фигур можно задать один раз для всей группы, а не отдельно для каждой фигуры:

<svg width="250" height="210" style="border: 1px solid">
    <g fill="#333">
      <ellipse rx="45" ry="37" cx="55" cy="60" transform="rotate(-45, 55, 55)"/>
      <ellipse rx="45" ry="37" cx="190" cy="60" transform="rotate(45, 190, 55)"/>
      <circle r="67" cx="122" cy="125"/>
     </g>
</svg>

Также можно рисовать простыми линиями.

Line

<svg width="230" height="140">
    <line x1="220" y1="10" x2="20" y2="130" stroke="violet" stroke-width="5" />
</svg>

x1, y1, x2, y2 — координаты начала и конца линии.

Polyline

<svg width="260" height="140">
    <polyline points="5,135 30,5 55,135 80,5, 105,135 130,5, 155,135 180,5, 205,135 230,5, 255,135"
              fill="none" stroke="orangered" stroke-width="5" />
</svg>

В points задаются x,y-координаты точек, каждая точка через пробел.

Для более сложных линий и фигур существует тег path, но эту тему стоит рассмотреть отдельно.

Transform

SVG-фигуры можно видоизменять с помощью свойства transform.

Возможные значения: translate, scale, rotate, skewX, skewY, matrix.

Пример:

<svg width="230" height="140">
     <ellipse rx="110" ry="30" cx="115" cy="70"
              fill="gold" stroke="orange" stroke-width="5"
              transform="rotate(-23 115 70)"/> <!-- Трансформация -->
</svg>

Можно задавать несколько трансформаций через запятую или через пробел.

translate(tx [ty])

Если второй параметр не задан, он равен 0.

translate(100)
translate(70, 70)
scale(sx [sy])

Если второй параметр не задан, он равен первому.

scale(1.5)
scale(1.5, .5)
rotate(rotate-angle [cx cy])

Если координаты центра поворота не заданы, они равны 0 0 — это левый верхний угол SVG-изображения.

rotate(45)
rotate(45 100 100)
skewX(skew-angle), skewY(skew-angle)
skewX(5)
skewY(5)
matrix(a b c d e f)
matrix(.3 0 0 .95 55 25)
Ссылки по теме:
Basic Shapes
The ‘transform’ attribute
Browsers support for SVG
Adobe Illustrator
Sketch
Inkscape
Если вы нашли ошибку или неточность, вы можете отредактировать статью с помощью prose.io, а также можно написать мне в комментариях или в Twitter.
Система комментирования от Disqus