Canvas
Настройка
В html-документе. Это блочный контейнер, он поддаётся блочной стилизации (по ум* размер 300х150).
Помещаем в нужный нам контейнер в html-документе
<canvas id="myCanvas" width="160" height="90">Текст при незагрузке</canvas>
#myCanvas {...}
const canvas = document.getElementById('myCanvas');
// Контекст отрисовки (2d или 3d)
const ctx = canvas.getContext('2d');
// Дальше можно приступать к рисованию
Фигуры
ctx.fillRect - Прямоугольник с заливкой
- 10, 10 - координаты верх. лев. угла (x, y)
- 310 - ширина, 170 - высота (в пикселях)
ctx.fillStyle = 'rgba(0, 0, 0, 0.7)'; // Цвет заливки
ctx.fillRect(10, 10, 310, 170);
ctx.strokeRect - Прямоугольник без заливки
- 75, 0 - координаты верх. лев. угла (x, y)
- 150 - ширина, 150 - высота (в пикселях)
ctx.strokeStyle = 'blue';// Цвет обводки
ctx.strokeRect(75, 0, 150, 150);
ctx.clearRect - Очистка холста
Указываются нулевые координаты и ширина и высота всего холста
ctx.clearRect(0, 0, 300, 150);
Path - Сложные фигуры (Контуры)
ctx.beginPath(); // Начало контура
ctx.moveTo(x, y); // Перенести перо
// Рисовать от точки перемещения до указанной
ctx.lineTo(x, y);
// Перемещать по нелинейной функции Безье (x,y в конце)
ctx.bezierCurveTo(140, 90, 110, 90, 100, 100); ctx.closePath(); // Конец контура
Градиент
// линейный
const gradient = ctx.createLinearGradient(0, 0, 300, 150);
// Колорстопы
gradient.addColorStop(0, 'green');
gradient.addColorStop(1, 'rgba(0, 255, 0, 0)');
ctx.fillStyle = gradient;
ctx.fillRect(0, 0, 300, 150);
// радиальный
const gradient = ctx.createRadialGradient(150, 72, 0, 150, 72, 72);
// Колорстопы
gradient.addColorStop(0, 'green');
gradient.addColorStop(1, 'rgba(0, 255, 0, 0)');
ctx.fillStyle = gradient;
ctx.fillRect(0, 0, 300, 150);
Текст
// Цвет текста
ctx.fillStyle = '#000';
// Шрифт текста
ctx.font = 'Normal 30pt Arial';
// Координаты лев. нижней точки строки
ctx.fillText('Some text', 20, 50);
// Можно поменять привязку на лев. верх.
ctx.textBaseline = 'hanging';
Примеры
// DOM-элемент канваса
const canvas = document.querySelector('canvas');
// Контекст отрисовки
const ctx = canvas.getContext('2d');
// рисуем 1 прямоугольник
(лев. верх. угол, ширина, высота) - по ум. заливка чёрная
ctx.fillRect(0,0, 100, 100);
// заливка 2 прямоугольника - переопределение заливки
ctx.fillStyle = 'blue';
// рисуем 2 прямоугольник с новой заливкой
ctx.fillRect(200,0, 200, 200);
// создаём ЛИНЕЙНЫЙ ГРАДИЕНТ
(координаты точек из какой в какую он перетекает)
const gradient1 = ctx.createLinearGradient(550,0, 850,0);
gradient1.addColorStop(0.00, 'red');
gradient1.addColorStop(0.25, 'orange');
gradient1.addColorStop(0.50, 'yellow');
gradient1.addColorStop(0.75, 'green');
gradient1.addColorStop(1.00, 'blue');
// заливаем градиентом
ctx.fillStyle = gradient1;
// создаём прямоугольник с градиентом
ctx.fillRect(550,0, 300, 300);
// создаём РАДИАЛЬНЫЙ ГРАДИЕНТ
(координаты центра первой окр(x,y,R) и второй)
const gradient2 = ctx.createRadialGradient(150,400,0, 150,400,50);
gradient2.addColorStop(0, 'red');
gradient2.addColorStop(1, 'orange');
// заливаем градиентом
ctx.fillStyle = gradient2;
// рисуем квадрат залитый рад. град.
ctx.fillRect(100,350, 100, 100);
// РАМКИ
// цвет рамки
ctx.strokeStyle = 'red';
// рисуем рамку
ctx.strokeRect(90,340, 120, 120);
// ОЧИСКА хоста (дырка на чёрном квадрате)
ctx.clearRect(0, 0, 15, 15);
// ФИГУРЫ
ctx.beginPath();
// ставим перо
ctx.moveTo(100, 100);
// хочу передвинуть перо на эти точки
ctx.lineTo(80, 60);
ctx.lineTo(110, 80);
ctx.lineTo(125, 40);
ctx.lineTo(140, 80);
ctx.lineTo(170, 60);
ctx.lineTo(150, 100);
ctx.lineTo(150, 100);
ctx.bezierCurveTo(140, 90, 110, 90, 100, 100);
ctx.stroke();
// ТЕКСТ
// кегль + гарнитура
ctx.font = '30px Consolas';
// чтобы не вылазил
ctx.textBaseline = 'hanging';
ctx.fillText('Привет!', 0, 120);
ctx.fillText('Как дела?', 0, 148);
// ТЕПЛОВЫЕ КАРТЫ
/**
* Переменные, названные заглавными буквами, по соглашению, считаются
* постоянными.
* @constant {number}
*/
// размеры canvas
const TILE_SIZE = 256;
/** @constant {number} */
const DIAMOND_SIZE = 16;
/**
* Функция getMapTile будет использоваться
* для отрисовки прямоугольников поверх карты
* @return {HTMLCanvasElement}
**/
const getMapTile = function() {
// Каждый канвас будет замощен ромбами,
// непрозрачность заливки которых будет означать
// количество ресторанов под указанным ромбом.
// Для простоты непрозрачность будем получать,
// генерируя случайное число.
// тег canvas сохраняем в пер.
const canvasElement = document.createElement('canvas');
// добавляем атрибуты
canvasElement.setAttribute('width', TILE_SIZE);
canvasElement.setAttribute('height', TILE_SIZE);
// контекст
const ctx = canvasElement.getContext('2d');
const x;
const y = -DIAMOND_SIZE / 2;
const row = 1;
while (y < TILE_SIZE) {
x = row % 2 === 0 ? -DIAMOND_SIZE / 2 : 0;
while (x < TILE_SIZE) {
drawDiamond(ctx, DIAMOND_SIZE, x, y);
x += DIAMOND_SIZE;
}
y += DIAMOND_SIZE / 2;
row++;
}
// добавляем canvas на страницу
return canvasElement;
};
/**
* Рисует ромб, вписанный в прямоугольник
* с заданными координатами
* @param {CanvasRenderingContext2D} ctx
* @param {number} size
* @param {number} x
* @param {number} y
*/
const drawDiamond = function(ctx, size, x, y) {
ctx.beginPath();
ctx.moveTo(x + size / 2, y);
ctx.lineTo(x + size, y + size / 2);
ctx.lineTo(x + size / 2, y + size);
ctx.lineTo(x, y + size / 2);
ctx.lineTo(x + size / 2, y);
ctx.fillStyle = getRandomColor();
ctx.fill();
};
/** @return {string} */
const getRandomColor = function() {
return 'rgba(30, 128, 30, ' + (Math.random() * 0.6).toFixed(1) + ')';
};
document.body.appendChild(getMapTile());
// Замощение квадратами
function draw() {
for (const i=0;i<6;i++){
for (const j=0;j<6;j++){
ctx.fillStyle = 'rgb(' + Math.floor(255-42.5*i) + ',' + Math.floor(255-42.5*j) + ',0)';
ctx.fillRect((j*25) + 300, (i*25) + 300,25,25);
}
}
}
draw();