From 2662589eb562993b788f48a062a06c3c2a1c3562 Mon Sep 17 00:00:00 2001
From: wizardforcel <562826179@qq.com>
Date: Sat, 12 May 2018 23:20:41 +0800
Subject: [PATCH] 17
---
17.md | 236 +++++++++++++++++++++++++++------------------------
img/17-0.jpg | Bin 0 -> 27283 bytes
img/17-1.png | Bin 0 -> 2696 bytes
img/17-2.svg | 11 +++
img/17-3.svg | 11 +++
img/17-4.png | Bin 0 -> 1163 bytes
img/17-5.png | Bin 0 -> 7904 bytes
7 files changed, 146 insertions(+), 112 deletions(-)
create mode 100644 img/17-0.jpg
create mode 100644 img/17-1.png
create mode 100644 img/17-2.svg
create mode 100644 img/17-3.svg
create mode 100644 img/17-4.png
create mode 100644 img/17-5.png
diff --git a/17.md b/17.md
index 75b6d89..682ce77 100644
--- a/17.md
+++ b/17.md
@@ -1,24 +1,36 @@
-## 十七、使用`canvas`绘图
+## 十七、在画布上绘图
-> Drawing is deception.
+> 原文:[Drawing on Canvas](https://eloquentjavascript.net/17_canvas.html)
>
-> M.C. Escher, cited by Bruno Ernst in The Magic Mirror of M.C. Escher
+> 译者:[飞龙](https://github.com/wizardforcel)
+>
+> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
+>
+> 自豪地采用[谷歌翻译](https://translate.google.cn/)
+>
+> 部分参考了[《JavaScript 编程精解(第 2 版)》](https://book.douban.com/subject/26707144/)
-浏览器为我们提供了多种绘图方式。最简单的方式是用样式来规定普通DOM对象的位置和颜色。就像在上一章中那个游戏展示的,我们可以使用这种方式实现很多功能。我们可以为节点添加半透明的背景图片,来获得我们希望的节点外观。我们也可以使用transform样式来旋转或倾斜节点。
+> 绘图就是欺骗。
+>
+> M.C. Escher,由 Bruno Ernst 在《The Magic Mirror of M.C. Escher》中引用
-但是,在一些场景中,使用DOM并不符合我们的设计初衷。比如我们很难使用普通的HTML元素画出任意两点之间的线段这类图形。
+
-这里有两种解决办法。第一种方法基于 DOM,但使用可缩放矢量图形(SVG,Scalable Vector Graphics)代替 HTML。我们可以将 SVG 看成文档标记方言,专用于描述图形而非文字。你可以在HTML文档中嵌入SVG,还可以在
标签中引用它。
+浏览器为我们提供了多种绘图方式。最简单的方式是用样式来规定普通 DOM 对象的位置和颜色。就像在上一章中那个游戏展示的,我们可以使用这种方式实现很多功能。我们可以为节点添加半透明的背景图片,来获得我们希望的节点外观。我们也可以使用`transform`样式来旋转或倾斜节点。
-我们将第二种方法称为画布(canvas)。画布是一个能够封装图片的DOM元素。它提供了在空白的html节点上绘制图形的编程接口。SVG与画布的最主要区别在于SVG保存了对于图像的基本信息的描述,我们可以随时移动或修改图像。
+但是,在一些场景中,使用 DOM 并不符合我们的设计初衷。比如我们很难使用普通的 HTML 元素画出任意两点之间的线段这类图形。
+
+这里有两种解决办法。第一种方法基于 DOM,但使用可缩放矢量图形(SVG,Scalable Vector Graphics)代替 HTML。我们可以将 SVG 看成文档标记方言,专用于描述图形而非文字。你可以在 HTML 文档中嵌入 SVG,还可以在`
`标签中引用它。
+
+我们将第二种方法称为画布(canvas)。画布是一个能够封装图片的 DOM 元素。它提供了在空白的`html`节点上绘制图形的编程接口。SVG 与画布的最主要区别在于 SVG 保存了对于图像的基本信息的描述,我们可以随时移动或修改图像。
另外,画布在绘制图像的同时会把图像转换成像素(在栅格中的具有颜色的点)并且不会保存这些像素表示的内容。唯一的移动图形的方法就是清空画布(或者围绕着图形的部分画布)并在新的位置重画图形。
-## 16.1 SVG
+## SVG
-本书不会深入研究SVG的细节,但是我会简单地解释其工作原理。在本章的结尾,我会再次来讨论,对于某个具体的应用来说,我们应该如何权衡利弊选择一种绘图方式。
+本书不会深入研究 SVG 的细节,但是我会简单地解释其工作原理。在本章的结尾,我会再次来讨论,对于某个具体的应用来说,我们应该如何权衡利弊选择一种绘图方式。
-这是一个带有简单的SVG图片的HTML文档。
+这是一个带有简单的 SVG 图片的 HTML 文档。
```html
Normal HTML here.
@@ -29,24 +41,24 @@
```
-xmlns属性把一个元素(以及他的子元素)切换到一个不同的XML命名空间。这个由url定义的命名空间,规定了我们当前使用的语言。在HTML中不存在的与标签,但这些标签在SVG中是有意义的,你可以通过这些标签的属性来绘制图像并指定样式与位置。
+`xmlns`属性把一个元素(以及他的子元素)切换到一个不同的 XML 命名空间。这个由`url`定义的命名空间,规定了我们当前使用的语言。在 HTML 中不存在``与``标签,但这些标签在 SVG 中是有意义的,你可以通过这些标签的属性来绘制图像并指定样式与位置。
-和HTML标签一样,这些标签会创建DOM元素,脚本可以和它们交互。例如,下面的代码可以把元素的颜色替换为青色。
+和 HTML 标签一样,这些标签会创建 DOM 元素,脚本可以和它们交互。例如,下面的代码可以把``元素的颜色替换为青色。
```html
let circle = document.querySelector("circle");
circle.setAttribute("fill", "cyan");
```
-## 16.2 canvas元素
+## `canvas`元素
-我们可以在