diff --git a/README.md b/README.md index b3bde7b..3f7ec45 100644 --- a/README.md +++ b/README.md @@ -102,6 +102,7 @@ Quick Reference [Emmet](./docs/emmet.md) [ES 6](./docs/es6.md) [HTML](./docs/html.md) +[HTML Canvas](./docs/canvas.md) [JavaScript](./docs/javascript.md) [jQuery](./docs/jquery.md) [Next.js](./docs/nextjs.md) diff --git a/assets/canvas.svg b/assets/canvas.svg new file mode 100644 index 0000000..873d320 --- /dev/null +++ b/assets/canvas.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/docs/canvas.md b/docs/canvas.md new file mode 100644 index 0000000..b18e29e --- /dev/null +++ b/docs/canvas.md @@ -0,0 +1,253 @@ +HTML Canvas 备忘清单 +=== + +这份 HTML Canvas 快速参考备忘单列出了常见的 HTML5 Canvas 设计标签,以易读的格式呈现。 + +入门 +--- + + +### 基本设置 + + +```html + + + + Canvas 示例 + + + + + + + +``` + +### 获取上下文 + + +```js +const canvas = document.getElementById("myCanvas"); + +const ctx = canvas.getContext("2d"); +``` + +绘制形状 +--- + +### 矩形 + + +```js +ctx.fillStyle = "red"; +ctx.fillRect(10, 10, 150, 100); // x, y, 宽度, 高度 + +ctx.strokeStyle = "blue"; +ctx.lineWidth = 5; +ctx.strokeRect(200, 10, 150, 100); // x, y, 宽度, 高度 + +ctx.clearRect(15, 15, 30, 30); // x, y, 宽度, 高度 +``` + +路径 +--- + +### 线条 + +```js +ctx.beginPath(); +ctx.moveTo(50, 50); // 起始点 +ctx.lineTo(200, 50); // 结束点 +ctx.lineTo(200, 200); // 下一个线条结束点 +ctx.closePath(); // 将结束点连接到起始点 +ctx.stroke(); +``` + +### 圆形 + +```js +ctx.beginPath(); +// x, y, 半径, 起始角度, 结束角度 +ctx.arc(150, 150, 75, 0, 2 * Math.PI); +ctx.fillStyle = "green"; +ctx.fill(); +ctx.stroke(); +``` + +### 弧 + +```js +ctx.beginPath(); +// x, y, 半径, 起始角度, 结束角度 +ctx.arc(150, 150, 75, 0, Math.PI); +ctx.stroke(); +``` + +贝塞尔曲线和二次曲线 +--- + +### 二次曲线 + +```js +ctx.beginPath(); +ctx.moveTo(50, 250); +// cpX, cpY, 终点X, 终点Y +ctx.quadraticCurveTo(200, 100, 400, 250); +ctx.stroke(); +``` + +### 贝塞尔曲线 + +```js +ctx.beginPath(); +ctx.moveTo(50, 300); +// cp1X, cp1Y, cp2X, cp2Y, 终点X, 终点Y +ctx.bezierCurveTo(150, 100, 350, 500, 450, 300); +ctx.stroke(); +``` + +### 文本 + +```js +ctx.font = "30px Arial"; +ctx.fillStyle = "black"; +// 文本, x, y +ctx.fillText("Hello Canvas", 10, 50); +// 文本, x, y +ctx.strokeText("Hello Canvas", 10, 100); +``` + +### 图像 + + +```js +const img = new Image(); +img.src = "path/to/image.jpg"; +img.onload = () => { + ctx.drawImage(img, 10, 10); // img, x, y + ctx.drawImage(img, 50, 50, 100, 100); // img, x, y, 宽度, 高度 + ctx.drawImage(img, 100, 100, 100, 100, 150, 150, 200, 200); // img, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight +}; +``` + +变换 +--- + +### 平移 + +```js +ctx.translate(100, 100); // x, y +ctx.fillRect(0, 0, 50, 50); +``` + +### 旋转 + +```js +// 角度(以弧度为单位) +ctx.rotate((Math.PI / 180) * 45); +ctx.fillRect(100, 100, 50, 50); +``` + +### 缩放 + +```js +ctx.scale(2, 2); // x, y +ctx.fillRect(50, 50, 50, 50); +``` + +渐变 +--- + +### 线性渐变 + + +```js +const linearGradient = ctx.createLinearGradient(0, 0, 200, 0); // x0, y0, x1, y1 +linearGradient.addColorStop(0, "red"); +linearGradient.addColorStop(1, "blue"); +ctx.fillStyle = linearGradient; +ctx.fillRect(10, 10, 200, 100); +``` + +### 径向渐变 + +```js +const radialGradient = ctx.createRadialGradient(75, 50, 5, 90, 60, 100); // x0, y0, r0, x1, y1, r1 +radialGradient.addColorStop(0, "red"); +radialGradient.addColorStop(1, "blue"); +ctx.fillStyle = radialGradient; +ctx.fillRect(10, 10, 200, 100); +``` + +### 图案 + + +```js +const img = new Image(); +img.src = "path/to/image.jpg"; +img.onload = () => { + // 'repeat', 'repeat-x', 'repeat-y', 'no-repeat' + const pattern = ctx.createPattern(img, "repeat"); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, 300, 300); +}; +``` + +### 阴影 + +```js +ctx.shadowColor = "rgba(0, 0, 0, 0.5)"; +ctx.shadowBlur = 10; +ctx.shadowOffsetX = 5; +ctx.shadowOffsetY = 5; + +ctx.fillStyle = "red"; +ctx.fillRect(100, 100, 100, 100); +``` + +合成 +--- + +### 全局透明度 + +```js +ctx.globalAlpha = 0.5; +ctx.fillStyle = "red"; +ctx.fillRect(100, 100, 100, 100); + +ctx.fillStyle = "blue"; +ctx.fillRect(150, 150, 100, 100); +``` + +### 全局合成操作 + +```js +ctx.globalCompositeOperation = "source-over"; // 默认 +ctx.fillStyle = "red"; +ctx.fillRect(100, 100, 100, 100); + +ctx.globalCompositeOperation = "destination-over"; +ctx.fillStyle = "blue"; +ctx.fillRect(150, 150, 100, 100); +``` + +### 动画 + +```js +let x = 0; +function draw() { + ctx.clearRect(0, 0, canvas.width, canvas.height); + ctx.fillStyle = "blue"; + ctx.fillRect(x, 100, 50, 50); + x += 2; + requestAnimationFrame(draw); +} +draw(); +``` + +参考阅读 +--- + +- [MDN 文档](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API) diff --git a/docs/quickreference.md b/docs/quickreference.md index ce3ebf4..b54a754 100644 --- a/docs/quickreference.md +++ b/docs/quickreference.md @@ -1018,7 +1018,7 @@ H2 部分 - 5列效果展示 ... ``` -[#示例](https://github.com/jaywcjlove/reference/blob/ee03850619440e3700ed68ccc2ed21d3591a1490/docs/quickreference.md?plain=1#L986-L991) +[#示例](https://github.com/jaywcjlove/reference/blob/8ae69f23860c1854a81aeceb81a6cc0bc0998fc4/docs/quickreference.md?plain=1#L1012-L1021) ### Two