Эта книга не углубляется детально в SVG, но кратко я поясню её работу. В конце главы я вернусь к сравнительным недостаткам методов, которые нужно принять во внимание, выбирая механизм рисования для конкретного применения.
Вот документ HTML, содержащий простую SVG-картинку:
Normal HTML here.
stroke="blue" fill="none"/>
Атрибут xmlns
меняет пространство имён элемента по умолчанию. Это пространство задаётся через URL и обозначает диалект, на котором мы сейчас говорим. Тэги и , не существующие в HTML, имеют смысл в SVG – они рисуют формы, используя стиль и позицию, заданные их атрибутами.
Они создают элементы DOM так же, как теги HTML. К примеру, такой код меняет цвет элемента на cyan
:
var circle = document.querySelector(«circle»);
circle.setAttribute(«fill», «cyan»);
Графику холста можно рисовать на элементе . Ему можно задать ширину и высоту, таким образом определяя его размер в пикселях.
Новый холст пуст, то есть он полностью прозрачен и показывает нам пустое пространство документа.
Тэг поддерживает разные стили рисования. Чтобы получить доступ к интерфейсу рисования, сначала нужно создать context
– объект, чьи методы предоставляют этот интерфейс. Сейчас есть два широко распространённых стиля рисования: “2d”
для двумерной графики и “webgl”
для трёхмерной графики при помощи интерфейса OpenGL.
WebGL мы обсуждать не будем, остановимся на двух измерениях. Если вам интересны три измерения, я советую вам окунуться в мир WebGL. Он предоставляет непосредственный доступ к современному графическому железу, поэтому с его помощью можно создавать довольно сложную и эффективную графику прямо из JavaScript.
Context создаётся методом getContext
элемента .
Before canvas.
After canvas.
var canvas = document.querySelector("canvas");
var context = canvas.getContext("2d");
context.fillStyle = "red";
context.fillRect(10, 10, 100, 50);
После создания объекта context
пример рисует прямоугольник шириной в 100 пикселей и высотой в 50, с координатами левого верхнего угла (10, 10).
Точно как в HTML (и SVG), используемая холстом система координат помещает точку (0, 0) в левый верхний угол, и положительная часть оси Y идёт оттуда вниз. То есть, точка (10,10) на 10 пикселей ниже и правее верхнего левого угла.
В интерфейсе холста форму можно залить, что означает, что занимаемая ею область будет закрашена нужным цветом или шаблоном, или же можно сделать stroke – обвести область линией по краю. Та же терминология используется в SVG.
Метод fillRect
заливает прямоугольник. Он принимает координаты левого верхнего угла x
, y
, затем ширину и высоту. Схожий метод strokeRect
рисует периметр прямоугольника.
Больше у методов параметров нет. Цвет заливки, толщина обводки и другие параметры определяются не аргументами метода (как можно было бы ожидать), а свойствами объекта context
.
Задав fillStyle
, вы меняете способ, которым заливаются формы. Его можно установить в строку, обозначающую цвет, и в любой цвет, который понимает CSS.
Свойство strokeStyle
работает так же, но определяет цвет, которым будет нарисована обводка. Толщина линии определяется свойством lineWidth
, которое может содержать любое положительное число.
var cx = document.querySelector("canvas").getContext("2d");
cx.strokeStyle = "blue";
cx.strokeRect(5, 5, 50, 50);
cx.lineWidth = 5;
cx.strokeRect(135, 5, 50, 50);
Когда не заданы атрибуты width
или height
, им назначаются значения по умолчанию – 300 для ширины и 150 для высоты.
Путь – последовательность линий. Двумерный холст имеет странный подход к описанию путей. Всё делается через побочные эффекты. Пути – не значения, которые можно хранить или передавать. Вместо этого, если вам что-то надо сделать с путём, вы создаёте последовательность вызовов метода для описания его формы.
var cx = document.querySelector("canvas").getContext("2d");
cx.beginPath();
for (var y = 10; y < 100; y += 10) {
cx.moveTo(10, y);
cx.lineTo(90, y);
}
cx.stroke();
Пример создаёт путь из нескольких горизонтальных отрезков, и затем обводит их методом stroke
. Каждый сегмент, созданный через lineTo
, начинается с текущей позиции пути. Эта позиция – обычно конец предыдущего сегмента, если только не было вызова moveTo
. В последнем случае следующий сегмент начнётся с позиции, заданной в moveTo
.
При заливке пути каждая из форм заливается отдельно. Путь может содержать несколько форм – каждое движение moveTo
начинает новую. Но путь должен быть закрытым (начало и конец находятся на одном месте), прежде чем его можно будет закрасить. Если путь не закрыт, от его конца до начала добавляется линия, и заливается форма, очерченная закрытым путём.
Читать дальше