国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答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
當前位置: 首頁 - 科技 - 知識百科 - 正文

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

來源:懂視網(wǎng) 責編:小采 時間:2020-11-27 22:27:12
文檔

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

parabola.js拋物線與加入購物車效果的示例代碼:在做購物車的時候發(fā)現(xiàn)一個很好用拋物線特效parabola.js,可先點擊DEMO體驗下。下面貼出一些關鍵代碼,具體代碼可在GitHub上查看 parabola.js var funParabola = function (element, target, options) { /* * 網(wǎng)頁模擬現(xiàn)實需要一個
推薦度:
導讀parabola.js拋物線與加入購物車效果的示例代碼:在做購物車的時候發(fā)現(xiàn)一個很好用拋物線特效parabola.js,可先點擊DEMO體驗下。下面貼出一些關鍵代碼,具體代碼可在GitHub上查看 parabola.js var funParabola = function (element, target, options) { /* * 網(wǎng)頁模擬現(xiàn)實需要一個

在做購物車的時候發(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 () {
 // 如果曲線運動還沒有結束,不再執(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 {
 // 運動結束,回調(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();
});

效果圖

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

文檔

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

parabola.js拋物線與加入購物車效果的示例代碼:在做購物車的時候發(fā)現(xiàn)一個很好用拋物線特效parabola.js,可先點擊DEMO體驗下。下面貼出一些關鍵代碼,具體代碼可在GitHub上查看 parabola.js var funParabola = function (element, target, options) { /* * 網(wǎng)頁模擬現(xiàn)實需要一個
推薦度:
標簽: js 代碼 加入的
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 在线日韩欧美 | 国产边打电话边做对白刺激 | 日韩无 | 一区二区三区在线播放 | 久久精品国产亚洲精品2020 | 亚洲欧美中文日韩在线v日本 | 国产欧美日韩一区二区三区 | 日本人乱人乱亲乱色视频观看 | 边做边爱边吃奶叫床的视频 | 亚洲第一区视频 | 中文字幕在线播放第一页 | 国产精品久久久久久久 | 日韩一区二区三区四区不卡 | h免费视频 | 亚洲欧美精品成人久久91 | 亚洲欧美视频一区二区三区 | 欧美极品第1页专区 | 免费网站看v片在线成人国产系列 | 骚b视频| 久久久久久久国产高清 | 羞羞网站在线观看 | 欧美国产日韩一区二区三区 | 国产a视频 | 欧美日韩视频一区二区在线观看 | 国产免费一区二区三区香蕉精 | bb毛片 | 国产福利二区 | 国产精品欧美亚洲韩国日本不卡 | 日韩一级精品久久久久 | 亚洲欧美网| 精品国产综合成人亚洲区 | 高清国产一区 | 曰韩欧美| 国产高清一区二区三区 | 91福利国产在线观一区二区 | 国产日韩欧美自拍 | 91精品一区二区 | 国产一区成人 | 亚洲国产成人精品91久久久 | 狠狠操夜夜 | 精品亚洲一区二区 |