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

首頁 > 編程 > JavaScript > 正文

js實(shí)現(xiàn)商品拋物線加入購(gòu)物車特效

2019-11-20 10:17:02
字體:
供稿:網(wǎng)友

本文實(shí)例為大家分享了js實(shí)現(xiàn)商品拋物線加入購(gòu)物車動(dòng)畫代碼,供大家參考,具體內(nèi)容如下

 

parapola.js

/*! * by zhangxinxu(.com) 2012-12-27 * you can visit http://www.zhangxinxu.com/wordpress/?p=3855 to get more infomation * under MIT license*/var funParabola = function(element, target, options) {  /*   * 網(wǎng)頁模擬現(xiàn)實(shí)需要一個(gè)比例尺   * 如果按照1像素就是1米來算,顯然不合適,因?yàn)轫撁鎰?dòng)不動(dòng)就幾百像素   * 頁面上,我們放兩個(gè)物體,200~800像素之間,我們可以映射為現(xiàn)實(shí)世界的2米到8米,也就是100:1   * 不過,本方法沒有對(duì)此有所體現(xiàn),因此不必在意  */    var defaults = {    speed: 166.67, // 每幀移動(dòng)的像素大小,每幀(對(duì)于大部分顯示屏)大約16~17毫秒    curvature: 0.001, // 實(shí)際指焦點(diǎn)到準(zhǔn)線的距離,你可以抽象成曲率,這里模擬扔物體的拋物線,因此是開口向下的    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; }  };    /* 確定移動(dòng)的方式    * 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ù)兩點(diǎn)坐標(biāo)以及曲率確定運(yùn)動(dòng)曲線函數(shù)(也就是確定a, b的值)  /* 公式: y = a*x*x + b*x + c;  */  var a = params.curvature, b = 0, c = 0;    // 是否執(zhí)行運(yùn)動(dòng)的標(biāo)志量  var flagMove = true;    if (element && target && element.nodeType == 1 && target.nodeType == 1) {    var rectElement = {}, rectTarget = {};        // 移動(dòng)元素的中心點(diǎn)位置,目標(biāo)元素的中心點(diǎn)位置    var centerElement = {}, centerTarget = {};        // 目標(biāo)元素的坐標(biāo)位置    var coordElement = {}, coordTarget = {};        // 標(biāo)注當(dāng)前元素的坐標(biāo)    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)";      }            // 四邊緣的坐標(biāo)      rectElement = element.getBoundingClientRect();      rectTarget = target.getBoundingClientRect();            // 移動(dòng)元素的中心點(diǎn)坐標(biāo)      centerElement = {        x: rectElement.left + (rectElement.right - rectElement.left) / 2 + scrollLeft,        y: rectElement.top + (rectElement.bottom - rectElement.top) / 2  + scrollTop      };            // 目標(biāo)元素的中心點(diǎn)位置      centerTarget = {        x: rectTarget.left + (rectTarget.right - rectTarget.left) / 2 + scrollLeft,        y: rectTarget.top + (rectTarget.bottom - rectTarget.top) / 2 + scrollTop          };            // 轉(zhuǎn)換成相對(duì)坐標(biāo)位置      coordElement = {        x: 0,        y: 0        };      coordTarget = {        x: -1 * (centerElement.x - centerTarget.x),        y: -1 * (centerElement.y - centerTarget.y)        };            /*       * 因?yàn)榻?jīng)過(0, 0), 因此c = 0       * 于是:       * y = a * x*x + b*x;       * y1 = a * x1*x1 + b*x1;       * y2 = a * x2*x2 + b*x2;       * 利用第二個(gè)坐標(biāo):       * b = (y2+ a*x2*x2) / x2      */      // 于是      b = (coordTarget.y - a * coordTarget.x * coordTarget.x) / coordTarget.x;              return this;    };            // 按照這個(gè)曲線運(yùn)動(dòng)    exports.move = function() {      // 如果曲線運(yùn)動(dòng)還沒有結(jié)束,不再執(zhí)行新的運(yùn)動(dòng)      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;                // 標(biāo)記當(dāng)前位置,這里有測(cè)試使用的嫌疑,實(shí)際使用可以將這一行注釋        element.setAttribute("data-center", [Math.round(x), Math.round(y)].join());                // x, y目前是坐標(biāo),需要轉(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 {          // 運(yùn)動(dòng)結(jié)束,回調(diào)執(zhí)行          params.complete();          flagMove = true;          }      };      window.requestAnimationFrame(step);      flagMove = false;            return this;    };        // 初始化方法    exports.init = function() {      this.position().mark().move();    };  }    return exports;};/*! requestAnimationFrame.js * by zhangxinxu 2013-09-30*/(function() {  var lastTime = 0;  var vendors = ['webkit', 'moz'];  for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {    window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];    window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] ||  // name has changed in Webkit                   window[vendors[x] + 'CancelRequestAnimationFrame'];  }  if (!window.requestAnimationFrame) {    window.requestAnimationFrame = function(callback, element) {      var currTime = new Date().getTime();      var timeToCall = Math.max(0, 16.7 - (currTime - lastTime));      var id = window.setTimeout(function() {        callback(currTime + timeToCall);      }, timeToCall);      lastTime = currTime + timeToCall;      return id;    };  }  if (!window.cancelAnimationFrame) {    window.cancelAnimationFrame = function(id) {      clearTimeout(id);    };  }}());

使用:

/* 元素 */var element = document.getElementById("element"),   target = document.getElementById("target");// 拋物線元素的的位置標(biāo)記var parabola = funParabola(element, target).mark();// 拋物線運(yùn)動(dòng)的觸發(fā)document.body.onclick = function() {  element.style.marginLeft = "0px";  element.style.marginTop = "0px";  parabola.init();};

加入購(gòu)物車實(shí)戰(zhàn):

/* 本demo演示腳本基于ieBetter.js, 項(xiàng)目地址:https://github.com/zhangxinxu/ieBetter.js */// 元素以及其他一些變量var eleFlyElement = document.querySelector("#flyItem"), eleShopCart = document.querySelector("#shopCart");var numberItem = 0;// 拋物線運(yùn)動(dòng)var myParabola = funParabola(eleFlyElement, eleShopCart, {  speed: 400,  curvature: 0.002,    complete: function() {    eleFlyElement.style.visibility = "hidden";    eleShopCart.querySelector("span").innerHTML = ++numberItem;  }});// 綁定點(diǎn)擊事件if (eleFlyElement && eleShopCart) {  [].slice.call(document.getElementsByClassName("btnCart")).forEach(function(button) {    button.addEventListener("click", function() {      // 滾動(dòng)大小      var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft || 0,        scrollTop = document.documentElement.scrollTop || document.body.scrollTop || 0;      eleFlyElement.style.left = event.clientX + scrollLeft + "px";      eleFlyElement.style.top = event.clientY + scrollTop + "px";      eleFlyElement.style.visibility = "visible";            // 需要重定位      myParabola.position().move();     });  });}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 晋中市| 工布江达县| 蒙城县| 沙湾县| 抚宁县| 化德县| 囊谦县| 瑞金市| 云安县| 北辰区| 鲁甸县| 玉树县| 成安县| 大渡口区| 克东县| 化德县| 汉中市| 台江县| 金沙县| 徐汇区| 龙里县| 历史| 赤壁市| 元江| 海伦市| 鸡东县| 五河县| 新巴尔虎左旗| 洛扎县| 大邑县| 遂昌县| 天台县| 汽车| 宜昌市| 长治市| 游戏| 游戏| 翁牛特旗| 宁远县| 务川| 东宁县|