RGB kalkulačka v JavaScriptu podruhé

27. listopadu 2001

Jak jsem vám slíbil v závěru minulého článku, vrátíme se dnes k RGB kalkulačce s několika vylepšeními. Všechna se budou týkat barevných palet.

Prvním vylepšením vůči minulému článku je automatický výpočet tzv. bezpečné barvy, která je nejblíže barvě nastavené (ohledně bezpečných barev si můžete přečíst více zde). V nové verzi RGB kalkulačky, kterou najdete tady, přibyl pod řádkem s HEX hodnotou řádek se zobrazením nejbližší bezpečné barvy, kterou můžete tlačítkem „Převzít“ přepsat do ostatních polí. V prohlížeči Internet Explorer se rovněž zobrazuje aktuální bezpečná barva jako pozadí tohoto řádku tabulky.

Pro implementaci výpočtu bezpečné barvy potřebujeme pomocnou funkci GetSafe, která z barevné složky R,G nebo B vypočte nejbližší hodnotu z množiny hodnot 00,33,66,99,cc nebo ff. Funkce může být napsána například takto:

function GetSafe(color) {
    var safe = (Math.round(color / 51)) * 51;
    return safe;
}

Automatický výpočet bezpečné barvy a rovněž také změnu pozadí příslušné buňky zabezpečuje několik úprav v minule uvedené funkci Redraw. Protože tato funkce obsahuje i jiné úpravy v souvislosti s dalšími novinkami, ukážeme si její kód až později. Přepis bezpečné barvy do ostatních polí formuláře zabezpečuje jednoduchá funkce recountSAFE, volaná z handleru události onclick na tlačítku „Převzít“:

function recountSAFE() {
    document.forms["calc"].HEX.value=document.forms["calc"].WEBSAFE.value;
    recountHEX();
}

Druhou úpravou RGB kalkulačky je rozšíření o paletu pojmenovaných barev, tedy barev, jejichž jména lze uvádět přímo v HTML místo HEXa vyjádření. RGB kalkulačka je upravena tak, že ve své dolní části zobrazuje tabulku těchto barev, přičemž po kliknutí na příslušnou barvu je její hodnota přepsána do horní části kalkulačky. Dále přibylo textové pole, ve kterém se zobrazuje název barvy, pokud je námi vytvořená barva shodná s některou z bezpečných barev. Posledním vylepšením je tlačítko „Test“, kterým lze barvu, jejíž název napíšeme do příslušného textového pole, zobrazit jako pozadí RGB kalkulačky a otestovat si tak správnost názvu. Všechny úpravy můžete opět vyzkoušet zde.

Všech 141 pojmenovaných barev, které se mi podařilo najít, najdete abecedně seřazeny v následujícím poli, zde pojmenovaném aWEB:

var aWEB = [
["ALICEBLUE","F0F8FF"], ["ANTIQUEWHITE","FAEBD7"],
["AQUA","00FFFF"], ["AQUAMARINE","7FFFD4"],
["AZURE","F0FFFF"], ["BEIGE","F5F5DC"],
["BISQUE","FFE4C4"], ["BLACK","000000"],
["BLANCHEDALMOND","FFEBCD"], ["BLUE","0000FF"],
["BLUEVIOLET","8A2BE2"], ["BROWN","A52A2A"],
["BURLYWOOD","DEB887"], ["CADETBLUE","5F9EA0"],
["CHARTREUSE","7FFF00"], ["CHOCOLATE","D2691E"],
["CORAL","FF7F50"], ["CORNFLOWERBLUE","6495ED"],
["CORNSILK","FFF8DC"], ["CRIMSON","DC143C"],
["CYAN","00FFFF"], ["DARKBLUE","00008B"],
["DARKCYAN","008B8B"], ["DARKGOLDENROD","B8860B"],
["DARKGRAY","A9A9A9"], ["DARKGREEN","006400"],
["DARKKHAKI","BDB76B"], ["DARKMAGENTA","8B008B"],
["DARKOLIVEGREEN","556B2F"], ["DARKORANGE","FF8C00"],
["DARKORCHID","9932CC"], ["DARKRED","8B0000"],
["DARKSALMON","E9967A"], ["DARKSEAGREEN","8FBC8F"],
["DARKSLATEBLUE","483D8B"], ["DARKSLATEGRAY","2F4F4F"],
["DARKTURQUOISE","00CED1"], ["DARKVIOLET","9400D3"],
["DEEPPINK","FF1493"], ["DEEPSKYBLUE","00BFFF"],
["DIMGRAY","696969"], ["DODGERBLUE","1E90FF"],
["FIREBRICK","B22222"], ["FLORALWHITE","FFFAF0"],
["FORESTGREEN","228B22"], ["GAINSBORO","DCDCDC"],
["GHOSTWHITE","F8F8FF"], ["GOLD","FFD700"],
["GOLDENROD","DAA520"], ["GRAY","808080"],
["GREEN","008000"], ["GREENYELLOW","ADFF2F"],
["HONEYDEW","F0FFF0"], ["HOTPINK","FF69B4"],
["INDIANRED",""], ["INDIGO",""],
["IVORY","FFFFF0"], ["KHAKI","F0E68C"],
["LAVENDER","E6E6FA"], ["LAVENDERBLUSH","FFF0F5"],
["LAWNGREEN","7CFC00"], ["LEMONCHIFFON","FFFACD"],
["LIGHTBLUE","ADD8E6"], ["LIGHTCORAL","F08080"],
["LIGHTCYAN","E0FFFF"], ["LIGHTGOLDENRODYELLOW","FAFAD2"],
["LIGHTGRAY","D3D3D3"], ["LIGHTGREEN","90EE90"],
["LIGHTPINK","FFB6C1"], ["LIGHTSALMON","FFA07A"],
["LIGHTSEAGREEN","20B2AA"], ["LIGHTSKYBLUE","87CEFA"],
["LIGHTSLATEBLUE","8470FF"], ["LIGHTSLATEGRAY","778899"],
["LIGHTSTEELBLUE","B0C4DE"], ["LIGHTYELLOW","FFFFE0"],
["LIME","00FF00"], ["LIMEGREEN","32CD32"],
["LINEN","FAF0E6"], ["MAGENTA","FF00FF"],
["MAROON","800000"], ["MEDIUMAQUAMARINE","66CDAA"],
["MEDIUMBLUE","0000CD"], ["MEDIUMORCHID","BA55D3"],
["MEDIUMPURPLE","9370D8"], ["MEDIUMSEAGREEN","3CB371"],
["MEDIUMSLATEBLUE","7B68EE"], ["MEDIUMSPRINGGREEN","00FA9A"],
["MEDIUMTURQUOISE","48D1CC"], ["MEDIUMVIOLETRED","C71585"],
["MIDNIGHTBLUE","191970"], ["MINTCREAM","F5FFFA"],
["MISTYROSE","FFE4E1"], ["MOCCASIN","FFE4B5"],
["NAVAJOWHITE","FFDEAD"], ["NAVY","000080"],
["OLDLACE","FDF5E6"], ["OLIVE","808000"],
["OLIVEDRAB","6B8E23"], ["ORANGE","FFA500"],
["ORANGERED","FF4500"], ["ORCHID","DA70D6"],
["PALEGOLDENROD","EEE8AA"], ["PALEGREEN","98FB98"],
["PALETURQUOISE","AFEEEE"], ["PALEVIOLETRED","D87093"],
["PAPAYAWHIP","FFEFD5"], ["PEACHPUFF","FFDAB9"],
["PERU","CD853F"], ["PINK","FFC0CB"],
["PLUM","DDA0DD"], ["POWDERBLUE","B0E0E6"],
["PURPLE","800080"], ["RED","FF0000"],
["ROSYBROWN","BC8F8F"], ["ROYALBLUE","4169E1"],
["SADDLEBROWN","8B4513"], ["SALMON","FA8072"],
["SANDYBROWN","F4A460"], ["SEAGREEN","2E8B57"],
["SEASHELL","FFF5EE"], ["SIENNA","A0522D"],
["SILVER","C0C0C0"], ["SKYBLUE","87CEEB"],
["SLATEBLUE","6A5ACD"], ["SLATEGRAY","708090"],
["SNOW","FFFAFA"], ["SPRINGGREEN","00FF7F"],
["STEELBLUE","4682B4"], ["TAN","D2B48C"],
["TEAL","008080"], ["THISTLE","D8BFD8"],
["TOMATO","FF6347"], ["TURQUOISE","40E0D0"],
["VIOLET","EE82EE"], ["VIOLETRED","D02090"],
["WHEAT","F5DEB3"], ["WHITE","FFFFFF"],
["WHITESMOKE","F5F5F5"], ["YELLOW","FFFF00"],
["YELLOWGREEN","9ACD32"] ];

Vykreslení tabulky bezpečných barev zabezpečí JavaScriptová funkce DrawWEBTable, což jsou v podstatě pouze dvě do sebe zanořené smyčky, generující řádky a sloupce tabulky. (rozměry tabulky jsou ve skriptu kódovány „natvrdo“):

function DrawWEBTable() {
    document.write("<table border=’1′ width=’100%‘>");
    for( var i=0; i<6; i++) {
        document.write("<tr>");
        for(j=0; j<25; j++) {
            if (i*25+j<141) {
                document.write("<td bgcolor="+aWEB[i*25+j][0]+"><a href=’javascript:MoveColor(\""+aWEB[i*25+j][1]+"\")‘>&nbsp;&nbsp;</a></td>");
            } else {
                document.write("<td>&nbsp;</td>");
            }
        }
        document.write("</tr>");
    }
    document.write("</table>");
}

Při kliknutí „na příslušnou barvu“ (tedy na HTML odkaz, umístěný v podbarvené buňce tabulky) je volána funkce MoveColor. Ta má za úkol přepsat hodnotu z tabulky bezpečných barev do všech ostatních polí formuláře. Protože jsme si už minule definovali sadu funkcí pro převody mezi HEX a RGB vyjádřením, s jejich využitím může být funkce MoveColor docela krátká:

function MoveColor(color) {
    document.forms["calc"].HEX.value=color;
    recountHEX();
}

Stiskneme-li tlačítko „Test“, je z jeho handleru události onClick volána funkce recountWEB, která přepíše text v příslušném formulářovém políčku do pozadí stránky a zobrazí hlášení o této činnosti:

function recountWEB() {
    document.bgColor = document.forms["calc"].WEB.value.toUpperCase();
    alert(‚Barva pozadí nastavena na hodnotu "‘ + document.forms["calc"].WEB.value.toUpperCase()+’"‘);
}

Poslední modifikací RGB kalkulačky je úprava funkce Redraw. Ta má za úkol aktualizovat všechna textová pole formuláře dle hodnoty uložené v globálním poli gRGB. Přidáme jí několik řádků, zabezpečujících s výpomocí funkce GetSafe správnou aktualizaci textového pole „Bezpečná barva“ (viz prostřední část funkce) a pro prohlížeč Internet Explorer také přenesení aktuálně zobrazené bezpečné barvy do pozadí buňky (podmínka document.all). Poslední třetina modifikované funkce Redraw zajistí vypsání správného názvu pojmenované barvy do příslušného formulářového pole, v případě, že se zadaná barva shoduje s některou z palety pojmenovaných barev. Zde je celý upravený kód funkce Redraw:

function Redraw() {
    var strHex = getHex();
    var frm = document.forms["calc"];
    document.bgColor = strHex;
    frm.HEX.value = strHex;
    frm.R.value = gRGB[0]; frm.G.value = gRGB[1]; frm.B.value = gRGB[2];
    var pR = gRGB[0]; var pG = gRGB[1]; var pB = gRGB[2];
    gRGB[0]= GetSafe(gRGB[0]); gRGB[1]= GetSafe(gRGB[1]); gRGB[2]= GetSafe(gRGB[2]);
    var strSafe = getHex();
    frm.WEBSAFE.value = strSafe;
    if(document.all)
        document.all.sc.bgColor=strSafe;
    gRGB[0] = pR; gRGB[1] = pG; gRGB[2] = pB;
    document.forms["calc"].WEB.value="";
    for( var i=0; i<141;i++ ) {
        if( strHex.toUpperCase()==aWEB[i][1].toUpperCase() ) {
            document.forms["calc"].WEB.value=aWEB[i][0];
        }
    }
}

Ostatní funkce zůstávají nezměněny – jejich popis byl součástí minulého článku. Rovněž, stejně jako minule neuvádím HTML kód vlastního formuláře – zájemci jej snadno získají z ukázky. Při modifikaci či vytváření vlastního formuláře je pouze potřeba zachovat názvy jednotlivých formulářových polí (názvy nově přidaných polí jsou patrné z obslužných funkcí) pro zajištění správné vazby skriptu na formulář.

Přeji vám příjemný den.

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *