绚丽的javascript拾色器(不兼容IE8及以下)
时间:2022-04-27
本文章向大家介绍绚丽的javascript拾色器(不兼容IE8及以下),主要内容包括一切尽在注释中、测试结果: (鼠标指针形状 crosshair, 截图时隐藏了)、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
一切尽在注释中
html节点
<div id="colorpicker" style="display:inline-block;">
<input class="color-value" type="text" value="#ffffff" />
<div class="canvas-box" style="display:none;padding:10px;border:1px solid #ccc;">
<canvas id="canvas" style="cursor:crosshair;">
你的浏览器不支持canvas.
</canvas>
</div>
</div>
jscolor.js
/**
* code by lonelydawn 161226
* color picker 拾色器
* need jQuery >= v1.10.2
*/
// 1 鼠标点击 click=getMixedColor() 十进制 getHexColor 十六进制
// 2 获取鼠标位置 getPos();
// 3 计算点击位置代表的两个色度 getColorTop/getColorBottom(pos) pos :x || y
// 4 根据两个色度计算出叠加色度 getMixedColor(color1,color2)
// & 绘制色谱
// & 10进制色值转16进制色值
// &
// 创建拾色器
var createColorPicker=function(){
var canvass=$("#canvas"); //获取的是属性集合 [canvas#canvas,context:document,selector:"#canvas"]
var canvas=$("#canvas")[0];
// 获取canvas上下文环境 for 2d
var getContext=function(width,height){
canvas.width=width;
canvas.height=height;
return canvas.getContext("2d");
};
//绘制色谱
var drawBackground=function(ctx,width,height){
// 初始清空绘图区域
ctx.clearRect(0,0,width,height);
// 绘制水平全色渐变
var hGrad=ctx.createLinearGradient(0,0,width,0);
hGrad.addColorStop(0 / 6, '#F00'); // x r g b
hGrad.addColorStop(1 / 6, '#FF0'); //1 - 30 255 x/30*255 0
hGrad.addColorStop(2 / 6, '#0F0'); //31 - 60 (60-x)/30*255 255 0
hGrad.addColorStop(3 / 6, '#0FF'); //61 - 90 0 255 (x-60)/30*255
hGrad.addColorStop(4 / 6, '#00F'); //91 -120 0 (120-x)/30*255 255
hGrad.addColorStop(5 / 6, '#F0F'); //121-150 (x-120)/30*255 0 255
hGrad.addColorStop(6 / 6, '#F00'); //151-180 255 0 (180-x)/30*255
ctx.fillStyle=hGrad;
ctx.fillRect(0,0,width,height);
// 绘制垂直白色透明度渐变
var vGrad=ctx.createLinearGradient(0,0,0,height);
vGrad.addColorStop(0, 'rgba(255,255,255,0)'); // y r g b α
vGrad.addColorStop(1, 'rgba(255,255,255,1)'); //1-100 255 255 255 y/100
ctx.fillStyle=vGrad;
ctx.fillRect(0,0,width,height);
};
//获取上层图层色道
var getColorTop=function(y){
return{
r : 255,
g : 255,
b : 255,
a : y/100
};
};
//获取下层图层色道
var getColorBottom=function(x){
var r=255,g=255,b=255;
if(x>0 && x<=30){
r=255;g=x/30*255;b=0;
}else if(x>30 && x<=60){
r=(60-x)/30*255;g=255;b=0;
}else if(x>60 && x<=90){
r=0;g=255;b=(x-60)/30*255;
}else if(x>90 && x<=120){
r=0;g=(120-x)/30*255;b=255;
}else if(x>120&& x<=150){
r=(x-120)/30*255;g=0;b=255;
}else if(x>150&& x<=180){
r=255;g=0;b=(180-x)/30*255;
}else return null;
return {
r:r,
g:g,
b:b
};
};
/**
* C=α*A+(1-α)*B 单色道的混合计算公式
* α为A层(上层)的不透明度
* 本节的A层是垂直渐变色区域
*/
var getMixedColor=function(cTop,cBtm){
var r= Math.floor(cTop.r*cTop.a+(1-cTop.a)*cBtm.r),
g= Math.floor(cTop.g*cTop.a+(1-cTop.a)*cBtm.g),
b= Math.floor(cTop.b*cTop.a+(1-cTop.a)*cBtm.b);
var value="rgba("+r+","+g+","+b+",1);";
return{
r: r,
g: g,
b: b,
value:value
};
};
//获取十六进制颜色字符串,如 #999999
var getHexColorString=function(c){
var cStr="#";
// 将单位色度值转换为字符
var getChar=function(value){
// var c='';
// switch(value){
// case 10:
// case 11:
// case 12:
// case 13:
// case 14:
// case 15:
// c=String.fromCharCode(value+87);
// break;
// default:
// c=value.toString();
// break;
// };
// return c;
return "0123456789abcdef"[value];
};
// 将单通道色度值转换为字符串
var passToStr=function(value){ //255
var pre=Math.floor(value/16);
var back=value%16;
return getChar(pre)+getChar(back);
};
return cStr+passToStr(c.r)+passToStr(c.g)+passToStr(c.b);
};
// 事件入口
var enter=function(event){
var ev=event || window.event;
var rect = canvas.getBoundingClientRect();
var x= ev.clientX - rect.left * (canvas.width / rect.width);
var y= ev.clientY - rect.top * (canvas.height / rect.height);
var cDec = getMixedColor(getColorTop(y),getColorBottom(x));
var cHex = getHexColorString(cDec);
exit(cHex);
};
// 事件出口
var exit=function(color){
$(".color-value").val(color);
$(".color-value").css("background",color);
};
// colorpicker && 初始化
var create=function(w, h){
// init
var width = w || 180;
var height = h || 101;
var ctx=getContext(width, height);
drawBackground(ctx,width,height);
// 绑定事件入口
canvass.bind("click",enter);
};
// 解绑事件 不解绑事件的后果:每次create都会为节点绑定事件,一次触发多次执行
var destroy=function(){
canvass.unbind("click");
};
return {
create:create,
destroy:destroy
};
};
// 统治所有的 mouseenter & mouseleave 事件
// 如果在mouseenter作用域内创建,则需要在mouseleave作用域删除
var cp=new createColorPicker();
/*
// 拾色器显示开关
$('#colorpicker').click(function(){
console.log("over");
// $("#colorpicker .canvas-box").css("display","block");
if(boxs==0){
$("#colorpicker").append(
"<div class='canvas-box' style='display:none;padding:10px;border:1px solid #ccc;'>"+
"<canvas id='canvas' style='display:crosshair;'>你的浏览器不支持canvas.</canvas>"+
"</div>"
);
boxs++;
}
$("#colorpicker .canvas-box").css("display","block");
cp.create();
});
$('#colorpicker').mouseleave(function(){
console.log("out");
// $("#colorpicker .canvas-box").css("display","none");
$("div").remove(".canvas-box");
if(boxs>0) boxs--;
cp.destroy();
});
*/
// 拾色器显示开关
$("#colorpicker").mouseenter(function(){
$("#colorpicker .canvas-box").css("display","block");
cp.create();
});
$("#colorpicker").mouseleave(function(){
$("#colorpicker .canvas-box").css("display","none");
cp.destroy();
});
// 判断字符串是否是7位颜色字符串
var isColorStr=function(color){
// 判断字符是否存在于字符串
var charInStr=function(ch,str){
// 如果字符串中存在与字符相等的,返回true
for(var i=0;i<str.length;i++)
if(ch==str[i])
return true;
// 遍历结束,还没有与字符相等的,返回false
return false;
};
if(color.length!=7 || color[0]!="#")
return false;
color=color.toLowerCase();
for(var i=1;i<color.length;i++){
if(!charInStr(color[i],"0123456789abcdef"))
return false;
}
return true;
}
// 输入框输入字符串若符合颜色格式,则取其值
$("#colorpicker .color-value").keyup(function(){
var input=$("#colorpicker .color-value");
console.log(input.val());
if(isColorStr(input.val()))
input.css("background",input.val());
});
测试结果: (鼠标指针形状 crosshair, 截图时隐藏了)
chrome
firefox
IE 9及以上
- Where's Waldorf?
- POj 1797 Heavy Transportation
- 卡特兰数简介原理性质应用参考:
- UVA Machined Surfaces
- NBUT 1117 Kotiya's Incantation
- React第三方组件1(路由管理之Router的使用④按需加载-上)
- React第三方组件1(路由管理之Router的使用③传参)
- Kindergarten Counting Game
- React第三方组件1(路由管理之Router的使用②多层级跳转及重定向)
- 括号配对问题描述输入输出样例输入样例输出解析代码实现运行结果参考链接
- React第三方组件1(路由管理之Router的使用①简单使用)
- POj 2253 Frogger
- React项目配置7(ES7的Async/Await的使用)
- HDU 1863 畅通工程
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浅谈keras使用预训练模型vgg16分类,损失和准确度不变
- 关于tf.matmul() 和tf.multiply() 的区别说明
- python中执行smtplib失败的处理方法
- PHP+Ajax简单get验证操作示例
- Python matplotlib读取excel数据并用for循环画多个子图subplot操作
- python转化excel数字日期为标准日期操作
- thinkPHP框架通过Redis实现增删改查操作的方法详解
- PHP中引用类型和值类型功能与用法示例
- PHP文件上传小程序 适合初学者学习!
- php的扩展写法总结
- 实例介绍PHP删除数组中的重复元素
- Python迭代器协议及for循环工作机制详解
- PHP CURL中传递cookie的方法步骤
- PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
- Yii2处理密码加密及验证的方法