So erstellen Sie eine webbasierte Zeichenanwendung mithilfe von Canvas
German (Deutsch) translation by Władysław Łucyszyn (you can also view the original English article)
Wenn Sie HTML mit der brandneuen <canvas>-Funktion kombinieren, können Sie einige ziemlich großartige Web-Apps erstellen! In diesem Tutorial erstellen wir eine übersichtliche interaktive Zeichenanwendung mit HTML und JavaScript. Unterwegs lernen wir auch die grundlegenden Konzepte der brandneuen <canvas> -Funktion kennen.
Das <canvas>-Tag ist ein relativ neues Element, das schnell an Popularität gewinnt. Es kann für eine Vielzahl verschiedener Dinge verwendet werden, z. B. zum Zeichnen von Grafiken, Formen, Bildern, Anwenden von Stilen und Farben, Erstellen von Fotokompositionen und sogar für einige einfache, übersichtliche Animationen. Heute erstellen wir eine einfache Online-Zeichenanwendung, ähnlich wie http://www.mugtug.com/sketchpad/
Das Erstellen einer Zeichenfläche auf Ihrer Site ist so einfach wie das Hinzufügen des <canvas>-Tags zu Ihrem HTML-Dokument, wie unten gezeigt:
1 |
<canvas id="canvas" width="800" height="600"> |
2 |
We're sorry, the browser you are using does not support <canvas>. Please upgrade your browser.
|
3 |
<!--Anything inside of the canvas tag will only display if the browser does not support the <canvas> tag.-->
|
4 |
</canvas>
|
Das Element 'ID' ist nicht erforderlich, wird jedoch dringend empfohlen, damit Sie es später in Ihrem JavaScript und/oder CSS finden können.
Schritt 1 Was machen wir?
Unten ist ein Bild von dem, was wir machen werden. Ihre sehen möglicherweise etwas anders aus, wenn wir vollständig fertig sind, abhängig von der Art der Stile, die Sie verwenden möchten usw.



Wie Sie sehen können, bin ich eine schreckliche Schublade, aber vielleicht können Sie, nachdem Sie Ihre Tafel erstellt haben, ein fantastisches Meisterwerk erstellen! Außerdem bauen wir die Tafel, nicht die Zeichnung!
Schritt 2 Was brauchen Sie?
Für dieses Tutorial benötigen Sie grundlegende Kenntnisse in HTML und JavaScript.
- Photoshop oder ein anderer Bildeditor
- Code-Editor Ihrer Wahl
- Grundkenntnisse in HTML und JavaScript
- <canvas> unterstützter Browser (Chrome, Firefox, Opera, Safari)
Ich werde auch das kostenlose Fugue Icon Pack verwenden, das hier heruntergeladen werden kann: http://p.yusukekamiyamane.com/
Darüber hinaus werden wir die folgenden Skripte verwenden, um das endgültige Ergebnis zu erzielen.
Schritt 3 Erste Schritte
Lassen Sie uns ohne weiteres gleich loslegen!
Das HTML-Markup
Öffnen Sie zunächst Ihre Codierungsanwendung und erstellen Sie ein reguläres HTML-Dokument. Kopieren Sie den folgenden Code und fügen Sie ihn ein. Dies ist die Grundstruktur unserer Zeichenanwendung. Speichern Sie das Dokument in einem neuen Ordner mit der Bezeichnung "canvas" (oder einem beliebigen gewünschten Ordner). Erstellen Sie jetzt auf derselben Ebene wie Ihre HTML-Datei drei neue Ordner.
- JS
- CSS
- Images
1 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
2 |
<html xmlns="http://www.w3.org/1999/xhtml"> |
3 |
|
4 |
<head>
|
5 |
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> |
6 |
|
7 |
<!-- External CSS Document(s) -->
|
8 |
<link rel="stylesheet" type="text/css" href="css/styles.css" /> |
9 |
|
10 |
<title>Online Drawing Application | Web Design Deluxe</title> |
11 |
|
12 |
<!-- Eternal JavaScript Document(s) -->
|
13 |
<script type="text/javascript" src="js/canvas.js"></script> |
14 |
|
15 |
</head>
|
16 |
<body>
|
17 |
|
18 |
<!-- Wrapper Begins --> <div id="wrapper"> |
19 |
|
20 |
<div id="blackboardPlaceholder"> |
21 |
</div>
|
22 |
|
23 |
</div>
|
24 |
|
25 |
</body>
|
26 |
</html>
|
Dies ist das grundlegende Markup unserer Seite. Bevor wir mit dem Schreiben des eigentlichen Codes beginnen, lassen Sie uns dies etwas näher erläutern. Ich werde Ihnen nicht zeigen, wie Sie das Design in Photoshop erstellen, aber Sie können die Bilder hier herunterladen. Stellen Sie sicher, dass Sie alle Bilder in den soeben erstellten images ordner kopieren.
Das CSS-Markup
Erstellen Sie ein neues Stylesheet mit dem Namen "styles.css" und speichern Sie es in Ihrem "css"-Ordner. Kopieren Sie den folgenden grundlegenden CSS-Code und fügen Sie ihn in Ihr Stylesheet ein.
1 |
@charset "UTF-8"; |
2 |
/* CSS Document */ |
3 |
|
4 |
* { margin:0; padding:0; }
|
5 |
|
6 |
body {
|
7 |
background:url(../images/bg.gif) repeat-x #f8f8f8; |
8 |
color:#d7d7d7; |
9 |
font-family:"Belle","Comic Sans MS", cursive; |
10 |
font-size:25px; |
11 |
line-height:27px;} |
12 |
|
13 |
#wrapper {
|
14 |
position:relative; |
15 |
width:960px; |
16 |
margin:0 auto; |
17 |
padding-top:75px;} |
18 |
|
19 |
<!-- Blackboard -->
|
20 |
#blackboardPlaceholder {
|
21 |
background:url(../images/blackboard.png) no-repeat; |
22 |
width:924px; |
23 |
height:599px; |
24 |
margin:0 auto; |
25 |
padding:14px 0 75px 14px; |
26 |
cursor:crosshair; |
27 |
} |
Schritt 4 Das Canvas-Tag
Wir werden das Canvas-Tag direkt in den blackboardPlaceholder einfügen. Fügen Sie den folgenden Code in die ID 'blackboardPlaceholder' ein.
1 |
<!-- Canvas Begins -->
|
2 |
<canvas id="drawingCanvas" height="532" width="897"> |
3 |
<p class="noscript">We're sorry, this web application is currently not supported with your browser. Please use an alternate browser or download a supported <br />browser. Supported browsers: <a href="http://www.google.com/chrome">Google Chrome</a>, <a href="http://www.opera.com">Opera</a>, <a href="http://www.mozilla.com">Firefox</a>, <a href="http://www.apple.com/safari">Safari</a>, <br />and <a href="http://www.konqueror.org">Konqueror</a>. Also make sure your JavaScript is enabled.</p> |
4 |
</canvas>
|
5 |
<!-- Canvas Ends -->
|
Dies ist die genaue Breite und Höhe der Leinwand, die wir erstellen, sodass Sie dies nicht ändern müssen. Wie oben erwähnt, wird alles zwischen den Canvas-Tags nur angezeigt, wenn JavaScript deaktiviert wurde oder der Browser kein Canvas unterstützt.
Als nächstes lassen Sie uns die ID ein wenig auffrischen. Fügen Sie in Ihrer Datei styles.css Folgendes hinzu:
1 |
#drawingCanvas {
|
2 |
position:absolute; |
3 |
border:none; |
4 |
color:#FFF; |
5 |
overflow:hidden; |
6 |
background-color:transparent; |
7 |
} |
8 |
#tempCanvas { position: absolute; width:897px; height:532px; overflow:hidden; }
|
Ich werde die #tempCanvas ID in Kürze erklären, wenn wir mit dem Schreiben des JavaScript beginnen.
Schritt 5 JavaScript-Implementierung
Lassen Sie uns jetzt unsere Leinwand so funktionieren, wie sie sollte. Erstellen Sie zunächst eine neue JS-Datei und nennen Sie sie "canvas". Speichern Sie diese Datei im Ordner 'JS'.
1 |
var context; |
Als Nächstes fügen wir mithilfe der Funktionen addEventListener und onLoad eine Funktion hinzu, um festzustellen, ob das HTML-Dokument ein Canvas-Tag enthält. Fügen Sie dies direkt unter die von uns erstellte Variable ein.
1 |
// Check for the canvas tag onload. |
2 |
if(window.addEventListener) {
|
3 |
window.addEventListener('load', function () {
|
Fügen wir nun einige Standardvariablen und einige Fehlermeldungen hinzu - falls etwas schief gelaufen ist.
1 |
var canvas, canvaso, contexto; |
2 |
// Default tool. (chalk, line, rectangle) |
3 |
var tool; |
4 |
var tool_default = 'chalk'; |
5 |
|
6 |
function init () {
|
7 |
canvaso = document.getElementById('drawingCanvas');
|
8 |
if (!canvaso) {
|
9 |
alert('Error! The canvas element was not found!');
|
10 |
return; |
11 |
} |
12 |
if (!canvaso.getContext) {
|
13 |
alert('Error! No canvas.getContext!');
|
14 |
return; |
15 |
} |
16 |
// Create 2d canvas. |
17 |
contexto = canvaso.getContext('2d');
|
18 |
if (!contexto) {
|
19 |
alert('Error! Failed to getContext!');
|
20 |
return; |
21 |
} |
22 |
// Build the temporary canvas. |
23 |
var container = canvaso.parentNode; |
24 |
canvas = document.createElement('canvas');
|
25 |
if (!canvas) {
|
26 |
alert('Error! Cannot create a new canvas element!');
|
27 |
return; |
28 |
} |
29 |
canvas.id = 'tempCanvas'; |
30 |
canvas.width = canvaso.width; |
31 |
canvas.height = canvaso.height; |
32 |
container.appendChild(canvas); |
33 |
context = canvas.getContext('2d');
|
34 |
context.strokeStyle = "#FFFFFF";// Default line color. |
35 |
context.lineWidth = 1.0;// Default stroke weight. |
36 |
|
37 |
// Fill transparent canvas with dark grey (So we can use the color to erase). |
38 |
context.fillStyle = "#424242"; |
39 |
context.fillRect(0,0,897,532);//Top, Left, Width, Height of canvas. |
Wir haben einige neue Variablen und Methoden erstellt, die später verwendet werden.
Der context.strokeStyle ist die Farbe unseres Strichs. Wir werden den Standardwert '#FFFFFF' festlegen, der der Hex-Wert für Weiß ist. Als nächstes kommt die context.lineWidth. Dies ist der Strich unserer Linie. Wir werden den Standardwert '1.0' belassen. Jetzt erstellen wir ein graues Rechteck, das wir später verwenden können, wenn wir die Möglichkeit hinzufügen, unser Bild zu speichern. Wir füllen das Rechteck mit Grau oder '#424242' und machen es auf die exakte Größe unserer canvas.
Lassen Sie uns fortfahren und unser Dropdown-Menü erstellen, in dem wir zwischen Kreide, Rechteck oder Linie wählen können.
1 |
// Create a select field with our tools. |
2 |
var tool_select = document.getElementById('selector');
|
3 |
if (!tool_select) {
|
4 |
alert('Error! Failed to get the select element!');
|
5 |
return; |
6 |
} |
7 |
tool_select.addEventListener('change', ev_tool_change, false);
|
8 |
|
9 |
// Activate the default tool (chalk). |
10 |
if (tools[tool_default]) {
|
11 |
tool = new tools[tool_default](); |
12 |
tool_select.value = tool_default; |
13 |
} |
14 |
// Event Listeners. |
15 |
canvas.addEventListener('mousedown', ev_canvas, false);
|
16 |
canvas.addEventListener('mousemove', ev_canvas, false);
|
17 |
canvas.addEventListener('mouseup', ev_canvas, false);
|
18 |
} |
19 |
// Get the mouse position. |
20 |
function ev_canvas (ev) {
|
21 |
if (ev.layerX || ev.layerX == 0) { // Firefox
|
22 |
ev._x = ev.layerX; |
23 |
ev._y = ev.layerY; |
24 |
} else if (ev.offsetX || ev.offsetX == 0) { // Opera
|
25 |
ev._x = ev.offsetX; |
26 |
ev._y = ev.offsetY; |
27 |
} |
28 |
// Get the tool's event handler. |
29 |
var func = tool[ev.type]; |
30 |
if (func) {
|
31 |
func(ev); |
32 |
} |
33 |
} |
34 |
function ev_tool_change (ev) {
|
35 |
if (tools[this.value]) {
|
36 |
tool = new tools[this.value](); |
37 |
} |
38 |
} |
39 |
// Create the temporary canvas on top of the canvas, which is cleared each time the user draws. |
40 |
function img_update () {
|
41 |
contexto.drawImage(canvas, 0, 0); |
42 |
context.clearRect(0, 0, canvas.width, canvas.height); |
43 |
} |
44 |
var tools = {};
|
45 |
// Chalk tool. |
46 |
tools.chalk = function () {
|
47 |
var tool = this; |
48 |
this.started = false; |
49 |
// Begin drawing with the chalk tool. |
50 |
this.mousedown = function (ev) {
|
51 |
context.beginPath(); |
52 |
context.moveTo(ev._x, ev._y); |
53 |
tool.started = true; |
54 |
}; |
55 |
this.mousemove = function (ev) {
|
56 |
if (tool.started) {
|
57 |
context.lineTo(ev._x, ev._y); |
58 |
context.stroke(); |
59 |
} |
60 |
}; |
61 |
this.mouseup = function (ev) {
|
62 |
if (tool.started) {
|
63 |
tool.mousemove(ev); |
64 |
tool.started = false; |
65 |
img_update(); |
66 |
} |
67 |
}; |
68 |
}; |
Wir haben gerade die Zeichenfunktion für die Kreide erstellt! Natürlich funktioniert unsere Leinwand zu diesem Zeitpunkt noch nicht, aber wir sind fast da!
Lassen Sie uns jetzt unser Rechteck-Werkzeug machen.
1 |
// The rectangle tool. |
2 |
tools.rect = function () {
|
3 |
var tool = this; |
4 |
this.started = false; |
5 |
this.mousedown = function (ev) {
|
6 |
tool.started = true; |
7 |
tool.x0 = ev._x; |
8 |
tool.y0 = ev._y; |
9 |
}; |
10 |
this.mousemove = function (ev) {
|
11 |
if (!tool.started) {
|
12 |
return; |
13 |
} |
14 |
// This creates a rectangle on the canvas. |
15 |
var x = Math.min(ev._x, tool.x0), |
16 |
y = Math.min(ev._y, tool.y0), |
17 |
w = Math.abs(ev._x - tool.x0), |
18 |
h = Math.abs(ev._y - tool.y0); |
19 |
context.clearRect(0, 0, canvas.width, canvas.height);// Clears the rectangle onload. |
20 |
|
21 |
if (!w || !h) {
|
22 |
return; |
23 |
} |
24 |
context.strokeRect(x, y, w, h); |
25 |
}; |
26 |
// Now when you select the rectangle tool, you can draw rectangles. |
27 |
this.mouseup = function (ev) {
|
28 |
if (tool.started) {
|
29 |
tool.mousemove(ev); |
30 |
tool.started = false; |
31 |
img_update(); |
32 |
} |
33 |
}; |
34 |
}; |
Und jetzt zum Linienwerkzeug.
1 |
// The line tool. |
2 |
tools.line = function () {
|
3 |
var tool = this; |
4 |
this.started = false; |
5 |
this.mousedown = function (ev) {
|
6 |
tool.started = true; |
7 |
tool.x0 = ev._x; |
8 |
tool.y0 = ev._y; |
9 |
}; |
10 |
this.mousemove = function (ev) {
|
11 |
if (!tool.started) {
|
12 |
return; |
13 |
} |
14 |
context.clearRect(0, 0, canvas.width, canvas.height); |
15 |
// Begin the line. |
16 |
context.beginPath(); |
17 |
context.moveTo(tool.x0, tool.y0); |
18 |
context.lineTo(ev._x, ev._y); |
19 |
context.stroke(); |
20 |
context.closePath(); |
21 |
}; |
22 |
// Now you can draw lines when the line tool is seletcted. |
23 |
this.mouseup = function (ev) {
|
24 |
if (tool.started) {
|
25 |
tool.mousemove(ev); |
26 |
tool.started = false; |
27 |
img_update(); |
28 |
} |
29 |
}; |
30 |
}; |
Und das ist fast unser JavaScript! Schließen wir nun die Funktion und Variablen, die wir vor einiger Zeit erstellt haben, indem wir damit enden:
1 |
init(); |
1 |
}, false); } |
Schritt 6 Einfügen der Werkzeugauswahl



Kehren wir zu unserer HTML-Seite zurück. Wir werden nun die Werkzeugauswahl mit einem einfachen HTML-Dropdown-Formular-Tag erstellen.
Fügen Sie direkt unter dem Anfang des Tags 'blackboardPlaceholder' und direkt vor unserem Canvas-Tag den folgenden Code hinzu, um die Auswahl des Dropdown-Tools zu erstellen.
1 |
<p><!-- Tool Selector --> |
2 |
<select name="selector" id="selector"> |
3 |
<option value="chalk">Chalk</option> |
4 |
<option value="line">Line</option> |
5 |
<option value="rect">Rectangle</option> |
6 |
</select>
|
7 |
</p>
|
Und das ist es! Jetzt haben wir ein Dropdown-Formular. Fügen wir etwas Styling hinzu.
1 |
.noscript { padding:50px 30px 0 40px; width:820px; }
|
2 |
#selector {
|
3 |
position:absolute; |
4 |
z-index:99999; |
5 |
margin-top:-30px; |
6 |
} |
7 |
select {
|
8 |
font-family:Verdana, Geneva, sans-serif; |
9 |
font-size:12px; |
10 |
background-color:#EAEAEA; |
11 |
} |
Das .noscript ist der Stil für den Text zwischen dem Canvas-Tag, den wir oben nie hinzugefügt haben.
Schritt 7 Ändern der Farbe



Nur um Sie zu informieren, das sind Kreidestücke. Ich hatte das Gefühl, dass ich Ihnen aufgrund meiner Designfähigkeiten mitteilen musste, was sie waren, weil mir viele Leute erzählten, dass sie einem Stück Kreide nicht im entferntesten nahe kommen :)
Es ist eigentlich ganz einfach, die Farbe im HTML zu ändern. Sie müssen lediglich die Onclick-Funktion verwenden. Links, Bilder, Text, Klassen usw. Die Funktion, mit der wir die Farbe ändern, ist unten aufgeführt.
1 |
onclick="context.strokeStyle = '#ff00d2';" |
Um die Farbe zu ändern, ändern Sie einfach den Hex-Farbcode zwischen den Klammern. #FF00D2, wie oben verwendet, ändert die Strichfarbe in Pink.
Fügen wir nun das HTML-Markup für die Kreidestücke hinzu.
1 |
<!-- Chalk Pieces -->
|
2 |
<div id="whiteChalk_button"> |
3 |
<img src="images/white.png" width="71" height="17" onclick="context.strokeStyle = '#FFFFFF';" /> |
4 |
</div>
|
5 |
<div id="redChalk_button"> |
6 |
<img src="images/red.png" width="71" height="17" onclick="context.strokeStyle = '#F00000';" /> |
7 |
</div>
|
8 |
<div id="orangeChalk_button"> |
9 |
<img src="images/orange.png" width="71" height="17" onclick="context.strokeStyle = '#ff9600';" /> |
10 |
</div>
|
11 |
<div id="yellowChalk_button"> |
12 |
<img src="images/yellow.png" width="71" height="17" onclick="context.strokeStyle = '#fff600';" /> |
13 |
</div>
|
14 |
<div id="greenChalk_button"> |
15 |
<img src="images/green.png" width="71" height="17" onclick="context.strokeStyle = '#48ff00';" /> |
16 |
</div>
|
17 |
<div id="blueChalk_button"> |
18 |
<img src="images/blue.png" width="71" height="17" onclick="context.strokeStyle = '#001eff';" /> |
19 |
</div>
|
20 |
<div id="pinkChalk_button"> |
21 |
<img src="images/pink.png" width="71" height="17" onclick="context.strokeStyle = '#ff00d2';" /> |
22 |
</div>
|
Fügen Sie den obigen Code direkt unter dem </canvas>-Tag hinzu.
Ihr HTML-Code sollte bisher wie folgt aussehen.
1 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
2 |
<html xmlns="http://www.w3.org/1999/xhtml"> |
3 |
|
4 |
<head>
|
5 |
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> |
6 |
<!-- External CSS Document(s) -->
|
7 |
<link rel="stylesheet" type="text/css" href="css/styles.css" /> |
8 |
<title>Online Drawing Application | Web Design Deluxe</title> |
9 |
<!-- Eternal JavaScript Document(s) -->
|
10 |
<script type="text/javascript" src="js/canvas.js"></script> |
11 |
</head>
|
12 |
<body>
|
13 |
|
14 |
<!-- Wrapper Begins -->
|
15 |
<div id="wrapper"> |
16 |
|
17 |
<div id="blackboardPlaceholder"> |
18 |
|
19 |
<p><!-- Tool Selector --><select name="selector" id="selector"><option value="chalk">Chalk</option><option value="line">Line</option><option value="rect">Rectangle</option></select></p> |
20 |
|
21 |
<!-- Canvas Begins --><canvas id="drawingCanvas" height="532" width="897"> <p class="noscript">We're sorry, this web application is currently not supported with your browser. Please use an alternate browser or download a supported <br />browser. Supported browsers: <a href="http://www.google.com/chrome">Google Chrome</a>, <a href="http://www.opera.com">Opera</a>, <a href="http://www.mozilla.com">Firefox</a>, <a href="http://www.apple.com/safari">Safari</a>, <br />and <a href="http://www.konqueror.org">Konqueror</a>. Also make sure your JavaScript is enabled.</p></canvas> <!-- Canvas Ends --> |
22 |
|
23 |
<!-- Chalk Pieces --><div id="whiteChalk_button"><img src="images/white.png" width="71" height="17" onclick="context.strokeStyle = '#FFFFFF';" /></div> |
24 |
|
25 |
<div id="redChalk_button"><img src="images/red.png" width="71" height="17" onclick="context.strokeStyle = '#F00000';" /> |
26 |
</div>
|
27 |
|
28 |
<div id="orangeChalk_button"><img src="images/orange.png" width="71" height="17" onclick="context.strokeStyle = '#ff9600';" /> |
29 |
</div>
|
30 |
<div id="yellowChalk_button"><img src="images/yellow.png" width="71" height="17" onclick="context.strokeStyle = '#fff600';" /></div> |
31 |
|
32 |
<div id="greenChalk_button"> |
33 |
<img src="images/green.png" width="71" height="17" onclick="context.strokeStyle = '#48ff00';" /></div> |
34 |
|
35 |
<div id="blueChalk_button"><img src="images/blue.png" width="71" height="17" onclick="context.strokeStyle = '#001eff';" /></div> |
36 |
<div id="pinkChalk_button"><img src="images/pink.png" width="71" height="17" onclick="context.strokeStyle = '#ff00d2';" /></div> |
37 |
|
38 |
</div>
|
39 |
</div>
|
40 |
</body>
|
41 |
</html>
|
Schritt 8 Hinzufügen eines Radiergummis



Der Radierer ist einfach ein Bild, das dieselbe Strichfarbe hat wie das Rechteck, das wir im JavaScript '#424242' erstellt haben. Kopieren Sie den HTML-Code und fügen Sie ihn unter den Kreidestücken ein, die wir gerade oben erstellt haben.
1 |
<!-- Eraser -->
|
2 |
<div id="eraser" onclick="context.strokeStyle = '#424242'; context.lineWidth = '22';"></div> |
Schritt 9 Stylen der Kreide und des Radiergummis
Fügen wir nun den Kreidestücken und dem Radiergummi etwas Styling hinzu, bevor wir weiterarbeiten. Fügen Sie Ihrer Datei styles.css Folgendes hinzu.
1 |
#redChalk_button { cursor:pointer; position:absolute; z-index:99999; top:620px; left:160px; }
|
2 |
#greenChalk_button { cursor:pointer; position:absolute; z-index:99999; top:620px; left:400px; }
|
3 |
#blueChalk_button { cursor:pointer; position:absolute; z-index:99999; top:620px; left:480px; }
|
4 |
#yellowChalk_button { cursor:pointer; position:absolute; z-index:99999; top:620px; left:320px; }
|
5 |
#orangeChalk_button { cursor:pointer; position:absolute; z-index:99999; top:620px; left:240px; }
|
6 |
#pinkChalk_button { cursor:pointer; position:absolute; z-index:99999; top:620px; left:560px; }
|
7 |
#whiteChalk_button { cursor:pointer; position:absolute; z-index:99999; top:620px; left:80px; }
|
8 |
#eraser {
|
9 |
position:absolute; |
10 |
background:url(../images/eraser.png) no-repeat; |
11 |
left: 737px; |
12 |
top: 568px; |
13 |
width: 139px; |
14 |
height: 67px; |
15 |
z-index:99999; |
16 |
cursor:pointer; |
17 |
} |
Schritt 10 Ändern des Hubgewichts
Das Ändern des Strichs ist genauso einfach wie das Ändern der Farbe im HTML. Alles was Sie tun müssen, ist die Funktion 'onclick' zu verwenden:
1 |
onclick="context.lineWidth = '1.0';" |
'1.0' ist der kleinste zulässige Strich. Sie können den Hub beliebig erhöhen.
Fügen wir nun unserem HTML-Code einige Strichfunktionen hinzu. Kopieren Sie den folgenden Code und fügen Sie ihn in Ihr HTML-Dokument ein. Sie müssen dies außerhalb des 'blackboardPlaceholder' platzieren, unmittelbar nach dem schließenden div-Tag (bevor der Wrapper endet).
1 |
<!-- Toggle Stroke Weight -->
|
2 |
<img src="images/toggle.png" width="16" height="16" id="stroke-subtract" title="Decrease Stroke" onclick="context.lineWidth--;" /> |
3 |
<img src="images/toggle-expand.png" width="16" height="16" id="stroke-add" title="Increase Stroke" onclick="context.lineWidth++;" /> |
4 |
|
5 |
<!-- Stroke Weight Panel -->
|
6 |
<div id="strokeWeight"> |
7 |
<img src="images/stroke1.png" alt="1.0" class="stroke" width="30" height="32" onclick="context.lineWidth = '1.0';" /> |
8 |
<img src="images/stroke2.png" alt="6.0" class="stroke" width="30" height="32" onclick="context.lineWidth = '6.0';" /> |
9 |
<img src="images/stroke3.png" alt="9.0" class="stroke" width="30" height="32" onclick="context.lineWidth = '9.0';" /> |
10 |
<img src="images/stroke4.png" alt="13.0" class="stroke" width="30" height="32" onclick="context.lineWidth = '13.0';" /> |
11 |
</div>
|
Nun etwas CSS:
1 |
#stroke-subtract {
|
2 |
position:absolute; |
3 |
top:436px; |
4 |
left:-13px; |
5 |
z-index:999999; |
6 |
cursor:pointer; |
7 |
} |
8 |
#stroke-add {
|
9 |
position:absolute; |
10 |
top:436px; |
11 |
left:5px; |
12 |
z-index:999999; |
13 |
cursor:pointer; |
14 |
} |
15 |
#strokeWeight {
|
16 |
background:url(../images/stroke-style.png) no-repeat; |
17 |
width:43px; |
18 |
height:153px; |
19 |
position:absolute; |
20 |
top:456px; |
21 |
left:-18px; |
22 |
z-index:1; |
23 |
padding:8px 0 0 7px; |
24 |
} |
25 |
.stroke { cursor:pointer; margin-bottom:3px; }
|
Schritt 11 Die Speicherfunktion



Dies ist wahrscheinlich der komplexeste Abschnitt unseres Tutorials. Wir werden die image/data-JavaScript-Funktion verwenden, um unser Bild zu speichern. Aber zuerst brauchen wir eine Bildbibliothek. Wir werden das Canvas2Image und die Base64-Bibliothek verwenden, die von Jacob Seidelin unter nihilogic.dk erstellt wurden.
Wenn Sie dies noch nicht getan haben, können Sie diese Dateien hier herunterladen und in Ihrem 'js'-Ordner ablegen.
Wir müssen die Datei canvas.js ändern. Fügen Sie am Ende Ihrer Datei Folgendes hinzu.
1 |
window.onload = function() {
|
2 |
var bMouseIsDown = false; |
3 |
|
4 |
var oCanvas = document.getElementById("drawingCanvas");
|
5 |
var oCtx = oCanvas.getContext("2d");
|
6 |
var iWidth = oCanvas.width; |
7 |
var iHeight = oCanvas.height; |
8 |
function showDownloadText() {
|
9 |
document.getElementById("textdownload").style.display = "block";
|
10 |
} |
11 |
function hideDownloadText() {
|
12 |
document.getElementById("textdownload").style.display = "none";
|
13 |
} |
14 |
function convertCanvas(strType) {
|
15 |
if (strType == "PNG") |
16 |
var oImg = Canvas2Image.saveAsPNG(oCanvas, true); |
17 |
if (strType == "BMP") |
18 |
var oImg = Canvas2Image.saveAsBMP(oCanvas, true); |
19 |
if (strType == "JPEG") |
20 |
var oImg = Canvas2Image.saveAsJPEG(oCanvas, true); |
21 |
if (!oImg) {
|
22 |
alert("Sorry, this browser is not capable of saving." + strType + " files!");
|
23 |
return false; |
24 |
} |
25 |
oImg.id = "canvasimage"; |
26 |
oImg.style.border = oCanvas.style.border; |
27 |
oCanvas.parentNode.replaceChild(oImg, oCanvas); |
28 |
howDownloadText(); |
29 |
} |
30 |
function saveCanvas(pCanvas, strType) {
|
31 |
var bRes = false; |
32 |
if (strType == "PNG") |
33 |
bRes = Canvas2Image.saveAsPNG(oCanvas); |
34 |
if (strType == "BMP") |
35 |
bRes = Canvas2Image.saveAsBMP(oCanvas); |
36 |
if (strType == "JPEG") |
37 |
bRes = Canvas2Image.saveAsJPEG(oCanvas); |
38 |
if (!bRes) {
|
39 |
alert("Sorry, this browser is not capable of saving " + strType + " files!");
|
40 |
return false; |
41 |
} |
42 |
} |
43 |
document.getElementById("convertpngbtn").onclick = function() {
|
44 |
convertCanvas("PNG");
|
45 |
} |
46 |
document.getElementById("resetbtn").onclick = function() {
|
47 |
var oImg = document.getElementById("canvasimage");
|
48 |
oImg.parentNode.replaceChild(oCanvas, oImg); |
49 |
hideDownloadText(); |
50 |
}} |
Wenn Sie auf die Schaltfläche Speichern klicken, wird Ihre Leinwand im Wesentlichen in ein PNG konvertiert, und von dort aus können Sie mit der rechten Maustaste klicken und das Bild herunterladen. Ziemlich ordentlich, oder?
Fügen wir nun den HTML-Code hinzu:
1 |
<!-- Save Image -->
|
2 |
<div id="saveWrapper"> |
3 |
<div id="save"> |
4 |
<img src="images/save.png" alt="Save Image" width="16" height="16" id="convertpngbtn" title="Save Image" /> |
5 |
</div>
|
6 |
<div id="textdownload"> |
7 |
Right click the image to download. |
8 |
<img src="images/cross.png" alt="Cancel" width="16" height="16" id="resetbtn" title="Continue Drawing" /> |
9 |
</div>
|
10 |
</div>
|
Fügen Sie den obigen Code direkt nach dem Wrapper hinzu. Dadurch werden die Schaltflächen zum Speichern und Löschen erstellt. Jetzt werden wir das CSS hinzufügen, um es ein wenig zu gestalten.
1 |
#saveWrapper { position:absolute; right:0px; }
|
2 |
#convertpngbtn {
|
3 |
float:right; |
4 |
margin-right:40px; |
5 |
margin-top:-10px; |
6 |
position:relative; |
7 |
z-index:9999; |
8 |
cursor:pointer; |
9 |
overflow:hidden; |
10 |
} |
11 |
#textdownload {
|
12 |
display:none; |
13 |
position:absolute; |
14 |
font-family:Verdana, Geneva, sans-serif; |
15 |
color:#000; |
16 |
font-size:10px; |
17 |
float:right; |
18 |
margin-top:-10px; |
19 |
right:91px; |
20 |
width:250px; |
21 |
overflow:hidden; |
22 |
} |
Fügen Sie diesen Code einfach dem Stylesheet styles.css hinzu.
Schritt 12 Die erweiterte Farbtabelle

Um mehr Flexibilität zu erreichen, sollten wir eine Farbtabelle erstellen, die der in Dreamweaver CS4 verwendeten ähnelt.



Um dies zu tun, dachte ich, es wäre eigentlich ganz einfach. Ich würde die obige Farbtabelle speichern und sie dann als Hintergrundbild einer Div-ID verwenden und dann im Inneren eine separate Div-Klasse für jede Farbe mit derselben Onclick-Funktion haben, die wir oben verwendet haben. Ich erkannte bald, dass dies nicht die beste Lösung war, da dies ein Durcheinander im HTML-Code verursachen und das Laden jedes Divs ewig dauern würde. Stattdessen habe ich eine neue Lösung gefunden, die ausschließlich aus JavaScript besteht. Ich würde jedes Div dynamisch in meiner JavaScript-Datei erstellen und den Farbcode für jedes 'color box' in ein Array einfügen. Bevor ich weiter erkläre, werden wir genau das tun. Öffnen Sie Ihre JavaScript-Datei, an der wir gearbeitet haben, und erstellen Sie ganz oben in der Datei direkt darunter eine Kontextvariable. Erstellen Sie eine neue Variable mit dem Namen "colorPalette". Dann beginnen wir mit dem Array. Jede neue Farbzeile wurde im JavaScript durch eine Leerzeichenzeile getrennt. Es gibt insgesamt zwölf Spalten, sodass wir insgesamt zwölf Abschnitte in unserem Array haben.
Hier ist das JavaScript:
1 |
var colorPalette = [ //Begin array of color table hex color codes. |
2 |
|
3 |
"#000000","#000000","#000000","#000000","#003300","#006600","#009900","#00CC00","#00FF00","#330000","#333300","#336600","#339900","#33CC00","#33FF00","#660000","#663300","#666600","#669900","#66CC00","#66FF00", |
4 |
|
5 |
"#000000","#333333","#000000","#000033","#003333","#006633","#009933","#00CC33","#00FF33","#330033","#333333","#336633","#339933","#33CC33","#33FF33","#660033","#663333","#666633","#669933","#66CC33","#66FF33", |
6 |
|
7 |
"#000000","#666666","#000000","#000066","#003366","#006666","#009966","#00CC66","#00FF66","#330066","#333366","#336666","#339966","#33CC66","#33FF66","#660066","#663366","#666666","#669966","#66CC66","#66FF66", |
8 |
|
9 |
"#000000","#999999","#000000","#000099","#003399","#006699","#009999","#00CC99","#00FF99","#330099","#333399","#336699","#339999","#33CC99","#33FF99","#660099","#663399","#666699","#669999","#66CC99","#66FF99", |
10 |
|
11 |
"#000000","#CCCCCC","#000000","#0000CC","#0033CC","#0066CC","#0099CC","#00CCCC","#00FFCC","#3300CC","#3333CC","#3366CC","#3399CC","#33CCCC","#33FFCC","#6600CC","#6633CC","#6666CC","#6699CC","#66CCCC","#66FFCC", |
12 |
|
13 |
"#000000","#FFFFFF","#000000","#0000FF","#0033FF","#0066FF","#0099FF","#00CCFF","#00FFFF","#3300FF","#3333FF","#3366FF","#3399FF","#33CCFF","#33FFFF","#6600FF","#6633FF","#6666FF","#6699FF","#66CCFF","#66FFFF", |
14 |
|
15 |
"#000000","#FF0000","#000000","#990000","#993300","#996600","#999900","#99CC00","#99FF00","#CC0000","#CC3300","#CC6600","#CC9900","#CCCC00","#CCFF00","#FF0000","#FF3300","#FF6600","#FF9900","#FFCC00","#FFFF00", |
16 |
|
17 |
"#000000","#00FF00","#000000","#990033","#993333","#996633","#999933","#99CC33","#99FF33","#CC0033","#CC3333","#CC6633","#CC9933","#CCCC33","#CCFF33","#FF0033","#FF3333","#FF6633","#FF9933","#FFCC33","#FFFF33", |
18 |
|
19 |
"#000000","#0000FF","#000000","#990066","#993366","#996666","#999966","#99CC66","#99FF66","#CC0066","#CC3366","#CC6666","#CC9966","#CCCC66","#CCFF66","#FF0066","#FF3366","#FF6666","#FF9966","#FFCC66","#FFFF66", |
20 |
|
21 |
"#000000","#FFFF00","#000000","#990099","#993399","#996699","#999999","#99CC99","#99FF99","#CC0099","#CC3399","#CC6699","#CC9999","#CCCC99","#CCFF99","#FF0099","#FF3399","#FF6699","#FF9999","#FFCC99","#FFFF99", |
22 |
|
23 |
"#000000","#00FFFF","#000000","#9900CC","#9933CC","#9966CC","#9999CC","#99CCCC","#99FFCC","#CC00CC","#CC33CC","#CC66CC","#CC99CC","#CCCCCC","#CCFFCC","#FF00CC","#FF33CC","#FF66CC","#FF99CC","#FFCCCC","#FFFFCC", |
24 |
|
25 |
"#000000","#FF00FF","#000000","#9900FF","#9933FF","#9966FF","#9999FF","#99CCFF","#99FFFF","#CC00FF","#CC33FF","#CC66FF","#CC99FF","#CCCCFF","#CCFFFF","#FF00FF","#FF33FF","#FF66FF","#FF99FF","#FFCCFF","#FFFFFF" |
26 |
|
27 |
]; |
Und das ist jede Farbe in unserer Farbtabelle. Fügen wir nun das JavaScript hinzu, damit es funktioniert.
1 |
$(document).ready(function() {
|
2 |
// Handles showing/hiding the color table |
3 |
$("#colorTable").hide();
|
4 |
|
5 |
$("#color").click(function() {
|
6 |
$("#colorTable").show();
|
7 |
}); |
8 |
$(document).click(function() {
|
9 |
$("#colorTable").hide();
|
10 |
}); |
11 |
$("#color").click(function(event) {
|
12 |
event.stopPropagation(); |
13 |
}); |
14 |
}); |
15 |
function LoadColorTable() { // Populate the color picker table with colors specified in the 'colorPalette' array
|
16 |
for (i = 0; i < colorPalette.length; i++) { |
17 |
var colorDiv = document.createElement("div"); |
18 |
colorDiv.className = "color"; |
19 |
colorDiv.id = "colorSwatch" + i; |
20 |
colorDiv.style.backgroundColor = colorPalette[i]; |
21 |
colorDiv.setAttribute("onclick", "SetColor(id);"); |
22 |
document.getElementById("colorTable").appendChild(colorDiv); |
23 |
};
|
24 |
}
|
25 |
function SetColor(id) { // Set the color of the drawing tool when a color swatch is clicked |
26 |
context.strokeStyle = document.getElementById(id).style.backgroundColor; |
27 |
}
|
Okay, im obigen Code fügen wir zunächst einige Funktionen hinzu, um die colorTable-ID in unserem HTML-Code anzuzeigen oder auszublenden (worauf wir gleich noch eingehen werden). Dies ist nur eine grundlegende Abfrage, wenn Sie auf die Farbtabelle klicken oder irgendwo außerhalb der Farbtabelle, wird die ID ausgeblendet. Jetzt laden wir die colorTable. Wenn Sie dies tun, füllen wir es mit allen Farbcodes, die wir im Array 'colorPalette' hinzugefügt haben. Und damit alles funktioniert, legen wir die Farbe des Zeichenwerkzeugs fest, wenn auf ein Farbfeld geklickt wird. Dazu machen wir einfach jede Farbe zu einer Klasse von 'color' und verwenden dann das Array, um jeden Hex-Farbwert zum Hintergrund zu machen. Und schließlich verwenden Sie eine Funktion. Wenn Sie auf eine Farbe klicken, entspricht der context.strokeStyle dem Hintergrundbild.
Und für das HTML-Markup fügen Sie den folgenden Code unmittelbar nach dem Start des Wrappers in Ihrem HTML hinzu.
1 |
<!-- Color Table (controlled in JavaScript) -->
|
2 |
<div id="colorTable"></div> |
3 |
<!-- Toggle Color Button -->
|
4 |
<div id="color" title="Toggle Color"> |
5 |
<img src="images/color-arrow.png" alt="Toggle Color" width="16" height="16" /> |
6 |
</div>
|
Und jetzt fügen wir unserer Farbtabelle etwas Stil hinzu.
1 |
#colorTable {
|
2 |
width:231px; |
3 |
height:132px; |
4 |
position:absolute; |
5 |
margin-top:8px; |
6 |
z-index:999999; |
7 |
right:80px; |
8 |
background-color: #000000; |
9 |
display:none; |
10 |
cursor:pointer; |
11 |
} |
12 |
.color {
|
13 |
position:relative; |
14 |
height:7px; |
15 |
width:7px; |
16 |
float:left; |
17 |
padding:1px; |
18 |
margin:1px; |
19 |
} |
20 |
.color:hover{ border:solid 1px #FFF; margin:0px; }
|
Fügen Sie dies an einer beliebigen Stelle in Ihre Datei styles.css ein, die Sie vor einiger Zeit erstellt haben.
Und da hast du es! Jetzt haben wir über 200 verschiedene Farben zur Auswahl!
Schritt 13 Verwenden der Reload-Funktion zum Löschen der Leinwand
Jetzt erstellen wir eine einfache Schaltfläche zum Löschen der Leinwand. Der einfachste Weg, dies zu tun, ist einfach die Seite zu aktualisieren. Wir werden also eine Funktion verwenden, mit der Sie sicher alle vertraut sind. Wenn nicht, aktualisiert der folgende Code die Seite einfach mit JavaScript.
1 |
<a href="javascript:location.reload(true)">Clear</a> |
Das ist es. Fügen wir es nun in unseren HTML-Code ein. Wir werden das Bild in Ihrem Ordner "images" verwenden, das wie das radioaktive Symbol aussieht. Ich bin mir nicht sicher, warum ich dafür ein radioaktives Symbol verwendet habe, aber ich konnte kein anderes Symbol im Symbolpaket finden, das verwendet werden kann. Dies wird also ausreichen.
Fügen Sie das folgende Bild zu Ihrem HTML-Code hinzu. Da es eine absolute Position hat, spielt es keine Rolle, wo Sie es platzieren, solange Sie es außerhalb des 'blackboardPlaceholder' und innerhalb des 'wrapper' platzieren. Damit der Code "in der richtigen Reihenfolge" aussieht, setzen wir den folgenden Code direkt nach unserer ID "color".
1 |
<!-- Clear Canvas Button -->
|
2 |
<div id="nuke" title="Clear Canvas"> |
3 |
<a href="javascript:location.reload(true)"> |
4 |
<img src="images/burn.png" alt="Clear Canvas" width="16" height="16" /> |
5 |
</a>
|
6 |
</div>
|
Und natürlich etwas CSS:
1 |
#nuke { position:absolute; cursor:pointer; margin-top:-10px; right:100px; }
|
Und da hast du es. Ein gut aussehender "klarer" Knopf.
Schritt 14 Hinzufügen einer zusätzlichen Funktion zum Strichmenü



Nachdem ich diese Zeichenanwendung abgeschlossen hatte, hatte ich immer noch das Gefühl, dass das Gewicht der Striche, die Sie auswählen konnten, immer noch etwas gering war. Also dachte ich mir, ich würde dafür eine neue kleine Funktion machen. Ich werde das Strichmenü, das wir derzeit bereits haben, nicht entfernen, sondern es einfach ein wenig ergänzen. Meine Idee war, einen Plus- und einen Minus-Knopf zu haben. Die Plus-Taste würde das Strichgewicht um eins erhöhen, und die Minus-Taste würde den Hub offensichtlich um eins verringern.
Zu diesem Zweck finden wir in unserem Icon-Pack einige nette Plus- und Minus-Schaltflächen. Wir werden dann den HTML-Schreibzugriff über die ID 'storkeWeight' schreiben.
1 |
<!-- Toggle Stroke Weight -->
|
2 |
<img src="images/toggle.png" width="16" height="16" id="stroke-subtract" title="Decrease Stroke" onclick="context.lineWidth--;" /> |
3 |
<img src="images/toggle-expand.png" width="16" height="16" id="stroke-add" title="Increase Stroke" onclick="context.lineWidth++;" /> |
Die Onclick-Funktion unterscheidet sich ein wenig von der zuvor verwendeten. Im Grunde genommen addieren oder subtrahieren die Werte '-' und '++' einfach 1 vom Standardwert. Der Standardwert ist 1.0. Wenn Sie also auf die Plus-Schaltfläche klicken, ist der Strich jetzt 2.0, etwas größer als der Standardwert.
Und jetzt das CSS:
1 |
#stroke-subtract {
|
2 |
position:absolute; |
3 |
top:436px; |
4 |
left:-13px; |
5 |
z-index:999999; |
6 |
cursor:pointer; |
7 |
} |
8 |
#stroke-add {
|
9 |
position:absolute; |
10 |
top:436px; |
11 |
left:5px; |
12 |
z-index:999999; |
13 |
cursor:pointer; |
14 |
} |
Schritt 15 Hinzufügen der Tooltips



Um die Anwendung benutzerfreundlicher zu gestalten, müssen wir allen unseren Schaltflächen einige Titel hinzufügen. Zum Glück habe ich bereits den gesamten Code in den HTML-Code aufgenommen, Sie haben es einfach nicht bemerkt. Grundsätzlich haben alle unsere Symbole im HTML-Code das Titel-Tag. Sie alle sollten wissen, was Titel-Tags sind, aber wir werden diese Tags verwenden, um einen ziemlich netten jQuery-Tooltip-Effekt zu implementieren, der als Tipsy bekannt ist. Ich habe Tipsy schon oft in anderen Projekten verwendet und es ist wirklich ein großartiges Plugin. Sie müssen die Tipsy-Dateien hier herunterladen. Platzieren Sie die Datei 'tipsy.css' in Ihrem CSS-Ordner, die Datei 'jquery.tipsy.js' in Ihrem Ordner js und die Datei 'tipsy.gif' in Ihrem Bilderordner, falls sie noch nicht vorhanden ist.
Sie müssen die jQuery-Bibliothek zu Ihrem Header hinzufügen. Hier ist der direkte Link zur neuesten jQuery-Bibliothek. Sie können direkt darauf verlinken oder es in Ihren 'js'-Ordner herunterladen:
http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js
Jetzt müssen wir die JavaScript-Datei für beschwipst aufrufen. Stellen Sie sicher, dass beim Aufrufen in Ihrem Header das jQuery-Skript vor diesem Skript steht. Es sollte so aussehen:
1 |
<script type="text/javascript" src="js/jquery.tipsy.js"></script> |
Rufen Sie dann die Datei 'tipsy.css' in Ihrem HTML-Code auf. Das sollte wie folgt aussehen:
1 |
<link rel="stylesheet" type="text/css" href="css/tipsy.css" /> |
Und jetzt nennen wir das eigentliche JavaScript. Platzieren Sie dies in Ihrer Kopfzeile unter allen externen JavaScript- und CSS-Quellen.
1 |
<script type='text/javascript'> |
2 |
$(function() { |
3 |
$('#nuke').tipsy({gravity: 's'}); |
4 |
$('#color').tipsy({gravity: 's'}); |
5 |
$('#convertpngbtn').tipsy({gravity: 's'}); |
6 |
$('#resetbtn').tipsy({gravity: 's'}); |
7 |
$('#stroke-subtract').tipsy({gravity: 's'}); |
8 |
$('#stroke-add').tipsy({gravity: 's'}); }); |
9 |
</script>
|
Sie müssen Ihrer Datei styles.css noch eine weitere Sache hinzufügen, um die Tooltips ein wenig zu verbessern:
1 |
.tooltip{
|
2 |
position: absolute; |
3 |
top: 0; |
4 |
left: 0; |
5 |
z-index: 3; |
6 |
display: none; |
7 |
background-color:#F00; |
8 |
} |
Verpacken Sie es
Und das fasst es fast zusammen! Herzliche Glückwünsche. Bitte lassen Sie mich wissen, wenn Sie Fragen oder Anregungen zur Verbesserung dieser Anwendung haben. Danke fürs Lesen!



