HTML 中的 Canvas 樣式設置全解

在 HTML5 中,<canvas> 元素提供了一個強大的繪圖接口,允許開發者通過 JavaScript 實現各種圖形和動畫效果。為了充分利用 <canvas> 的功能,理解其樣式設置是至關重要的。本文將詳細介紹如何在 HTML 中設置 <canvas> 的各種樣式屬性,幫助你實現更加豐富和靈活的繪圖效果。


1. 基礎設置
1.1 創建 Canvas

首先,在 HTML 文件中添加一個 <canvas> 元素:

<canvas id="myCanvas" width="500" height="500"></canvas>

注意:widthheight 屬性定義了畫布的實際尺寸(以像素為單位),而 CSS 樣式中的寬度和高度僅影響畫布的顯示大小。

1.2 獲取 Canvas 上下文

在 JavaScript 文件中,使用 getContext('2d') 方法獲取 canvas 的上下文對象:

const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');

2. 顏色與透明度
2.1 設置填充顏色

使用 fillStyle 屬性設置填充顏色:

ctx.fillStyle = 'red'; // 設置填充顏色為紅色

也可以使用 RGB 或 RGBA 格式:

ctx.fillStyle = 'rgba(255, 0, 0, 0.5)'; // 半透明紅色
2.2 設置描邊顏色

使用 strokeStyle 屬性設置描邊顏色:

ctx.strokeStyle = 'blue'; // 設置描邊顏色為藍色

同樣支持 RGB 和 RGBA 格式:

ctx.strokeStyle = 'rgba(0, 0, 255, 0.5)'; // 半透明藍色
2.3 設置透明度

使用 globalAlpha 屬性設置整個畫布的透明度:

ctx.globalAlpha = 0.5; // 設置透明度為50%

3. 線條樣式
3.1 設置線條寬度

使用 lineWidth 屬性設置線條寬度:

ctx.lineWidth = 5; // 設置線條寬度為5px
3.2 設置線條端點樣式

使用 lineCap 屬性設置線條端點樣式,可選值有 'butt''round''square'

ctx.lineCap = 'round'; // 設置線條端點為圓形
3.3 設置線條連接樣式

使用 lineJoin 屬性設置線條連接處的樣式,可選值有 'bevel''round''miter'

ctx.lineJoin = 'round'; // 設置線條連接處為圓角
3.4 設置虛線樣式

使用 setLineDash 方法設置虛線樣式,參數為數組 [實線長度, 空白長度]

ctx.setLineDash([10, 5]); // 設置虛線樣式為10px實線,5px空白
3.5 設置虛線偏移量

使用 lineDashOffset 屬性設置虛線偏移量:

ctx.setLineDash([10, 5]);
ctx.lineDashOffset = 5; // 設置虛線偏移量為5px

4. 文本樣式
4.1 設置字體

使用 font 屬性設置字體樣式,格式類似于 CSS 字體屬性:

ctx.font = 'italic bold 20px Arial'; // 設置字體樣式為斜體、加粗、20px的Arial字體
4.2 設置文本對齊方式

使用 textAlign 屬性設置文本對齊方式,可選值有 'left''center''right'

ctx.textAlign = 'center'; // 設置文本對齊方式為居中
4.3 設置文本基線

使用 textBaseline 屬性設置文本基線,可選值有 'top''middle''bottom''alphabetic'

ctx.textBaseline = 'middle'; // 設置文本基線為中間

5. 漸變與陰影
5.1 線性漸變

使用 createLinearGradient 方法創建線性漸變:

const gradient = ctx.createLinearGradient(0, 0, 200, 0); // 創建從左到右的線性漸變
gradient.addColorStop(0, 'red'); // 漸變起始顏色為紅色
gradient.addColorStop(1, 'blue'); // 漸變結束顏色為藍色
ctx.fillStyle = gradient; // 使用漸變作為填充顏色
5.2 徑向漸變

使用 createRadialGradient 方法創建徑向漸變:

const gradient = ctx.createRadialGradient(100, 100, 0, 100, 100, 100); // 創建徑向漸變
gradient.addColorStop(0, 'red'); // 漸變中心顏色為紅色
gradient.addColorStop(1, 'blue'); // 漸變邊緣顏色為藍色
ctx.fillStyle = gradient; // 使用漸變作為填充顏色
5.3 設置陰影

使用 shadowColorshadowOffsetXshadowOffsetYshadowBlur 屬性設置陰影效果:

ctx.shadowOffsetX = 10; // 設置陰影水平偏移10px
ctx.shadowOffsetY = 10; // 設置陰影垂直偏移10px
ctx.shadowBlur = 5; // 設置陰影模糊半徑5px

6. 裁剪與變換
6.1 裁剪區域

使用 clip 方法裁剪當前路徑:

ctx.beginPath();
ctx.arc(100, 75, 50, 0, Math.PI * 2, true); // 創建一個圓形路徑
ctx.clip(); // 將該圓形路徑作為裁剪區域
ctx.fillStyle = 'green';
ctx.fillRect(0, 0, 200, 150); // 只有圓形區域內的部分會被填充
6.2 平移變換

使用 translate 方法平移坐標系:

ctx.translate(50, 50); // 將坐標系原點平移到(50, 50)
6.3 縮放變換

使用 scale 方法縮放坐標系:

ctx.scale(2, 2); // 將坐標系縮放2倍
6.4 旋轉變換

使用 rotate 方法旋轉坐標系:

ctx.rotate(Math.PI / 4); // 將坐標系旋轉45度(π/4弧度)
6.5 復合變換

可以組合使用 saverestore 方法保存和恢復變換狀態:

ctx.save(); // 保存當前變換狀態
ctx.translate(50, 50);
ctx.scale(2, 2);
ctx.restore(); // 恢復之前的變換狀態

7. 圖像處理
7.1 繪制圖像

使用 drawImage 方法繪制圖像:

const img = new Image();
img.src = 'your-image-url.jpg';
img.onload = () => {ctx.drawImage(img, 0, 0, 200, 150); // 在(0, 0)位置繪制寬200px高150px的圖像
};
7.2 圖像裁剪

可以通過指定裁剪區域來裁剪圖像:

ctx.drawImage(img, 0, 0, 100, 100, 0, 0, 200, 200); // 裁剪圖像并放大顯示
7.3 圖像濾鏡

雖然 <canvas> 不直接支持 CSS 濾鏡,但可以通過 getImageDataputImageData 方法進行像素級操作來實現類似效果。例如,簡單的灰度轉換:

const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
const data = imageData.data;for (let i = 0; i < data.length; i += 4) {const r = data[i];const g = data[i + 1];const b = data[i + 2];// 計算灰度值const gray = 0.299 * r + 0.587 * g + 0.114 * b;// 設置灰度值data[i] = gray;     // Reddata[i + 1] = gray; // Greendata[i + 2] = gray; // Blue
}ctx.putImageData(imageData, 0, 0);

8. 其他功能
8.1 測量文本寬度

使用 measureText 方法測量文本寬度:

const metrics = ctx.measureText('Hello World');
console.log(metrics.width); // 輸出文本的寬度
8.2 清除畫布

使用 clearRect 方法清除畫布:

ctx.clearRect(0, 0, canvas.width, canvas.height); // 清除整個畫布
8.3 更新畫布

在 HTML 中,通常不需要顯式調用更新方法,因為所有的繪圖操作都會立即生效。但在某些框架或庫中,可能需要手動刷新畫布。


示例代碼

以下是一個完整的示例代碼,展示了如何使用上述的各種樣式設置來繪制復雜的圖形:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Canvas Styles</title><style>body {display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;background-color: #f0f0f0;}canvas {border: 1px solid black;}</style>
</head>
<body><canvas id="myCanvas" width="500" height="500"></canvas><script>const canvas = document.getElementById('myCanvas');const ctx = canvas.getContext('2d');// 設置背景顏色ctx.fillStyle = '#f0f0f0';ctx.fillRect(0, 0, canvas.width, canvas.height);// 繪制一個矩形ctx.fillStyle = 'rgba(255, 0, 0, 0.5)';ctx.fillRect(50, 50, 200, 100);// 繪制一條帶虛線的路徑ctx.beginPath();ctx.moveTo(50, 200);ctx.lineTo(250, 200);ctx.setLineDash([10, 5]);ctx.stroke();// 設置文字樣式并繪制文本ctx.font = 'italic bold 24px Arial';ctx.textAlign = 'center';ctx.textBaseline = 'middle';ctx.fillStyle = 'blue';ctx.fillText('Hello Canvas', 250, 300);// 創建并應用線性漸變const gradient = ctx.createLinearGradient(0, 0, 200, 0);gradient.addColorStop(0, 'red');gradient.addColorStop(1, 'blue');ctx.fillStyle = gradient;ctx.fillRect(50, 350, 200, 50);// 應用陰影ctx.shadowColor = 'rgba(0, 0, 0, 0.5)';ctx.shadowOffsetX = 10;ctx.shadowOffsetY = 10;ctx.shadowBlur = 5;ctx.fillStyle = 'green';ctx.fillRect(300, 50, 150, 100);// 平移、縮放和旋轉變換ctx.save();ctx.translate(300, 300);ctx.scale(2, 2);ctx.rotate(Math.PI / 4);ctx.fillStyle = 'purple';ctx.fillRect(-25,

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/70599.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70599.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/70599.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【論文解析】Fast prediction mode selection and CU partition for HEVC intra coding

級別:IET Image Processing(2020)CCF CSCI 4區時間:2020年機構:蘇州大學下載地址:Fast prediction mode selection and CU partition for HEVC intra coding摘要 HEVC確實是一個很大的進步,編碼效率翻倍,但計算復雜度也增加了不少。為了解決這個問題,提出了兩種算法:…

大數據組件(四)快速入門實時數據湖存儲系統Apache Paimon(2)

Paimon的下載及安裝&#xff0c;并且了解了主鍵表的引擎以及changelog-producer的含義參考&#xff1a; 大數據組件(四)快速入門實時數據湖存儲系統Apache Paimon(1) 利用Paimon表做lookup join&#xff0c;集成mysql cdc等參考&#xff1a; 大數據組件(四)快速入門實時數據…

智慧校園系統在學生學習與生活中的應用

隨著科技的快速發展&#xff0c;智慧校園系統逐漸成為現代教育不可或缺的一部分。它整合了先進的信息技術、物聯網技術以及人工智能等&#xff0c;旨在構建一個全面、智能、個性化的學習與生活環境。對于學生而言&#xff0c;這一系統不僅能夠極大地提高學習效率&#xff0c;還…

基于Flask的京東商品信息可視化分析系統的設計與實現

【Flask】基于Flask的京東商品信息可視化分析系統的設計與實現&#xff08;完整系統源碼開發筆記詳細部署教程&#xff09;? 目錄 一、項目簡介二、項目界面展示三、項目視頻展示 一、項目簡介 系統能夠靈活地執行SQL查詢&#xff0c;提取出用于分析的關鍵數據指標。為了將這…

Electron通過ffi-napi調用dll導出接口

electron使用ffi-napi環境搭建 附打包好的ffi-napi可以直接放到項目目錄下使用&#xff0c;避免以后麻煩 一、安裝node.js Node.js官網&#xff1a;https://nodejs.org/zh-cn/download&#xff0c;選擇LTS長期穩定版本即可 需要注意Node.js 區分32和64位&#xff0c;32位版…

25工程管理研究生復試面試問題匯總 工程管理專業知識問題很全! 工程管理復試全流程攻略 工程管理考研復試真題匯總

工程管理復試面試心里沒底&#xff1f;別慌&#xff01;學姐手把手教你怎么應對復試&#xff01; 很多同學面對復試總擔心踩坑&#xff0c;其實只要避開雷區掌握核心技巧&#xff0c;逆襲上岸完全有可能&#xff01;這份保姆級指南幫你快速鎖定重點&#xff0c;時間緊迫優先背…

深藍學院自主泊車第3次作業-IPM

目錄 1 題目介紹2 求解 1 題目介紹 已知魚眼相機的參數&#xff0c; image_width&#xff0c;表示圖像的寬度image_height&#xff0c;表示圖像的高度 ξ \xi ξ&#xff0c;表示魚眼相機參數 k 1 k_1 k1?、 k 2 k_2 k2?&#xff0c;表示徑向相機參數 p 1 p_1 p1?、 p 2 p…

核貨寶助力連鎖門店訂貨數字化轉型升級

在競爭激烈的連鎖零售行業&#xff0c;傳統訂貨模式弊端日益凸顯&#xff0c;嚴重制約著企業的發展。核貨寶訂貨系統以其卓越的數字化解決方案&#xff0c;為連鎖門店訂貨帶來了全方位的變革&#xff0c;助力企業實現數字化轉型升級&#xff0c;在市場中搶占先機。 一、增強總部…

2.最多提取子串數目(100分)-附帶Java逐行解析

題目 給定 [a-z]&#xff0c;26個英文字母小寫字符串組成的字符串 A 和 B&#xff0c;其中 A 可能存在重復字母&#xff0c;B 不會存在重復字母&#xff0c;現從字符串 A 中按規則挑選一些字母&#xff0c;可以組成字符串B。 挑選規則如下&#xff1a; 同一個位置的字母只能挑…

AutoGen 技術博客系列 八:深入剖析 Swarm—— 智能體協作的新范式

本系列博文在掘金同步發布, 更多優質文章&#xff0c;請關注本人掘金賬號&#xff1a; 人肉推土機的掘金賬號 AutoGen系列一&#xff1a;基礎介紹與入門教程 AutoGen系列二&#xff1a;深入自定義智能體 AutoGen系列三&#xff1a;內置智能體的應用與實戰 AutoGen系列四&am…

力扣每日一題【算法學習day.132】

前言 ###我做這類文章一個重要的目的還是記錄自己的學習過程&#xff0c;我的解析也不會做的非常詳細&#xff0c;只會提供思路和一些關鍵點&#xff0c;力扣上的大佬們的題解質量是非常非常高滴&#xff01;&#xff01;&#xff01; 習題 1.統計相似字符串對的數目 題目鏈…

C語言.h頭文件的寫法

頭文件的內容 #ifndef __SEQUENCE_LIST_H // 定義以防止遞歸包含 #define __SEQUENCE_LIST_H // (1)、其它頭文件 #include <stdio.h> #include <stdlib.h> #include <strings.h> #include <stdbool.h> // (2)、宏定義(函數、變量、常量) // (3)、…

Spring AI + Ollama 實現調用DeepSeek-R1模型API

一、前言 隨著人工智能技術的飛速發展&#xff0c;大語言模型&#xff08;LLM&#xff09;在各個領域的應用越來越廣泛。DeepSeek 作為一款備受矚目的國產大語言模型&#xff0c;憑借其強大的自然語言處理能力和豐富的知識儲備&#xff0c;迅速成為業界關注的焦點。無論是文本生…

自學Java-AI結合GUI開發一個石頭迷陣的游戲

自學Java-AI結合GUI開發一個石頭迷陣的游戲 準備環節1、創建石頭迷陣的界面2、打亂順序3、控制上下左右移動4、判斷是否通關5、統計移動步驟&#xff0c;重啟游戲6、拓展問題 準備環節 技術&#xff1a; 1、GUI界面編程 2、二維數組 3、程序流程控制 4、面向對象編程 ? \bulle…

C語言的內存分配:malloc和free

使用庫函數分配和管理內存。在運行時&#xff0c;分配更多的內存給程序使用&#xff0c;主要工具是malloc函數&#xff0c;這個函數接受一個參數&#xff1a;所需要要的內存字節數。malloc函數會找到合適的空閑內存塊&#xff0c;這樣的內存是匿名的&#xff0c;即malloc分配了…

本地安裝 Grafana Loki

本地安裝 Grafana Loki 一、 安裝 Loki1. 下載 Loki2. 創建 Loki 配置文件3. 創建 Loki 服務 二、安裝 Promtail1. 下載 Promtail2. 創建 Promtail 配置文件3. 創建 Promtail 服務 三、 安裝 Grafana四、啟動所有服務五、添加loki 數據源1. 添加儀表板2. 日志查詢面板 json 參考…

趣味數學300題1981版-十五個正方形

分析&#xff1a;移動兩根變成11個正方形很簡單&#xff1a; 移動4根變成15個正方形&#xff0c;分析&#xff1a; 一個田字格包含5個正方形&#xff0c;若要15個正方形需要3個田字格&#xff0c;如果3個田字格完全不重合&#xff0c;需要6*318根火柴。如果合并正方形的邊&…

IDEA——Mac版快捷鍵

目錄 按鍵含義常用組合代碼生成快捷鍵&#xff1a;代碼追蹤快捷鍵&#xff1a;高效編輯快捷鍵&#xff1a;代碼重構快捷鍵&#xff1a;工具類快捷鍵&#xff1a;常規文件操作快捷鍵&#xff1a; 按鍵含義 ? command Command鍵&#xff08;?&#xff09;相當于Windows中的Con…

基于Spring Boot的興順物流管理系統設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

Prompt:創造性的系統分析者

分享的提示詞&#xff1a; 你是一個創造性的系統分析者&#xff0c;作為咨詢師&#xff0c;你具有以下特質&#xff1a; 基礎能力&#xff1a; 深入理解我的系統性模式 識別模式間的隱藏聯系 發現出人意料的關聯 提供令人驚訝的洞見 工作方式&#xff1a; 在每次回應中至少…