1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
---
title: HTMLCanvasElement.getContext()
slug: Web/API/HTMLCanvasElement/getContext
tags:
- API
- Canvas
translation_of: Web/API/HTMLCanvasElement/getContext
---
<div>{{APIRef("Canvas API")}}</div>
<p><strong><code>HTMLCanvasElement.getContext()</code></strong> 方法返回{{jsxref("canvas")}} 的上下文,如果上下文没有定义则返回 {{jsxref("null")}} .</p>
<p>在同一个canvas上以相同的 <code>contextType</code> 多次调用此方法只会返回同一个上下文。</p>
<h2 id="语法">语法</h2>
<pre class="syntaxbox">var <em>ctx</em> = <em>canvas</em>.getContext(<em>contextType</em>);
var <em>ctx</em> = <em>canvas</em>.getContext(<em>contextType</em>, <em>contextAttributes</em>);</pre>
<h3 id="参数">参数</h3>
<dl>
<dt>上下文类型(contextType)</dt>
<dd>是一个指示使用何种上下文的 {{domxref("DOMString")}} 。可能的值是:
<ul>
<li><code>"2d</code>", 建立一个 {{domxref("CanvasRenderingContext2D")}} 二维渲染上下文。</li>
<li><code>"webgl"</code> (或<code>"experimental-webgl"</code>) 这将创建一个 {{domxref("WebGLRenderingContext")}} 三维渲染上下文对象。只在实现<a href="https://developer.mozilla.org/en-US/docs/Web/WebGL">WebGL</a> 版本1(OpenGL ES 2.0)的浏览器上可用。</li>
<li>"<code>webgl2</code>" (或 "<code>experimental-webgl2</code>") 这将创建一个 {{domxref("WebGL2RenderingContext")}} 三维渲染上下文对象。只在实现 <a href="https://developer.mozilla.org/en-US/docs/Web/WebGL">WebGL</a> 版本2 (OpenGL ES 3.0)的浏览器上可用。{{experimental_inline}}</li>
<li><code>"bitmaprenderer"</code> 这将创建一个只提供将canvas内容替换为指定{{domxref("ImageBitmap")}}功能的{{domxref("ImageBitmapRenderingContext")}} 。</li>
</ul>
<div class="blockIndicator note">
<p>注意: 标识符 "<code>experimental-webgl</code>" 或 "<code>experimental-webgl2</code>" 用于新 <a href="https://developer.mozilla.org/en-US/docs/Web/WebGL">WebGL</a>的实现。 这些实现还没有达到测试套件一致性或图形驱动程序平台局势尚不稳定。<a href="https://www.khronos.org/">Khronos Group</a> 集团认证<a href="https://developer.mozilla.org/en-US/docs/Web/WebGL">WebGL</a> 实现在某些<a href="https://www.khronos.org/registry/webgl/sdk/tests/CONFORMANCE_RULES.txt">一致性规则</a>。</p>
</div>
</dd>
<dt><code>上下文属性(contextAttributes)</code></dt>
<dd>
<p>你可以在创建渲染上下文的时候设置多个属性,例如:</p>
<pre class="brush: js">canvas.getContext("webgl",
{ antialias: false,
depth: false });</pre>
2d 上下文属性:
<ul>
<li><strong><code>alpha</code></strong>: {{jsxref("boolean")}}值表明{{jsxref("canvas")}}包含一个{{jsxref("alpha")}}通道. 如果设置为{{jsxref("false")}}, 浏览器将认为{{jsxref("canvas")}}背景总是不透明的, 这样可以加速绘制透明的内容和图片.</li>
<li>{{non-standard_inline}} (Gecko only) <strong><code>willReadFrequently</code></strong>: {{jsxref("boolean")}}值表明是否有重复读取计划。经常使用{{domxref("CanvasRenderingContext2D.getImageData", "getImageData()")}},这将迫使软件使用2D {{jsxref("canvas")}} 并 节省内存(而不是硬件加速)。这个方案适用于存在属性 <code>gfx.canvas.willReadFrequently</code>的环境。并设置为{{jsxref("true")}} (缺省情况下,只有B2G / Firefox OS).</li>
<li>{{non-standard_inline}} (Blink only) <strong><code>storage</code></strong>: {{jsxref("string")}} 这样表示使用哪种方式存储(默认为:持久("persistent")).</li>
</ul>
WebGL上下文属性:
<ul>
<li>
<p><strong><code>alpha</code></strong>: {{jsxref("boolean")}}值表明{{jsxref("canvas")}}包含一个{{jsxref("alpha")}}缓冲区。</p>
</li>
<li>
<p><strong><code>antialias</code></strong>: {{jsxref("boolean")}}值表明是否开启抗锯齿。</p>
</li>
<li>
<p><strong><code>depth</code></strong>: {{jsxref("boolean")}}值表明绘制缓冲区包含一个深度至少为16位的缓冲区。</p>
</li>
<li>
<p><code><strong>failIfMajorPerformanceCaveat</strong></code>: 表明在一个系统性能低的环境是否创建该上下文的{{jsxref("boolean")}}值。</p>
</li>
<li>
<p><code><strong>powerPreference</strong></code>: 指示浏览器在运行WebGL上下文时使用相应的GPU电源配置。 可能值如下:</p>
<ul>
<li>
<p><code>"default"</code>:自动选择,默认值。</p>
</li>
<li>
<p><code>"high-performance"</code>: 高性能模式。</p>
</li>
<li>
<p><code>"low-power"</code>: 节能模式。</p>
</li>
</ul>
</li>
<li>
<p><strong><code>premultipliedAlpha</code></strong>: 表明排版引擎讲假设绘制缓冲区包含预混合alpha通道的{{jsxref("boolean")}}值。</p>
</li>
<li>
<p><strong><code>preserveDrawingBuffer</code></strong>: 如果这个值为{{jsxref("true")}}缓冲区将不会被清除,会保存下来,直到被清除或被使用者覆盖。</p>
</li>
<li>
<p><strong><code>stencil</code></strong>: 表明绘制缓冲区包含一个深度至少为8位的模版缓冲区{{jsxref("boolean")}}值。</p>
</li>
</ul>
</dd>
</dl>
<h3 id="返回值">返回值</h3>
<p>{{domxref("RenderingContext")}} 返回值是下列之一:</p>
<ul>
<li>{{domxref("CanvasRenderingContext2D")}} 为 <code>"2d"</code>,</li>
<li>{{domxref("WebGLRenderingContext")}} 为<code>"webgl"</code> 和<code>"experimental-webgl"</code>,</li>
<li>{{domxref("WebGL2RenderingContext")}} 为<code>"webgl2"</code> 和<code>"experimental-webgl2"</code>, 或者</li>
<li>{{domxref("ImageBitmapRenderingContext")}} 为<code>"bitmaprenderer"</code>.</li>
</ul>
<p>如果 <code><em>contextType</em></code> 不是上述之一,返回{{jsxref("null")}}.</p>
<h2 id="例子">例子</h2>
<p>定义 {{HTMLElement("canvas")}} 元素:</p>
<pre class="brush: html"><canvas id="canvas" width="300" height="300"></canvas>
</pre>
<p>通过如下代码可以获取 {{jsxref("canvas")}}<code>2d</code> 上下文:</p>
<pre class="brush: js">var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
console.log(ctx); // CanvasRenderingContext2D { ... }
</pre>
<p>现在你已经获取到了2D 画布的渲染上下文({{domxref("CanvasRenderingContext2D")}}),可以使用它画你想画的了.</p>
<h2 id="规范">规范</h2>
<table class="standard-table">
<tbody>
<tr>
<th scope="col">Specification</th>
<th scope="col">Status</th>
<th scope="col">Comment</th>
</tr>
<tr>
<td>{{SpecName('HTML WHATWG', "scripting.html#dom-canvas-getcontext", "HTMLCanvasElement.getContext")}}</td>
<td>{{Spec2('HTML WHATWG')}}</td>
<td>No change since the latest snapshot, {{SpecName('HTML5 W3C')}}</td>
</tr>
<tr>
<td>{{SpecName('HTML5.1', "scripting-1.html#dom-canvas-getcontext", "HTMLCanvasElement.getContext")}}</td>
<td>{{Spec2('HTML5.1')}}</td>
<td> </td>
</tr>
<tr>
<td>{{SpecName('HTML5 W3C', "scripting-1.html#dom-canvas-getcontext", "HTMLCanvasElement.getContext")}}</td>
<td>{{Spec2('HTML5 W3C')}}</td>
<td>Snapshot of the {{SpecName('HTML WHATWG')}} containing the initial definition.</td>
</tr>
</tbody>
</table>
<h2 id="浏览器兼容性">浏览器兼容性</h2>
<p>{{Compat("api.HTMLCanvasElement.getContext")}}</p>
<h2 id="另请参阅">另请参阅</h2>
<ul>
<li>{{domxref("HTMLCanvasElement")}}.</li>
<li>{{domxref("OffscreenCanvas.getContext()")}}</li>
<li>可用的上下文: {{domxref("CanvasRenderingContext2D")}}, {{domxref("WebGLRenderingContext")}} 和 {{domxref("WebGL2RenderingContext")}} and {{domxref("ImageBitmapRenderingContext")}}.</li>
</ul>
|