Chrome Color Picker
A replicate of
HTML
<div class="wrapper">
<div class="color-picker" name="color">
<div class="color-indicator" name="color"></div>
</div>
<div class="preview"></div>
<div class="hue palette" name="hue">
<div class="slider" name="hue"></div>
</div>
<div class="alpha palette" name="alpha">
<div class="slider" name="alpha"></div>
</div>
<h5 class="hex result">#fff</h5>
<h5 class="rgb result">rgba(255, 255, 255, 1)</h5>
<h5 class="hsl result">hsla(0, 0%, 100%, 1)</h5>
</div>
<div class="target">Change my color pls!</div>
CSS
@import url(https://fonts.googleapis.com/css?family=Quicksand);
html, body {
margin: 0;
box-sizing: border-box;
}
body {
background-color: #333;
font-family: 'Quicksand', sans-serif;
padding-top: 20px;
}
.wrapper {
position: relative;
background: white;
margin: 0 auto;
width: 200px;
height: 265px;
border-radius: 3px;
border: 1px solid #666;
user-select: none;
transition: all ease-in-out 0.2s;
transform-origin: 50% 100%;
transform: scale(0.8) rotate3d(0, 1, 0, 90deg);
}
.wrapper.active {
transform: scale(1) rotate3d(0, 1, 0, 0);
}
.wrapper::after {
content: '';
position: absolute;
width: 10px;
height: 10px;
top: 260px;
left: 94px;
background: linear-gradient(135deg, transparent 50%, white 50%);
border-width: 1px 1px 0 0 inherit solid;
transform: rotate(45deg);
}
.color-picker {
width: 200px;
height: 120px;
margin-bottom: 15px;
border-radius: inherit;
background: linear-gradient(to bottom, rgba(0, 0, 0, 0), rgba(0, 0, 0, 1)), linear-gradient(to left, rgba(0, 0, 0, 0), rgba(255, 255, 255, 1));
background-color: red;
overflow: hidden;
}
.color-indicator {
position: relative;
left: -6px;
top: -6px;
width: 12px;
height: 12px;
transform: translate(-6px, -6px);
border-radius: 50%;
border: 1px solid white;
}
.preview {
background: white;
float: left;
width: 32px;
height: 32px;
border-radius: 50%;
margin-left: 12px;
border: 1px solid #eee;
}
.palette {
background: darkblue;
width: 120px;
height: 12px;
margin-left: 60px;
position: relative;
border-radius: 1px;
margin-bottom: 10px;
}
.hue {
background: linear-gradient(to left,
hsl(0, 100%, 50%) 0%,
hsl(30, 100%, 50%) 8.33%,
hsl(60, 100%, 50%) 16.67%,
hsl(90, 100%, 50%) 25%,
hsl(120, 100%, 50%) 33.33%,
hsl(150, 100%, 50%) 41.67%,
hsl(180, 100%, 50%) 50%,
hsl(210, 100%, 50%) 58.33%,
hsl(240, 100%, 50%) 66.67%,
hsl(270, 100%, 50%) 75%,
...
JavaScript
const utils = {
// 事件绑定
addHandler(target, event, handler) {
if (target.addEventListener) {
target.addEventListener(event, handler, false);
} else if (target.attachEvent) {
target.attachEvent('on' + event, handler);
} else {
target['on' + event] = handler;
}
},
// 事件解绑
removeHandler(target, event, handler) {
if (target.removeEventListener) {
target.removeEventListener(event, handler, false);
} else if (target.detachEvent) {
target.detachEvent('on' + event, handler);
} else {
target['on' + event] = null;
}
},
// 坐标锁定
clamp(val, min, max) {
return val < min ? min : (val > max ? max : val);
},
// 一个不考虑兼容性的domready
domready(callback) {
document.addEventListener('DOMContentLoaded', listener = function () {
document.removeEventListener('DOMContentLoaded', listener);
callback();
});
},
// 判断是否为数组
isArray(arrayLike) {
return Object.prototype.toString.call(arrayLike) === '[object Array]';
},
// 数字末尾除0
trimZero(str) {
return str.replace(/\.?0*$/, '');
},
color: {
// https://gist.github.com/NV/522734
// hsb颜色转为hsl颜色
hsb2hsl(h, s, b) {
var hsl = {
h: h
};
hsl.l = (2 - s) * b;
hsl.s = s * b;
if (hsl.l <= 1 && hsl.l > 0) {
hsl.s /= hsl.l;
} else {
hsl.s = hsl.s / (2 - hsl.l) || 0;
}
hsl.l /= 2;
if (hsl.s > 1) {
hsl.s = 1;
}
return hsl;
},
/**
* Converts an HSL color value to RGB. Conversion formula
* adapted from http://en.wikipedia.org/wiki/HSL_color_space.
* Assumes s and l are contained in the set [0, 1] and h is
* contained in the set [0, 360], returns r, g, and b in the
* set [0, 255].
*
* @param {number} h The hue
* @param {number} s The saturation
* @param {number} l The lightness
* @return {Array} The RGB representation
*/
...