首页 > 解决方案 > 用画布线定位 body 元素

问题描述

我有一个带图像的画布。当用户双击它时,我在画布上添加一条水平线,并X在该线的前面添加一个标记。这个X标记在画布之外。然而不知何故,这个 X 标记的 TOP 位置没有与水平线正确对齐,它偏离了几个像素

(请以全页模式运行演示以查看问题)

$(function(){

var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var rect = {};  
var img = new Image();

img.src = 'https://i.ndtvimg.com/i/2016-10/spud-boxer-best-dressed-dog_650x400_41476182056.jpg';
img.addEventListener('load', function() {
	canvas.width = img.naturalWidth;
	canvas.height = img.naturalHeight;
	ctx.drawImage(img, 0, 0);
	}, false);


$("#canvas").dblclick(function (e) {
    var mousePos = getMousePos(canvas, e);
    ctx.beginPath();
    ctx.lineWidth = 1;
    ctx.strokeStyle = '#df4b26';
    ctx.moveTo(0, mousePos.y);
    ctx.lineTo(canvas.width, mousePos.y);
    ctx.closePath();
    ctx.stroke();
    
    var top = e.clientY;
    var left = canvas.width + mousePos.rectLeft + 5; 

    $("body").append($("<span>x</span>").css({ top: top, left: left, position: 'absolute' }));
});

function getMousePos(canvas, evt) {
        var rect = canvas.getBoundingClientRect();
        return {
            x: Math.floor(evt.clientX - rect.left),
            y: Math.floor(evt.clientY - rect.top),
            rectLeft: rect.left,
            rectTop: rect.top
        };
    }

})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<canvas id="canvas" style="max-width: 100%;"></canvas>

标签: jqueryhtmlcsshtml5-canvas

解决方案


它对齐得很好,但由于font-sizeline-height内容区域(x所属区域)将对齐而不是x.

您可以添加line-height:0以解决此问题:

$(function(){

var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var rect = {};  
var img = new Image();

img.src = 'https://i.ndtvimg.com/i/2016-10/spud-boxer-best-dressed-dog_650x400_41476182056.jpg';
img.addEventListener('load', function() {
	canvas.width = img.naturalWidth;
	canvas.height = img.naturalHeight;
	ctx.drawImage(img, 0, 0);
	}, false);


$("#canvas").dblclick(function (e) {
    var mousePos = getMousePos(canvas, e);
    ctx.beginPath();
    ctx.lineWidth = 1;
    ctx.strokeStyle = '#df4b26';
    ctx.moveTo(0, mousePos.y);
    ctx.lineTo(canvas.width, mousePos.y);
    ctx.closePath();
    ctx.stroke();
    
    var top = e.clientY;
    var left = canvas.width + mousePos.rectLeft + 5; 

    $("body").append($("<span class='fix'>x</span>").css({ top: top, left: left, position: 'absolute' }));
});

function getMousePos(canvas, evt) {
        var rect = canvas.getBoundingClientRect();
        return {
            x: Math.floor(evt.clientX - rect.left),
            y: Math.floor(evt.clientY - rect.top),
            rectLeft: rect.left,
            rectTop: rect.top
        };
    }

})
.fix {
 line-height:0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<canvas id="canvas" style="max-width: 100%;"></canvas>


推荐阅读