3.4.1_指示文本输入位置的光标

3.4.1_指示文本输入位置的光标

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>指示文本输入位置的光标</title>
        <style>
            body{
                background: #eee;
            }
            #canvas{
                background: #fff;
                cursor: pointer;
                margin-left: 10px;
                margin-top: 10px;
                box-shadow: 4px 4px 8px rgba(0,0,0,0.5);
                -webkit-box-shadow: 4px 4px 8px rgba(0,0,0,0.5);
                -moz-box-shadow: 4px 4px 8px rgba(0,0,0,0.5);
            }
            #controls{
                position: absolute;
                left: 25px;
                top: 25px;
            }
        </style>
    </head>
    <body>
        <canvas id="canvas" width="1000" height="600"></canvas>
        <div id="controls">
            字体:
            <select id="fontStyleSelect">
                <option value="palatino">palatino</option>
                <option value="lucida">lucida</option>
                <option value="fantasy">fantasy</option>
                <option value="copperplate">copperplate</option>
                <option value="tahoma" selected>tahoma</option>
                <option value="verdana">verdana</option>
                <option value="impact">impact</option>
                <option value="century">century</option>
            </select>
            字体大小:
            <select id="fontSizeSelect">
                <option value="20px" selected>20px</option>
                <option value="30px">30px</option>
                <option value="40px">40px</option>
                <option value="50px">50px</option>
                <option value="60px">60px</option>
            </select>
            字体填充颜色:
            <select id="fontColorSelect">
                <option value="red">red</option>
                <option value="green">green</option>
                <option value="blue">blue</option>
                <option value="orange">orange</option>
                <option value="cornflowerblue" selected>cornflowerblue</option>
                <option value="goldenrod">goldenrod</option>
                <option value="navy">navy</option>
                <option value="purple">purple</option>
            </select>
        </div>
    </body>
    <!-- 可以单独保存为一个独立的JS文件  -->
    <script> 
        //组合使用构造函数与原型模式
        TextCursor = function (width,fillStyle){
            this.width = width || 2;
            this.fillStyle = fillStyle || 'rgba(0,0,0,0.5)';
            this.left = 0;
            this.top = 0;
        };
        TextCursor.prototype = {
            //设置光标高度为当前字体的字符框值的1又6分之一
            getHeight:function(context){  
                var h = context.measureText('M').width; //得到字符框值

                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();
            }
        }
    </script>
    <script>
        var canvas = document.getElementById('canvas');
        var context = canvas.getContext('2d'); 
        var fontStyleSelect = document.getElementById('fontStyleSelect');
        var fontSizeSelect = document.getElementById('fontSizeSelect');
        var fontColorSelect = document.getElementById('fontColorSelect');
        var fillStyle = fontColorSelect.value;
        var str = fontSizeSelect.value +' '+ fontStyleSelect.value;


        //创建新的光标对象
        var cursor = new TextCursor(2,fillStyle);

        //canvas事件控制器
        canvas.onmousedown = function(e){
            var loc = windowToCanvas(e.clientX,e.clientY);
            context.font = str;
            cursor.fillStyle = fillStyle;
            cursor.draw(context,loc.x,loc.y);
        }
        fontStyleSelect.onchange = function(){
            str = fontSizeSelect.value +' '+ fontStyleSelect.value;

        }
        fontSizeSelect.onchange = function(){
            str = fontSizeSelect.value +' '+ fontStyleSelect.value;
        }
        fontColorSelect.onchange = function (){
            fillStyle = fontColorSelect.value;
        }
        //得到鼠标在canvas画布中的坐标
        function windowToCanvas(x,y){
            var bbox = canvas.getBoundingClientRect();
            return {
                x:x-bbox.left*(canvas.width/bbox.width),
                y:y-bbox.top*(canvas.height/bbox.height)
            }
        };
    </script>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值