<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        js實現商品拋物線加入購物車特效

        來源:懂視網 責編:小OO 時間:2020-11-27 20:25:52
        文檔

        js實現商品拋物線加入購物車特效

        parapola.js。/*。== 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;};/*使用。
        推薦度:
        導讀parapola.js。/*。== 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;};/*使用。
        本文實例為大家分享了js實現商品拋物線加入購物車動畫代碼,供大家參考,具體內容如下

        js實現商品拋物線加入購物車特效

        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) {
         /*
         * 網頁模擬現實需要一個比例尺
         * 如果按照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;
        };
         
        /*! 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");
        // 拋物線元素的的位置標記
        var parabola = funParabola(element, target).mark();
        // 拋物線運動的觸發
        document.body.onclick = function() {
         element.style.marginLeft = "0px";
         element.style.marginTop = "0px";
         parabola.init();
        };

        加入購物車實戰:

        /* 本demo演示腳本基于ieBetter.js, 項目地址:https://github.com/zhangxinxu/ieBetter.js */
         
        // 元素以及其他一些變量
        var eleFlyElement = document.querySelector("#flyItem"), eleShopCart = document.querySelector("#shopCart");
        var numberItem = 0;
        // 拋物線運動
        var myParabola = funParabola(eleFlyElement, eleShopCart, {
         speed: 400,
         curvature: 0.002, 
         complete: function() {
         eleFlyElement.style.visibility = "hidden";
         eleShopCart.querySelector("span").innerHTML = ++numberItem;
         }
        });
        // 綁定點擊事件
        if (eleFlyElement && eleShopCart) {
         [].slice.call(document.getElementsByClassName("btnCart")).forEach(function(button) {
         button.addEventListener("click", function() {
         // 滾動大小
         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(); 
         });
         });
        }

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        js實現商品拋物線加入購物車特效

        parapola.js。/*。== 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;};/*使用。
        推薦度:
        標簽: js 效果 商品加入
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产精品色拉拉免费看| 大地影院MV在线观看视频免费| 91成人免费观看| 亚洲一区二区三区日本久久九| 久久国产精品2020免费m3u8| 久热综合在线亚洲精品| 三级黄色在线免费观看| 亚洲精品无码鲁网中文电影| a级特黄毛片免费观看| 精品国产日韩亚洲一区在线 | 国产精品综合专区中文字幕免费播放 | 久久亚洲中文字幕精品有坂深雪| 日韩免费在线观看视频| 久久久久亚洲AV无码永不| 国产高清免费视频| 亚洲人成网站在线在线观看| 国产精品视频免费一区二区三区| 日韩久久无码免费毛片软件| 久久精品国产精品亚洲| 精品无码国产污污污免费网站| 天堂亚洲国产中文在线| 免费一级做a爰片久久毛片潮喷| 国产大片免费天天看| 亚洲国产成人久久精品动漫| 中文字幕无码免费久久99| 色天使亚洲综合一区二区| 中文字幕亚洲综合久久菠萝蜜| 99久久免费精品视频| 亚洲Av永久无码精品黑人 | 久久丫精品国产亚洲av不卡 | 亚洲精品99久久久久中文字幕| 国内永久免费crm系统z在线| 亚洲国色天香视频| 曰批全过程免费视频在线观看无码| 亚洲色欲www综合网| 全黄a免费一级毛片人人爱| 无码人妻一区二区三区免费n鬼沢| 亚洲日韩国产一区二区三区在线| 亚洲无线一二三四区手机| 91精品国产免费入口| 老司机免费午夜精品视频|