Canvas 眼睛随输入文本移动

看了https://juejin.im/post/5ae802a46fb9a07ac55fec04的文章,想实现一个眼睛随输入文本移动的效果
虽然最后实现的效果很差,但过程中学到了很多东西

最后效果:


test.gif

主要代码:

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <title>Document</title>
    <style type="text/css">
        body {
            font-size: 20px;
        }
        
        #email {
            width: 200px;
            height: 40px;
            font-size: 20px;
        }
    </style>
    <script type="text/javascript" src="./jquery.js"></script>
</head>  
<body>
    <canvas id="myCanvas" width="600px" height="200px" style="border: 1px solid #DDDDDD">
    </canvas>
    
    <form>
        <input type="" name="" id="email" oninput="OnInput (event)" onpropertychange="OnPropChanged (event)">
    </form>

    <script type="text/javascript">
        function paint(left_x, left_y, right_x, right_y) {
            var c=document.getElementById("myCanvas");
            var ctx=c.getContext("2d");
            ctx.clearRect(0, 0, 600, 200);
            ctx.beginPath();
            ctx.arc(100,200,100,Math.PI,0);
            ctx.stroke();
            ctx.beginPath();
            ctx.arc(50,113,25,2.5,5.9);
            ctx.stroke();
            ctx.beginPath();
            ctx.arc(150,113,25,3.6,0.7);
            ctx.stroke();
            ctx.beginPath();
            ctx.arc(50,180,20,2*Math.PI,0);
            ctx.stroke();
            ctx.beginPath();
            ctx.arc(150,180,20,2*Math.PI,0);
            ctx.stroke();
            //左眼球
            ctx.beginPath();
            ctx.arc(left_x,left_y,5,2*Math.PI,0);
            ctx.fillStyle = 'black';
            ctx.fill();
            ctx.stroke();
            //右眼球
            ctx.beginPath();
            ctx.arc(right_x,right_y,5,2*Math.PI,0);
            ctx.fillStyle = 'black';
            ctx.fill();
            ctx.stroke();
        }

        paint(50, 190, 150, 190);

        function repaint() {
            var angle = 130 - textWidth(document.getElementById("email").value) / 200 * 80;

            paint(50 + 10 * Math.cos(angle * Math.PI / 180), 190 + Math.sin(angle * Math.PI / 180), 150 + 10 * Math.cos(angle * Math.PI / 180), 190 + Math.sin(angle * Math.PI / 180));
        }
        //输入改变时改变眼球位置
        function OnInput (event) {
            repaint();
        }

        // Internet Explorer
        function OnPropChanged (event) {
            repaint();
        }

        //获取文本长度
        var textWidth = function(text){ 
            var sensor = $('<p>'+ text +'</p>').css({display: 'none'}).css({'font-size': '20px'}); 
            $('body').append(sensor); 
            var width = sensor.width();
            sensor.remove(); 
            return width;
        };
    </script>
</body>
</html>  

输入文本立刻触发事件

<input type="" name="" id="email" oninput="OnInput (event)" onpropertychange="OnPropChanged (event)">
//输入改变时改变眼球位置
        function OnInput (event) {
            repaint();
        }

        // Internet Explorer
        function OnPropChanged (event) {
            repaint();
        }

oninput在<input>或<textarea>的值发生改变时触发,不需要等到元素失去焦点,是实时的。它是HTML5的事件,可用于检测文本类输入框的值。
缺陷:从脚本中修改值不会触发事件。从浏览器下拉提示框里选取值时不会触发。IE9 以下不支持,所以IE9以下可用onpropertychange 事件代替。

计算文本宽度:

var textWidth = function(text){ 
            var sensor = $('<p>'+ text +'</p>').css({display: 'none'}).css({'font-size': '20px'}); 
            $('body').append(sensor); 
            var width = sensor.width();
            sensor.remove(); 
            return width;
};

一开始想计算字体的宽度但字体不是等宽的所以不能准确计算出文本的长度,后来通过查询使用上面的方法,但这个方法会改变Dom结构,感觉不是一个很好的方法,不知道有没有更好的方法

计算眼球的位置
https://blog.csdn.net/can3981132/article/details/52559402

20160917000925189.png

p2 (x1,y1), 其中angle = 30
x1 = x0 + r * cos(angle * PI / 180)
y1 = y0 + r * sin(angle * PI /180)

github地址 https://github.com/zheever/bear

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 3,664评论 1 11
  • 一:canvas简介 1.1什么是canvas? ①:canvas是HTML5提供的一种新标签 ②:HTML5 ...
    GreenHand1阅读 4,874评论 2 32
  •   JavaScript 最初的一个应用,就是分担服务器处理表单的责任,打破处处依赖服务器的局面。   尽管目前的...
    霜天晓阅读 756评论 0 3
  • 前言 最近在學習研究前端開發, 學了JS之後想學一學bootstrap. 經過 邊看教程邊去官網找lib臨摹, 結...
    jProvim阅读 2,910评论 0 3
  • 相见不如不见,太傻了...
    capfswj阅读 163评论 0 0

友情链接更多精彩内容