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