Edit in JSFiddle

/**
 * 通用动画函数
 * @param opts {Object} 动画所需参数
 * @param opts.delay {number} 动画两帧之间的间隔,单位为ms
 * @param opts.duration {number} 动画总时长,单位为ms
 * @param opts.delta {function} 时间进度到动画进度的映射函数,
 *  参数为[0,1]之间的时间进度,返回值为[0,1]之间的动画进度
 * @param opts.step {function} 实际执行动画帧状态修改的函数,
 *  参数为动画进度delta,然后执行所需的操作
 **/
function animate(opts) {
  var start = new Date();

  var id = setInterval(function () {

    var timePassed = new Date() - start;
    var progress = timePassed / opts.duration;

    if (progress > 1) {
      progress = 0;
    }

    var delta = opts.delta(progress);
    opts.step(delta);

    if (progress === 1) {
      clearInterval(id);
    }
  }, opts.delay || 10);
}


/**
 * 移动一个元素的动画
 * @param element {HTMLElement} 需要动画移动的元素
 * @param delta {function} 时间进度到动画进度的映射函数
 * @param duration {number} 动画总时长
 **/
function move(element, delta, duration) {
  var to = 500;

  animate({
    delay: 10,
    duration: duration || 1000,
    delta: delta,
    step: function (delta) {
      element.style.left = to * delta + 'px';
    }
  });
}

var p = document.querySelector('.example_path');
var c = document.querySelector('.example_block');

p.addEventListener('click', function () {
  move(c, function (p) {
    return p;
  });
}, false);
.example_path{
  position:relative;
  overflow:hidden;
  width:530px;
  height:30px;
  border:3px solid #000;
  }
.example_path .example_block {
  position:absolute;
  background-color:blue;
  width:30px;
  height:20px;
  padding-top:10px;
  text-align:center;
  color:#fff;
  font-size:10px;
  white-space:nowrap;
}
<h2>点击下面的元素开始动画</h2>
<div class="example_path">
  <div class="example_block"></div>
</div>