Edit in JSFiddle

/*  ================================================
	
    AUTHOR: JÉRÉMIE JACQUES (http://jeremiejacques.be — @jeremiejacques)
    TITLE: GRADIENT GENERATOR
    VERSION: 1.0
    LAST MODIFIED: Tue 18th January 2016
	
	================================================ */

function HEXGradient(color, amount) {
  if (color.toString().indexOf('#') > -1) color = color.replace('#', '');


  // CONVERT HEX COLOR INTO RGB
  var r, g, b;
  r = '0x' + color >> 16;
  g = '0x' + color >> 8 & 0xFF;
  b = '0x' + color & 0xFF;


  // CONVERT RGB INTO HSV VALUE
  function rgbToHsv(r, g, b) {
    // algorythm :: http://stackoverflow.com/questions/2353211/hsl-to-rgb-color-conversion
    r /= 255, g /= 255, b /= 255;
    var min = Math.min(r, g, b),
      max = Math.max(r, g, b),
      delta = max - min,
      h = 0,
      s = 0,
      v = max;

    if (min != max) {
      s = (delta / max);
      switch (max) {
        case r:
          h = (g - b) / delta + (g < b ? 6 : 0);
          break;
        case g:
          h = (b - r) / delta + 2;
          break;
        case b:
          h = (r - g) / delta + 4;
          break;
      }
      h /= 6;
    }
    return [h * 360, s, v];
  }


  // UPDATE HUE VALUE WITH THE AMOUT
  var newColor = rgbToHsv(r, g, b);
  newColor[0] += amount;
  if (newColor[0] >= 360) newColor[0] = 0;


  // CONVERT BACK TO RGB
  function hsvToRgb(h, s, v) {
    // algorythm :: http://stackoverflow.com/questions/2353211/hsl-to-rgb-color-conversion
    var step = (h / 360) / (1 / 6),
      pos = step - Math.floor(step), // the hue position within the current step
      m = (Math.floor(step) % 2) ? (1 - pos) * v : pos * v, // mix color value adjusted to the brightness(v)
      max = 1 * v,
      min = (1 - s) * v,
      med = m + ((1 - s) * (v - m)),
      r, g, b;

    switch (Math.floor(step)) {
      case 0:
        r = max;
        g = med;
        b = min;
        break;
      case 1:
        r = med;
        g = max;
        b = min;
        break;
      case 2:
        r = min;
        g = max;
        b = med;
        break;
      case 3:
        r = min;
        g = med;
        b = max;
        break;
      case 4:
        r = med;
        g = min;
        b = max;
        break;
      case 5:
        r = max;
        g = min;
        b = med;
        break;
    }
    return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
  }
  var rgb = hsvToRgb(newColor[0], newColor[1], newColor[2]);


  // CONVERT RVG VALUE AND RETURN INTO HEX CODE
  var rHex = (rgb[0]).toString(16),
    gHex = (rgb[1]).toString(16),
    bHex = (rgb[2]).toString(16);
  return '#' + (rHex.length == 1 ? "0" + rHex : rHex) +
    (gHex.length == 1 ? "0" + gHex : gHex) +
    (bHex.length == 1 ? "0" + bHex : bHex);
}



// DEMO TO SEE IN LIVE COLOR UPDATE :
var demo = document.querySelector('ul');
var bg = '#ff0000';
var li = document.createElement('li');
li.style.backgroundColor = bg;
li.innerHTML = bg;
demo.appendChild(li);
for (var i = 0; i < 18; i++) {
  bg = HEXGradient(bg, 20);
  var li = document.createElement('li');
  li.style.backgroundColor = bg;
  li.innerHTML = bg;
  demo.appendChild(li);
};



var body = document.querySelector('body');
var bodyBG = '#ff0000';
setInterval(function() {
  bodyBG = HEXGradient(bodyBG, 20);
  console.log(bodyBG)
  body.style.backgroundColor = bodyBG;
}, 300);
<ul>
  <li class="title">Gradient color : </li>
</ul>
html,
body {
  margin: 0;
  padding: 0;
  position: relative;
  height: 100%;
  width: 100%;
  text-align: center;
  -webkit-transition: background-color .3s linear;
  -moz-transition: background-color .3s linear;
  -ms-transition: background-color .3s linear;
  -o-transition: background-color .3s linear;
  transition: background-color .3s linear;
}

.container {
  max-width: 600px;
  margin: 0 auto;
}

ul {
  font-family: 'helvetica', sans-serif;
  font-weight: 200;
  font-size: 15px;
  display: inline-block;
  width: 180px;
  background: white;
  padding: 20px;
  margin: 40px;
}

ul li {
  height: 40px;
  width: 80px;
  margin: 0 auto;
  list-style: none;
  text-align: center;
  line-height: 40px;
}

ul .title {
  width: 180px;
  font-size: 18px;
}