Размещение
внутри

Я размещаю div внутри элемента холста, как показано ниже:

<canvas>
    <div></div>
</canvas>

Здесь у них обоих есть высота и ширина. Но здесь я не вижу div!

Разве нельзя использовать div или p на canvas?

Свободный перевод вопроса Placing a div within a canvas от участника @thecodeparadox.


Ответы (3 шт):

Автор решения: Alexandr_TT

Вы не можете размещать элементы внутри canvas (и отображать оба элемента); они отображаются только в том случае, если браузер не понимает элемент canvas.

Если вы хотите расположить элементы в той же области, что и canvas, вот один из множества способов, который позволит вам это сделать:

HTML

<div id="canvas-wrap">
  <canvas width="800" height="600"></canvas>
  <div id="overlay"></div>
</div>

CSS

#canvas-wrap { position:relative } /* Сделайте это позиционированным родителем */
#overlay     { position:absolute; top:20px; left:30px; } 

Вот еще один метод, который позволяет содержимому div нормально перемещаться и делает canvas фоном для содержимого:

CSS

#canvas-wrap { position:relative; width:800px; height:600px }
#canvas-wrap canvas { position:absolute; top:0; left:0; z-index:0 }

Свободный перевод ответа от участника @Phrogz.

→ Ссылка
Автор решения: Leonid

Содержимое между открывающим и закрывающим тегами <canvas> будет проигнорировано браузером, если поддерживается Canvas API. В противном случае тег будет распознан, как пользовательский (теперь уже невалидный пользовательский, т.к. не содержит -) со стилями и поведением inline элемента (по умолчанию).

<canva><div>Ваш браузер не поддерживает тег <i>canvas</i>.<br> Установите современный браузер и наслаждайтесь крутыми фишками.<br> <a href="https://www.google.com/chrome/">Скачать правильный браузер!</a></div></canva>
<canvas><div>Canvas игнорирует "содержимое"</div></canvas>

→ Ссылка
Автор решения: Alexandr_TT

Вот еще один метод, который позволяет содержимому div нормально перемещаться и делает canvas фоном для содержимого:

CSS

> #canvas-wrap { position:relative; width:800px; height:600px }
> #canvas-wrap canvas { position:absolute; top:0; left:0; z-index:0 }

Попробовал этот вариант реализовать, когда canvas находится внутри div

<div id="canvas-wrap">
  <canvas id="myCanvas" width="300" height="350"></canvas>
  <div id="overlay"></div>
</div>

var canvas = document.getElementById("myCanvas");
var context = canvas.getContext("2d");
var img1 = new Image();
img1.src = "https://i.stack.imgur.com/FPcfs.jpg";
img1.onload = drawImages;

function drawImages() {
 context.drawImage(img1, 20, 20, 300, 350);
}
#canvas-wrap { position:relative; width:400px; height:400px;border:1px solid; }
#canvas-wrap canvas { position:absolute; top:0; left:0; }
#overlay {
position:relative;
margin:2em;
width:50px;
height:50px;
border-radius:50%;
background:gold;
}
<div id="canvas-wrap">
  <canvas id="myCanvas" width="300" height="350"></canvas>
  <div id="overlay"></div>
</div>

→ Ссылка