如何在HTML 5 Canvas中添加可选文本?

时间:2013-07-29 10:58:52

标签: javascript html5 canvas html5-canvas

我需要在画布上放置一个文本标签。可能吗?我怎样才能做到这一点? 我知道有fillText但fillText没有给我流畅的输出文本。我还希望标签上的文本可由用户复制,如果我使用fillText,这是不可能的。

3 个答案:

答案 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)