我需要在画布上放置一个文本标签。可能吗?我怎样才能做到这一点? 我知道有fillText但fillText没有给我流畅的输出文本。我还希望标签上的文本可由用户复制,如果我使用fillText,这是不可能的。
答案 0 :(得分:2)
假设您只想在html页面中的画布顶部放置一些文本:
<强> HTML:强>
<label>Yahoo, I'm on top of canvas??</label>
<canvas width="500" height="500" ></canvas>
<强> CSS:强>
canvas {
border:1px solid gray;
}
label {
position:absolute;
top:20px;
left:20px;
}
的 Working demo 强>
<小时/> 修改强>
根据编辑,如果您正在寻找在画布中选择文本的解决方案,那将会更加痛苦。
我建议使用 CreateJS 。使用画布时,它会让你的生活变得更轻松。
虽然库没有为您提供可选择的文本,但它更容易实现。
以下是 DEMO ,了解如何创建可选文字。
// Text Selector Class
function Selector(stage, text) {
var select = new createjs.Shape();
function selector(x, y, width, height) {
select.graphics.clear().beginFill("#ace")
.drawRect(x || 0, y || 0, width || 0, height || 0);
}
var tuw = text.getMeasuredWidth();
var tuh = text.getMeasuredHeight();
text.addEventListener("mousedown", function (e) {
var startX = e.rawX;
var onMove = function (e) {
if (e.rawX >= text.x && e.rawX <= text.x + tuw) selector(startX, text.y, e.rawX - startX, tuh);
};
var onUp = function () {
stage.removeEventListener("stagemousemove", onMove);
selector();
};
stage.addEventListener("stagemousemove", onMove);
stage.addEventListener("stagemouseup", onUp);
});
return select;
}
var stage = new createjs.Stage("shape");
// Text Node
var text = new createjs.Text("Hello World");
text.x = 100;
text.font = "20px Arial";
text.color = "#ff7700";
text.cursor = "text";
stage.addChild(text);
// Attach Selector
stage.addChildAt(new Selector(stage, text), 0);
// Important
stage.enableMouseOver();
setInterval(function () {
stage.update();
}, 100);
答案 1 :(得分:1)
有可能。以下是svg
使用foreignObject
直接Mozilla Developer Network的示例。
<!DOCTYPE html>
<html>
<body>
<p><canvas id="canvas" style="border:2px solid black;" width="200" height="200"></canvas>
<script>
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var data = "<svg xmlns='http://www.w3.org/2000/svg' width='200' height='200'>" +
"<foreignObject width='100%' height='100%'>" +
"<div xmlns='http://www.w3.org/1999/xhtml' style='font-size:40px'>" +
"<em>I</em> like <span style='color:white; text-shadow:0 0 2px blue;'>cheese</span>" +
"</div>" +
"</foreignObject>" +
"</svg>";
var DOMURL = self.URL || self.webkitURL || self;
var img = new Image();
var svg = new Blob([data], {type: "image/svg+xml;charset=utf-8"});
var url = DOMURL.createObjectURL(svg);
img.onload = function() {
ctx.drawImage(img, 0, 0);
DOMURL.revokeObjectURL(url);
};
img.src = url;
</script>
</body>
</html>
答案 2 :(得分:1)
在我的一个画布项目中,我需要创建高亮显示,可编辑和可复制的文本区域,在文本区域失去焦点时单击并删除。以下是我如何做的结构
使用Javascript:
var mousePos;
var textarea = null;
var x;
var y;
var textValue;
function getMousePos(canvas, evt)
{
var rect = canvas.getBoundingClientRect();
return {
x: evt.clientX - rect.left,
y: evt.clientY - rect.top
};
}
canvas.addEventListener('mousedown', function(evt)
{
mousePos = getMousePos(canvas, evt);
mouseDown = true;
setTimeout(function() { check(mousePos.x, mousePos.y) }, 50);
}, false);
canvas.addEventListener('mouseup', function(evt)
{
evt.preventDefault();
mouseDown = false;
}, false);
function check(xPos, yPos)
{
if(xPos > /*lower bounding x position*/ && xPos < /*upper bounding x position*/ && yPos < /*upper bounding y position*/ && yPos > /*lower bounding y position*/)
{
if(!textarea) {
textarea = document.createElement('textarea');
textarea.className = 'textArea';
textarea.onkeypress = function (e) {
if (e.which === 13) { // Allows pressing 'Enter' to change the focus of the text area
textarea.blur();
}
}
textarea.onblur = function () {
/*do something with value*/
textValue = textarea.value;
document.body.removeChild(textarea);
textarea = null;
}
document.body.appendChild(textarea);
}
textarea.blur();
textarea.value = /*put default value*/;
textarea.style.left = /*put left position of object*/;
textarea.style.top = /*put top position of object*/;
}
}
CSS
.textArea {
/* The only necessary CSS is a height, a width, and position:absolute */
position: absolute;
background:grey;
height:20px;
border:0;
outline:0;
line-height:10px;
width:100px;
resize: none;
overflow:hidden;
font-size:10px;
}
这样只允许创建一个文本区域,并在单击时创建,并在失去焦点时删除。不确定您是否需要此功能,但如果不是
则很容易删除 单击其中一个栏右侧的值时,Demo here(WiP)