bnbweb/back/js/jquery.bigcolorpicker.js
2022-11-14 23:49:28 +08:00

339 lines
12 KiB
JavaScript
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(function($){
var bigColorPicker = new function(){
var currentPicker = null; //当前绑定拾取器的对象
var allColorArray = [];//整个颜色区域分为前两列后面所有列分为6个块计算出各个区域的数组后放入一个总的二维数组里
var sideLength = 6;//六个区域的每个边长
this.init = function(){
$("body").append('<div id="bigpicker" class="bigpicker"><ul class="bigpicker-bgview-text" ><li><div id="bigBgshowDiv"></div></li><li><input id="bigHexColorText" size="7" maxlength="7" value="#000000" /></li></ul><div id="bigSections" class="bigpicker-sections-color"></div><div id="bigLayout" class="biglayout" ></div></div>');
$("#bigLayout").hover(function(){
$(this).show();
},function(){
$(this).hide();
}).click(function(){
$("#bigpicker").hide();
});
//颜色拾取器text输入框注册事件
$("#bigHexColorText").keypress(function(){
var text = $.trim($(this).val());
$(this).val(text.replace(/[^A-Fa-f0-9#]/g,''));
if(text.length <= 0)return;
text = text.charAt(0)=='#'?text:"#" + text;
var countChar = 7 - text.length;
if(countChar < 0){
text = text.substring(0,7);
}else if(countChar > 0){
for(var i=0;i<countChar;i++){
text += "0";
};
}
$("#bigBgshowDiv").css("backgroundColor",text);
}).keyup(function(){
var text = $.trim($(this).val());
$(this).val(text.replace(/[^A-Fa-f0-9#]/g,''));
}).focus(function(){
this.select();
});
//单击页面选择器以外的地方时选择器隐藏
$(document).bind('mousedown',function(event){
if(!($(event.target).parents().andSelf().is('#bigpicker'))){
$("#bigpicker").hide();
}
});
};
/*
* callback:可以是undefined不传参数时、字符串、函数
* undefined把选择的颜色设置到绑定bigColorpicker的元素的value上。
* 字符串把选择的颜色设置到id为"字符串"的元素的value上。
* 函数:执行传入的函数以实现自定义的获取颜色后的动作。
* engine:可以是undefined、p(或P)、l(或L)
* 在bigColorpicker展现颜色选择区域小格时有两种实现方式
* 一、是一张背景图片采用光标定位的方式获取颜色。p(或P)
* 二、每个小格就是一个li设置li的背景颜色。l(或L)
* 实现方式的不同效率有所差异可以自己在使用时选择默认是p(或P)。
* undefined不传参数时使用默认p(或P)
* sideLength:设置颜色区域的大小取值范围为210默认为6,只有engine为L时才生效
*/
this.showPicker = function(callback,engine,sideLength_){
if($("body").length > 0 && $("#bigpicker").length <= 0){
bigColorPicker.init();
}
var sl_ = parseInt(sideLength_,10);
if(engine == "L" && !isNaN(sl_) && sl_ >=2 && sl_ <= 10){
sideLength = sl_;
}else{
sideLength = 6;
}
this.getAllColorArray = function(){
allColorArray = new Array(sideLength*3 + 2);
//计算第一列的数组
var mixColorArray = [];
var blackWhiteGradientArray = gradientColor(new RGB(0,0,0),new RGB(255,255,255));
for(var i=0;i<blackWhiteGradientArray.length;i++){
mixColorArray[i] = blackWhiteGradientArray[i];
}
var baseArray = [new RGB(255,0,0),new RGB(0,255,0),new RGB(0,0,255),new RGB(255,255,0),new RGB(0,255,255),new RGB(255,0,255),new RGB(204,255,0),new RGB(153,0,255),new RGB(102,255,255),new RGB(51,0,0)];
mixColorArray = mixColorArray.concat(baseArray.slice(0, sideLength));
allColorArray[0] = mixColorArray;
//计算第二列的数组
var blackArray = new Array(sideLength*2);
for(var i=0;i<blackArray.length;i++){
blackArray[i] = new RGB(0,0,0);
}
allColorArray[1] = blackArray;
//计算六个区域的数组
var cornerColorArray = new Array();//六个元素每个元素放6个区域的四角颜色二维数组
cornerColorArray.push(generateBlockcornerColor(0),generateBlockcornerColor(51),generateBlockcornerColor(102),generateBlockcornerColor(153),generateBlockcornerColor(204),generateBlockcornerColor(255));
var count = 0;
var halfOfAllArray1 = [];
var halfOfAllArray2 = [];
for(var i=0;i<cornerColorArray.length;i++){
var startArray = gradientColor(cornerColorArray[i][0][0],cornerColorArray[i][0][1]);
var endArray = gradientColor(cornerColorArray[i][1][0],cornerColorArray[i][1][1]);
for(var j=0;j<sideLength;j++){
if(i < 3){
halfOfAllArray1[count] = gradientColor(startArray[j],endArray[j]);
}else{
halfOfAllArray2[count - sideLength*3] = gradientColor(startArray[j],endArray[j]);
}
count++;
}
}
for(var i=0;i<halfOfAllArray1.length;i++){
allColorArray[i + 2] = halfOfAllArray1[i].concat(halfOfAllArray2[i]);
}
//将数组里所有的RGB颜色转换成Hex形式
for(var i=0;i<allColorArray.length;i++){
for(var j=0;j<allColorArray[i].length;j++){
allColorArray[i][j] = RGBToHex(allColorArray[i][j]);
}
}
};
this.getAllColorArray();
$(this).data("bigpickerCallback",callback);
if(engine){
try{
engine = engine.toUpperCase();
}catch(e){
engine = "P";
}
}
if(engine == "L" ){
$("#bigSections").unbind("mousemove").unbind("mouseout").removeClass("bigpicker-bgimage");
var ulArray = new Array();
for(var i=0;i<sideLength*3 + 2;i++){
ulArray.push("<ul>");
for(var j=0;j<sideLength*2;j++){
ulArray.push("<li data-color='" + allColorArray[i][j] + "' style='background-color: " + allColorArray[i][j] + ";' ></li>");
}
ulArray.push("</ul>");
}
$("#bigSections").html(ulArray.join(""));
var minBigpickerHeight = 90;
var minBigpickerWidth = 129;
var minSectionsHeight = minBigpickerHeight - 29;
var minSectionsWidth = minBigpickerWidth - 1;
var defaultSectionsWidth = (sideLength*3 + 2)*11 + 1;
if(defaultSectionsWidth < minSectionsWidth){
$("#bigSections li,#bigLayout").width(minSectionsWidth/(sideLength*3 + 2) - 2)
.height(minSectionsHeight/(sideLength*2) - 1);
$("#bigpicker").height(minBigpickerHeight).width(minBigpickerWidth);
$("#bigSections").height(minSectionsHeight).width(minSectionsWidth);
}else{
$("#bigSections").width(defaultSectionsWidth)
.height(sideLength*2*11);
$("#bigpicker").width(defaultSectionsWidth + 5)
.height(sideLength*2*11 + 29);
}
$("#bigSections ul").find("li:last").css("border-bottom","1px solid #000000");
$("#bigSections ul:last li").css("border-right","1px solid #000000");
$("#bigSections li").hover(function(){
var $this = $(this);
$("#bigLayout").css({"left":$this.position().left,"top":$this.position().top}).show();
var cor = $this.attr("data-color");
$("#bigBgshowDiv").css("backgroundColor",cor);
$("#bigHexColorText").val(cor);
invokeCallBack(cor);
},function(){
$("#bigLayout").hide();
});
}else{
//预加载图片
var bgmage = new Image();
bgmage.src = "../images/big_bgcolor.jpg";
//初始化为默认样式
$("#bigSections").height(134).width(222).addClass("bigpicker-bgimage").empty();
$("#bigpicker").width(227).height(163);
//P模式时鼠标在颜色小格上移动时获取颜色
$("#bigSections").unbind("mousemove").unbind("mouseout").mousemove(function(event){
var xSections = getSections(sideLength*3 + 2);
var ySections = getSections(sideLength*3);
var $this = $(this);
var cursorXPos = event.pageX - $this.offset().left;
var cursorYPos = event.pageY - $this.offset().top;
var xi = 0;
var yi = 0;
for(var i=0;i<(sideLength*3+2);i++){
if(cursorXPos >= xSections[i][0] && cursorXPos <= xSections[i][1]){
xi = i;
break;
}
}
for(var i=0;i<(sideLength*3);i++){
if(cursorYPos >= ySections[i][0] && cursorYPos <= ySections[i][1]){
yi = i;
break;
}
}
$("#bigLayout").css({"left":$this.position().left + xi*11,"top":$this.position().top + yi*11}).show();
var hex = allColorArray[xi][yi];
$("#bigBgshowDiv").css("backgroundColor",hex);
$("#bigHexColorText").val(hex);
invokeCallBack(hex);
}).mouseout(function(){
$("#bigLayout").hide();
});
}
//给传入的拾取颜色的元素绑定click事件显示颜色拾取器
$(this).bind("click",function(event){
currentPicker = event.currentTarget;
$("#bigBgshowDiv").css("backgroundColor","#000000");
$("#bigHexColorText").val("#000000");
var pos = calculatePosition ($(currentPicker));
$("#bigpicker").css({"left":pos.left + "px","top":pos.top + "px"}).fadeIn(300);
var bigSectionsP = $("#bigSections").position();
$("#bigLayout").css({"left":bigSectionsP.left,"top":bigSectionsP.top}).show();
});
};
this.hidePicker = function(){
$("#bigpicker").hide();
};
this.movePicker = function(){
var pos = calculatePosition ($(currentPicker));
$("#bigpicker").css({"left":pos.left + "px","top":pos.top + "px"});
$("#bigLayout").hide();
};
//计算出拾取器层的left,top坐标
function calculatePosition ($el) {
var offset = $el.offset();
var compatMode = document.compatMode == 'CSS1Compat';
var w = compatMode ? document.documentElement.clientWidth : document.body.clientWidth;
var h = compatMode ? document.documentElement.clientHeight : document.body.clientHeight;
var pos = {left:offset.left,top:offset.top + $el.height() + 7};
var $bigpicker = $("#bigpicker");
if(offset.left + $bigpicker.width() > w){
pos.left = offset.left - $bigpicker.width() - 7;
if(pos.left < 0){
pos.left = 0;
}
}
if(offset.top + $el.height() + 7 + $bigpicker.height() > h){
pos.top = offset.top - $bigpicker.height() - 7;
if(pos.top < 0){
pos.top = 0;
}
}
return pos;
}
//创建小区域的四个角的颜色二维数组
function generateBlockcornerColor(r){
var a = new Array(2);
a[0] = [new RGB(r,0,0),new RGB(r,255,0)];
a[1] = [new RGB(r,0,255),new RGB(r,255,255)];
return a;
}
//两个颜色的渐变颜色数组
function gradientColor(startColor,endColor){
var gradientArray = [];
gradientArray[0] = startColor;
gradientArray[sideLength-1] = endColor;
var averageR = Math.round((endColor.r - startColor.r)/sideLength);
var averageG = Math.round((endColor.g - startColor.g)/sideLength);
var averageB = Math.round((endColor.b - startColor.b)/sideLength);
for(var i=1;i<sideLength-1;i++){
gradientArray[i] = new RGB(startColor.r + i*averageR,startColor.g + i*averageG,startColor.b + i*averageB);
}
return gradientArray;
}
/*获取一个二维区间数组比如[0,11],[12,23],[24,37]..
* sl:区间的长度
*/
function getSections(sl){
var sections = new Array(sl);
var initData = 0;
for(var i=0;i<sl;i++){
var temp = initData + 1;
initData += 11;
sections[i] = [temp,initData];
}
return sections;
}
function RGBToHex(rgb){
var hex = "#";
for(c in rgb){
var h = rgb[c].toString(16).toUpperCase();
if(h.length == 1){
hex += "0" + h;
}else{
hex += h;
}
}
return hex;
}
//RGB对象函数用于创建一个RGB颜色对象
function RGB(r,g,b){
this.r = Math.max(Math.min(r,255),0);
this.g = Math.max(Math.min(g,255),0);
this.b = Math.max(Math.min(b,255),0);
}
function invokeCallBack(hex){
var callback_ = $(currentPicker).data("bigpickerCallback");
if($.isFunction(callback_)){
callback_(currentPicker,hex);
}else if(callback_ == undefined || callback_ == ""){
$(currentPicker).val(hex);
}else{
if(callback_.charAt(0) != "#"){
callback_ = "#" + callback_;
}
$(callback_).val(hex);
}
}
};
$.fn.bigColorpicker = bigColorPicker.showPicker;
$.fn.bigColorpickerMove = bigColorPicker.movePicker; //使用在拖拽的浮层上,在拖拽时拾取器随浮层移动位置
$.fn.bigColorpickerHide = bigColorPicker.hidePicker; //对应一些特定的应用需要手动隐藏拾取器时使用。比如拖拽浮层时隐藏拾取器
})(jQuery);