Canvas 眼睛隨輸入文本移動(dòng)

看了https://juejin.im/post/5ae802a46fb9a07ac55fec04的文章,想實(shí)現(xiàn)一個(gè)眼睛隨輸入文本移動(dòng)的效果
雖然最后實(shí)現(xiàn)的效果很差,但過程中學(xué)到了很多東西

最后效果:


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));
        }
        //輸入改變時(shí)改變眼球位置
        function OnInput (event) {
            repaint();
        }

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

        //獲取文本長(zhǎng)度
        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>  

輸入文本立刻觸發(fā)事件

<input type="" name="" id="email" oninput="OnInput (event)" onpropertychange="OnPropChanged (event)">
//輸入改變時(shí)改變眼球位置
        function OnInput (event) {
            repaint();
        }

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

oninput在<input>或<textarea>的值發(fā)生改變時(shí)觸發(fā),不需要等到元素失去焦點(diǎn),是實(shí)時(shí)的。它是HTML5的事件,可用于檢測(cè)文本類輸入框的值。
缺陷:從腳本中修改值不會(huì)觸發(fā)事件。從瀏覽器下拉提示框里選取值時(shí)不會(huì)觸發(fā)。IE9 以下不支持,所以IE9以下可用onpropertychange 事件代替。

計(jì)算文本寬度:

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;
};

一開始想計(jì)算字體的寬度但字體不是等寬的所以不能準(zhǔn)確計(jì)算出文本的長(zhǎng)度,后來通過查詢使用上面的方法,但這個(gè)方法會(huì)改變Dom結(jié)構(gòu),感覺不是一個(gè)很好的方法,不知道有沒有更好的方法

計(jì)算眼球的位置
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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ??JavaScript 與 HTML 之間的交互是通過事件實(shí)現(xiàn)的。 ??事件,就是文檔或?yàn)g覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,688評(píng)論 1 11
  • 一:canvas簡(jiǎn)介 1.1什么是canvas? ①:canvas是HTML5提供的一種新標(biāo)簽 ②:HTML5 ...
    GreenHand1閱讀 4,880評(píng)論 2 32
  • ??JavaScript 最初的一個(gè)應(yīng)用,就是分擔(dān)服務(wù)器處理表單的責(zé)任,打破處處依賴服務(wù)器的局面。 ??盡管目前的...
    霜天曉閱讀 763評(píng)論 0 3
  • 前言 最近在學(xué)習(xí)研究前端開發(fā), 學(xué)了JS之後想學(xué)一學(xué)bootstrap. 經(jīng)過 邊看教程邊去官網(wǎng)找lib臨摹, 結(jié)...
    jProvim閱讀 2,911評(píng)論 0 3
  • 相見不如不見,太傻了...
    capfswj閱讀 163評(píng)論 0 0

友情鏈接更多精彩內(nèi)容