美文网首页程序员
canvas 模拟文本输入光标效果

canvas 模拟文本输入光标效果

作者: infi_ | 来源:发表于2018-06-22 14:47 被阅读0次

canvas虽然没有文本输入的API
但是我们可以利用它先有的模拟一个
后续我会继续补充完整 以达到可以文字输入的效果

效果如图



并且鼠标可以在canvas任意位置点击移动光标

var canvas=document.getElementById("canvas")
var context=canvas.getContext("2d")
var drawingSurfaceImageData;
var blinkingInterval;
var BLINK_ON=500;
var BLINK_OFF=500;
context.font="40px Arial"
context.fillText("这是一个canvas模拟光标闪烁效果",10,50)
TextCursor=function(width,fillStyle){
  this.fillStyle=fillStyle||"rgba(0,0,0,0.5)"
  this.width=width||2;
  this.left=0;
  this.top=0


}

TextCursor.prototype={
   getHeight:function(context){
    var h=context.measureText("Wwwwww").width; //measureText 测量文字宽度
    return h+h/6;
   },
   createPath:function(context){
    context.beginPath();
    context.rect(this.left,this.top,this.width,this.getHeight(context))
   },
   draw:function(context,left,bottom){
    context.save()
    this.left=left;
    this.top=bottom-this.getHeight(context)  //通过底部减去光标高度 得到矩形的顶部位置
    this.createPath(context)
    context.fillStyle=this.fillStyle;
    context.fill();
    context.restore()
    },
    erase:function(context,imageData){
       context.putImageData(imageData,0,0,this.left,this.top,this.width,this.getHeight(context))

    }


}
function windowToCanvas(e){
   var bbox=canvas.getBoundingClientRect()
   return{
        x:e.clientX-bbox.left,
        y:e.clientY-bbox.top
   }

}


function saveDrawingSurface(){  //复制整个canvas图像的数据
drawingSurfaceImageData=context.getImageData(0,0,canvas.width,canvas.height)

}

function blinkCursor(loc){
   blinkingInterval=setInterval(function(){
      cursor.erase(context,drawingSurfaceImageData)
      setTimeout(function(e){
        cursor.draw(context,cursor.left,cursor.top+cursor.getHeight(context)) //这时候cursor里面的属性已经初始化好了 直接可以用cursor.left
      
      },BLINK_OFF)

   },BLINK_ON+BLINK_OFF)

}
function moveCursor(loc){
    cursor.erase(context,drawingSurfaceImageData)
    cursor.draw(context,loc.x,loc.y)  //这里完成鼠标第二次点击的位置 并传给cursor 初始化cursor里面的left top width getHeight
    if(!blinkingInterval){
        blinkCursor(loc)
    }
}




var cursor=new TextCursor()
canvas.onmousedown=function(e){

  var loc=windowToCanvas(e)
  moveCursor(loc)

}
saveDrawingSurface()

相关文章

  • canvas 模拟文本输入光标效果

    canvas虽然没有文本输入的API但是我们可以利用它先有的模拟一个后续我会继续补充完整 以达到可以文字输入的效果...

  • HTML5 Canvas笔记——简单文本编辑功能

    编写在canvas环境中具有简单文本编辑功能的程序。 主要功能:(1)有跟随移动的闪烁的光标;(2)能输入、插入、...

  • 一个Android长文本光标选中神器

    Android长文本输入栏神器:通过拖动进度条移动光标或选中文本。 Preview 短按拖动:移动光标长按拖动:选...

  • 微信小程序6位支付密码输入框

    微信小程序6位支付密码输入框 产品需求 微信小程序支付密码6位输入框 实现效果 非明文6位输入框,模拟光标,输入自...

  • textarea高度自适应自动增高撑开

    方法一:div模拟textarea文本域实现高度自适应 div模拟textarea出现光标实现编辑功能,可添加此属...

  • 集成讯飞输入法的问题

    UITextview 1, 在光标位置插入输入的文本 2, 对textView赋值以后默认滚动到最后 滚动到光标位...

  • Flutter文本输入框-TextField

    TextField 文本输入框,类似Android中的EditText 光标-cursor 参数说明cursorC...

  • canvas 刮刮乐

    今天我们来模拟刮刮乐效果 既然是使用Canvas来完成刮刮乐的效果,那么我们先来创建一个Canvas标签,并给它赋...

  • Vi编辑器

    命令模式 文本输入模式 末行模式。 插入模式 移动光标: 删除命令: 撤销命令: 重复命令 文本行移动: 复制粘贴...

  • Canvas模拟TextArea换行效果

    最近项目种需求,使用Canvas模拟TextArea自动换行的效果,TextArea自动换行,考虑了中英文、考虑了...

网友评论

    本文标题:canvas 模拟文本输入光标效果

    本文链接:https://www.haomeiwen.com/subject/mfpkyftx.html