婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > canvas實現(xiàn)按住鼠標(biāo)移動繪制出軌跡的示例代碼

canvas實現(xiàn)按住鼠標(biāo)移動繪制出軌跡的示例代碼

熱門標(biāo)簽:成都智能外呼系統(tǒng)平臺 當(dāng)涂高德地圖標(biāo)注 江蘇智能電銷機器人哪家好 四川點撥外呼系統(tǒng) 南寧點撥外呼系統(tǒng)哪家公司做的好 電銷機器人電話用什么卡 黃島區(qū)地圖標(biāo)注 鎮(zhèn)江智能外呼系統(tǒng)有效果嗎 云南大理400電話申請官方

概要

工作以來,寫過vue、react、正則、算法、小程序等知識,唯獨沒有寫過canvas,因為實在不會??!

2018年,給自己設(shè)定一個小目標(biāo):學(xué)會canvas,達到的效果是能用canvas實現(xiàn)一些css3不容易實現(xiàn)的動畫。

本文作為學(xué)習(xí)canvas的第一篇收獲,很多人初學(xué)canvas做的第一個demo是實現(xiàn)一個“鐘”,當(dāng)然,我也實現(xiàn)了一個,不過不講這個,而是講講一個更有趣、也更簡單的玩意。

鼠標(biāo)按住繪制軌跡

需求

在一塊canvas畫布上,初始狀態(tài)畫布什么都沒有,現(xiàn)在,我想給畫布加一點鼠標(biāo)事件,用鼠標(biāo)在畫布上寫字。具體的效果是鼠標(biāo)移動到畫布上任意一點,然后按住鼠標(biāo),移動鼠標(biāo)的位置,就可以開始寫字啦!

原理

先簡單分析下思路,首先我們需要一個canvas畫布,然后計算鼠標(biāo)在畫布上的位置,給鼠標(biāo)綁定onmousedown事件和onmousemove事件,在移動過程中繪制出路徑,松開鼠標(biāo)的時候,繪制結(jié)束。

這個思路雖然很簡單,但是里面有些地方需要小技巧實現(xiàn)。

1、需要一個html文件,包含canvas元素。

這是一個寬度800,高度400的畫布。為什么沒有寫px呢?哦,暫時沒搞懂,canvas文檔推薦的。

<!doctype html>
<html class="no-js" lang="zh">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="x-ua-compatible" content="ie=edge">
        <title>canvas學(xué)習(xí)</title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <link rel="manifest" href="site.webmanifest">
        <link rel="apple-touch-icon" href="icon.png">
        <link rel="stylesheet" href="css/main.css">
    </head>
    <body>
        <canvas id="theCanvas" width="800" height="400"></canvas>
        <script src="js/main.js"></script>
    </body>
</html>

2、判斷當(dāng)前環(huán)境是否支持canvas。

在main.js中,我們寫一個自執(zhí)行函數(shù),下面是兼容性判斷的代碼片段,“代碼主體”中將會是實現(xiàn)需求的核心。

(function() {
    let theCanvas = document.querySelector('#theCanvas')
    if (!theCanvas || !theCanvas.getContext) {
        //不兼容canvas
        return false
    } else {
        //代碼主體
    }
})()

3、獲取2d對象。

let context = theCanvas.getContext('2d')

4、獲取當(dāng)前鼠標(biāo)相對于canvas的坐標(biāo)。

為什么要獲取這個坐標(biāo)呢?因為鼠標(biāo)默認(rèn)是獲取當(dāng)前窗口的相對坐標(biāo),而canvas可以位于頁面上的任何位置,所以需要通過計算才能得到真實的鼠標(biāo)坐標(biāo)。

將獲取鼠標(biāo)相對于canvas的真實坐標(biāo)封裝成了一個函數(shù),如果你覺得抽象,可以在草稿紙上畫圖來理解為什么要這么運算。

通常情況下,可以是x - rect.left和y - rect.top。但為什么實際上卻是x - rect.left * (canvas.width/rect.width)呢?

canvas.width/rect.width表示判斷canvas中存在的縮放行為,求出縮放的倍數(shù)。

const windowToCanvas = (canvas, x, y) => {
    //獲取canvas元素距離窗口的一些屬性,MDN上有解釋
    let rect = canvas.getBoundingClientRect()
    //x和y參數(shù)分別傳入的是鼠標(biāo)距離窗口的坐標(biāo),然后減去canvas距離窗口左邊和頂部的距離。
    return {
        x: x - rect.left * (canvas.width/rect.width),
        y: y - rect.top * (canvas.height/rect.height)
    }
}

5、有了第4步的利器函數(shù),我們可以給canvas加上鼠標(biāo)事件了!

先給鼠標(biāo)綁定按下onmousedown事件,用moveTo繪制坐標(biāo)起點。

theCanvas.onmousedown = function(e) {
    //獲得鼠標(biāo)按下的點相對canvas的坐標(biāo)。
    let ele = windowToCanvas(theCanvas, e.clientX, e.clientY)
    //es6的解構(gòu)賦值
    let { x, y } = ele
    //繪制起點。
    context.moveTo(x, y)
}

6、移動鼠標(biāo)的時候,沒有鼠標(biāo)長按事件,又該怎么監(jiān)聽呢?

這里用到的小技巧是在onmousedown內(nèi)部再執(zhí)行一個onmousemove(鼠標(biāo)移動)事件,這樣就能監(jiān)聽按住鼠標(biāo)并且移動了。

theCanvas.onmousedown = function(e) {
    //獲得鼠標(biāo)按下的點相對canvas的坐標(biāo)。
    let ele = windowToCanvas(theCanvas, e.clientX, e.clientY)
    //es6的解構(gòu)賦值
    let { x, y } = ele
    //繪制起點。
    context.moveTo(x, y)
    //鼠標(biāo)移動事件
    theCanvas.onmousemove = (e) => {
        //移動時獲取新的坐標(biāo)位置,用lineTo記錄當(dāng)前的坐標(biāo),然后stroke繪制上一個點到當(dāng)前點的路徑
        let ele = windowToCanvas(theCanvas, e.clientX, e.clientY)
        let { x, y } = ele
        context.lineTo(x, y)
        context.stroke()
    }
}

7、鼠標(biāo)松開的時候,不再繪制路徑。

有什么辦法可以讓onmouseup事件中阻止掉上面監(jiān)聽的2種事件呢?方法挺多的,設(shè)置onmousedown和onmousemove為null算是一種,我這里用到了“開關(guān)”。isAllowDrawLine設(shè)置為bool值,來控制函數(shù)是否執(zhí)行,具體代碼可以看下面完整的源碼。

源碼

分為3個文件,index.html、main.js、utils.js,這里用到了es6的語法,我是使用parcle配置好了開發(fā)環(huán)境,所以不會有報錯,如果你直接復(fù)制代碼,運行的時候出現(xiàn)錯誤,在無法升級瀏覽器的情況下,可以將es6語法改成es5.

1、index.html

上面已經(jīng)展示了,不再復(fù)述。

2、main.js

import { windowToCanvas } from './utils'
(function() {
    let theCanvas = document.querySelector('#theCanvas')
    if (!theCanvas || !theCanvas.getContext) {
        return false
    } else {
        let context = theCanvas.getContext('2d')
        let isAllowDrawLine = false
        theCanvas.onmousedown = function(e) {
            isAllowDrawLine = true
            let ele = windowToCanvas(theCanvas, e.clientX, e.clientY)
            let { x, y } = ele
            context.moveTo(x, y)
            theCanvas.onmousemove = (e) => {
                if (isAllowDrawLine) {
                    let ele = windowToCanvas(theCanvas, e.clientX, e.clientY)
                    let { x, y } = ele
                    context.lineTo(x, y)
                    context.stroke()
                }
            }
        }
        theCanvas.onmouseup = function() {
            isAllowDrawLine = false
        }
    }
})()

3、utils.js

/*
* 獲取鼠標(biāo)在canvas上的坐標(biāo)
* */
const windowToCanvas = (canvas, x, y) => {
    let rect = canvas.getBoundingClientRect()
    return {
        x: x - rect.left * (canvas.width/rect.width),
        y: y - rect.top * (canvas.height/rect.height)
    }
}

export {
    windowToCanvas
}

總結(jié)

這里有個誤區(qū),我用的是canvas對象綁定事件 theCanvas.onmouseup,其實canvas不能綁定事件,真正綁定的是document和window。但是由于瀏覽器會自動幫你判斷并且移交事件處理,所以完全不用擔(dān)心。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

標(biāo)簽:咸寧 廣西 十堰 淮安 佳木斯 南京 西寧 酒泉

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《canvas實現(xiàn)按住鼠標(biāo)移動繪制出軌跡的示例代碼》,本文關(guān)鍵詞  canvas,實現(xiàn),按住,鼠標(biāo),移動,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《canvas實現(xiàn)按住鼠標(biāo)移動繪制出軌跡的示例代碼》相關(guān)的同類信息!
  • 本頁收集關(guān)于canvas實現(xiàn)按住鼠標(biāo)移動繪制出軌跡的示例代碼的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    成人精品免费看| 91亚洲国产成人精品一区二区三 | 色老综合老女人久久久| 欧美精品在线观看一区二区| 久久一二三国产| 亚洲综合色婷婷| 老司机免费视频一区二区三区| 美女视频黄 久久| 国产伦精品一区二区三区视频青涩 | 综合欧美一区二区三区| 日本欧美加勒比视频| 粉嫩av一区二区三区粉嫩| 欧美在线你懂的| 国产精品色婷婷久久58| 日韩精品一二三四| 99久久婷婷国产| 欧美精品一区二区精品网| 亚洲一区在线观看免费 | 欧美一区午夜精品| 亚洲视频免费在线| 国产在线精品免费| 欧美高清hd18日本| 中文字幕一区二区在线观看| 精品在线观看视频| 日韩亚洲欧美在线| 亚洲成人一区二区在线观看| 国产精品18久久久久| 91精品国产aⅴ一区二区| 亚洲女人小视频在线观看| 国产91色综合久久免费分享| 欧美电视剧在线看免费| 亚洲五码中文字幕| 在线观看91视频| 亚洲欧美色图小说| av一本久道久久综合久久鬼色| 久久亚洲精精品中文字幕早川悠里| 午夜伦欧美伦电影理论片| 色综合视频一区二区三区高清| 欧美国产日韩精品免费观看| 国产在线麻豆精品观看| 91麻豆精品国产91久久久使用方法 | 91国产成人在线| 亚洲黄色在线视频| 91欧美一区二区| 亚洲特黄一级片| 一本色道久久加勒比精品| 成人欧美一区二区三区1314 | 国产精品伦理在线| 国产精品乡下勾搭老头1| 久久久久久日产精品| 国产毛片精品一区| 欧美www视频| 国产真实乱偷精品视频免| 久久夜色精品一区| 美女视频一区在线观看| 日韩一区二区三区四区五区六区| 亚洲国产视频直播| 欧美精品粉嫩高潮一区二区| 日本美女视频一区二区| 日韩欧美二区三区| 国产乱人伦精品一区二区在线观看| 国产亚洲欧美色| 99久久久国产精品免费蜜臀| 亚洲自拍偷拍麻豆| 欧美顶级少妇做爰| 国内精品免费**视频| 精品国产91九色蝌蚪| 成人一道本在线| 一区二区久久久久久| 欧美色男人天堂| 免费观看在线综合色| 久久夜色精品国产欧美乱极品| 国产成人av福利| 亚洲一区免费视频| 久久综合av免费| 欧美综合亚洲图片综合区| 麻豆精品在线视频| 中文字幕免费不卡在线| 日本道色综合久久| 看电视剧不卡顿的网站| 国产精品美女www爽爽爽| 欧美天堂一区二区三区| 国产电影精品久久禁18| 樱桃视频在线观看一区| 精品久久人人做人人爽| 91视频免费观看| 韩国欧美国产1区| 亚洲激情欧美激情| 久久精品日产第一区二区三区高清版| 99久久国产综合精品女不卡| 日本欧美一区二区三区乱码| 国产精品国产三级国产三级人妇| 欧美高清视频一二三区| 成人激情小说网站| 全部av―极品视觉盛宴亚洲| www国产成人免费观看视频 深夜成人网 | 亚洲人成人一区二区在线观看| 91亚洲国产成人精品一区二区三 | 国产美女视频91| 亚洲高清三级视频| 国产精品成人免费| 久久色.com| 91精品国产品国语在线不卡| 大胆亚洲人体视频| 欧美a一区二区| 亚洲主播在线观看| 亚洲另类在线一区| 国产精品久久久久久亚洲毛片| 日韩一级黄色片| 欧美日韩精品福利| 91亚洲精品一区二区乱码| 国产精品一区2区| 国内成+人亚洲+欧美+综合在线| 亚洲永久免费av| 亚洲欧美自拍偷拍色图| 国产视频视频一区| 久久蜜桃香蕉精品一区二区三区| 日韩欧美在线不卡| 日韩欧美高清dvd碟片| 欧美一区二区成人6969| 欧美精品在线视频| 欧美精品v国产精品v日韩精品| 欧洲精品视频在线观看| 国产a视频精品免费观看| 国产一本一道久久香蕉| 久久国产精品露脸对白| 五月天亚洲精品| 日本va欧美va欧美va精品| 秋霞午夜av一区二区三区| 日韩精品电影在线| 奇米888四色在线精品| 蜜臀久久久久久久| 久久精品国产亚洲一区二区三区| 蜜臀av亚洲一区中文字幕| 老司机精品视频导航| 国产一区二区剧情av在线| 国产福利精品导航| 91美女片黄在线观看91美女| 91香蕉国产在线观看软件| 日本电影亚洲天堂一区| 欧美日韩精品三区| 日韩精品中文字幕在线一区| 欧美电影免费观看高清完整版| 日韩欧美一级精品久久| 欧美xxx久久| 中文无字幕一区二区三区| 久久久91精品国产一区二区精品| 国产女同性恋一区二区| 亚洲三级电影网站| 五月综合激情网| 福利91精品一区二区三区| 91一区二区在线观看| 欧美久久免费观看| 久久综合久久鬼色中文字| 国产精品不卡视频| 日本伊人午夜精品| 国产精品白丝jk白祙喷水网站| 91啪在线观看| 日韩欧美电影一二三| 国产精品久久久久久久久搜平片| 一区二区久久久| 久久国产精品99精品国产| 国产精品456| 99精品国产视频| 欧美不卡一区二区| 亚洲男同1069视频| 激情久久五月天| 一本到不卡免费一区二区| 日韩午夜小视频| 亚洲天堂a在线| 国产一区二区视频在线| 欧美va在线播放| 日韩免费高清av| 亚洲精品一区二区三区在线观看| 久久久综合精品| 91视频www| 日韩精品一区在线观看| 一本到高清视频免费精品| 精品国内二区三区| 男人的天堂久久精品| 欧美在线视频日韩| 一区二区三区丝袜| av亚洲精华国产精华| 国产视频一区二区在线| 国模少妇一区二区三区| 欧美电影免费观看高清完整版 | 欧美精品vⅰdeose4hd| 一区二区免费视频| 99精品视频在线播放观看| 欧美激情在线看| 成人精品视频一区二区三区尤物| 久久久久久久综合日本| 黄色资源网久久资源365| 日韩一区二区三区在线视频| 日韩一区精品字幕| 91精品一区二区三区久久久久久| 日本sm残虐另类| 2023国产精品| 成人网在线播放| 亚洲日本va午夜在线电影|