При рисовании фигуры мы не ограничены пространством. Считайте, что у нас есть бесконечный холст и мы можем нарисовать круг в любом месте. Но наш монитор имеет ограниченный размер, поэтому фигура должна "попасть" в видимый прямоугольник. Считайте viewBox (регистр важен) таким ограничивающим прямоугольником. Например, зададим ограничивающую область 200 на 100 единиц с началом координат (0, 0), которая находится в верхней левой точке. Единицы измерения и начало координат являются условными понятиями, чтобы было от чего отталкиваться.
<svg viewBox="0 0 200 100">
Для демонстрации примера нарисуем круг в некоторой позиции. Для удобства изменим фон области.
.box {
width: 50%;
display: block;
background: hsl(230, 90%, 80%);
}
<svg viewBox="0 0 200 100" class="box">
<circle r="50"></circle>
</svg>
Для экономии места в примере не используются пространства имён, браузер Chrome справляется с этим.
Мы задали фигуру Круг с радиусом 50 единиц, но не указали координаты. В результате центр круга разместился в точке (0, 0), а мы увидели только часть круга в области viewBox, хотя где-то в памяти компьютера был нарисован честный круг.
Если мы уменьшим размер viewBox в два раза с 200х100 на 100х50, то увидим, что круг увелится.
<svg viewBox="0 0 100 50" class="box">
<circle r="50"></circle>
</svg>
Общий размер контейнера останется прежним, так как мы задали размеры в процентах у CSS. Тут главное понять, что viewBox работает в своём измерении. Не изменяя размеры круга, мы увидели, что круг увеличился. По сути, viewBox работает как масштабирование объекта.
Части фигуры, которые выходят за пределы viewBox, обрезаются и мы их не видим.
Впрочем мы может задать координаты кругу. Попробуем.
<svg viewBox="0 0 100 50" class="box">
<circle cx="118" cy="56" r="20" fill="red" />
</svg>
Если приглядеться, то в правом нижнем углу можно увидеть фрагмент красного круга. Очевидно, что мы не слишком удачно выбрали координаты. Исправимся. Заодно увеличим масштаб.
<svg viewBox="0 0 200 120" class="box">
<circle cx="150" cy="120" r="20" fill="red" />
</svg>
Уже лучше. Похоже на восход или закат солнца.
Напомню ещё раз, что в действительно круг рисуется полностью и вы можете использовать его в анимациях, чтобы увидеть его полный размер. Более того, можно показать и этот круг видимым, через CSS, используя overflow:visible.
<svg viewBox="0 0 200 120" style="overflow:visible" class="box">
<circle cx="150" cy="120" r="20" fill="red" />
</svg>
Также можно использовать отрицательные значения. Допустим, есть такой вариант со стандартной точкой отсчёта (0, 0).
<svg viewBox="0 0 500 100" class="box">
<circle cx="50" cy="0" r="50" fill="red" />
</svg>
Не будем менять координаты круга, а изменим координаты у viewBox.
<svg viewBox="-10 -50 500 100" class="box">
<circle cx="50" cy="0" r="50" fill="red" />
</svg>
При этом нужно помнить, что сама точка отсчёта у SVG не меняется и круг без указания координат будет рисоваться в точке (0, 0).
Вернуться в раздел SVG