canvas 上添加事件綁定

Canvas 畫布上繪制的視頻圖片等越走,因為均不是節(jié)點(diǎn)澜汤,我們也就無法獲取圖片的 DOM 節(jié)點(diǎn)來進(jìn)行操作和添加事件械筛。畫布上繪制的圖像稠诲,本質(zhì)上只能看到卻“摸”不到侦鹏。那么怎么給畫布上的東西添加監(jiān)聽事件那诡曙?

一、利用定位覆蓋

思路:canvas標(biāo)簽的父親固定定位略水,canvas標(biāo)簽絕對定位且canvas標(biāo)簽撐滿父盒子价卤,canvas標(biāo)簽的父盒子還有子元素,這些子元素絕對定位就可以覆蓋在canvas畫布上渊涝。

當(dāng)canvas 上需要實(shí)現(xiàn)類似的點(diǎn)擊事件慎璧,就可以使用 canvas 標(biāo)簽父盒子里面的子元素,定位覆蓋點(diǎn)擊區(qū)域跨释。實(shí)現(xiàn)canvas 畫布上類似的DOM操作胸私。


畫布點(diǎn)擊事件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            background-color: #BA7271;
        }
        canvas{
            position: absolute;
            left: 50%;
            top: 0;
            transform:translate(-300px);
            background-color: #fff;
        }
        div{
            position: relative;
            width: 600px;
            height: 500px;
            margin:30px auto;
        }
        main{
            background-color: #0f0;
            position: absolute;
            width: 100px;
            height: 100px;
            left: 100px;
            top: 100px;
        }
        aside{
            background-color: #f00;
            position: absolute;
            width: 100px;
            height: 100px;
            left: 300px;
            top: 100px;
        }
    </style>
</head>
<body>
    <div>
        <canvas width="600" height="500"></canvas>
        <main></main>
        <aside></aside>
    </div>
    <script>
        var m = document.querySelector("main");
        var n = document.querySelector("aside");
        m.onclick = function(event){
            var x = event.offsetX;
            var y = event.offsetY;
            alert(`鼠標(biāo)在顏色塊的坐標(biāo):${x} 和 ${y}`);
        }
        n.onclick = function(event){
            var x = event.offsetX;
            var y = event.offsetY;
            alert(`鼠標(biāo)在顏色塊的坐標(biāo):${x} 和 ${y}`);
        }
    </script>
</body>
</html>

當(dāng)畫布上需要移動拖拽東西時,也可以實(shí)現(xiàn)移動拖拽:


畫布移動拖拽模型
        var m = document.querySelector("main");
        var n = document.querySelector("aside");
        m.onmousedown = function(event){
            var starX = event.clientX - m.offsetLeft;
            var starY = event.clientY - m.offsetTop;
            document.onmousemove = function(event){
                var x = event.clientX - starX;
                var y = event.clientY - starY;
                m.style.left = `${x}px`;
                m.style.top = `${y}px`;
            }
        }
        n.onmousedown = function(event){
            var starX = event.clientX - n.offsetLeft;
            var starY = event.clientY - n.offsetTop;
            document.onmousemove = function(event){
                var x = event.clientX - starX;
                var y = event.clientY - starY;
                n.style.left = `${x}px`;
                n.style.top = `${y}px`;
            }
        }
        document.onmouseup = function(event){
            document.onmousemove = null;
        }
二煤傍、全局監(jiān)聽局部響應(yīng)

思路:現(xiàn)在只有一個 canvas 標(biāo)簽了盖文。要進(jìn)行 DOM 操作添加事件只能給畫布這個 DOM 節(jié)點(diǎn)添加事件,那索性我們就給DOM節(jié)點(diǎn)添加事件蚯姆。然后通過鼠標(biāo)的 event 來計算鼠標(biāo)的距離畫布左上角的水平和垂直距離∥逍現(xiàn)在我們只需要判斷畫布上的色塊的坐標(biāo)能包住鼠標(biāo)的坐標(biāo),條件成立時龄恋,添加對應(yīng)的事件疙驾,這時候你想怎么玩畫布上的內(nèi)容都行。

全局監(jiān)聽局部響應(yīng)

源代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            background-color: #BA7271;
        }
        canvas{
            position: absolute;
            left: 50%;
            top: 10%;
            transform:translate(-300px);
            background-color: #fff;
        }
    </style>
</head>
<body>
        <canvas width="600" height="500"></canvas>
    <script>
        var myCanvas = document.querySelector("canvas");
        var ctx = myCanvas.getContext("2d");

        // 畫上兩個正方形
        ctx.fillStyle = "#f00";
        var x1 = 100;
        var y1 = 100;
        var x2 = 300;
        var y2 = 200;
        var width = 100;
        var height = 100;
        ctx.fillRect(x1,y1,width,height);
        ctx.fillStyle = "#0ff";
        ctx.fillRect(x2,y2,width,height);
        // 全局監(jiān)聽
        myCanvas.onclick = function(event){
            console.log("全局監(jiān)聽");
            var x = event.offsetX;
            var y = event.offsetY;
            // 局部響應(yīng)郭毕,第一個方塊
            if(x > x1 && x < x1 + width && y > y1 && y < y1 + height){
                alert("點(diǎn)我干嘛它碎!");
            }
            // 局部響應(yīng),第二個方塊
            if(x > x2 && x < x2 + width && y > y2 && y < y2 + height){
                alert("不知道我是第二個方塊呀显押,點(diǎn)我扳肛!");
            }
        }
    </script>
</body>
</html>
總結(jié)

兩個方法,沒有好壞之分乘碑,都能用挖息。第二個方法相對與第一個的好處就是只進(jìn)行 JS 代碼的操作。在開發(fā)的時候因為代碼寫在一處可能比較方便兽肤。

今天比較發(fā)現(xiàn)了一個好的博客套腹,看了一下午了∽收。看的時候給人的感覺真的很棒电禀,內(nèi)心是真的特別滿足。但是看完后特別失落落的感覺笤休,都怪看的時候期望太高了尖飞,內(nèi)心比較浮躁,內(nèi)心深處暗示自己,以為看完以后就能有多厲害了葫松,誰知看完一切未變瓦糕,落差就來了,這樣看來自己的閱讀習(xí)慣并不是太好腋么,我能保證每天的碎片化閱讀咕娄,但是突然來一次深度閱讀就有點(diǎn)不能自我了,提了不止一遍了珊擂,盡量把閱讀常態(tài)化圣勒。這樣才能降低胡思亂想的期望,達(dá)到平常心的對待閱讀摧扇。

也不吝嗇圣贸,下午看的幾個好博客拿出來:

下午還看到一本特好的書「中央帝國的財經(jīng)密碼」 這書聽過很多次,有幾次看公眾號也有博主推薦扛稽,今天索性看了吁峻,兩章寫的真好,從漢一直寫到清末在张,雖然只寫了這一點(diǎn)用含,當(dāng)給人的感覺,這兩千年的帝國歷史仿佛和當(dāng)代中國聯(lián)系在一起帮匾,帝國經(jīng)濟(jì)自漢到唐建立之后啄骇,經(jīng)濟(jì)的基礎(chǔ)就從未動搖過,一直延續(xù)到當(dāng)代瘟斜。歷史有時候讓人摸不著頭腦缸夹,有時候又主干特別清楚。不管如何能夠啟迪自己就行螺句。

2019.07.15 21.26

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末虽惭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蛇尚,更是在濱河造成了極大的恐慌趟妥,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佣蓉,死亡現(xiàn)場離奇詭異,居然都是意外死亡亲雪,警方通過查閱死者的電腦和手機(jī)勇凭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來义辕,“玉大人虾标,你說我怎么就攤上這事」嘧” “怎么了璧函?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵傀蚌,是天一觀的道長。 經(jīng)常有香客問我蘸吓,道長善炫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任库继,我火速辦了婚禮箩艺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宪萄。我一直安慰自己艺谆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布拜英。 她就那樣靜靜地躺著静汤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪居凶。 梳的紋絲不亂的頭發(fā)上虫给,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機(jī)與錄音排监,去河邊找鬼狰右。 笑死,一個胖子當(dāng)著我的面吹牛舆床,可吹牛的內(nèi)容都是我干的棋蚌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼挨队,長吁一口氣:“原來是場噩夢啊……” “哼谷暮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盛垦,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤湿弦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后腾夯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颊埃,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年蝶俱,在試婚紗的時候發(fā)現(xiàn)自己被綠了班利。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡榨呆,死狀恐怖罗标,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤闯割,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布彻消,位于F島的核電站,受9級特大地震影響宙拉,放射性物質(zhì)發(fā)生泄漏宾尚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一鼓黔、第九天 我趴在偏房一處隱蔽的房頂上張望央勒。 院中可真熱鬧,春花似錦澳化、人聲如沸崔步。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽井濒。三九已至,卻和暖如春列林,著一層夾襖步出監(jiān)牢的瞬間瑞你,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工希痴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留者甲,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓砌创,卻偏偏與公主長得像虏缸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子嫩实,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容