Description
Similar to v1 except only using one 0.2kb png file and one 3.6kb jpg used.
Works in all modern browsers including support for ie6 with the png fix. The colour selector used in Adobe Fireworks inspired me to use two
individual images for the hue/saturation and lightness levels.
Demo
Red:
Green:
Blue:
Hue:
Saturation:
Lightness:
JavaScript
- $(".colour_selector").ready(function() {
- $(".colour_selector").each(function(i) {
- //controls
- var colour_chooser = $(this).find(".colour_chooser");
- var brightness_changer = $(this).find(".brightness_changer");
- var colour_preview = $(this).find(".colour_preview");
- var hue_image = colour_chooser.find(".hue_image");
- var colour_cursor = colour_chooser.find(".colour_cursor");
- var brightness_cursor = brightness_changer.find(".brightness_cursor");
-
- var span_red_value = $(this).find(".red_value");
- var span_green_value = $(this).find(".green_value");
- var span_blue_value = $(this).find(".blue_value");
- var hue_value = $(this).find(".hue_value");
- var saturation_value = $(this).find(".saturation_value");
- var lightness_value = $(this).find(".lightness_value");
-
- //variables
- var lightness = 1.0, hue = 0.0, saturation = 1.0;
- var red=256, green=256, blue=256;
- var mouseDown = false;
-
- //when ready
- updateColourDisplay();
-
- //methods
- brightness_changer.select(function() { $(this).blur(); });
- brightness_changer.bind("mousedown",function(event) { mouseDown=true; changeBrightness(event, $(this)); });
- brightness_changer.bind("mousemove",function(event) { if (mouseDown) changeBrightness(event, $(this)); });
- brightness_changer.bind("mouseup",function() { mouseDown=false; });
-
- function changeBrightness(mouseEvent, obj) {
- yPos = (mouseEvent.pageY-obj.offset().top);
- if (yPos<0) yPos=0;
- if (yPos>obj.height()) yPos = obj.height();
-
- brightness_cursor.css("top", yPos);
-
- lightness = 1.0 - (yPos/(obj.height()));
-
- setColourFromHSV();
- updateColourDisplay();
- }
-
- colour_chooser.bind("mousedown" ,function(event) { mouseDown=true; changeColour(event, $(this)); });
- colour_chooser.bind("mousemove" ,function(event) { if (mouseDown) changeColour(event, $(this)); });
- colour_chooser.bind("mouseup" ,function(event) { mouseDown=false; });
-
- function changeColour(mouseEvent, obj) {
- xPos = (mouseEvent.pageX-obj.offset().left);
- yPos = (mouseEvent.pageY-obj.offset().top);
-
- if (xPos<0) xPos=0;
- if (xPos>obj.height()) xPos = obj.Width();
-
- if (yPos<0) yPos=0;
- if (yPos>obj.height()) yPos = obj.height();
-
- colour_cursor.css("top", yPos);
- colour_cursor.css("left", xPos);
-
- hue = xPos/obj.width();
- saturation = 1.0 - (yPos/obj.height());
-
- var newColour = hslToRGB(hue, saturation, 0.5);
- brightness_changer.css("background-color","rgb(" + newColour[0] + "," + newColour[1] + "," + newColour[2] + ")");
-
- setColourFromHSV();
- updateColourDisplay();
- }
-
- $(".common_colours li").bind("click", function(event) {
- colour_preview.css("background-color", $(this).css("background-color"));
- return false;
- });
-
- function setColourFromHSV() {
- var newColour = hslToRGB(hue, saturation, lightness);
-
- red = newColour[0];
- green = newColour[1];
- blue = newColour[2];
- }
-
- function updateColourDisplay() {
- colour_preview.css("background-color", "rgb(" + red + "," + green + "," + blue + ")");
-
- span_red_value.text(red);
- span_green_value.text(green);
- span_blue_value.text(blue);
-
- hue_value.text(Math.floor(hue*100) + "%");
- saturation_value.text(Math.floor(saturation*100) + "%");
- lightness_value.text(Math.floor(lightness*100) + "%");
- }
- });
- });
-
- /**
- * Maths used from Wikipedia
- */
- function hslToRGB(hue, saturation, lightness) {
- var q = 0.0, p=0.0;
- var newColour = new Array(3);
-
- if (lightness<0.5) {
- q = lightness * (1+saturation);
- } else {
- q = lightness + saturation - (lightness*saturation);
- }
-
- p = 2*lightness - q;
-
- newColour[0] = Math.floor(hslColourToRGBColour(hue+0.33,p,q)*256); //red
- newColour[1] = Math.floor(hslColourToRGBColour(hue,p,q)*256); //green
- newColour[2] = Math.floor(hslColourToRGBColour(hue-0.33,p,q)*256); //blue
-
- return newColour;
- }
-
- function hslColourToRGBColour(hslColour, p, q) {
- if (hslColour<0.0) hslColour+= 1.0;
- if (hslColour>1.0) hslColour-= 1.0;
-
- if (hslColour<0.167) {
- return p+((q-p) * 6 * hslColour);
- } else if (hslColour<0.5) {
- return q;
- } else if (hslColour<0.67) {
- return p+((q-p)*6*(0.67-hslColour));
- } else {
- return p;
- }
- }
CSS
- .hue_image,
- .brightness_image {
- position: absolute;
- width: 100%;
- height: 100%;
- z-index: 0;
- }
-
- .colour_chooser,
- .brightness_changer,
- .colour_preview {
- float: left;
- border: 1px solid black;
- margin: 5px;
- overflow: hidden;
- }
-
- .colour_chooser {
- float: left;
- background: url("hue_saturation.jpg") white top left no-repeat;
- width: 200px;
- height: 200px;
- padding: 0px;
- cursor: crosshair;
- }
-
- .brightness_changer {
- background: url("hue_lightness.png") red top left repeat-x;
- width: 10px;
- height: 200px;
- cursor: s-resize;
- }
-
- .colour_preview {
- width: 26px;
- height: 26px;
- clear: right;
- background-color: white;
- }
-
- .colour_cursor,
- .brightness_cursor {
- position: absolute;
- top: 0px;
- left: 0px;
- }
-
- .colour_cursor {
- width: 8px;
- height: 8px;
- }
-
- .brightness_cursor {
- width: 10px;
- height: 5px;
- }
-
- .drag_plane {
- width: 100%;
- height: 100%;
- position: absolute;
- z-index: 100;
- }
-
- .common_colours {
- float: left;
- border: 1px solid black;
- padding: 0px;
- list-style: none;
- margin: 5px;
- margin-top: 8px;
- }
-
- .common_colours li {
- float: left;
- clear: both;
- width: 16px;
- height: 15px;
- border-top: 1px black solid;
- cursor: pointer;
- }
XHTML
- <div class="colour_selector">
- <ul class="common_colours">
- <li style="background-color: #000000;"></li>
- <li style="background-color: #333333;"></li>
- <li style="background-color: #666666;"></li>
- <li style="background-color: #999999;"></li>
- <li style="background-color: #CCCCCC;"></li>
- <li style="background-color: #FFFFFF;"></li>
- <li style="background-color: #FF0000;"></li>
- <li style="background-color: #00FF00;"></li>
- <li style="background-color: #0000FF;"></li>
- <li style="background-color: #00FFFF;"></li>
- <li style="background-color: #FFFF00;"></li>
- <li style="background-color: #FF00FF;"></li>
- </ul>
- <div class="colour_chooser"><img class="colour_cursor" src="cursor.gif" alt="*" /></div>
- <div class="brightness_changer"><img class="brightness_cursor" src="slider.gif" alt="-" /></div>
- <div class="colour_preview"></div>
- <p style="float: left;">
- Red: <span class="red_value"></span><br />
- Green: <span class="green_value"></span><br />
- Blue: <span class="blue_value"></span><br />
- <br />
- Hue: <span class="hue_value"></span><br />
- Saturation: <span class="saturation_value"></span><br />
- Lightness: <span class="lightness_value"></span>
- </p>
- </div>