HTML5 學習筆記(四)——canvas繪圖、WebGL、SVG

来源:http://www.cnblogs.com/SeeYouBug/archive/2016/12/03/6127050.html
-Advertisement-
Play Games

一、Canvas canvas是HTML5中新增一個HTML5標簽與操作canvas的javascript API,它可以實現在網頁中完成動態的2D與3D圖像技術。<canvas> 標記和 SVG以及 VML 之間的一個重要的不同是,<canvas> 有一個基於 JavaScript 的繪圖 API ...


一、Canvas

canvas是HTML5中新增一個HTML5標簽與操作canvas的javascript API,它可以實現在網頁中完成動態的2D與3D圖像技術。<canvas> 標記和 SVG以及 VML 之間的一個重要的不同是,<canvas> 有一個基於 JavaScript 的繪圖 API,而 SVG 和 VML 使用一個 XML 文檔來描述繪圖。SVG 繪圖很容易編輯與生成,但功能明顯要弱一些。

canvas可以完成動畫、游戲、圖表、圖像處理等原來需要Flash完成的一些功能。、

瀏覽器支持情況如下:

1.1、創建canvas元素

<canvas id="can" width="800"  height="600">不支持Canvas</canvas>

以上代碼創建了一個寬度為800像素,高度為600像素的canvas。不建議使用CSS樣式指定寬度和高度。
canvas標簽中間的內容為替代顯示內容,當瀏覽器不支持canvas標簽時會顯示出來。

創建了canvas元素後,要在canvas元素上面繪製圖象,首先必須獲取canvas環境上下文:
canvas.getContext(畫布上繪製的類型)
2d: 表示2維
experimental-webgl: 表示試驗版3維
webgl:表示3維

Hello Wolrd示例代碼:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>canvas繪圖1</title>
    </head>
    <body>
        <canvas id="canvas1" width="800" height="600"></canvas>
        <script type="text/javascript">
           //獲得畫布元素
            var canvas1=document.getElementById("canvas1");
            //獲得2維繪圖的上下文
            var ctx=canvas1.getContext("2d");
            
            //設置線寬
            ctx.lineWidth=10;
            //設置線的顏色
            ctx.strokeStyle="blue";
            
            //將畫筆移動到00點
            ctx.moveTo(0,0);
            //畫線到800,600的坐標
            ctx.lineTo(800,600);
            
            //執行畫線
            ctx.stroke();
        </script>
    </body>
</html>

運行效果:

在頁面上就顯示了一條直線,另存為後就是一張背景透明的png圖片。

練習:畫一個100X100的正方形在畫布正中央

1.2、畫線

context.moveTo(x,y)

把畫筆移動到x,y坐標,建立新的子路徑。

context.lineTo(x,y)
建立上一個點到x,y坐標的直線,如果沒有上一個點,則等同於moveTo(x,y),把(x,y)添加到子路徑中。

context.stroke()
描繪子路徑

            //設置線寬
            ctx.lineWidth = 10;
            //設置線的顏色
            ctx.strokeStyle = "blue";
            //將畫筆移到x0,y0處
            context.moveTo(x0, y0);
            //從x0,y0到x1,y1畫一條線
            ontext.lineTo(x1, y1);
            //從x1,y1到x2,y2畫條線
            ontext.lineTo(x2, y2);
            //執行填充
            ontext.fill();
            //執行畫線
            context.stroke();

 

結合javascript事件實現滑鼠自由劃線:

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>canvas繪圖2</title>
    </head>

    <body>
        <canvas id="canvas1" width="800" height="600"></canvas>
        <script type="text/javascript">
            //獲得畫布元素
            var canvas1 = document.getElementById("canvas1");
            //獲得2維繪圖的上下文
            var ctx = canvas1.getContext("2d");

            //設置線寬
            ctx.lineWidth = 10;
            //設置線的顏色
            ctx.strokeStyle = "blue";
            
            canvas1.onmousemove=function(e){
                //劃線到當前客戶端的x與y座標
                ctx.lineTo(e.clientX, e.clientY);
                //執行畫線
                ctx.stroke();
            }
        </script>
    </body>

</html>

運行效果:

移動手機端:

<!DOCTYPE html>
<html>

    <head>
        <meta charset="utf-8">
        <title></title>
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
        <script>
            var canvas1;
            var ctx;
            var width;
            var height;
            var msg;
            window.onload = function() {
                canvas1 = document.getElementById("canvas1");
                msg = document.getElementById("msg");
                ctx = canvas1.getContext("2d");
                width = canvas1.width;
                height = canvas1.height;
                ctx.fillRect(0, 0, width, height);
                ctx.moveTo(0, 0);
                ctx.lineTo(100, 100);
                ctx.strokeStyle = "red";
                ctx.lineWidth = 2;
                ctx.stroke();
                canvas1.onmousemove = function(e) {
                    ctx.lineTo(e.clientX, e.clientY);
                    ctx.stroke();
                }
                canvas1.ontouchmove = function(e) {
                    e.preventDefault();
                    var touchE=e.targetTouches[0]
                    msg.innerHTML += touchE.clientX+""+touchE.clientY+ "<br/>";
                    ctx.lineTo(touchE.clientX, touchE.clientY);
                    ctx.stroke();
                }
                canvas1.ontouchstart = function() {
                    msg.innerHTML += "ontouchstart" + "<br/>";
                }
                canvas1.ontouchend = function() {
                    msg.innerHTML += "ontouchend" + "<br/>";
                }
            }
        </script>
    </head>

    <body>
        <canvas id="canvas1" width="500" height="500">不支持</canvas>
        <div id="msg"></div>
    </body>

</html>
View Code

1.2.1、路徑與closePath,beginPath,fill

canvas的環境上下文中總有唯一一個路徑,路徑包含多個子路徑,這些子路徑可以看成是一系列點的集合。
beginPath()

清空子路徑,一般用於開始路徑的創建。在幾次迴圈地創建路徑的過程中,每次開始創建時都要調用beginPath函數。

closePath()

如果當前子路徑是打開的,就關閉它。否則把子路徑中的最後一個點和路徑中的第一個點連接起來,形成閉合迴路。

canvas繪圖有兩種模式,一種是fill,一種是stroke,fill是填充,stroke是描邊線,fillstyle,strokeStyle指定繪圖樣式

示例代碼:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>路徑與closePath,beginPath,fill</title>
    </head>
    <body>
        <canvas id="canvas1" width="600" height="600"></canvas>
        <script type="text/javascript">
            //獲得畫布元素
            var canvas1 = document.getElementById("canvas1");
            //獲得2維繪圖的上下文
            var ctx = canvas1.getContext("2d");

            //設置線寬
            ctx.lineWidth = 10;
            //設置線的顏色
            ctx.strokeStyle = "blue";
            
            ctx.moveTo(0,0);  //移動畫筆到0,0點
            ctx.lineTo(300,300);  //畫線到300,300的位置
            ctx.stroke();  //執行描邊
            
            ctx.beginPath();  //清空子路徑,一般用於開始路徑的創建
            ctx.strokeStyle = "red";
            ctx.moveTo(300,300);
            ctx.lineTo(0,595);  //畫線到0,300的位置
            ctx.lineTo(595,595);  //畫線到右下角
            ctx.closePath();  //閉合
            //ctx.stroke();  //執行描邊
            ctx.fillStyle="lightgreen";  //設置填充顏色
            ctx.fill();  //執行填充
        </script>
    </body>
</html>

運行效果:

練習:試著完成一個象棋或圍棋棋盤。

1.3、繪製矩形

context.strokeRect(x,y,width,height)
以x,y為左上角,繪製寬度為width,高度為height的矩形。

context.fillRect(x,y,width,height)
以x,y為左上角,填充寬度為width,高度為height的矩形。

context.clearRect(x,y,width,height)
清除以x,y為左上角,寬度為width,高度為height的矩形區域。

示例代碼:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>繪製矩形</title>
    </head>
    <body>
        <canvas id="canvas1" width="600" height="600"></canvas>
        <script type="text/javascript">
            //獲得畫布元素
            var canvas1 = document.getElementById("canvas1");
            //獲得2維繪圖的上下文
            var ctx = canvas1.getContext("2d");

            //設置線寬
            ctx.lineWidth = 10;
            //設置線的顏色
            ctx.strokeStyle ="dodgerblue";
            
            //畫一個空心的矩形,
            ctx.strokeRect(0,0,600,600);
            
            //畫一個實心矩形
            ctx.fillStyle="aquamarine";
            ctx.fillRect(200,200,200,200);
            
            //清除指定的矩形區域
            ctx.clearRect(250,250,100,100);
        </script>
    </body>
</html>

運行效果: 

1.4、繪製圓弧

context.arc(x,y,radius,startAngle,endAngle,anticlockwise)

arc方法用來繪製一段圓弧路徑,以(x,y)圓心位置radius為半徑、startAngle為起始弧度、endAngle為終止弧度來,而在畫圓弧時的旋轉方向則由最後一個參數 anticlockwise 來指定,如果為 true 就是逆時針,false 則為順時針,Math.PI * 2 剛好為一周。

示例代碼:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>繪製圓弧</title>
    </head>
    <body>
        <canvas id="canvas1" width="600" height="600"></canvas>
        <script type="text/javascript">
            //獲得畫布元素
            var canvas1 = document.getElementById("canvas1");
            //獲得2維繪圖的上下文
            var ctx = canvas1.getContext("2d");

            //設置線寬
            ctx.lineWidth = 10;
            //設置線的顏色
            ctx.strokeStyle ="dodgerblue";
            
            //畫一段圓弧,300,300是圓心,200是半徑,0是超始角度,Math.PI是結束角度,是否逆時鐘
            ctx.arc(300,300,200,0,Math.PI,false);
            //閉合
            ctx.closePath();
            ctx.stroke();
            ctx.beginPath();
            ctx.fillStyle="aquamarine";
            ctx.arc(300,300,100,0,Math.PI*2,false);
            ctx.fill();
        </script>
    </body>
</html>

運行效果:

 

練習:

a、模擬鐘錶的時,分,秒

b、模擬水波,一個黑色的屏幕,多個從中心隨機產生彩色的圈不斷的放大,接觸到屏幕結束。

1.5、繪製圖像

context.drawImage(image,x,y)

把image圖像繪製到畫布上x,y坐標位置。

context.drawImage(image,x,y,w,h)

把image圖像繪製到畫布上x,y坐標位置,圖像的寬度是w,高度是h。

context.drawImage(image,sx,sy,sw,sh,dx,dy,dw,dh)
截取image圖像以sx,sy為左上角坐標,寬度為sw,高度為sh的一塊矩形區域繪製到畫布上以dx,dy坐標位置,圖像寬度是dw,高度是dh。
其中image可以是htmlImageElement元素,htmlcanvasElement元素,htmlVideoElement元素

示例代碼:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>繪製圖像</title>
    </head>
    <body>
        <canvas id="canvas1" width="600" height="600"></canvas>
        <img src="img/apple.png" id="apple" hidden="hidden" />
        <script type="text/javascript">
           //必須當頁面中的圖片資源載入成功
            window.onload = function() {
                //獲得畫布元素
                var canvas1 = document.getElementById("canvas1");
                //獲得2維繪圖的上下文
                var ctx = canvas1.getContext("2d");

                //設置線寬
                ctx.lineWidth = 10;
                //設置線的顏色
                ctx.strokeStyle = "dodgerblue";
                ctx.moveTo(0,0);
                ctx.strokeRect(0,0,600,600);

                //圖片
                var apple = document.getElementById("apple");
                //將圖像繪製到畫布的,圖片的左上角
                ctx.drawImage(apple, 300-52, 300-63);
            }
        </script>
    </body>

</html>

運行效果:

1.6、繪製文字

context.fillText(text,x,y,[maxWidth])

在canvas上填充文字,text表示需要繪製的文字,x,y分別表示繪製在canvas上的橫,縱坐標,最後一個參數可選,表示顯示文字的最大寬度,防止文字顯示溢出。

context.strokeText(text,x,y,[maxWidth])

在canvas上描邊文字,參數的意義同fillText
使用context.font屬性設置字體
context.font='italic bolder 48px 黑體';

示例代碼:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>繪製文字</title>
    </head>
    <body>
        <canvas id="canvas1" width="600" height="600"></canvas>
        <img src="img/apple.png" id="apple" hidden="hidden" />
        <script type="text/javascript">
           //必須當頁面中的圖片

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • html: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>列表渲染</title></head><body> <!-- v-for可以將一組數組渲染到列表當中 --> <!-- 以item in items的形 ...
  • 為期半個月的項目實踐開發,已完整告一段落,團隊小組獲得第一名,辛苦總算沒有白費,想起有一天晚上,整個小組的人,聯調到12點才從公司回去,真是心酸。這裡總結一下,項目過程中遇到的問題 和感悟。哈哈,放張集體照。嘿嘿,項目所有的不同的team的小伙伴,一群優秀的小伙伴(大多都來自高校211,985)麽麽 ...
  • Special Characters #Latin-1 entity set for HTML capital O, slash #Latin Extended-A #Latin Extended-B #Spacing Modifier Letters Greek Punctuation Gener ...
  • 很多時候頁面都需要一個或者多個小型三角形!多數人直接用PS扣個圖片 下麵用CSS簡單畫幾個最終效果如下圖 ...
  • 提升指定樣式規則的應用優先權。 IE6及以下瀏覽器有個比較顯式的支持問題存在,!important在同一條規則集里不生效。請看下述代碼: 示例代碼: div { color: #f00 !important; color: #000; } 在上述代碼中,IE6及以下瀏覽器div的文本顏色為#000, ...
  • <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> #big { height: 800px; width: 800px; background-color: #00 ...
  • B/S結構的軟體項目中有時客戶端需要實時的獲得伺服器消息,但預設HTTP協議只支持請求響應模式,這樣做可以簡化Web伺服器,減少伺服器的負擔,加快響應速度,因為伺服器不需要與客戶端長時間建立一個通信鏈接,但不容易直接完成實時的消息推送功能,如聊天室、後臺信息提示、實時更新數據等功能,但通過polli ...
  • html: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>條件渲染</title></head><body> <!-- v-if 作為判斷條件 如果滿足則展示它所附著的元素的內容--> <!-- 除了v-if ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...