【发布时间】:2018-02-02 08:57:26
【问题描述】:
我在 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.
知道怎么解决吗?
【问题讨论】:
-
“能够用它隐藏照片的某些部分” - 哪些部分,这是如何确定的?我不确定您在这里尝试实现的实际最终结果是什么。
-
这不是这里的问题,它有效。唯一的问题是画布没有占据整个高度和宽度。
-
你在自相矛盾 - 如果那 实际上 是“唯一的问题”,那么指定宽度和高度 100% 会解决它,但正如你自己所说,它没有吨。这里的实际问题是画布的像素尺寸由宽度和高度 attributes 指定 - 如果您通过 CSS 在画布上应用宽度和高度,那么您实际上是在拉伸它,但是画布内的像素坐标系保持不变。
-
其他人都明白了。
标签: javascript jquery html css canvas