map系列(一)——canvas

近期工作用到了map相關(guān)的一些知識(shí),有些資料找起來(lái)著實(shí)費(fèi)勁奔滑。忙里偷閑,順手整理一下啦顺少。(≧▽≦)/啦啦啦朋其。

首先呢,是canvas脆炎。

?先來(lái)個(gè)simple demo

涂鴉畫(huà)板.png
?實(shí)現(xiàn)功能:
  • 選擇畫(huà)筆顏色
  • 繪畫(huà)
  • 橡皮擦
  • 清空畫(huà)板
?核心技能:
  • 獲取鼠標(biāo)在畫(huà)板中的位置
  • canvas繪畫(huà)

?canvas相關(guān)

  • canvas是一個(gè)可以使用腳本在其中繪制圖形的HTML元素梅猿。注意:無(wú)論canvas 上畫(huà)多少東西膜眠,canvas都始終是單個(gè)元素统诺。
  • canvas標(biāo)簽只有兩個(gè)非通用屬性width和height,canvas默認(rèn)的大小為300*150.
  • canvas元素也和普通的元素一樣逾一,有margin几蜻,border喇潘,background等屬性。
  • 如果在canvas繪制出來(lái)的圖像是扭曲的梭稚,嘗試在<canvas>的屬性中明確規(guī)定寬和高颖低,而不是使用CSS。
  • 基本用法
  • 元素引入
    <canvas id="canvas" width="600" height="400">
    <p>瀏覽器不支持canvas</p>
    </canvas>
  • 渲染上下文
    • canvas本身不具備畫(huà)圖形的功能哨毁,一切都是由canvas內(nèi)部的CanvasRenderingContext2D對(duì)象來(lái)做的。
  • 繪制矩形
    • canvas只支持一種原生的圖形繪制:矩形源武。所有其他圖形的繪制都至少需要生成一條路徑扼褪。

    • canvas提供三種繪制矩形的方法

      • fillRect(x,y,width,height) 繪制一個(gè)填充的矩形
      • strokeRect(x,y,width,height) 繪制一個(gè)矩形的邊框
      • clearRect(x,y,width,height) 清除指定矩形矩形,讓清除部分完全透明
    • 繪制線段
      1.開(kāi)始路徑 ctx.beginPath()
      2.設(shè)置起點(diǎn) ctx.moveTo(x,y)
      3.設(shè)置終點(diǎn) ctx.lineTo(x,y)
      4.繪制 ctx.stroke()
      5.結(jié)束路徑 ctx.closePath()

    • 繪制三角形

      • 利用繪制線段的原理繪制三角形
    • 繪制弧形

    • 繪制弧形的參數(shù)分別是:弧形圓心x坐標(biāo)粱栖、y坐標(biāo)话浇、半徑、起始角(以三點(diǎn)鐘的位置開(kāi)始)闹究、結(jié)束角幔崖、方向(true表示逆時(shí)針,false表示順時(shí)針)

      • ctx.arc(600,200,100,0,Math.PI*2,false);
    • 繪制貝塞爾曲線:

      • 二次貝塞爾曲線:ctx.quadraticCurveTo (cpx, cpy, x, y)參數(shù)是控制點(diǎn)x坐標(biāo),控制點(diǎn)y坐標(biāo),結(jié)束點(diǎn)x坐標(biāo)和結(jié)束點(diǎn)y坐標(biāo)

      • 三次貝塞爾曲線 ctx.bezierCurveTo (cp1x, cp1y, cp2x, cp2y, x, y)參數(shù)是控制點(diǎn)1的x坐標(biāo)和控制點(diǎn)1的y坐標(biāo)赏寇、控制點(diǎn)2的x坐標(biāo)和控制點(diǎn)2的y坐標(biāo)吉嫩、結(jié)束點(diǎn)x坐標(biāo)和結(jié)束點(diǎn)y坐標(biāo)

三次貝塞爾曲線繪制.png

?完整代碼如下,注釋有詳解

   <!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
    <style type="text/css">
        *{
            margin: 0;
            padding: 0;
        }
        
        #box{
            width: 600px;
            height: 500px;
            margin: 100px auto;
            border: 1px solid black;
        }
        
        #box .control{
            height: 100px;
        }
        
        #box .control div{
            height: 50px;
            line-height: 50px;
        }
        
        #box .control .changeColor{
            padding-left: 15px;
        }
        
        #box .control .changeColor input{
            width: 30px;
            height: 30px;
            margin: 0 15px;
            font-size: 0;
            /*background-color: orange;*/
            vertical-align: middle;
        }
        
        #box .control .changeColor input:nth-of-type(1){
            background-color: black;
        }
        
        #box .control .changeColor input:nth-of-type(2){
            background-color: pink;
        }
        
        #box .control .changeColor input:nth-of-type(3){
            background-color: red;
        }
        
        #box .control .changeColor input:nth-of-type(4){
            background-color: orange;
        }
        
        #box .control .changeColor input:nth-of-type(5){
            background-color: brown;
        }
        
        #box .control .changeColor input:nth-of-type(6){
            background-color: purple;
        }
        
        #box .control .clear{
            height: 50px;
        }
        
        #box .control .clear input{
            width: 100px;
            height: 50px;
            margin: 0 15px;
            font-size: 20px;
            background-color: #FDF5E5;
        }
        
        #canvas{
            background-color: #FFEBCB;
        }
        
        b{
            font-size: 20px;
        }
        
        
    </style>
</head>
<body>
    <div id="box">
        <div class="control">
            <div class="changeColor">
                選擇畫(huà)筆顏色:
                <input type="button" value="黑色" />
                <input type="button" value="粉色" />
                <input type="button" value="紅色"/>
                <input type="button" value="橘色"/>
                <input type="button" value="棕色" />
                <input type="button" value="紫色" />
            </div>
            <div class="clear">
                <input type="button" value="清空畫(huà)布" id="clearAllBtn" />
                當(dāng)前選中的顏色:<b>黑色</b>
                <input type="button" value="橡皮擦" id="rubberBtn" />
            </div>
        </div>
        <canvas id="canvas" width="600" height="400"></canvas>
    </div>
    <script type="text/javascript">
        var cvs = document.querySelector("#canvas");
        var ctx = canvas.getContext("2d");      
        
        //記錄坐標(biāo)的對(duì)象(用來(lái)給move使用)
        var pointerObj = {
            
        }
        //切換橡皮擦的狀態(tài)
        var isRubber = false;
        
        //按下
        cvs.addEventListener('mousedown', function (e) {
            var x = e.offsetX;
            var y = e.offsetY;
            
            console.log(x + " : " + y);
            
            pointerObj.x = x;
            pointerObj.y = y;
            
            if (isRubber) {
                //橡皮擦
                rubberFn(x, y); 
            } else {
                //畫(huà)畫(huà)
                draw(x, y);
            }
            
            
            //移動(dòng)和抬起
            this.addEventListener('mousemove', move);
            this.addEventListener('mouseup', up);
        })
        
        //移動(dòng)
        function move (e) {
            var x = e.offsetX;
            var y = e.offsetY;
            
            if (isRubber) {
                //橡皮擦
                rubberFn(x, y); 
            } else {
                //畫(huà)畫(huà)
                draw(x, y);
            }
            
            //在移動(dòng)的時(shí)候把之前的存儲(chǔ)起來(lái)
            pointerObj.x = x;
            pointerObj.y = y;
        }
        
        //抬起
        function up () {
            cvs.removeEventListener('mousemove', move);
        }
        
        //畫(huà)畫(huà)
        function draw (x, y) {
            ctx.beginPath();
            ctx.lineWidth = 5;
            //設(shè)置樣式為圓頭
            ctx.lineCap = "round";
            ctx.moveTo(x, y);
            ctx.lineTo(pointerObj.x, pointerObj.y);
            ctx.stroke();
            ctx.closePath();
        }
        
        var colorBtns = document.querySelectorAll('.changeColor input');
        for (var i = 0; i < colorBtns.length; i++) {
            colorBtns[i].onclick = changeColor;
        }
        
        //改變畫(huà)筆顏色
        function changeColor () {
            ctx.strokeStyle = getComputedStyle(this, null).backgroundColor;
            var b = document.querySelector("b");
            b.style.color = ctx.strokeStyle;
            b.innerHTML = this.value;
            
            //改變橡皮擦的狀態(tài)
            isRubber = false;
        }
        
        var clearAllBtn = document.querySelector("#clearAllBtn");
        var rubberBtn = document.querySelector("#rubberBtn");
        
        //清空畫(huà)布
        clearAllBtn.onclick = function () {
            ctx.clearRect(0, 0, cvs.width, cvs.height);
        }
        
        //橡皮擦按鈕
        rubberBtn.onclick = function () {
            //開(kāi)啟橡皮擦功能
            isRubber = true;
        }
        
        //橡皮擦功能
        function rubberFn (x, y) {
            ctx.beginPath();
            //裁剪之前先把當(dāng)前場(chǎng)景保存下來(lái)
            ctx.save();
            //裁剪區(qū)域
            ctx.arc(x, y, 20, 0, Math.PI * 2, false);
            //裁剪
            ctx.clip();
            //在裁剪之后畫(huà)一個(gè)清空矩形嗅定,但根據(jù)裁剪的原理自娩,只有在裁剪區(qū)域才生效
            ctx.clearRect(0, 0, cvs.width, cvs.height);
            //然后在還原之前的場(chǎng)景
            ctx.restore();
            ctx.closePath();
        }
        
        
        
        
    </script>
</body>
</html>
?推薦一個(gè)特別贊的學(xué)習(xí)canvas的網(wǎng)站,簡(jiǎn)直不能再完美http://bucephalus.org/text/CanvasHandbook/CanvasHandbook.html
?下次見(jiàn).gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末渠退,一起剝皮案震驚了整個(gè)濱河市忙迁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碎乃,老刑警劉巖姊扔,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異梅誓,居然都是意外死亡恰梢,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)证九,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)删豺,“玉大人,你說(shuō)我怎么就攤上這事愧怜⊙揭常” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵拥坛,是天一觀的道長(zhǎng)蓬蝶。 經(jīng)常有香客問(wèn)我,道長(zhǎng)猜惋,這世上最難降的妖魔是什么丸氛? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮著摔,結(jié)果婚禮上缓窜,老公的妹妹穿的比我還像新娘。我一直安慰自己谍咆,他們只是感情好禾锤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著摹察,像睡著了一般恩掷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上供嚎,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天黄娘,我揣著相機(jī)與錄音峭状,去河邊找鬼。 笑死逼争,一個(gè)胖子當(dāng)著我的面吹牛优床,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播氮凝,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼羔巢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了罩阵?” 一聲冷哼從身側(cè)響起竿秆,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稿壁,沒(méi)想到半個(gè)月后幽钢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡傅是,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年匪燕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喧笔。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡帽驯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出书闸,到底是詐尸還是另有隱情尼变,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布浆劲,位于F島的核電站嫌术,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏牌借。R本人自食惡果不足惜度气,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望膨报。 院中可真熱鬧磷籍,春花似錦、人聲如沸现柠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)晒旅。三九已至栅盲,卻和暖如春汪诉,著一層夾襖步出監(jiān)牢的瞬間废恋,已是汗流浹背谈秫。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鱼鼓,地道東北人拟烫。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像迄本,于是被迫代替她去往敵國(guó)和親硕淑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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

  • 一:canvas簡(jiǎn)介 1.1什么是canvas嘉赎? ①:canvas是HTML5提供的一種新標(biāo)簽 ②:HTML5 ...
    GreenHand1閱讀 4,683評(píng)論 2 32
  • 一置媳、canvas簡(jiǎn)介 1.1 什么是canvas?(了解) 是HTML5提供的一種新標(biāo)簽 Canvas是一個(gè)矩形區(qū)...
    Looog閱讀 3,942評(píng)論 3 40
  • 神奇且強(qiáng)大的canvas 一.Canvas的基本介紹 1.什么是Canvas 定義:是HTML5提供的一種新標(biāo)簽,...
    Ainy塵世繁花終凋落閱讀 10,761評(píng)論 1 18
  • 一公条、canvas簡(jiǎn)介 1.1 什么是canvas拇囊?(了解) 是HTML5提供的一種新標(biāo)簽 Canvas是一個(gè)矩形區(qū)...
    J_L_L閱讀 1,516評(píng)論 0 4
  • 第一天,我打開(kāi)了窗 沒(méi)有月亮靶橱、星星的夜晚 我看見(jiàn)寥袭,你在閃閃發(fā)光 第二天,我在窗臺(tái)放了一盆花 我最?lèi)?ài)的一朵白薔薇 今...
    西巷舊時(shí)閱讀 145評(píng)論 2 13