我在div中有照片和画布。照片占据整个div,我想要绝对定位画布,以便能够隐藏照片的某些部分。
但我有一个问题,画布不占用整个宽度和高度(我使用的样式是position: absolute;left:0;right:0;top:0;bottom:0
)
我的代码如下:
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var rect = {};
var drag = false;
var buttons = false;
var angle = 10;
var rotate_angle = 0;
function init() {
// imageObj = new Image();
// imageObj.onload = function () { ctx.drawImage(imageObj, 0, 0); };
// imageObj.src = 'http://www.html5canvastutorials.com/demos/assets/darth-vader.jpg';
canvas.addEventListener('mousedown', mouseDown, false);
canvas.addEventListener('mouseup', mouseUp, false);
canvas.addEventListener('mousemove', mouseMove, false);
}
function mouseDown(e) {
rect.startX = e.pageX - this.offsetLeft;
rect.startY = e.pageY - this.offsetTop;
drag = true;
buttons = false;
document.getElementById('test').innerHTML = '';
}
function mouseUp() { drag = false; buttons = true; }
function onRemoveSelectionClick(e) {
ctx.clearRect(0, 0, 500, 500);
drag = false;
buttons = false;
document.getElementById('test').innerHTML = '';
}
function onRotateLeft(){
rotate_angle = rotate_angle - angle;
canvas.style.transform = 'rotate(' + rotate_angle + 'deg)';
}
function onRotateRight(){
rotate_angle = rotate_angle + angle;
canvas.style.transform = 'rotate(' + rotate_angle + 'deg)';
}
function mouseMove(e) {
if (drag) {
ctx.clearRect(0, 0, 500, 500);
// ctx.drawImage(imageObj, 0, 0);
rect.w = (e.pageX - this.offsetLeft) - rect.startX;
rect.h = (e.pageY - this.offsetTop) - rect.startY;
ctx.strokeStyle = 'black';
ctx.shadowColor = 'black';
// ctx.shadowBlur = 5;
ctx.fillRect(rect.startX, rect.startY, rect.w, rect.h);
ctx.strokeRect(rect.startX, rect.startY, rect.w, rect.h);
// ctx.filter = 'blur(5px)';
// ctx.filter = 'drop-shadow(16px 16px 20px blue) '
}else{
if(buttons){
if(document.getElementById('test').innerHTML === ''){
document.getElementById('test').innerHTML = '<button onclick="onRotateLeft()">Rotate Left</button>' +
'<button onclick="onRotateRight()">Rotate right</button><br />' +
'<button onclick="onRemoveSelectionClick()">Remove Selection</button>';
}
}
}
}
//
init();
<div style="position: relative; overflow: hidden;display:inline-block;">
<img src="http://www.html5canvastutorials.com/demos/assets/darth-vader.jpg" style="position: relative;"/>
<canvas id="canvas" style="position: absolute;left: 0; right: 0; top: 0; bottom: 0;background-color: yellow; display:inline-block;"></canvas>
</div>
<div id="test"></div>
如果我将width: 100%;height: 100%;
添加到画布,而不是整个宽度和高度,但矩形不会按原样绘制:
你可以在这里看到:
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var rect = {};
var drag = false;
var buttons = false;
var angle = 10;
var rotate_angle = 0;
function init() {
// imageObj = new Image();
// imageObj.onload = function () { ctx.drawImage(imageObj, 0, 0); };
// imageObj.src = 'http://www.html5canvastutorials.com/demos/assets/darth-vader.jpg';
canvas.addEventListener('mousedown', mouseDown, false);
canvas.addEventListener('mouseup', mouseUp, false);
canvas.addEventListener('mousemove', mouseMove, false);
}
function mouseDown(e) {
rect.startX = e.pageX - this.offsetLeft;
rect.startY = e.pageY - this.offsetTop;
drag = true;
buttons = false;
document.getElementById('test').innerHTML = '';
}
function mouseUp() { drag = false; buttons = true; }
function onRemoveSelectionClick(e) {
ctx.clearRect(0, 0, 500, 500);
drag = false;
buttons = false;
document.getElementById('test').innerHTML = '';
}
function onRotateLeft(){
rotate_angle = rotate_angle - angle;
canvas.style.transform = 'rotate(' + rotate_angle + 'deg)';
}
function onRotateRight(){
rotate_angle = rotate_angle + angle;
canvas.style.transform = 'rotate(' + rotate_angle + 'deg)';
}
function mouseMove(e) {
if (drag) {
ctx.clearRect(0, 0, 500, 500);
// ctx.drawImage(imageObj, 0, 0);
rect.w = (e.pageX - this.offsetLeft) - rect.startX;
rect.h = (e.pageY - this.offsetTop) - rect.startY;
ctx.strokeStyle = 'black';
ctx.shadowColor = 'black';
// ctx.shadowBlur = 5;
ctx.fillRect(rect.startX, rect.startY, rect.w, rect.h);
ctx.strokeRect(rect.startX, rect.startY, rect.w, rect.h);
// ctx.filter = 'blur(5px)';
// ctx.filter = 'drop-shadow(16px 16px 20px blue) '
}else{
if(buttons){
if(document.getElementById('test').innerHTML === ''){
document.getElementById('test').innerHTML = '<button onclick="onRotateLeft()">Rotate Left</button>' +
'<button onclick="onRotateRight()">Rotate right</button><br />' +
'<button onclick="onRemoveSelectionClick()">Remove Selection</button>';
}
}
}
}
//
init();
<div style="position: relative; overflow: hidden;display:inline-block;">
<img src="http://www.html5canvastutorials.com/demos/assets/darth-vader.jpg" style="position: relative;"/>
<canvas id="canvas" style="position: absolute;left: 0; right: 0; top: 0; bottom: 0;background-color: yellow; display:inline-block;width:100%;height: 100%;"></canvas>
</div>
<div id="test"></div>
Here is the fiddle for the second case.
知道怎么解决吗?
答案 0 :(得分:0)
我知道这不是一个理想的解决方案,但是如果你需要快速的东西并且图像的尺寸已知,那么现在可能没问题。您的图片为438x300,因此您可以为height: 100%; width: 100%
提供height
和width
属性,而不是指定canvas
的样式。
<canvas width=438 height=300></canvas>
如果我找到一个不依赖于事先知道图像尺寸的解决方案,我会更新答案。
答案 1 :(得分:0)
<canvas>
元素的高度和宽度完全独立于用于显示它的CSS。您尚未明确设置,因此画布默认为300px×150px。在CSS中使用height: 100%; width: 100%;
只会将300x150画布拉伸到更大的区域。您在画布中绘制的所有内容仍将使用300x150坐标空间。
如果画布应该与图像大小相同,但您不知道图像的大小,则可以在图像加载后更改画布的大小:
var canvas = document.getElementById('canvas');
const img = document.querySelector('img');
img.addEventListener('load', () => {
canvas.width = img.width;
canvas.height = img.height;
});
// the rest is your original code, except using MouseEvent.offsetX and
// .offsetY to get the mouse coordinates, and using the canvas's
// height and width instead of 500 for ctx.clearRect
var ctx = canvas.getContext('2d');
var rect = {};
var drag = false;
var buttons = false;
var angle = 10;
var rotate_angle = 0;
function init() {
// imageObj = new Image();
// imageObj.onload = function () { ctx.drawImage(imageObj, 0, 0); };
// imageObj.src = 'http://www.html5canvastutorials.com/demos/assets/darth-vader.jpg';
canvas.addEventListener('mousedown', mouseDown, false);
canvas.addEventListener('mouseup', mouseUp, false);
canvas.addEventListener('mousemove', mouseMove, false);
}
function mouseDown(e) {
rect.startX = e.offsetX;
rect.startY = e.offsetY;
drag = true;
buttons = false;
document.getElementById('test').innerHTML = '';
}
function mouseUp() {
drag = false;
buttons = true;
}
function onRemoveSelectionClick(e) {
ctx.clearRect(0, 0, canvas.width, canvas.height);
drag = false;
buttons = false;
document.getElementById('test').innerHTML = '';
}
function onRotateLeft() {
rotate_angle = rotate_angle - angle;
canvas.style.transform = 'rotate(' + rotate_angle + 'deg)';
}
function onRotateRight() {
rotate_angle = rotate_angle + angle;
canvas.style.transform = 'rotate(' + rotate_angle + 'deg)';
}
function mouseMove(e) {
if (drag) {
ctx.clearRect(0, 0, canvas.width, canvas.height);
// ctx.drawImage(imageObj, 0, 0);
rect.w = e.offsetX - rect.startX;
rect.h = e.offsetY - rect.startY;
ctx.strokeStyle = 'black';
ctx.shadowColor = 'black';
// ctx.shadowBlur = 5;
ctx.fillRect(rect.startX, rect.startY, rect.w, rect.h);
ctx.strokeRect(rect.startX, rect.startY, rect.w, rect.h);
// ctx.filter = 'blur(5px)';
// ctx.filter = 'drop-shadow(16px 16px 20px blue) '
} else {
if (buttons) {
if (document.getElementById('test').innerHTML === '') {
document.getElementById('test').innerHTML = '<button onclick="onRotateLeft()">Rotate Left</button>' +
'<button onclick="onRotateRight()">Rotate right</button><br />' +
'<button onclick="onRemoveSelectionClick()">Remove Selection</button>';
}
}
}
}
//
init();
#container {
position: relative;
overflow: hidden;
display: inline-block;
}
canvas {
position: absolute;
left: 0;
top: 0;
background-color: yellow;
}
<div id="container">
<img src="http://www.html5canvastutorials.com/demos/assets/darth-vader.jpg">
<canvas id="canvas"></canvas>
</div>
<div id="test"></div>
答案 2 :(得分:0)
我遇到了这个问题,此javascript起作用了:
var element = document.getElementsByClassName('canvasjs-chart-canvas')[0];
element.style.removeProperty("position");