diff --git a/files/zh-cn/learn/javascript/client-side_web_apis/drawing_graphics/index.md b/files/zh-cn/learn/javascript/client-side_web_apis/drawing_graphics/index.md index aac04047a02e3c..7b5187d72fd8f3 100644 --- a/files/zh-cn/learn/javascript/client-side_web_apis/drawing_graphics/index.md +++ b/files/zh-cn/learn/javascript/client-side_web_apis/drawing_graphics/index.md @@ -2,12 +2,12 @@ title: 绘图 slug: Learn/JavaScript/Client-side_web_APIs/Drawing_graphics l10n: - sourceCommit: 1f8e00821b6a18996dd58f32c7adedfe8902bdae + sourceCommit: 7782020d48b20a95fab6767f574cddda8ff59b86 --- {{LearnSidebar}}{{PreviousMenuNext("Learn/JavaScript/Client-side_web_APIs/Third_party_APIs", "Learn/JavaScript/Client-side_web_APIs/Video_and_audio_APIs", "Learn/JavaScript/Client-side_web_APIs")}} -浏览器包含一些非常强大的图形编程工具,从可缩放矢量图形(Scalable Vector Graphics,简称 [SVG](/zh-CN/docs/Web/SVG))语言到用于在 HTML {{htmlelement("canvas")}} 元素上绘制图形的 API(参阅 [Canvas API](/zh-CN/docs/Web/API/Canvas_API) 和 [WebGL](/zh-CN/docs/Web/API/WebGL_API))。本文对 {{htmlelement("canvas")}} 进行介绍,并提供更多的学习资源。 +浏览器包含一些非常强大的图形编程工具,从可缩放矢量图形(Scalable Vector Graphics,简称 [SVG](/zh-CN/docs/Web/SVG))语言到用于在 HTML {{htmlelement("canvas")}} 元素上绘制图形的 API(参见 [Canvas API](/zh-CN/docs/Web/API/Canvas_API) 和 [WebGL](/zh-CN/docs/Web/API/WebGL_API))。本文将介绍 canvas,并提供更多的学习资源。 @@ -16,10 +16,10 @@ l10n:
JavaScript 基础(见 JavaScript 第一步创建 JavaScript 代码块JavaScript 对象入门),JavaScript 对象入门)、Web API 基础知识。 @@ -36,7 +36,7 @@ l10n: ## 网络图形 -我们来讨论 HTML 的 [多媒体和嵌入式](/zh-CN/docs/Learn/HTML/Multimedia_and_embedding) 模块,早先的网页只有单调的文字,后来才引入了图像,起初是通过 {{htmlelement("img")}} 元素的方式,后来出现了类似于 {{cssxref("background-image")}} 的 CSS 属性和 [SVG](/zh-CN/docs/Web/SVG) 图像等方式。 +我们来讨论 HTML 的[多媒体和嵌入式](/zh-CN/docs/Learn/HTML/Multimedia_and_embedding)模块,早先的网页只有单调的文字,后来才引入了图像,起初是通过 {{htmlelement("img")}} 元素的方式,后来出现了类似于 {{cssxref("background-image")}} 的 CSS 属性和 [SVG](/zh-CN/docs/Web/SVG) 图像等方式。 然而,这还不够好。当你能够使用 [CSS](/zh-CN/docs/Learn/CSS) 和 [JavaScript](/zh-CN/docs/Learn/JavaScript) 让 SVG 矢量图动起来时,位图却依然没有相应的支持。同时 SVG 动画的可用工具也少得可怜。有效地生成动画、游戏画面、3D 场景和其他的需求依然没有满足,而这些在诸如 C++ 或者 Java 等底层语言中却司空见惯。 @@ -50,10 +50,7 @@ l10n: {{EmbedGHLiveSample("learning-area/javascript/apis/drawing-graphics/threejs-cube/index.html", '100%', 500)}} -由于原生的 WebGL 代码非常复杂,本文主要针对 2D 画布。然而,你也可以通过 [WebGL 介绍页面](/zh-CN/docs/Web/API/WebGL_API) 找到 WebGL 原生代码的教程,来学习如何更容易地使用 WebGL 库来创建一个 3D 场景。 - -> [!NOTE] -> 画布的基本功能有良好的跨浏览器支持。但存在例外:IE 8 及以下不支持 2D 画布,IE 11 及以下不支持 WebGL。 +由于原生的 WebGL 代码非常复杂,本文主要针对 2D 画布。然而,你也可以通过[初识 WebGL](/zh-CN/docs/Web/API/WebGL_API/Tutorial/Getting_started_with_WebGL) 找到 WebGL 原生代码的教程,来学习如何更容易地使用 WebGL 库来创建一个 3D 场景。 ## 主动学习:开始使用 \ @@ -69,18 +66,24 @@ l10n: ```html -

卧槽你的浏览器竟然不支持 canvas!

+

你的浏览器不支持 canvas

``` 当然这条信息实在是没什么用!在实际情况中最好提供与画布内容相关的反馈信息。比如,如果无法渲染实时更新的股价曲线图,就应提供一幅静态的、最近的股价曲线图,并用 alt 显示出价格信息。 +> [!NOTE] +> 屏幕阅读器无法获取画布内容。需要在画布元素的 aria-label 属性填写描述性文本,或者在起始和结束的 `` 标签里嵌入回退内容。画布内容不是 DOM 的一部分,但嵌入的回退内容是 DOM 的一部分。 + ### 创建画布并确定尺寸 让我们开始吧:创建画布,准备尝试绘制图形。 -1. 首先下载 [0_canvas_start](https://github.com/mdn/learning-area/blob/main/javascript/apis/drawing-graphics/getting-started/0_canvas_start) 文件,用文本编辑器打开。 -2. 在 {{htmlelement("body")}} 标签下面填加以下代码。 +1. 首先在本地拷贝一份 [0_canvas_start](https://github.com/mdn/learning-area/tree/main/javascript/apis/drawing-graphics/getting-started/0_canvas_start) 文件夹。包含三个文件: + - "index.html" + - "script.js" + - "style.css" +2. 打开“index.html”,在 {{htmlelement("body")}} 的起始标签下面填加以下代码。 ```html @@ -93,30 +96,17 @@ l10n: 3. 现在,请在 {{htmlelement("script")}} 元素内添加以下 JavaScript 代码: ```js - var canvas = document.querySelector(".myCanvas"); - var width = (canvas.width = window.innerWidth); - var height = (canvas.height = window.innerHeight); + const canvas = document.querySelector(".myCanvas"); + const width = (canvas.width = window.innerWidth); + const height = (canvas.height = window.innerHeight); ``` 这里我们用 `canvas` 变量来存储画布的引用。第二行中我们将 {{domxref("Window.innerWidth")}}(可视区域宽度)赋值给一个新变量 `width` 和画布的 `canvas.width` 变量(第三行同理)。然后我们就得到了一个充满窗口的画布。 你还可以看到我们使用了多个等号为多个变量进行连续赋值,这在 JavaScript 中是允许的,很适合为多个变量同时赋一个相同的值。后文中你会发现,使用 `width` 和 `height` 变量可以更快捷地访问画布的长宽(比如在画布正中央绘制一条垂直线)。 -4. 如果现在保存文件,浏览器中什么也不会显示,这并没有问题,但是滚动条还是可见的,这就是问题了。原因是我们的“全窗尺寸画布”包含 {{htmlelement("body")}} 元素的外边距({{cssxref("margin")}}),使得文档比窗口略宽。为使滚动条消失,需要删除 {{htmlelement("body")}} 元素的 {{cssxref("margin")}} 并将 {{cssxref("overflow")}} 设置为 `hidden`。在文档的 {{htmlelement("head")}} 中添加以下代码即可: - - ```html - - ``` - - 此时滚动条就消失了。 - > [!NOTE] -> 如上文所讲,一般情况下图片的尺寸可以通过 HTML 属性或 DOM 属性来设定。你也可以使用 CSS,但问题是画布在渲染完毕后其尺寸就是固定的了,如果试图调整,就会与其他图象一样(其实渲染好的画布就是一副图片),所显示的内容将变得像素化或扭曲变形。 +> 如上文所讲,一般情况下图片的尺寸可以通过 HTML 属性或 DOM 属性来设定。你也可以使用 CSS,但问题是画布在渲染完毕后其尺寸就是固定的了,如果试图调整,就会与其他图像一样(其实渲染好的画布就是一副图片),所显示的内容将变得像素化或扭曲变形。 ### 获取画布上下文(canvas context)并完成设置 @@ -125,7 +115,7 @@ l10n: 这里我们需要一个 2d 画布,在 `