Ich habe ein Ding gemacht, mit dem du mit deiner Maus auf einem Raster mit verschiedenen Farben zeichnen kannst. Du kannst dann den HTML-Code des von dir erstellten Designs kopieren und einfügen.

Demo ansehen Dateien herunterladen
Funktionen
- Löschen des aktuellen Designs
- Ändern der Rastergröße auf verschiedene Voreinstellungen
- Farbfelder zum Ändern der aktuell aktiven Farbe
- Farbauswahl zum Ändern der Farben der Farbfelder
- Weiße Farbe = Radieren
- Wenn du die [Option]-Taste gedrückt hältst, wechselst du in den Radiergummi-Modus. Wenn du die Taste loslässt, kehrst du zur vorherigen Farbe zurück.
- Möglichkeit, ein Bild im Raster zu platzieren, um davon abzuzeichnen (dimmt das darüber liegende Raster)
- Ein- und Ausschalten des Zeichenmodus
- Und der Sinn der ganzen Sache… die Möglichkeit, den HTML-Code des fertigen Designs zu kopieren und einzufügen.
Was ist der Sinn?
Ich war bei einer Präsentation von @blueys, wo sie über HTML-E-Mails sprach und einige besonders schöne Beispiele zeigte. Eines, das ich extra cool fand, war dieses hier, das sie aus der Campaign Monitor Galerie gefunden hatte.
„Inky“, der blaue Geist aus PacMan, der oben gezeigt wird, wurde ohne Bilder erstellt, nur mit Tabellenzellen mit angewendeten Hintergrundfarben. Das ist besonders cool für HTML-E-Mails, denn in vielen (den meisten?) E-Mail-Clients werden heutzutage Bilder erst angezeigt, wenn ein Benutzer explizit auf einen Link klickt, um sie anzeigen zu lassen. Durch die Verwendung von farbigen Tabellenzellen können einfache Grafiken ohne tatsächliche Bilder angezeigt werden.
Erstellung dieser Mini-App
Dies ist im Wesentlichen eine One-Page-JavaScript-(jQuery)-gesteuerte Mini-Anwendung. Lassen Sie uns behandeln, wie einige der verschiedenen Teile davon funktionieren.
Erstellung des Rasters
Die Zeichentabelle selbst ist buchstäblich eine HTML-Tabelle. Wir könnten Tabellen-Markup direkt in HTML einfügen, aber es ist viel flexibler, wenn JavaScript das Markup erstellt. So können wir die Tabellenstruktur programmatisch ändern, anstatt den HTML-Code direkt zu verändern. Dies ermöglicht uns auch, neue Tabellengrößen dynamisch zu erstellen. Eine der Funktionen ist ein Dropdown-Menü für verschiedene Rastergrößen, also sollten wir unsere Rastererstellungs-JavaScript-Funktion tatsächlich dort einbauen, wo sie auf Änderungen reagiert.
function buildGrid(cols, rows) {
var tableMarkup = "";
for (x = 0; x < cols; x++) {
tableMarkup += "<tr>";
for (y = 0; y < rows; y++) {
tableMarkup += "<td> </td>";
}
tableMarkup += "</tr>";
}
$("#drawing-table").html(tableMarkup)
};
Dies erstellt einen leeren String, dann gibt es eine äußere Schleife, die so oft läuft, wie es der übergebene rows-Parameter angibt, und eine innere Schleife, die so oft läuft, wie es der übergebene cols-Parameter angibt. Für jede Zeile werden umgebende <tr>-Tags an den String angehängt, und für jede Spalte werden <td>s eingefügt.
Wenn fertig, wird der HTML-Code des Rasters durch das neu erstellte Markup ersetzt. Ich war etwas neugierig auf die Geschwindigkeit der String-Verkettung für diese Art von Aufgabe, aber es scheint, dass dies keine schlechte Vorgehensweise ist. Die Alternativen wären das Erstellen und Anhängen von Elementen im laufenden Betrieb und die Verwendung von Arrays. Weitere Informationen finden Sie in diesem Forrst-Thread.
Jetzt können wir einige Variablen für die anfänglichen Zeilen und Spalten festlegen und die Funktion aufrufen.
var cols = 20, rows = 20;
// Inital Build of Table
buildGrid(cols, rows);
Der HTML-Code für unser Dropdown-Menü für die Rastergröße wird wie folgt aussehen
<select id="gridSize">
<option value="10,10">10 x 10</option>
<option value="20,20" selected>20 x 20</option>
<option value="30,30">30 x 30</option>
</select>
Und dann werden wir auf die Änderung des Werts im Dropdown achten und die Funktion buildGrid() erneut aufrufen, wenn dies geschieht.
// Dropdown for changing Grid Size
$("#gridSize").change(function() {
$el = $(this);
rows = $el.val().split(",")[0];
cols = $el.val().split(",")[1];
buildGrid(rows, cols);
});
Ebenso prüft das Löschen des Designs einfach die aktuelle Einstellung des Dropdowns und baut das Raster mit dieser Größe neu auf.
Das eigentliche Zeichnen
Wir müssen bei der Maus und der Umsetzung der Klick-und-Ziehen-Zeichenfunktion etwas clever vorgehen. Wir können offensichtlich nicht einfach Klick-Events an die Zellen anhängen, da dies das Zeichnen mühsam machen würde. Wir müssen das mouseenter-Event verwenden, aber auch wissen, ob die Maustaste gerade gedrückt ist oder nicht. Denken wir darüber nach.
- Beim
mousedowneiner beliebigen Tabellenzelle wird der Zeichenzustand auf "ein" gesetzt - – Wenn der Radiergummi-Modus aktiviert ist, wird der Stil der Zelle entfernt
- – Wenn der Radiergummi-Modus deaktiviert ist, wird die Zelle eingefärbt
- Beim
mouseentereiner beliebigen Tabellenzelle wird geprüft, ob der Zeichenzustand aktiviert ist - – Wenn ja, wird die Zelle eingefärbt
- Beim
mouseoutirgendwo wird der Zeichenzustand auf "aus" gesetzt
// Drawing functionality
$("#drawing-table").delegate("td", "mousedown", function() {
mouseDownState = true;
$el = $(this);
if (eraseState) {
$el.removeAttr("style");
} else {
$el.css("background", curColor);
}
}).delegate("td", "mouseenter", function() {
if (mouseDownState) {
$el = $(this);
if (eraseState) {
$el.removeAttr("style");
} else {
// DRAWING ACTION
$el.css("background", curColor);
}
}
});
$("html").bind("mouseup", function() {
mouseDownState = false;
});
Radiergummi-Modus
Unser Zeichenmodus ist bereits darauf vorbereitet, sowohl zu radieren als auch zu malen. Wir müssen also nur sicherstellen, dass die Variable eraseState entsprechend auf true oder false gesetzt wird. Die erste Möglichkeit, ihn zu aktivieren, ist das Klicken auf den weißen Kreis. Beachten Sie im unten stehenden HTML-Code, dass das Attribut data-color verwendet wird, um den Farbwert für die drei Farbfelder zu speichern, aber für den vierten/weißen/Radiergummi-Kreis ist der Wert "eraser".
<fieldset id="color-selector">
<legend>Color Picker</legend>
<div class="color red selected" data-color="red"><input type="text"></div>
<div class="color green" data-color="green"><input type="text"></div>
<div class="color blue" data-color="blue"><input type="text"></div>
<div class="color eraser" data-color="eraser"></div>
<p>Hold [Option] key for temporary erase mode</p>
</fieldset>
Wenn einer der Kreise angeklickt wird, wird die aktuelle Farbe auf die Farbe des Farbfeldes gesetzt und der Radiergummi-Modus ausgeschaltet, wenn es sich um eine Farbe handelt. Wenn der angeklickte Kreis der Radiergummi ist, wird der Radiergummi-Modus umgeschaltet. Außerdem wird eine Klasse selected angewendet, um visuelles Feedback über die Änderung zu geben.
// Color selection swatches
$("#color-selector").delegate(".color", "click", function() {
$el = $(this);
var pulledVal = $el.attr("data-color");
if (pulledVal == 'eraser') {
eraseState = true;
} else {
eraseState = false;
curColor = pulledVal;
}
$(".color").removeClass("selected");
$(this).addClass("selected");
});
Wir haben auch im Markup geschrieben, dass du die [Option]-Taste gedrückt halten kannst, um den Radiergummi-Modus umzuschalten. Das erleichtert das Zeichnen erheblich, da du zwischen den Modi wechseln kannst, ohne die Maus manuell über den Radiergummi bewegen und ihn auswählen zu müssen. Dazu überwachen wir keydown- und keyup-Ereignisse im Dokument. Wenn die Taste 18 (die Option-Taste) ist, schalten wir den Radiergummi-Modus entsprechend ein und aus und wenden auch die Klasse selected für mehr visuelles Feedback an.
// Erasing functionality through OPTION key
$(document).keydown(function(event) {
if (event.keyCode == 18) {
eraseState = true;
$(".selected").addClass("previous");
$(".color").removeClass("selected");
$(".eraser").addClass("selected");
}
}).keyup(function(event) {
if (event.keyCode == 18) {
eraseState = false;
$(".color").removeClass("selected");
$(".previous").addClass("selected").removeClass("previous");
$("." + curColor).addClass("selected");
}
});
Farbauswahl
Ich habe diesen jQuery Color Picker verwendet. Beachten Sie, dass jedes der Farbfelder im HTML oben ein <input type="text" /> innerhalb des <div> hatte. Diese Eingabefelder werden für die Farbauswahl verwendet, um den Wert zu speichern.
597″ />
An jedem dieser Texteingabefelder binden wir die Farbauswahl. Wenn eine Auswahl getroffen wird, aktualisieren wir die visuelle Farbe des Farbfeldes sowie sein data-color-Attribut für den Fall, dass es weg und wieder zurückgeschaltet wird.
$('.color input').ColorPicker({
onSubmit: function(hsb, hex, rgb, el) {
var $swatch = $(el).parent();
var newColor = "#" + hex;
$(".color").removeClass("selected");
$("." + $swatch.attr("data-color")).css("background", newColor).addClass("selected");
$swatch.attr("data-color", newColor);
curColor = newColor;
},
onBeforeShow: function () {
$(this).ColorPickerSetColor(this.value);
}
});
Zeichenmodus
Wenn die URL eines Bildes in das dafür vorgesehene Texteingabefeld eingegeben und abgeschickt wird, wollen wir einen neuen <div> unter der Tabelle erstellen und dieses Bild anzeigen. Es wird genau die gleiche Größe wie die Tabelle haben und als Hintergrundbild gesetzt, sodass es abgeschnitten wird, wenn das Bild größer ist. Wir werden auch einen Zeichenmodus haben, bei dem wir die Opazität der Tabelle verringern, während das Bild sichtbar ist. Um den Fortschritt zu überprüfen, werden wir eine Schaltfläche zum Umschalten des Zeichenmodus haben. Das Wiedereinschalten ist jedoch immer noch nur ein Knopfdruck.
// Zeichenfunktionalität
$("#tracing-image-form").submit(function() {
var url = $("#fileLocation").val();
$("<div />", {
css: {
backgroundImage: "url(" + url + ")",
width: 500,
height: 500,
opacity: 1,
position: "absolute",
top: 0,
left: 0
},
id: "tracing-image"
}).appendTo("#table-wrap");
$("#drawing-table").css("opacity", 0.5);
$("#toggle-tracing-mode").show();
$("#tracing-image-form").remove();
tracingMode = true;
return false;
});
$("#toggle-tracing-mode").click(function() {
if (tracingMode) {
$("#tracing-image").css("visibility", "hidden");
$(this).html("Toggle Tracing Mode On");
$("#drawing-table").css("opacity", 1);
tracingMode = false;
} else {
$("#tracing-image").css("visibility", "visible");
$(this).html("Toggle Tracing Mode Off");
$("#drawing-table").css("opacity", 0.5);
tracingMode = true;
}
});
Das kann wahrscheinlich eleganter gelöst werden als das, aber es erfüllt seinen Zweck.
Bereitstellung des endgültigen HTML
Der Zweck dieser gesamten Mini-App ist die Lieferung des HTML-Codes der entworfenen Tabelle. Glücklicherweise ist das unglaublich einfach. Wir haben ein Textfeld und einen Button. Wenn der Button geklickt wird, wird der HTML-Code von der Tabelle gesammelt und in das Textfeld eingefügt.
$("#get-html-button").click(function() {
$("#the-html").val("<table style='width: 100%; border-collapse: collapse;'>" + $("#drawing-table").html() + "</table>");
});
Zusammenfassung
Ich glaube, ich werde ein Screencast von all dem machen und alles durchsprechen, also haltet danach Ausschau. Nicht jedes Detail und jede Codezeile ist in den obigen schriftlichen Ausführungen enthalten, ich habe nur die interessantesten Module aufgeschlüsselt. Um den vollständigen Code einzusehen, laden Sie das Beispiel herunter und spielen Sie damit. Wenn Sie etwas Spaßiges damit machen, teilen Sie es!
…. Wie findest du die Zeit, so großartig zu sein?
Das Erfinden cleverer Gizmos wie dieses ist sein Job. ;)
Schön, das erinnert mich an etwas Ähnliches, das ich gemacht habe
http://frabjous.ath.cx/misc/conway/
Es ist ein Conway's Game of Life-Simulator, der die Hintergrundfarbe-Eigenschaft eines Gitters von Blockelementen umschaltet.
NICE. Ich habe genau das Gleiche einmal geschrieben. Nur dass ich meines in jQuery gemacht habe, das eine Menge jQuery DOM-Traversal-Sachen zur Berechnung verwendete, und es war SEHR langsam. Ich hatte Hilfe und habe es schließlich angepasst und besser zum Laufen gebracht, aber nicht ganz so gut wie dieses. Etwas so Magisches an Conway's Game of Life. Es war eine meiner ersten Programmierherausforderungen als Kind, daher bin ich damit sentimental verbunden.
Hallo, netter Artikel, ich habe diese Woche etwas sehr Ähnliches gemacht!
http://www.reedeesign.com/drawing/
Deiner ist aber viel besser :P
Der Code ist jenseits des alten, mir JS-ignoranten Wissens, aber die Demo macht Spaß! Danke, dass du mir geholfen hast, etwas Arbeitszeit zu verschwenden :)
Ich habe mir eine Zeichnung geschickt, und zumindest in Mac OS X Mail waren die Tabellenzellen nicht quadratisch; sie waren breiter als hoch. Ich frage mich, ob zusätzliches CSS hinzugefügt werden muss, um ihre Quadratheit zu gewährleisten. Nicht, dass ich mich tief mit den Launen von Tabellen in HTML-E-Mails auseinandersetzen möchte, oder dass ich erwarte, dass du es tust, Chris!
Wow, Chris, du hörst nie auf zu überraschen. Du bist ein Genie!
Chris, das ist großartig, du bist ein Zauberer
Bin mir nicht sicher, ob das funktionieren wird, aber es ist einen Versuch wert :) 15 Minuten geklickt
http://jsbin.com/ojipa3
Ich glaube, zuerst hast du es auf LinkedIn geteilt, Chris, und ja, es gibt keinen Bug :)
Danke, hoffe, das funktioniert
http://jsbin.com/oloxe4
Danke. Es ist großartig!
Einfach großartig! Danke fürs Teilen!
Hey Leute,
Weißt du nicht, aber es ist möglich, Bilder in einem HTML-Mailing-Brief anzeigen zu lassen, solange sie nicht von einer externen Quelle stammen.
Es nennt sich Inline-Bilder einbetten.
Ich habe gerade einen Newsletter für eine Organisation erstellt, für die ich arbeite, und es schien zu funktionieren!
Ich weiß nicht wirklich, was die Wissenschaft dahinter ist, aber das Mailing-Skript, das ich benutze, erledigt das für mich
http://swiftmailer.org/docs/inline-message-media
aber die Zeichen-App ist wirklich cool, und eine nette Möglichkeit, Pixelkunst zu teilen (egal ob in einem HTML-Newsletter oder online wie hier) :D
Coole App, ich mag die Idee!
Du kannst die Größe des Ausgabeteils HTML erheblich optimieren
1. style=”background-color:#XXXXXX” ist kompakter als die aktuelle Style-Ausgabe
2. Sie können colspan- und rowspan-Attribute verwenden (um so etwas wie RLE-Kompression durchzuführen).
Gute Arbeit, Chris, besonders gut gefällt mir die clevere Verwendung von Delegate
Chris, einige meiner Lieblingsbeiträge von dir beginnen mit: „Ich habe ein Ding gemacht.“
Vielleicht könnte das sogar der Name deines Blogs sein! :)
Sehr cool, danke
Ich liebe es, Chris. Ich könnte mit einem Favre-Porträt zurückkommen. Oder bist du jetzt ein Cutler-Mann?
In der Tat sehr cool.
Sehr cool, Chris, ich werde heute definitiv etwas Zeit damit verschwenden :)
Oh mein Gott, das ist das coolste Werkzeug, das du je erschaffen hast! Ich probiere meinen Navicon aus: Cody sagt allen Hallo ^_^
aww. es hat hier nicht angezeigt :| Wie auch immer, hier ist es. http://jsbin.com/eremo4 Es kommt im Vorschaubild gut an, aber nachdem ich es gespeichert habe, ist nur die Hälfte sichtbar.. gibt es einen bestimmten Grund?
Danke für diesen Artikel, Grüße Sebastian
Ich werde das hier mal ausprobieren und versuchen, meinen kleinen Droiden-Kumpel zu posten.
Ah, hat er wirklich nicht. Du kannst ihn hier sehen. Könnte eine schöne Tapete für Android-Nutzer sein :)
http://www.favicon.cc/
Ich weiß, dass sie unterschiedliche Zwecke erfüllen, aber das Design erinnerte mich daran.
schönes Tool, pixelbasiertes Paradigma
Ausgezeichnete Idee, farbige Tabellenzellen zur Anzeige einfacher Grafiken ohne tatsächliche Bilder für E-Mails zu verwenden, sehr nützlich, und vielen Dank für das Teilen des HTML/jQuery-Codes für die Tabelle. LT
Sehr cooles Konzept, besonders für E-Mails, wie du angemerkt hast. Ich frage mich, welche Art von coolen Effekten man potenziell mit &-Zeichen oder Symbolschriftarten in diesen Zellen erzielen könnte. Obwohl 8-Bit definitiv ein Comeback im Design feiert, wäre ich besorgt, diese Methode einem Kunden vorzustellen, angesichts ihrer Einschränkungen. Man könnte einige sehr schicke jQ-Animationen mit einer Zellmalmethode erzielen. Ich wäre interessiert zu sehen, wie schlank (Dateigröße) jemand eine Demo machen könnte, die dieses Konzept animiert.
Ich bin ziemlich sicher, dass das kompilierte HTML detaillierter sein muss (Inline-Eigenschaften), um innerhalb einer E-Mail zu funktionieren, aber eine großartige Sandbox ist es trotzdem.
Deine jQuery-Fähigkeiten sind erstaunlich. Ich bin neidisch.
Danke dafür :)
Kannst du es unter einer Open-Source-Lizenz veröffentlichen oder die Erlaubnis zur Nutzung erteilen?
Ich denke nur, wenn du eine benutzerdefinierte Canvas-Größe aktivieren könntest, könnte es ein unglaublich nützliches Werkzeug zur Erstellung von Hintergrundbildern für Layouts mit zwei Spalten-Floats sein.
Ich hoffe, du hast meinen Punkt verstanden….
Gut für das Zeichnen von Favicons)
Fantastischer Beitrag und Anwendung; wie einige auch schon angedeutet haben, sieht es wie eine eher nützliche Schnittstelle für die Erstellung oder Nachbearbeitung von Favicons aus :) Danke fürs Teilen!
Ich war begeistert, RGB-Unterstützung in HTML-E-Mails zu sehen… ich werde eine Vorlage für mich selbst entwickeln und dieses Tool verwenden, um coole Pixelkunst-E-Mails zu versenden.. coole Sachen!
Ist es möglich, dass es ein Bild als Quelle nimmt und es pixelig macht? Könnte mit noch komplexeren Berechnungen möglich sein!
Das ist fantastisch. Ich werde das jeden Tag auf einem Webblog verwenden, um lustige Bilder zu meinen Geschichten zu erstellen. Ich werde Ihnen am Ende der Seite meinen Dank aussprechen. So großartig. Ich habe eine Weile darüber nachgedacht, das manuell zu tun, aber das ist fantastisch!
tolle Arbeit!
kann es als Content-type:image/jpeg gespeichert werden?
Hallo Leute, ich habe es geschafft, einen PHP-Code zu erstellen, der eine HTML-Tabelle mit den Bildpixeln erstellt… Ich werde versuchen, bald etwas Besseres daraus zu machen und es hier posten.
großartige Arbeit