拆分CSS过渡贝塞尔曲线

时间:2014-10-28 16:16:57

标签: javascript css css-animations bezier

我有一个2秒的CSS转换,从0到200px,在cubic-bezier(0.4,0,0.2,1)的时间:

transition: transform 2s cubic-bezier(0.4, 0, 0.2, 1);

我想将此动画分解为两个相等的部分:

Part 1: transform-duration 1s from 0 to 100px
Part 2: transform-duration 1s from 100px to 200px, will start after the first one ends

棘手的部分是计算每个人的正确时间。 根据这篇文章:Create easy function 40% off set和这个:Extrapolate split cubic-bezier to 1,1我设法拆分我的初始贝塞尔曲线并将坐标标准化为(0,0) - (1,1)。

这是我的代码:

//    Single Animation, 2s from 0 to 200px
var d1 = document.querySelector('.d1')
d1.style.transform = 'translateX(200px)';

//    Composed Animation, Part 1, 1s from 0 to 100px
var d2 = document.querySelector('.d2');

//    Get first part bezier
//    cubic-bezier(0.4, 0, 0.2, 1)
var x = [0, 0.4, 0.2, 1]
var y = [0, 0,   1,   1]

function splitCubicBezier(options) {
  var z = options.z,
      cz = z-1,
      z2 = z*z,
      cz2 = cz*cz,
      z3 = z2*z,
      cz3 = cz2*cz,
      x = options.x,
      y = options.y;

  var left = [
    x[0],
    y[0],
    z*x[1] - cz*x[0], 
    z*y[1] - cz*y[0], 
    z2*x[2] - 2*z*cz*x[1] + cz2*x[0],
    z2*y[2] - 2*z*cz*y[1] + cz2*y[0],
    z3*x[3] - 3*z2*cz*x[2] + 3*z*cz2*x[1] - cz3*x[0],
    z3*y[3] - 3*z2*cz*y[2] + 3*z*cz2*y[1] - cz3*y[0]];

  var right = [
    z3*x[3] - 3*z2*cz*x[2] + 3*z*cz2*x[1] - cz3*x[0],
    z3*y[3] - 3*z2*cz*y[2] + 3*z*cz2*y[1] - cz3*y[0],
                    z2*x[3] - 2*z*cz*x[2] + cz2*x[1],
                    z2*y[3] - 2*z*cz*y[2] + cz2*y[1],
                                    z*x[3] - cz*x[2], 
                                    z*y[3] - cz*y[2], 
                                                x[3],
                                                y[3]];

  if (options.fitUnitSquare) {
    return {
      left: left.map(function(el, i) {
        if (i % 2 == 0) {

          var Xmin = left[0];
          var Xmax = left[6]; //should be 1
          var Sx = 1 / (Xmax - Xmin);
          return (el - Xmin) * Sx;
        } else {

          var Ymin = left[1];
          var Ymax = left[7]; //should be 1
          var Sy = 1 / (Ymax - Ymin);
          return (el - Ymin) * Sy;
        }
      }),
      right: right.map(function(el, i) {
        if (i % 2 == 0) {
          //xval
          var Xmin = right[0]; //should be 0
          var Xmax = right[6];
          var Sx = 1 / (Xmax - Xmin);
          return (el - Xmin) * Sx;
        } else {
          //yval
          var Ymin = right[1]; //should be 0
          var Ymax = right[7];
          var Sy = 1 / (Ymax - Ymin);
          return (el - Ymin) * Sy;
        }
      })
    }
  } else {
   return { left: left, right: right};
  }
}

var result = splitCubicBezier({
  z: .5, // Split at half
  x: x,
  y: y,
  fitUnitSquare: true // coordinate normalization
});

console.log(result)

d2.addEventListener("transitionend", newTiming, false);

d2.style['transition-timing-function'] = 'cubic-bezier(' + result.left[2] + ',' + result.left[3] + ',' + result.left[4] + ',' + result.left[5] + ')';
d2.style.transform = 'translateX(100px)';

function newTiming(){
    d2.textContent = 'Composed Animation, Part 2'
    d2.style['transition-timing-function'] = 'cubic-bezier(' + result.right[2] + ',' + result.right[3] + ',' + result.right[4] + ',' + result.right[5] + ')';
    d2.style.transform = 'translateX(200px)';
}

http://jsfiddle.net/3hs4ehom/1/

显然这看起来不对。贝塞尔曲线似乎右撇http://jsfiddle.net/DfpLk/3/。我错过了什么吗? 感谢。

0 个答案:

没有答案