Ðазовое иÑполÑзование Canvas
ÐавайÑе наÑнÑм ÑÑÐ¾Ñ ÑÑок Ñ Ð¸Ð·ÑÑÐµÐ½Ð¸Ñ ÑлеменÑа <canvas> как Ñакового. РконÑе ÑÑой ÑÑÑаниÑÑ Ð²Ñ ÑзнаеÑе как ÑÑÑанавливаÑÑ canvas 2D context и наÑиÑÑеÑе пеÑвÑй пÑÐ¸Ð¼ÐµÑ Ð² ваÑем бÑаÑзеÑе.
ÐÐ»ÐµÐ¼ÐµÐ½Ñ <canvas>
<canvas id="tutorial" width="150" height="150"></canvas>
Ðн вÑглÑÐ´Ð¸Ñ ÐºÐ°Ðº ÑÐ»ÐµÐ¼ÐµÐ½Ñ <img>, но его оÑлиÑие в Ñом, ÑÑо он не Ð¸Ð¼ÐµÐµÑ Ð°ÑÑибÑÑов src и alt. ÐÐ»ÐµÐ¼ÐµÐ½Ñ <canvas> Ð¸Ð¼ÐµÐµÑ ÑолÑко два аÑÑибÑÑа - ÑиÑÐ¸Ð½Ñ Ð¸ вÑÑоÑÑ. Ðба они не обÑзаÑелÑÐ½Ñ Ð¸ могÑÑ Ð±ÑÑÑ Ð²ÑÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ñ Ð¸ÑполÑзованием ÑвойÑÑв DOM. ÐÑли аÑÑибÑÑÑ Ð²ÑÑоÑÑ Ð¸ ÑиÑÐ¸Ð½Ñ Ð½Ðµ ÑÑÑановленÑ, canvas бÑÐ´ÐµÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ ÑиÑиной 300 пикÑелей и в вÑÑоÑÑ 150 пикÑелей. ÐÑ Ñак же можеÑе вÑÑÑавиÑÑ ÑазмеÑÑ Ð¿ÑоизволÑно в CSS, но во вÑÐµÐ¼Ñ ÑендеÑинга изобÑажение бÑÐ´ÐµÑ Ð¼Ð°ÑÑÑабиÑоваÑÑÑÑ Ð² ÑооÑвеÑÑÑвии Ñ ÐµÐ³Ð¾ ÑазмеÑом и оÑиенÑаÑией.
ÐÑимеÑание: ÐÑли вид ваÑего изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÐºÐ°Ð¶ÐµÑÑÑ Ð²Ð°Ð¼ иÑкажÑннÑм, попÑобÑйÑе ÑказаÑÑ Ð°ÑÑибÑÑÑ ÑиÑÐ¸Ð½Ñ Ð¸ вÑÑоÑÑ Ð² Ñвном виде в аÑÑибÑÑÐ°Ñ <canvas> , а не Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ CSS.
ÐÑÑибÑÑ id не ÑпеÑиÑиÑен Ð´Ð»Ñ ÑлеменÑа <canvas>, но он Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑименÑн по ÑмолÑÐ°Ð½Ð¸Ñ Ð² аÑÑибÑÑаÑ
HTML, Ñак как он Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзован (поÑÑи) Ð´Ð»Ñ Ð»Ñбого ÑлеменÑа HTML (Ñак же как клаÑÑ). ÐÑо вÑегда оÑлиÑÐ½Ð°Ñ Ð¸Ð´ÐµÑ Ð¸ÑполÑзоваÑÑ id, Ñак как ÑÑо позволÑÐµÑ Ð½Ð°Ð¼Ð½Ð¾Ð³Ð¾ пÑоÑе иденÑиÑиÑиÑоваÑÑ Ð½Ð°Ñ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² ÑÑенаÑии.
ÐÐ»ÐµÐ¼ÐµÐ½Ñ <canvas> Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑилизован Ñакже, как лÑбое изобÑажение (margin, border, background, и Ñ. д.). ÐÑи пÑавила, как Ð±Ñ Ñо ни бÑло, ÑакÑиÑеÑки не влиÑÑÑ Ð½Ð° оÑÑиÑÐ¾Ð²ÐºÑ Ð² canvas. ÐÑ Ñвидим как ÑÑо Ñделано позже в ÑÑом ÑÑководÑÑве. Ðогда ÑÑили не ÑказанÑ, canvas бÑÐ´ÐµÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð°Ð±ÑолÑÑно пÑозÑаÑнÑм.
ÐапаÑное ÑодеÑжимое
Ðз-за Ñого, ÑÑо ÑÑаÑÑе бÑаÑзеÑÑ (в оÑобенноÑÑи, веÑÑии Internet Explorer Ñаннее Ñем 9) не поддеÑживаÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ <canvas>, вам ÑледÑÐµÑ Ð¿ÑедоÑÑавиÑÑ Ð·Ð°Ð¿Ð°Ñное ÑодеÑжимое Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑÑими бÑаÑзеÑами.
ÐÑо оÑÐµÐ½Ñ Ð¿ÑоÑÑо: Ð¼Ñ Ð²Ñего лиÑÑ Ð¿ÑедоÑÑавлÑем алÑÑеÑнаÑивное ÑодеÑжимое внÑÑÑи ÑлеменÑа <canvas>. ÐÑаÑзеÑÑ, коÑоÑÑе не поддеÑживаÑÑ <canvas> пÑоигноÑиÑÑÑÑ container и оÑобÑазÑÑ Ð·Ð°Ð¿Ð°Ñное ÑодеÑжимое ÑÑого Ñега. ÐÑаÑзеÑÑ, коÑоÑÑе поддеÑживаÑÑ <canvas> пÑоигноÑиÑÑÑÑ Ð·Ð°Ð¿Ð°Ñное ÑодеÑжимое, и пÑоÑÑо ноÑмалÑно оÑобÑазÑÑ canvas.
ÐапÑимеÑ, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ пÑедоÑÑавиÑÑ ÑекÑÑовое опиÑание ÑодеÑжимого canvas или пÑедоÑÑавиÑÑ ÑÑаÑиÑное изобÑажение динамиÑеÑки оÑобÑажаемого ÑодеÑжимого. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð²ÑглÑдеÑÑ ÐºÐ°Ðº-Ñо Ñак:
<canvas id="stockGraph" width="150" height="150">
current stock price: $3.15 +0.15
</canvas>
<canvas id="clock" width="150" height="150">
<img src="images/clock.png" width="150" height="150" alt="" />
</canvas>
СообÑаÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¾ Ñом, ÑÑо его бÑаÑÐ·ÐµÑ Ð½Ðµ поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ canvas не Ð¿Ð¾Ð¼Ð¾Ð¶ÐµÑ Ñем, кÑо не Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоÑеÑÑÑ ÑодеÑжимое Ñега canvas, к пÑимеÑÑ. ÐÑедоÑÑавление полезной инÑоÑмаÑии в дополниÑелÑном canvas Ð´ÐµÐ»Ð°ÐµÑ ÑÑÐ¾Ñ Ñег более доÑÑÑпнÑм Ð´Ð»Ñ ÑиÑокого иÑполÑзованиÑ.
ТÑебÑеÑÑÑ Ñег </canvas>
РоÑлиÑии Ð¾Ñ ÑлеменÑа <img>, ÑÐ»ÐµÐ¼ÐµÐ½Ñ <canvas> ÑÑебÑÐµÑ Ð·Ð°ÐºÑÑваÑÑийÑÑ Ñег (</canvas>). ÐÑли ÑÑÐ¾Ñ Ñег не пÑедоÑÑавлен, оÑÑаÑок докÑменÑа бÑÐ´ÐµÑ ÑÑиÑаÑÑÑÑ Ð·Ð°Ð¿Ð°ÑнÑм конÑенÑом и не бÑÐ´ÐµÑ Ð¾ÑобÑажÑн.
ÐÑли запаÑной конÑÐµÐ½Ñ Ð½Ðµ нÑжен, пÑоÑÑой <canvas id="foo" ...></canvas> полноÑÑÑÑ ÑовмеÑÑим Ñо вÑеми бÑаÑзеÑами, ÑÑо поддеÑживаÑÑ canvas.
РендеÑинг ÑодеÑжимого (конÑекÑÑа)
ÐÐ»ÐµÐ¼ÐµÐ½Ñ <canvas> в докÑменÑе ÑоздаÑÑÑÑ Ñ ÑикÑиÑованнÑм ÑазмеÑом ÑлеменÑа Ð´Ð»Ñ ÑиÑованиÑ, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ð¾Ð´Ð¸Ð½ или неÑколÑко конÑекÑÑов Ð´Ð»Ñ ÑендеÑинга, ÑÐ¾Ð·Ð´Ð°Ð²Ð°Ñ Ð¸ манипÑлиÑÑÑ ÑодеÑжимÑм Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°. Рданном ÑÑководÑÑве Ð¼Ñ ÑÑокÑÑиÑÑемÑÑ Ð½Ð° 2D ÑендеÑинге. ÐÑÑгие конÑекÑÑÑ Ð¼Ð¾Ð³ÑÑ Ð¿ÑедоÑÑавлÑÑÑ ÑазнÑе ÑÐ¸Ð¿Ñ ÑендеÑинга, к пÑимеÑÑ WebGl иÑполÑзÑÐµÑ 3D конÑекÑÑ Ð¾ÑнованнÑй на OpenGL ES.
ХолÑÑ Ð¸Ð·Ð½Ð°ÑалÑно пÑÑÑой и пÑозÑаÑнÑй. ÐеÑвÑм делом ÑкÑÐ¸Ð¿Ñ Ð¿Ð¾Ð»ÑÑÐ°ÐµÑ Ð´Ð¾ÑÑÑп к конÑекÑÑÑ Ð¸ оÑÑиÑовÑÐ²Ð°ÐµÑ ÐµÐ³Ð¾. ÐÐ»ÐµÐ¼ÐµÐ½Ñ <canvas> Ð¸Ð¼ÐµÐµÑ Ð¼ÐµÑод getContext(), иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑекÑÑа визÑализаÑии и ÐµÑ ÑÑнкÑии ÑиÑованиÑ. getContext() пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¾Ð´Ð¸Ð½ паÑамеÑÑ, Ñип конÑекÑÑа. ÐÐ»Ñ 2D гÑаÑики, коÑоÑÐ°Ñ Ð¾Ñ
ваÑена ÑÑим ÑÑководÑÑвом бÑдем иÑполÑзоваÑÑ Ð¼ÐµÑÐºÑ "2d".
const canvas = document.getElementById("tutorial");
const ctx = canvas.getContext("2d");
РпеÑвой ÑÑÑоке ÑкÑипÑа Ð¼Ñ Ð¿Ð¾Ð»ÑÑаем Ñзел наÑего Ñ
олÑÑа <canvas>, далее Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ document.getContext() меÑода Ð¼Ñ Ð¿ÑиÑваиваем ÐµÐ¼Ñ ÐºÐ¾Ð½ÑекÑÑ. ÐÐ¼ÐµÑ Ñзел ÑлеменÑа , Ð²Ñ Ð²Ñегда можеÑе полÑÑиÑÑ Ð´Ð»Ñ ÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½ÑекÑÑ Ð¿Ñи помоÑи меÑода getContext().
ÐÑовеÑка поддеÑжки
Ранее Ñже ÑпоминалоÑÑ, ÑÑо в бÑаÑзеÑаÑ
, коÑоÑÑе не поддеÑживаÑÑ <canvas> оÑобÑажаеÑÑÑ Ð·Ð°Ð¿Ð°Ñное ÑодеÑжимое. Ðо помимо ÑÑого, опÑеделиÑÑ, поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð»Ð¸ бÑаÑÐ·ÐµÑ canvas, можно пÑÑмо из кода, пÑовеÑив налиÑие меÑода getContext(). Ðод Ñ Ð·Ð°Ð¿Ð°ÑнÑм ÑодеÑжимÑм, коÑоÑÑй Ð¼Ñ Ð¿Ñиводили ÐÑÑе, ÑÑановиÑÑÑ ÑледÑÑÑим:
const canvas = document.getElementById("tutorial");
if (canvas.getContext) {
const ctx = canvas.getContext("2d");
// drawing code here
} else {
// canvas-unsupported code here
}
Ð¡ÐºÐµÐ»ÐµÑ Ñаблона
ÐдеÑÑ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑнÑй Ñаблон, коÑоÑÑй Ð¼Ñ Ð±Ñдем иÑполÑзоваÑÑ ÐºÐ°Ðº наÑалÑнÑÑ ÑоÑÐºÑ Ð´Ð»Ñ Ð´Ð°Ð»ÑнейÑÐ¸Ñ Ð¿ÑимеÑов.
ÐÑимеÑание: BÑÑавка ÑкÑипÑа внÑÑÑÑ HTML не ÑвлÑеÑÑÑ Ñ Ð¾ÑоÑей пÑакÑикой. ÐÑ Ð´ÐµÐ»Ð°ÐµÐ¼ ÑÑо здеÑÑ, ÑÑÐ¾Ð±Ñ ÑделаÑÑ Ð¿ÑÐ¸Ð¼ÐµÑ ÐºÐ¾ÑоÑе.
<!doctype html>
<html>
<head>
<title>Canvas tutorial</title>
<script type="text/javascript">
function draw() {
const canvas = document.getElementById("tutorial");
if (canvas.getContext) {
const ctx = canvas.getContext("2d");
}
}
</script>
<style type="text/css">
canvas {
border: 1px solid black;
}
</style>
</head>
<body onload="draw();">
<canvas id="tutorial" width="150" height="150"></canvas>
</body>
</html>
СкÑÐ¸Ð¿Ñ Ð²ÑзÑÐ²Ð°ÐµÑ ÑÑнкÑÐ¸Ñ draw(), коÑоÑÐ°Ñ Ð²ÑполниÑÑÑ, когда ÑÑÑаниÑа законÑÐ¸Ñ Ð·Ð°Ð³ÑÑзкÑ. ÐÑо делаеÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑобÑÑÐ¸Ñ load в докÑменÑе. ÐÑа ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñзвана как единождÑ, Ñак и Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð´Ð°Ð½Ð½ÑÑ
меÑодов window.setTimeout(), window.setInterval(), или лÑбÑм дÑÑгим обÑабоÑÑиком ÑобÑÑиÑ, когда ÑÑÑаниÑа бÑÐ´ÐµÑ Ð·Ð°Ð³ÑÑжена.
ÐÐ¾Ñ ÐºÐ°Ðº Ñаблон бÑÐ´ÐµÑ Ð²ÑглÑдеÑÑ Ð² дейÑÑвии.
ÐÑоÑÑой пÑимеÑ
ÐÐ»Ñ Ð½Ð°Ñала, давайÑе поÑмоÑÑим на пÑоÑÑой пÑимеÑ, коÑоÑÑй ÑиÑÑÐµÑ Ð´Ð²Ð° пеÑеÑекаÑÑÐ¸Ñ ÑÑ Ð¿ÑÑмоÑголÑника, один из коÑоÑÑÑ Ð¸Ð¼ÐµÐµÑ Ð¿ÑозÑаÑноÑÑÑ alpha. ÐÑ Ð¸Ð·ÑÑим, как ÑÑо ÑабоÑÐ°ÐµÑ Ð±Ð¾Ð»ÐµÐµ деÑалÑно в поÑледÑÑÑÐ¸Ñ Ð¿ÑимеÑÐ°Ñ .
<!doctype html>
<html>
<head>
<script type="application/javascript">
function draw() {
const canvas = document.getElementById("canvas");
if (canvas.getContext) {
const ctx = canvas.getContext("2d");
ctx.fillStyle = "rgb(200,0,0)";
ctx.fillRect(10, 10, 55, 50);
ctx.fillStyle = "rgba(0, 0, 200, 0.5)";
ctx.fillRect(30, 30, 55, 50);
}
}
</script>
</head>
<body onload="draw();">
<canvas id="canvas" width="150" height="150"></canvas>
</body>
</html>
ÐÑÐ¾Ñ Ð¿ÑÐ¸Ð¼ÐµÑ Ð²ÑглÑÐ´Ð¸Ñ Ñак: