国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

parabola.js拋物線與加入購物車效果的示例代碼

2019-11-19 15:05:08
字體:
供稿:網(wǎng)友

在做購物車的時候發(fā)現(xiàn)一個很好用拋物線特效parabola.js,可先點擊DEMO體驗下。下面貼出一些關鍵代碼,具體代碼可在GitHub上查看

parabola.js

var funParabola = function (element, target, options) {  /*   * 網(wǎng)頁模擬現(xiàn)實需要一個比例尺   * 如果按照1像素就是1米來算,顯然不合適,因為頁面動不動就幾百像素   * 頁面上,我們放兩個物體,200~800像素之間,我們可以映射為現(xiàn)實世界的2米到8米,也就是100:1   * 不過,本方法沒有對此有所體現(xiàn),因此不必在意   */  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;      }    });  }  // 根據(jù)兩點坐標以及曲率確定運動曲線函數(shù)(也就是確定a, b的值)  /* 公式: y = a*x*x + b*x + c;   */  var a = params.curvature, b = 0, c = 0;  // 是否執(zhí)行運動的標志量  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      };      // 轉(zhuǎn)換成相對坐標位置      coordElement = {        x: 0,        y: 0      };      coordTarget = {        x: -1 * (centerElement.x - centerTarget.x),        y: -1 * (centerElement.y - centerTarget.y)      };      /*       * 因為經(jīng)過(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 () {      // 如果曲線運動還沒有結(jié)束,不再執(zhí)行新的運動      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目前是坐標,需要轉(zhuǎn)換成定位的像素值        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 {          // 運動結(jié)束,回調(diào)執(zhí)行          params.complete();          flagMove = true;        }      };      window.requestAnimationFrame(step);      flagMove = false;      return this;    };    // 初始化方法    exports.init = function () {      this.position().mark().move();    };  }  return exports;};

實現(xiàn)

// 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'),  // 購物車數(shù)量  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();});

效果圖

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 奎屯市| 延寿县| 麦盖提县| 武义县| 图木舒克市| 岐山县| 张家口市| 平山县| 札达县| 多伦县| 达尔| 洞头县| 咸阳市| 雅安市| 盐山县| 尤溪县| 古蔺县| 金川县| 临澧县| 井研县| 新乡县| 乐安县| 乌什县| 汉寿县| 汉阴县| 连州市| 岐山县| 延长县| 陵水| 穆棱市| 寿光市| 凤庆县| 永清县| 三原县| 尼木县| 宾阳县| 衡南县| 三都| 尼勒克县| 邢台市| 图片|