parabola.js 포물선 과 카 트 효과 추가 예시 코드

8181 단어 parabola.js포물선
카 트 를 만 들 때 포물선 효과 가 좋 은 파 라 볼 라 제 이 스 를 발견 하면 먼저DEMO를 클릭 하여 체험 할 수 있다.아래 에 관건 적 인 코드 를 붙 여 놓 으 면 구체 적 인 코드 는GitHub에서 볼 수 있다.
parabola.js

var funParabola = function (element, target, options) {
  /*
   *              
   *     1    1   ,     ,            
   *    ,       ,200~800    ,            2  8 ,   100:1
   *   ,           ,      
   */

  var defaults = {
    speed: 166.67, //          ,  (        )  16~17  
    curvature: 0.001, //            ,        ,           ,        
    progress: function () {
    },
    complete: function () {
    }
  };

  var params = {};
  options = options || {};

  for (var key in defaults) {
    params[key] = options[key] || defaults[key];
  }

  var exports = {
    mark: function () {
      return this;
    },
    position: function () {
      return this;
    },
    move: function () {
      return this;
    },
    init: function () {
      return this;
    }
  };

  /*         
   * IE6-IE8  margin  
   * IE9+  transform
   */
  var moveStyle = "margin", testDiv = document.createElement("div");
  if ("oninput" in testDiv) {
    ["", "ms", "webkit"].forEach(function (prefix) {
      var transform = prefix + (prefix ? "T" : "t") + "ransform";
      if (transform in testDiv.style) {
        moveStyle = transform;
      }
    });
  }

  //                   (     a, b  )
  /*   : y = a*x*x + b*x + c;
   */
  var a = params.curvature, b = 0, c = 0;

  //           
  var flagMove = true;

  if (element && target && element.nodeType == 1 && target.nodeType == 1) {
    var rectElement = {}, rectTarget = {};

    //           ,          
    var centerElement = {}, centerTarget = {};

    //          
    var coordElement = {}, coordTarget = {};

    //          
    exports.mark = function () {
      if (flagMove == false) return this;
      if (typeof coordElement.x == "undefined") this.position();
      element.setAttribute("data-center", [coordElement.x, coordElement.y].join());
      target.setAttribute("data-center", [coordTarget.x, coordTarget.y].join());
      return this;
    }

    exports.position = function () {
      if (flagMove == false) return this;

      var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft,
        scrollTop = document.documentElement.scrollTop || document.body.scrollTop;

      //     
      if (moveStyle == "margin") {
        element.style.marginLeft = element.style.marginTop = "0px";
      } else {
        element.style[moveStyle] = "translate(0, 0)";
      }

      //       
      rectElement = element.getBoundingClientRect();
      rectTarget = target.getBoundingClientRect();

      //           
      centerElement = {
        x: rectElement.left + (rectElement.right - rectElement.left) / 2 + scrollLeft,
        y: rectElement.top + (rectElement.bottom - rectElement.top) / 2 + scrollTop
      };

      //           
      centerTarget = {
        x: rectTarget.left + (rectTarget.right - rectTarget.left) / 2 + scrollLeft,
        y: rectTarget.top + (rectTarget.bottom - rectTarget.top) / 2 + scrollTop
      };

      //          
      coordElement = {
        x: 0,
        y: 0
      };
      coordTarget = {
        x: -1 * (centerElement.x - centerTarget.x),
        y: -1 * (centerElement.y - centerTarget.y)
      };

      /*
       *     (0, 0),   c = 0
       *   :
       * y = a * x*x + b*x;
       * y1 = a * x1*x1 + b*x1;
       * y2 = a * x2*x2 + b*x2;
       *        :
       * b = (y2+ a*x2*x2) / x2
       */
      //   
      b = (coordTarget.y - a * coordTarget.x * coordTarget.x) / coordTarget.x;

      return this;
    };

    //         
    exports.move = function () {
      //            ,        
      if (flagMove == false) return this;

      var startx = 0, rate = coordTarget.x > 0 ? 1 : -1;

      var step = function () {
        //    y'=2ax+b
        var tangent = 2 * a * startx + b; // = y / x
        // y*y + x*x = speed
        // (tangent * x)^2 + x*x = speed
        // x = Math.sqr(speed / (tangent * tangent + 1));
        startx = startx + rate * Math.sqrt(params.speed / (tangent * tangent + 1));

        //     
        if ((rate == 1 && startx > coordTarget.x) || (rate == -1 && startx < coordTarget.x)) {
          startx = coordTarget.x;
        }
        var x = startx, y = a * x * x + b * x;

        //       ,          ,            
        element.setAttribute("data-center", [Math.round(x), Math.round(y)].join());

        // x, y     ,           
        if (moveStyle == "margin") {
          element.style.marginLeft = x + "px";
          element.style.marginTop = y + "px";
        } else {
          element.style[moveStyle] = "translate(" + [x + "px", y + "px"].join() + ")";
        }

        if (startx !== coordTarget.x) {
          params.progress(x, y);
          window.requestAnimationFrame(step);
        } else {
          //     ,    
          params.complete();
          flagMove = true;
        }
      };
      window.requestAnimationFrame(step);
      flagMove = false;

      return this;
    };

    //      
    exports.init = function () {
      this.position().mark().move();
    };
  }

  return exports;
};

이루어지다

// body
<div class="container">
  ![](dist/01.png)
  <center>           </center>

  <!--    -->
  <div class="img-element" id="imgElement">
    ![](dist/02.jpg)
  </div>
  <!--   -->
  <div class="shop-cart" id="shopCart"></div>

  <span class="shop-cart-num">0</span>
  <div class="add-shop-cart"><!--     --></div>
</div>

// script
//       
var imgElement = document.querySelector('#imgElement'),
  //       
  shopCartElement = document.querySelector('#shopCart'),
  //      
  proNum = 0;

//         
var myParabola = funParabola(imgElement, shopCartElement, {
  speed: 100,//          
  curvature: 0.005,//            
  complete: function () {
    imgElement.style.visibility = "hidden";
    $('.shop-cart-num').text(++proNum);
  }
});
//          
$('.add-shop-cart').click(function () {
  //     
  $('#imgElement').css({ left: '70px', bottom: '25px', visibility: 'visible' });

  myParabola.position().move();
});
효과 도

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기