canvas2

canvas簡易畫板

<!DOCTYPE html>
<html lang="zh-CN">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>canvas 畫圖板</title>
        <style type="text/css">
            * {
                padding: 0;
                margin: 0;
            }
            body {
                display: flex;
                justify-content: center;
            }
            .options {
                display: flex;
                align-items: center;
                margin-top: 20px;
            }
            .options input {
                /* 清除input自帶的輪廓 */
                outline: 0;
                margin-left: 20px;
            }
            .options button {
                /* 簡單修飾一下按鈕 */
                /* 同樣清除輪廓 */
                outline: 0;
                /* 把邊框也去掉 */
                border: 0;
                padding: 10px 20px;
                /* 加個圓角 */
                border-radius: 3px;
                color: #fff;
                background-color: #0d53ff;
                /* 鼠標移入變小手 */
                cursor: pointer;
            }
            /* 給畫布一個邊框 */
            canvas {
                margin-top: 20px;
                border: 1px solid #000;
            }
            
        </style>
        <!-- <link rel="stylesheet" href="css/index.css" />
        <script src="js/index.js"></script> -->
    </head>
    <body>
        <!-- 不寫樣式 只為實現(xiàn)最后的畫圖效果 -->
        <div class="container">
            <div class="options">
                <label>畫筆顏色</label>
                <!-- value值可以設(shè)置默認的顏色 -->
                <input type="color" value="#7788ff" id="color" />
            </div>
            <div class="options">
                <label>畫筆粗細</label>
                <!-- value同樣設(shè)置默認的值 -->
                <!-- min為最小取值 -->
                <!-- max為最大取值 -->
                <input type="range" value="5" min="1" max="50" id="range" />
            </div>
            <div class="options">
                <button id="clear">清空畫布</button>
            </div>
            <canvas width="1000" height="500"></canvas>
        </div>
        <script type="text/javascript">
            window.addEventListener("load", () => {
                // 獲取顏色元素
                const color = document.querySelector("#color");
                // 獲取range元素
                const range = document.querySelector("#range");
                // 設(shè)置初始的畫筆顏色和粗細 畫圖時用的
                let colorValue = color.value,
                    rangeValue = range.value;
                // 給顏色選擇器加onchange事件 以此來更新顏色
                color.addEventListener("change", () => {
                    // 變化之后就會改變value值
                    colorValue = color.value;
                });
                // 同理來改變畫筆粗細
                range.addEventListener("change", () => {
                    rangeValue = range.value;
                });
            
                // ok現(xiàn)在開始畫圖了
                // 先獲取畫布
                const cvs = document.querySelector("canvas");
                // 再返回一個2d的繪圖環(huán)境
                const ctx = cvs.getContext("2d");
                // 給畫布添加鼠標按下事件
                let flag = false;
                cvs.addEventListener("mousedown", (e) => {
                    // 按下之后讓flag變成true
                    flag = true;
                    // 這里我們要獲取鼠標的坐標來確定畫布里面的初始位置
                    // 先獲取畫布距離瀏覽器可視區(qū)的頂部和左部的大小
                    // getBoundingClientRect這個方法內(nèi)有六個值 分別是 left top  right bottom 和 width height 代表當(dāng)前元素的寬度和高度
                    const top = cvs.getBoundingClientRect().top;
                    const left = cvs.getBoundingClientRect().left;
                    // 然后求出鼠標在畫布內(nèi)容的位置
                    // 計算方式依然是 鼠標距離整個瀏覽器可視區(qū)域的距離減去畫布距離瀏覽器的距離
                    const mouseX = e.pageX - left;
                    const mouseY = e.pageY - top;
                    // 這樣就獲取到了
                    // 可以開始繪圖了
                    // 先設(shè)置好繪圖的畫筆顏色和粗細
                    ctx.strokeStyle = colorValue;
                    ctx.lineWidth = rangeValue;
                    // 這里再設(shè)置一個屬性
                    // 繪制的圖像是圓角的
                    ctx.lineCap = "round";
                    // 開啟一個路徑
                    ctx.beginPath();
                    // 然后確定開始繪圖的起點位置
                    ctx.moveTo(mouseX, mouseY);
                });
                // 現(xiàn)在在加鼠標移動事件就可以繪圖了
                cvs.addEventListener("mousemove", (e) => {
                    // 同樣的方式獲取鼠標位置 復(fù)制一下
                    const top = cvs.getBoundingClientRect().top;
                    const left = cvs.getBoundingClientRect().left;
                    const mouseX = e.pageX - left;
                    const mouseY = e.pageY - top;
                    // OK 這樣就可以保證按下在開始畫了
                    if (flag) {
                        // 然后就開始連接線條了
                        // 這個用來確定要去的位置
                        ctx.lineTo(mouseX, mouseY);
                        // 封閉連接
                        ctx.stroke();
                    }
                });
                // ok 現(xiàn)在我們需要鼠標按下才繪圖
                // 用最笨的方法 立一個flag 哈哈
                // 現(xiàn)在鼠標彈起了還繪圖 加一個鼠標彈起事件
                cvs.addEventListener("mouseup", () => {
                    // flag為fasle即可
                    flag = false;
                });
                // 現(xiàn)在實現(xiàn)清空畫布
                // 獲取按鈕
                const clear = document.querySelector("#clear");
                clear.addEventListener("click", () => {
                    // clearRect方法可以清空一定區(qū)域內(nèi)的內(nèi)容 填寫的值為x坐標 y坐標 清除的寬度 和 高度 我們?nèi)恳宄?所以直接從左上角開始 寬高為畫布的寬高了 再來試試
                    ctx.clearRect(0, 0, 1000, 500);
                    // OK了
                });
            });
            
        </script>
    </body>
</html>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末弯予,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子个曙,更是在濱河造成了極大的恐慌锈嫩,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垦搬,死亡現(xiàn)場離奇詭異呼寸,居然都是意外死亡,警方通過查閱死者的電腦和手機猴贰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門对雪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人米绕,你說我怎么就攤上這事瑟捣。” “怎么了义郑?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵蝶柿,是天一觀的道長。 經(jīng)常有香客問我非驮,道長交汤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任劫笙,我火速辦了婚禮芙扎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘填大。我一直安慰自己戒洼,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布允华。 她就那樣靜靜地躺著圈浇,像睡著了一般寥掐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上磷蜀,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天召耘,我揣著相機與錄音,去河邊找鬼褐隆。 笑死污它,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的庶弃。 我是一名探鬼主播衫贬,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼歇攻!你這毒婦竟也來了固惯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤掉伏,失蹤者是張志新(化名)和其女友劉穎缝呕,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斧散,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡供常,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸡捐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栈暇。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖箍镜,靈堂內(nèi)的尸體忽然破棺而出源祈,到底是詐尸還是另有隱情,我是刑警寧澤色迂,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布香缺,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜过牙,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一域滥、第九天 我趴在偏房一處隱蔽的房頂上張望泛豪。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舷夺。三九已至苦酱,卻和暖如春售貌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疫萤。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工趁矾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人给僵。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像详拙,于是被迫代替她去往敵國和親帝际。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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