您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
self-contained color picker based on the idea of jscolor
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyfork.icu/scripts/25223/160404/jscolorXS.js
// ==UserScript== // @name jscolorXS // @namespace edzep.scripts // @description self-contained color picker based on the idea of jscolor // @author Peter Dematte, http://dematte.at // @version 0.9x // @license GNU Lesser General Public License, http://www.gnu.org/copyleft/lesser.html // ==/UserScript== // used with permission of the author, via email exchange in 2011 // minor tweaks to the code have been made, also with permission /* * @version 0.9x * @license GNU Lesser General Public License, http://www.gnu.org/copyleft/lesser.html * @author Peter Dematte, http://dematte.at * @created 2010-08-03 * @updated 2010-08-13 * @status not finished (~265 lines) * @link http://dematte.at/jscolorXS/ * based on the idea of jscolor.com * inspired by jondyer.name, quirksmode.com */ var jscolor = { pickerMode : 'HSV', pickerBorderColor : '#efefef #a0a0a0 #a0a0a0 #efefef', pickerInsetColor : '#a0a0a0 #fff #fff #a0a0a0', pickerFaceColor : '#DDDDDD', pickerBorder : 2, pickerInset : 2, pickerFace : 10, hash : '#', caps : true, // ..... etc. init : function() { var objs = document.getElementsByTagName('input'), cName; for (var n=0; n<objs.length; n++) if (objs[n].className.indexOf('color') != -1) { // cName = objs[n].className.replace(/(color)( )?/,''); objs[n].color = cName; // do something with it... jscolor.addEvent(objs[n], 'click', jscolor.togglePicker); objs[n].style.backgroundColor = objs[n].value != '' ? (objs[n].value.indexOf('#') != -1 ? '' : '#') + objs[n].value : '#FFFFFF'; if (objs[n].value == '') objs[n].value = '#FFFFFF'; objs[n].style.color = jscolor.getBrightness(jscolor.HEX2RGB(objs[n].value)) > 128 ? '#000' : '#FFF'; } if (!objs[0]) return; objs[0].parentNode.appendChild(jscolor.build()); jscolor.addEvents(); }, build : function() { var newCSS = document.createElement('style'), div = document.createElement('div'), divColl, ver = navigator.userAgent.toLowerCase(), IE = document.all, IE = IE ? ver.indexOf("msie 5") !=-1 || ver.indexOf("msie 6") !=-1 : false, cpMS = (jscolor.pickerMode == 'HVS'), // twf = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'tw.png\', sizingMethod=\'scale\')', // tbf = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'tb.png\', sizingMethod=\'scale\')', db1 = 'iVBORw0KGgoAAAANSUhEUgAAA', db2 = 'AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA', db3 = db1+'AEAAABlCAYAAACMcInF'+db2+'N', db4 = 'R0lGODlhDwAPAPEAAAAAAP///', hsv = db1+'LUAAAABCAIAAAAXanid'+db2+'EtJREFUKFNj/M/AwMDDwMAGRhAGMomfi1UjTMtfToZfDCD0BYNEEyRDDQ5HU+BciLexOppy54KDgGLH4YwiZobvSGFMRnBCogiLPwFPaF0BRtROKwAAAABJRU5ErkJggg==', tb = db3+'dJREFUKFMVxE1EA2AAANCvHyVJMpPJyEhEIpGImB0SHbJDOmSH2SEiOkyHDumQDukQERExosN0SIdEOiQmEpFIJBlFibKUUu/wXgghVP0L1apRrepUrwY1qknNalFEUbUqpjbF1a6EOtSpLnWrR73qU78GNKghJZXSsEY0qjGlNa4JTSqjrHKa0rRmNKu85jSvBS1qScta0arWtK4NbWpL2ypoR7sqak/7OtChjnSsE53qTCWd60KXutK1bnSrO93rQY8q60nPetGr3vSuD1X0qS9960e/f/WiMhwclNgJAAAAAElFTkSuQmCC', tw = db3+'hJREFUKFMVxEFEQwEAANC10iRJMpnEjEQkEokRs8OMHabDdEiH6RARHdKhQzqkQzpERESM2CEd0iGRDolEIhKJJFGUKGVpv947vFAQBDWh/8KqVZ3qFVGDGtWkZrWoVVG1KaZ2dSiuhDrVpW71qFd96teABpXUkFJKK6OscsprWAWNaFRjKmpcE5rUlKY1o1nNaV4LWtSSlrWiVa1pXRva1JZK2lZZO9rVnvZ1oEMd6VgnOtWZznWhS13pWje61Z3u9aBHPelZL3rVm971oU996VsV/ehX1T9OtF/8xZgdKAAAAABJRU5ErkJggg==', cross = db4+'////////yH5BAEAAAIALAAAAAAPAA8AAAIklB8Qx53b4otSUWcvyiz4/4AeQJbmKY4p1HHapBlwPL/uVRsFADs=', arrow = db4+'6g8eKg8eCH5BAEAAAIALAAAAAAHAAsAAAITTIQYcLnsgGxvijrxqdQq6DRJAQA7', jsW = 211+jscolor.pickerInset*4+jscolor.pickerFace*2, jsH = 101+jscolor.pickerInset*2+jscolor.pickerFace*2, addQ = jscolor.pickerInset*2, jsF = jscolor.pickerFace, jsI = jscolor.pickerInset, jsB = jscolor.pickerBorder, jsIC = jscolor.pickerInsetColor, CSS = '.jscolor{position:relative;width:'+jsW+'px !important;width:'+(jsW+jsB*2)+'px;height:'+jsH+'px !important;height:'+(jsH+jsB*2)+'px;border:'+jsB+'px solid #fff;border-color:'+jscolor.pickerBorderColor+';background-color:'+jscolor.pickerFaceColor+'}'+ '.jscolor .left{position:absolute;left:'+jsF+'px;top:'+jsF+'px;width:181px !important;width:'+(181+addQ)+'px;height:100px !important;height:'+(100+addQ)+'px;border:'+jsI+'px solid #fff;border-color:'+jsIC+';background-image:url('+(IE?'hsv.png':'data:image/png;base64,'+hsv+'')+')}'+ '.jscolor .left .layer, .jscolor .left .mousepad{position:absolute;width:181px;height:100px}'+ '.jscolor .left .mousepad{cursor:crosshair}'+ '.jscolor .left .cursor{position:absolute;top:-7px;left:-7px;width:15px;height:15px}'+ '.jscolor .right{position:absolute;right:'+jsF+'px;top:'+jsF+'px;width:16px !important;width:'+(16+addQ)+'px;height:100px !important;height:'+(100+addQ)+'px;border:'+jsI+'px solid #fff;border-color:'+jsIC+';background-color:#f00}'+ '.jscolor .right .mousepad{position:absolute;right:0px;width:26px;height:100px;cursor:hand;cursor:pointer}'+ '.jscolor .right .cursor{position:absolute;right:'+(jsI+17)+'px;top:-5px;width:7px;height:11px}'+ '.cross{background-image:url('+(IE?'cross.gif':'data:image/gif;base64,'+cross+'')+')}'+ '.arrow{background-image:url('+(IE?'arrow.gif':'data:image/gif;base64,'+arrow+'')+')}'+ '.tw{background-image:url('+(IE?'tw.png':'data:image/png;base64,'+tw+'')+')}'+ '.tb{background-image:url('+(IE?'tb.png':'data:image/png;base64,'+tb+'')+')}'; newCSS.setAttribute('type','text/css'); if (newCSS.styleSheet) newCSS.styleSheet.cssText = '<!--\n'+CSS+'\n-->'; else newCSS.appendChild(document.createTextNode('<!--\n'+CSS+'\n-->')); document.getElementsByTagName('head')[0].appendChild(newCSS); div.className = 'jscolor'; div.innerHTML = '<div class="left"><div class="layer t'+(cpMS?'b':'w')+'"></div><div class="cursor cross"></div><div class="mousepad"></div></div>'+ '<div class="right t'+(cpMS?'w':'b')+'"><div class="cursor arrow"></div><div class="mousepad"></div></div>'; divColl = div.getElementsByTagName('div'); for (var n=0; n<divColl.length; n++) jscolor[['jcL','layL','curL','padL','jcR','curR','padR'][n]]=divColl[n]; div.style.position = 'absolute'; div.style.display = 'none'; jscolor.jscolor = div; return div; }, addEvents : function() { jscolor.padL.onmousedown = jscolor.padR.onmousedown = function(e){ var e = e ? e : window.event, obj = e.target || e.srcElement; obj.xyNow = jscolor.getOrigin(obj); jscolor.doDrag(e); jscolor.addEvent(document.body, 'mousemove', jscolor.doDrag); return false; } jscolor.addEvent(document.body, 'mouseup', function(){ jscolor.removeEvent(document.body, 'mousemove'); jscolor.padL.xyNow = jscolor.padR.xyNow = false; return false; }); }, doDrag : function(e,mouseNow,init) { if (jscolor.curObj) jscolor.obj = jscolor.curObj; var e = e ? e : window.event, mouseNow = mouseNow ? mouseNow : jscolor.getMousePos(e,jscolor.padL.xyNow || jscolor.padR.xyNow), curL = jscolor.curL.style, curR = jscolor.curR.style, cpMS = (jscolor.pickerMode == 'HVS'), val = ''; mouseNow[1] = mouseNow[1] < 0 ? 0 : mouseNow[1] > 100 ? 100 : mouseNow[1]; mouseNow[0] = mouseNow[0] < 0 ? 0 : mouseNow[0] > 180 ? 180 : mouseNow[0]; var Hc = mouseNow[0]/180*255, Sc = Vc = 255-(mouseNow[1]/100*255), // c = coordinate whise Sr = jscolor.color.S/100*255, Vr = jscolor.color.V/100*255; // r = real if (jscolor.padL.xyNow || init == jscolor.padL) { // left picker curL.left = mouseNow[0]-7+'px'; curL.top = mouseNow[1]-7+'px'; jscolor.color.putHSV([mouseNow[0]*2, cpMS?100-mouseNow[1]:jscolor.color.S, cpMS?jscolor.color.V:100-mouseNow[1]]); jscolor.jcR.style.backgroundColor = 'rgb('+jscolor.HSV2RGB(Hc, cpMS?Sc:255, cpMS?255:Vc)+')'; } else { // right picker curR.top = mouseNow[1]-5+'px'; jscolor.color.putHSV([jscolor.color.H, cpMS?jscolor.color.S:100-mouseNow[1], cpMS?100-mouseNow[1]:jscolor.color.V]); } if (init) return false; jscolor.obj.style.backgroundColor = 'rgb('+[jscolor.color.R,jscolor.color.G,jscolor.color.B]+')'; jscolor.obj.style.color = jscolor.getBrightness([jscolor.color.R,jscolor.color.G,jscolor.color.B]) > 128 ? '#000' : '#FFF'; val = jscolor.RGB2HEX([jscolor.color.R,jscolor.color.G,jscolor.color.B]); jscolor.obj.value = (jscolor.hash ? '#':'') + (jscolor.caps ? val : val.toLowerCase()); return false; }, color : { H:0,S:100,V:100,R:0,G:0,B:0, putRGB : function (rgb) {this.R=rgb[0]; this.G=rgb[1]; this.B=rgb[2]}, putHSV : function (hsv) { this.H=hsv[0]; this.S=hsv[1]; this.V=hsv[2]; var rgb = jscolor.HSV2RGB(this.H/360*255,this.S/100*255,this.V/100*255); this.R=rgb[0]; this.G=rgb[1]; this.B=rgb[2] } }, togglePicker : function(e) { var e = e ? e : window.event, obj = e.target || e.srcElement, jcs = jscolor.jscolor.style, HSVxy = jscolor.RGB2HSV(jscolor.HEX2RGB(obj.value)), cpMS = (jscolor.pickerMode == 'HVS'); if (jcs.display != 'none' && jscolor.curObj == obj) jcs.display = 'none'; else { jcs.display = 'block'; jcs.left = obj.offsetLeft+obj.scrollLeft+'px'; jcs.top = obj.offsetTop+obj.offsetHeight+obj.scrollTop+'px'; jscolor.doDrag(null,[null,100-HSVxy[(cpMS?1:2)]],jscolor.padR); jscolor.doDrag(null,[HSVxy[0]/2,100-HSVxy[(cpMS?2:1)]],jscolor.padL); } jscolor.curObj = obj; }, getBrightness : function(rgb) {return Math.sqrt(rgb[0]*rgb[0]*.241+rgb[1]*rgb[1]*.691+rgb[2]*rgb[2]*.068)}, RGB2HEX : function (rgb) { return((rgb[0]<16?'0':'')+rgb[0].toString(16)+ (rgb[1]<16?'0':'')+rgb[1].toString(16)+ (rgb[2]<16?'0':'')+rgb[2].toString(16)).toUpperCase(); }, HEX2RGB : function (hex) { hex = hex.replace('#',''); return [parseInt(hex.substr(0,2),16), parseInt(hex.substr(2,2),16), parseInt(hex.substr(4,2),16)]; }, HSV2RGB : function(x,y,z) { var r=g=b=c=0,d=(100-z/255*100)/100,i=y/255,j=y*(255-z)/255;cPHue=z; if (x<42.5){r=y;g=x*6*i;g+=(y-g)*d;b=j;} else if (x>=42.5&&x< 85){c=42.5;r=(255-(x-c)*6)*i;r+=(y-r)*d;g=y;b=j;} else if (x>=85&&x<127.5){c=85;r=j;g=y;b=(x-c)*6*i;b+=(y-b)*d;} else if (x>=127.5&&x<170){c=127.5;r=j;g=(255-(x-c)*6)*i;g+=(y-g)*d;b=y;} else if (x>=170&&x<212.5){c=170;r=(x-c)*6*i;r+=(y-r)*d;g=j;b=y;} else if (x>=212.5){c=212.5;r=y;g=j;b=(255-(x-c)*6)*i;b+=(y-b)*d;} return [Math.round(r),Math.round(g),Math.round(b)]; }, RGB2HSV : function(r, g, b) { if (typeof r == 'object') {var b=r[2],g=r[1];r=r[0]} var n = Math.min(Math.min(r,g),b), v = Math.max(Math.max(r,g),b), m = v - n; if(m === 0) return [0, 0, v/255*100]; var h = r===n ? 3+(b-g)/m : (g===n ? 5+(r-b)/m : 1+(g-r)/m); return [h===6?0:h*60, m/v*100, v/255*100]; }, getStyle : function (prop,obj) { if (obj.currentStyle) return obj.currentStyle[prop]; else if (window.getComputedStyle) return document.defaultView.getComputedStyle(obj,null).getPropertyValue(prop); }, getOrigin : function(obj) { var parent=box=null, pos=[]; if (obj.parentNode === null || jscolor.getStyle('display', obj) == 'none') return false; if (obj.getBoundingClientRect) { // IE box = obj.getBoundingClientRect(); var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft; return [Math.round(box.left) + scrollLeft, Math.round(box.top) + scrollTop]; } else if (document.getBoxObjectFor) { // gecko box = document.getBoxObjectFor(obj); pos = [box.x, box.y]; } else { // safari/opera pos = [obj.offsetLeft, obj.offsetTop]; parent = obj.offsetParent; if (parent != obj) { while (parent) { pos[0] += parent.offsetLeft; pos[1] += parent.offsetTop; parent = parent.offsetParent; } } var ua = navigator.userAgent.toLowerCase(); if (ua.indexOf('opera') != -1 || (ua.indexOf('safari') != -1 && jscolor.getStyle('position', obj) == 'absolute')) { pos[1] -= document.body.offsetTop; } } if (obj.parentNode) parent = obj.parentNode; else parent = null; while (parent && parent.tagName != 'BODY' && parent.tagName != 'HTML') { pos[0] -= parent.scrollLeft; pos[1] -= parent.scrollTop; if (parent.parentNode) parent = parent.parentNode; else parent = null; } return pos; }, getMousePos : function(e,relC) { var e = e ? e : window.event; if(typeof e.pageX === 'number') return [e.pageX - relC[0], e.pageY - relC[1]]; else return [e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft - relC[0], e.clientY + document.body.scrollTop + document.documentElement.scrollTop - relC[1]]; }, addEvent : function(obj, type, func) { if (!obj || !type || !func) return false; if (obj == window && type == 'load') {jscolor.addWinEvent(obj, type, func); return false;} if (!obj.funcCache) obj.funcCache = []; obj.funcCache[type] = func; if (obj.addEventListener) obj.addEventListener(type, func, false); else obj.attachEvent("on" + type, func); }, addWinEvent : function(obj, type, func) { if(typeof window.addEventListener != 'undefined') window.addEventListener(type, func, false); else if(typeof document.addEventListener != 'undefined') document.addEventListener(type, func, false); //.. opera else if(typeof window.attachEvent != 'undefined') window.attachEvent('on' + type, func); else { if(typeof window.onload == 'function') { var existing = onload; window.onload = function() { existing(); func(); }; } else window.onload = func; } }, removeEvent : function(obj, type, func) { if (!obj || !type) return false; if (!func && !obj.funcCache[type]) return false; if (obj.removeEventListener) obj.removeEventListener(type, func||obj.funcCache[type], false); else obj.detachEvent("on" + type, func||obj.funcCache[type]); } } jscolor.addEvent(window, 'load', jscolor.init);