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
     */
  ...