読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

シンプルなカラーピッカーを作ってみた。

JavaScript

シンプルなカラーピッカーを作ってみました。
→サンプルはこちら

  • 四角をクリックすると色選択UIがポップアップします。
  • 色にカーソルをあわせて、クリックで選択。

ソースは以下。

/**
 * カラーピッカー
 * @param elementId ピッカーを表示する要素のID
 * @param color ピッカーの初期値 例) #FFFFFF
 */
ColorPicker = function(elementId, color) {
  this.elementId = elementId;
  this.color = color;
  this.init();
}
ColorPicker.prototype = {
  init: function() {
    var self = this;
    var top = "<table id='picker_table_" + this.elementId +  "' class='picker' cellpading=0 cellspacing=0><tr>";
    var bottom = "";
    var current = top;
    var list = ["00","22","44","66","88","AA","CC","EE"];
    for ( var g=0;g<list.length;g++  ) {
      for ( var r=0;r<list.length;r++  ) {
        for ( var b=0;b<list.length;b++  ) {
          var c = list[r] + list[g] +list[b];
          str = '<td><div class="block" style="background-color:#' + c + ';border:1px solid #' + c + ';"></div></td>'
          if ( r <= 3 ) {
            top += str;
          } else {
            bottom+=str;
          }
        }
        if (r ==3) { top += "</tr><tr>";  }
      }
      bottom += "</tr><tr>";
    }
    var body = top + bottom + "</tr></table>";
    var el = document.getElementById( this.elementId );
    el.innerHTML = '<div class="picker">' +
      ' <div class="picker_thumb" id="picker_thumb_' + this.elementId + '"></div>'+
      ' <div class="picker_picker" id="picker_picker_' + this.elementId + '">' + body + '</div>'+
      '</div>';

    var thumb = document.getElementById( "picker_thumb_" + this.elementId );
    thumb.style.backgroundColor = this.color;
    thumb.onclick = function( ev ) {
      self.show();
      return false;
    }

    var blocks = document.getElementById("picker_table_" + this.elementId ).getElementsByTagName( "div" );
    var enter = function() {
      thumb.style.backgroundColor = this.style.backgroundColor;
      this.style.border = "1px solid #FFFFFF ";
    };
    var out = function() {
      thumb.style.backgroundColor = self.color;
      this.style.border = "1px solid " + this.style.backgroundColor;
    };
    var click = function() {
      thumb.style.backgroundColor = this.style.backgroundColor;
      self.color =  this.style.backgroundColor;
    }
    for ( var i=0,n=blocks.length;i<n;i++ ) {
      if ( blocks[i] == el  ) { continue; }
      YAHOO.util.Event.addListener(blocks[i], "mouseover", enter);
      YAHOO.util.Event.addListener(blocks[i], "mouseout", out);
      YAHOO.util.Event.addListener(blocks[i], "click", click);
    }
    YAHOO.util.Event.addListener(document.body, "click", function( ev ) {
      if ( self.visible &&  YAHOO.util.Event.getTarget( ev ) != thumb ) {
        self.hide();
      }
    } );
  },
  /** 色選択パネルを表示*/
  show: function() {
    document.getElementById("picker_picker_" + this.elementId).style.visibility = "visible";
    this.visible = true;
  },
  /** 色選択パネルを非表示*/
  hide: function() {
    document.getElementById("picker_picker_" + this.elementId).style.visibility = "hidden";
    this.visible = false;
  },
  /** 選択された色を「#FFFFFF」形式で取得する。*/
  get : function() {
    return this.convert(this.color);
  },
  convert: function(str) {
    if ( str.match(/^\#[0-9A-Fa-f]{6}$/) ) {
      return str;
    } else if ( str.match(/^\#([0-9A-Fa-f])([0-9A-Fa-f])([0-9A-Fa-f])$/) ) {
      return "#" + RegExp.$1+RegExp.$1+RegExp.$2+RegExp.$2+RegExp.$3+RegExp.$3;
    } else if (str.match(/^rgb\(\s*(\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\s*\)$/)) {
      return "#" + this.toHex(RegExp.$1)+this.toHex(RegExp.$2)+this.toHex(RegExp.$3);
    } else {
      throw "illegal color format. color=" + str;
    }
  },
  toHex: function( str ) {
    var h = Number(str).toString(16);
    return h.length == 1 ? "0"+h : h;
  }
}

CSS

div.picker {
  border:1px solid #BBBBBB;
}
/**サムネイル*/
div.picker_thumb {
  font-size: 1px;
  width:12px;
  height:12px;
  border:1px solid #FFFFFF;
}
/**色選択パネル*/
div.picker_picker {
  border: 1px solid #BBBBBB;
  background-color: #E2E2E2;
  padding:10px;
  visibility: hidden;
  position: absolute;
  z-index: 100;
}
table.picker {
  font-size: 1px;
  border: 1px solid #FFFFFF;
}
table.picker div.block {
  width: 8px;
  height: 8px;
}

使い方

<script type="text/javascript" src="http://yui.yahooapis.com/2.5.2/build/yahoo/yahoo-min.js" ></script>
<script type="text/javascript" src="http://yui.yahooapis.com/2.5.2/build/event/event-min.js" ></script>
  • 2.↑のソースとCSSを追加。
  • 3.ピッカーを表示するDIV要素を用意して、
<div id="foo"></div>
  • 4.「new ColorPicker()」でOK。
new ColorPicker( "foo", "#444488" ); // 第2引数は初期選択色。


Yahoo User Interface Libraryにもカラーピッカーはあるのですが、クリックしたらUIを出すのがうまいこといかず、かっとなって作ってみました。とりあえずはそんなにリッチな機能必要ないしね。