jsで反対色の生成

  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4. <meta charset="UTF-8">
  5. <script type="text/javascript" src="jquery-1.5.1.min.js"></script>
  6. <script type="text/javascript" src="knockout-2.1.0beta.js"></script>
  7. <title>jsで反対色の生成</title>
  8. </head>
  9. <body>
  10. <script type="text/javascript"><!--
  11.   $(document).ready(function () {
  12.     ko.applyBindings(new viewModel());
  13.   });
  14.   // =========================================================
  15.   // カラーコードかチェックする
  16.   // 戻り値は真・偽
  17.   function checkColorCode(ColorCode)
  18.   {
  19.     // 「値がない」or「#で始まらないとき」は終了
  20.     if (ColorCode == undefined || ColorCode.match(/^[#]/) == null)
  21.     {
  22.       return false;
  23.     } 
  24.     
  25.     // 「#を取って6文字」or「カラーコードが0~9、A~Fだけ」かチェック
  26.     noMark = ColorCode.replace(/^[#]/, "");
  27.     if (noMark.length != 6 || noMark.match(/^[0-9A-F]*$/i) == null)
  28.     {
  29.       return false;
  30.     }
  31.     
  32.     return true;
  33.   }
  34.   // =========================================================
  35.   // 16進数のカラーコードをRGBをキーにした配列に変換
  36.   function ConvertToColorAryFrom16(ColorCode)
  37.   {
  38.     // #からはじまる色コードかチェック
  39.     if (checkColorCode(ColorCode) == false)
  40.     {
  41.       return false;
  42.     } 
  43.     
  44.     // 1番目から3文字目までがR
  45.     ConvertColor = new Array;
  46.     ConvertColor["R"] = ColorCode.substring(1, 3);
  47.     ConvertColor["G"] = ColorCode.substring(3, 5);
  48.     ConvertColor["B"] = ColorCode.substring(5);
  49.     
  50.     return ConvertColor;
  51.   }
  52.   // 16進数のカラーコードを10進数にする
  53.   // 戻り値はRGBをキーにした配列
  54.   function ConvertColorCodeTo10From16(ColorCodeAry)
  55.   {
  56.     // 1番目から3文字目までがR
  57.     ConvertColor = new Array;
  58.     ConvertColor["R"] = parseInt(ColorCodeAry["R"], 16);
  59.     ConvertColor["G"] = parseInt(ColorCodeAry["G"], 16);
  60.     ConvertColor["B"] = parseInt(ColorCodeAry["B"], 16);
  61.     
  62.     return ConvertColor;
  63.   }
  64.   // 10進数のカラーコードを16進数にする
  65.   // 戻り値はRGBをキーにした配列
  66.   function ConvertColorCodeTo16From10(ColorCode)
  67.   {
  68.     // 1番目から3文字目までがR
  69.     ConvertColor = new Array;
  70.     ConvertColor["R"] = ColorCode["R"].toString(16);
  71.     ConvertColor["G"] = ColorCode["G"].toString(16);
  72.     ConvertColor["B"] = ColorCode["B"].toString(16);
  73.     
  74.     return ConvertColor;
  75.   }
  76.   // 10進数のカラーコードを格納した配列
  77.   // 戻り値はRGBをキーにした配列
  78.   function ConvertReverseColor(ColorArray)
  79.   {
  80.     ReverseColor = new Array;
  81.     ReverseColor["R"] = Math.round(255 - ColorArray["R"]);
  82.     ReverseColor["G"] = Math.round(255 - ColorArray["G"]);
  83.     ReverseColor["B"] = Math.round(255 - ColorArray["B"]);
  84.     return ReverseColor;
  85.   }
  86.   // 16進数のカラーコードを格納した配列を#xxxxxxにする
  87.   // 戻り値は#xxxxxxといったカラーコード(文字列)
  88.   function ConvertColorCode(ColorArray)
  89.   {
  90.     ColorCode = "#"
  91.     
  92.     // Rを追加
  93.     if (ColorArray["R"].length == 1)
  94.     {
  95.       ColorCode += "0";
  96.     }
  97.     ColorCode += ColorArray["R"];
  98.     
  99.     // Gを追加
  100.     if (ColorArray["G"].length == 1)
  101.     {
  102.       ColorCode += "0";
  103.     }
  104.     ColorCode += ColorArray["G"];
  105.     
  106.     // Bを追加
  107.     if (ColorArray["B"].length == 1)
  108.     {
  109.       ColorCode += "0";
  110.     }
  111.     ColorCode += ColorArray["B"];
  112.     
  113.     return ColorCode;
  114.   }
  115.   /* ================================================
  116.    ▼knockout.js
  117.   ================================================ */
  118.   function viewModel() {
  119.     var self = this;
  120.     
  121.     self.inputColor = ko.observable();
  122.     
  123.     // 文字色
  124.     self.outputColor = ko.computed( function()
  125.     {
  126.       if ( checkColorCode(self.inputColor()) == false ) 
  127.       {
  128.         return "";
  129.       }
  130.       return self.inputColor();
  131.     }, this);
  132.     // 背景色
  133.     self.backColor = ko.computed( function()
  134.     {
  135.       if (self.outputColor() == false)
  136.       {
  137.         return "";
  138.       }
  139.       
  140.       ColorAry16 = ConvertToColorAryFrom16( self.outputColor() );
  141.       ColorAry10 = ConvertColorCodeTo10From16( ColorAry16 );
  142.       ReverseAry10 = ConvertReverseColor( ColorAry10 );
  143.       ReverseAry16 = ConvertColorCodeTo16From10( ReverseAry10 );
  144.       
  145.       return ConvertColorCode(ReverseAry16);
  146.     }, this);
  147.     
  148.   }
  149. // --></script>
  150. <h1>jsで反対色の生成:表示部は「knockout.js」</h1>
  151. <h2>「#000000」ってな感じで#から始まる6ケタの色コードを入力</h2>
  152. <div>
  153.   色コード:<input type="text" data-bind="value: inputColor" /><br />
  154.   <div style="margin-top:0.5em;padding:10px;" data-bind="visible: outputColor, style: {color: outputColor, backgroundColor: backColor}">
  155.   文字色:<span data-bind="text: outputColor"></span>、
  156.   背景色(反対色):<span data-bind="text: backColor"></span>
  157.   </div>
  158. </div>
  159. <div style="font-size:10pt;text-align:right;margin-top:0.5em;">
  160. <a href="//tips.recatnap.info/" target="_top">PCスキルの小技・忘却防止メモ</a> -
  161. <a href="//tips.recatnap.info/wiki/" target="_top">PCスキルの小技・忘却防止メモのまとめ(wiki)</a>
  162. </div>
  163. <div style="font-size:10pt;text-align:center;margin-top:0.5em;padding:0.5em;border-top:1px solid #ccc;">
  164. Copyright &copy; 2009 by PCスキルの小技・忘却防止メモ. All rights reserved.
  165. </div>
  166. </body>
  167. </html>