1 canvas 必须认识到的大坑
2 <!-- 重点:
3 在js/canvas标签中定义的宽和高是画布实际的宽和高。
4 在样式表中定义的宽和高是画布缩放后的宽和高。
5 即:把js/canvas实际大小缩放到css中的宽高即可。浏览器中显示的效果是css中设置的宽高。
6
7 一,没有设置canvas宽高,默认是300px*150px。设置canvas在浏览器中的实际宽高,必须在canvas标签或者使用js进行设置。而使用css进行设置的宽高是进行缩放后大小,与实际位置不同。
8
9 1,<canvas id="mycanvas" class="mycanvas" width="200px" height="200px">您的浏览器不支持canvas标签</canvas>
10 2, var mycanvas = document.querySelector("#mycanvas");
11 var ctx = mycanvas.getContext('2d');//2d画布环境
12 mycanvas.width=400; //这里没有单位
13 mycanvas.height=300; //这里没有单位
14 -->
15 <!DOCTYPE html>
16 <html lang="en">
17 <head>
18 <meta charset="UTF-8">
19 <title>canvas的坑</title>
20 <style>
21 .mycanvas{background: #ccc;width: 500px;height: 500px;}
22 .mycanvas1{
23 background: yellow;
24 /*这里的设置的宽高等价于把canvas默认宽高300*150 进行缩放至 100*100。
25 所以在js中 从(0,0)到(100,100)之间画一条直线,这两个点也按照300*150进行缩放,再画直线*/
26 width: 200px;
27 height: 200px;
28 }
29 </style>
30 </head>
31 <body>
32 <canvas id="mycanvas" class="mycanvas">您的浏览器不支持canvas标签</canvas>
33 <script type="text/javascript">
34 var mycanvas = document.querySelector("#mycanvas");
35 var ctx = mycanvas.getContext('2d');//2d画布环境
36 mycanvas.width=100;//在页面中实际大小
37 mycanvas.height=100;//在页面中实际大小
38 ctx.moveTo(0,0);
39 ctx.lineTo(100,100);
40 ctx.stroke();
41 </script>
42
43 <canvas id="mycanvas1" class="mycanvas1">您的浏览器不支持canvas标签</canvas>
44 <script type="text/javascript">
45 var mycanvas1 = document.querySelector("#mycanvas1");
46 var ctx1 = mycanvas1.getContext('2d');//2d画布环境
47 ctx1.moveTo(0,0);
48 ctx1.lineTo(100,100);
49 ctx1.stroke();
50 </script>
51 </body>
52 </html>
53
54 ===========
55
56 ctx.beginPath(); 清除之前在内存中预先画的路径,重新开始预先画路径,直到ctx.stroke()才会真正在页面中画出路径
57
58 重点:ctx.beginPath();实例一:
59 <!DOCTYPE html>
60 <html lang="en">
61 <head>
62 <meta charset="UTF-8">
63 <title>canvas</title>
64 <style>
65 .mycanvas{background: #ccc;}
66 </style>
67 </head>
68 <body>
69 <canvas id="mycanvas" class="mycanvas" width="300px" height="300px">您的浏览器不支持canvas</canvas>
70 <script>
71 var canvas = document.querySelector("#mycanvas");
72 var ctx = canvas.getContext("2d");//2d环境
73 //moveTo(0,0) 到 ctx.lineTo(100,200) 只是在内存中预先画的路径,并没有画出来。
74 ctx.moveTo(0,0);
75 ctx.lineTo(100,100);
76 ctx.lineTo(100,200);
77 ctx.strokeStyle = "red";
78 ctx.stroke();//已经画一次
79
80 //ctx.beginPath(); 作用:清除之前在内存中预先画的路径,重新开始预先画路径。
81 //如果注释该代码,那么上面的路径在内存中会被再画一次。再继续画下面的路径。
82 //到了最后的ctx.stroke()时,就会把内存中预先画好的路径全部画出来。
83 ctx.beginPath();
84 ctx.moveTo(100,0);
85 ctx.lineTo(200,100);
86 ctx.lineTo(200,200);
87 ctx.strokeStyle = "green";
88 ctx.stroke();//画出内存中预先画好的路径。
89 </script>
90 </body>
91 </html>
92
93
94 重点:
95 ctx.beginPath() 和 ctx.closePath() 不一定要成对出现,因为意义完全不同。
96
97 canvas 模板:
98 var canvas = document.querySelector("#mycanvas");
99 var ctx = canvas.getContext("2d");//设置绘画2d环境
100 ctx.beginPath(); 清除之前在内存中预先画的路径,重新开始预先画路径,直到ctx.stroke()才会真正在页面中画出路径
101 .........(具体画什么图形)
102 ctx.closePath();//自动闭合起点和终点,不一定要有,需要闭合路线才写。
103 ctx.strokeStyle="#d36";//设置路线颜色
104 ctx.stroke();//把内存中的路径全部画在网页中
105
106 //画线
107 ctx.beginPath(); 清除之前在内存中预先画的路径,重新开始预先画路径,直到ctx.stroke()才会真正在页面中画出路径
108 ctx.moveTo(50,500);
109 ctx.lineTo(100,300);
110 ctx.lineTo(300,600);
111 ctx.closePath();//自动闭合起点和终点
112 ctx.strokeStyle="#d36";//设置路线颜色
113 ctx.stroke();//把内存中的路径全部画在网页中
114
115 // 画圆 ctx.arc(x,y,r,开始弧度,终止弧度,true逆时针画/flase顺时针画);
116 // ctx.arc(圆点x轴坐标,圆点y轴坐标,圆的半径,开始弧度,终止弧度,true逆时针画/flase顺时针画);
117
118 // 画矩形 rectangle 英 [ˈrektæŋɡl] 矩形
119 // ctx.strokeRect(x,y,width,height);该方法是已经封装好了的,不用ctx.beginPath(),ctx.closePath(),ctc.stroke();
120 // ctx.strokeRect(矩形起始点x轴坐标,矩形起始点y轴坐标,矩形宽,矩形高);
121 ctx.strokeStyle="purple";
122 ctx.strokeRect(200,200,300,100);
123
124
125 <!DOCTYPE html>
126 <html lang="en">
127 <head>
128 <meta charset="UTF-8">
129 <title>canvas</title>
130 <style>
131 .mycanvas{background: #ccc;}
132 </style>
133 </head>
134 <body>
135 <canvas id="mycanvas" class="mycanvas" width="600px" height="600px">您的浏览器不支持canvas</canvas>
136 <script>
137 var canvas = document.querySelector("#mycanvas");
138 var ctx = canvas.getContext("2d");//2d环境
139 //moveTo(0,0) 到 ctx.lineTo(100,200) 只是在内存中预先画的路径,并没有画出来。
140 ctx.moveTo(50,250);
141 ctx.lineTo(250,250);
142 ctx.strokeStyle = "green";
143 ctx.stroke();
144 ctx.beginPath();//如果从新开始话,必须清除之前内存中预画的路径
145 ctx.moveTo(250,250);
146 ctx.lineTo(150,50);
147 ctx.strokeStyle = "yellow";
148 ctx.stroke();
149 ctx.beginPath();//如果从新开始话,必须清除之前内存中预画的路径
150 ctx.moveTo(150,50);
151 ctx.lineTo(50,250);
152 ctx.strokeStyle = "red";
153 ctx.stroke();
154
155 //画线
156 ctx.beginPath();//清除内存中预画好的路径,从新开始预画路径。
157 ctx.moveTo(50,500);
158 ctx.lineTo(100,300);
159 ctx.lineTo(300,600);
160 ctx.closePath();//自动闭合起点和终点
161 ctx.strokeStyle="#d36";
162 ctx.stroke();
163
164
165 // 画圆 ctx.arc(x,y,r,开始弧度,终止弧度,true逆时针画/flase顺时针画);
166 // ctx.arc(圆点x轴坐标,圆点y轴坐标,圆的半径,开始弧度,终止弧度,true逆时针画/flase顺时针画);
167 ctx.beginPath();
168 ctx.arc(200,400,50,0,2*Math.PI,true);
169 ctx.closePath();
170 ctx.strokeStyle="#00d";
171 ctx.stroke();
172
173 // 画矩形 rectangle 英 [ˈrektæŋɡl] 矩形
174 // ctx.strokeRect(x,y,width,height);
175 // ctx.strokeRect(矩形起始点x轴坐标,矩形起始点y轴坐标,矩形宽,矩形高);
176 ctx.strokeStyle="purple";
177 ctx.strokeRect(200,200,300,100);
178 </script>
179 </body>
180 </html>
181
182 ===========
183
184 重点:描边 与 填充
185 二者可以一起使用,除了已经封装好的矩形ctx.strokeRect(x,y,w,h);
186 // 先描边再填充,填充会覆盖描边的颜色
187 // 如果是先填充再描边,描边会覆盖填充。
188 // 即后者会覆盖前者的。
189
190 给路径或图形填充颜色话,如果不设置颜色的话,默认颜色是黑色,如果要设置颜色的话,要写设置颜色,然后再调用fill方法。这里的#00f就是蓝色
191
192 //描边样式
193 ctx.strokeStyle="#f0f";//必须写在stroke()方法之前,之后的无效
194 ctx.lineWidth = 5;
195 ctx.stroke();
196
197 //填充样式
198 ctx.fillStyle="#0f0";//必须写在fill()方法之前,之后的无效
199 ctx.fill();
200
201 <!DOCTYPE html>
202 <html lang="en">
203 <head>
204 <meta charset="UTF-8">
205 <title>描边与填充</title>
206 <style>
207 .mycanvas{background: #ccc;}
208 </style>
209 </head>
210 <body>
211 <canvas id="mycanvas" class="mycanvas" width="300px" height="300px">您的浏览器不支持canvas,请升级!</canvas>
212 <script>
213 var canvas = document.querySelector("#mycanvas");
214 var ctx = canvas.getContext("2d");//设置2d环境
215 ctx.moveTo(20,20);
216 ctx.lineTo(50,100);
217 ctx.lineTo(20,100);
218 ctx.closePath();
219 // 先描边再填充,所以填充会覆盖描边的颜色
220 // 如果是先填充再描边,描边会覆盖填充。后面覆盖前面的部分。
221 ctx.strokeStyle="#f0f";
222 ctx.lineWidth = 5;
223 ctx.stroke();
224 ctx.fillStyle="#0f0";
225 ctx.fill();
226
227 //画圆
228 // 先描边再填充,填充的红色会覆盖描边的紫色
229 // 相反,描边的紫色会覆盖填充的红色
230 ctx.beginPath();
231 ctx.arc(100,200,50,0,2*Math.PI,true);
232 ctx.strokeStyle="purple";
233 ctx.lineWidth=10;
234 ctx.stroke();
235 ctx.fillStyle="rgba(255,0,0,.2)";
236 ctx.fill();
237
238 //矩形
239 ctx.beginPath();
240 ctx.strokeStyle="rgba(0,255,255,.5)";
241 ctx.lineWidth=20;
242 ctx.strokeRect(150,80,100,50);
243 //因为ctx.strokeRect(x,y,w,h);是已经封装好的,所以使用fill()方法是无效的,即矩形不能填充,只能使用其他方式进行填充。
244 // ctx.fillStyle="green";
245 // ctx.fill();
246 </script>
247 </body>
248 </html>
249
250 =========