餓了麽購物車動畫

来源:https://www.cnblogs.com/wind-lanyan/archive/2018/04/27/8964545.html
-Advertisement-
Play Games

前言 之前用餓了麽印象最深刻的是聯動菜單和小球飛入購物車動畫,所以想看看別人是怎麼實現的,但是看了很多仿餓了麽的demo都是實現了一個完整的大的項目,要找到那個小模塊很麻煩,所以自己將聯動菜單和動畫提取出來寫了一個demo,方便學習。 目的只是想突出功能所以界面細節很relax,大家也relax的看 ...


前言

之前用餓了麽印象最深刻的是聯動菜單和小球飛入購物車動畫,所以想看看別人是怎麼實現的,但是看了很多仿餓了麽的demo都是實現了一個完整的大的項目,要找到那個小模塊很麻煩,所以自己將聯動菜單和動畫提取出來寫了一個demo,方便學習。

目的只是想突出功能所以界面細節很relax,大家也relax的看看吧~

效果圖

 

實現功能

1. 聯動菜單

1.1 用戶點擊左側導航欄會跳轉到相應的內容

這個很簡單,給導航欄的每一個元素加一個點擊事件,其實也可以通過a標簽的錨點來實現

<li v-for="(item, index) in navs" 
    :key="index" 
    :class="{click: selector==index}"
    @click="toHash(item, index)">
    {{item}}
</li>
// 點擊右側導航欄
toHash(item, index) {
    this.selector = index;
    window.location.hash = item; 
    
    // 導航欄向上滾動相應距離,一個li的高度為54px
    this.$refs.left.scrollTop = (index > 7 ? index-7 : 0)*54;
}

1.2 用戶滑動右側的內容左側的導航欄會響應式改變

右側內容監聽一個scroll事件,當觸發滑動事件的時候獲取粘性定位在頂部的標題,根據標題使導航欄定位到相應的li

var obj = element.getBoundingClientRect();

上述api返回一個對象obj,該對象有left、top等屬性,可以根據該屬性獲得element元素在頁面的位置

listScroll() {
    // 為了達到聯動效果,右側滑動則改變左側導航欄樣式
    var titles = document.getElementsByClassName('goodTitle');
    for(var i = 0; i < titles.length; i++) {
        var style = titles[i].getBoundingClientRect();
        if(style.top == 107) {
            this.toHash(titles[i].innerHTML, i);
        }
    }
}

1.3 標題欄粘性定位

#el {
    position: sticky;
    top: 0;
}

該元素定位表現為在跨越特定閾值前為相對定位,之後為固定定位。這也實現了內容區標題欄始終在頂部的效果。關於粘性定位更多的可以看這裡

2. 按鈕緩慢彈出

當我們點擊添加按鈕的時候其他的內容會緩慢彈出,這個是靠css的動畫實現的。

我們先將個數減少按鈕和被選中物品個數num的left設為48px,使其被隱藏。點擊添加按鈕時選擇物品個數大於0則讓left變為0達到一個緩慢彈出的動畫效果。

 <div :class="{pop: true, mov: item.num>0}">
    <!---->
 </div>
.pop {
    display: inline-block;
    position: relative;
    left: 48px;
    opacity: 0;
    transition: all ease .5s;
}
.mov {
    left: 0;
    opacity: 1;
}

3.小球飛入購物車動畫

先準備n個小球,為什麼不是一個呢?因為如果用戶連續點擊添加可能會出現小球不夠的情況,所以需要多個小球。

<!-- 運動的小球 -->
<div id="points">
    <div class="pointOuter pointPre">
        <div class="point-inner"></div>
    </div>  
    <!--其他n個小球-->
</div>

令小球為絕對定位這樣可以改變它的left和top。

動畫實現思路:用戶點擊添加時將一個小球的位置設置為被點擊元素的位置,且獲取目的地位置(購物車位置),當小球拋出時使其運動方式按照貝塞爾曲線過渡。

increase(index1, index2, event) { 
    
    // some code...
    
    // 小球動畫 
    var top = event.clientY, // 小球降落起點
        left = event.clientX,
        endTop = window.innerHeight - 30,  // 小球降落終點
        endLeft = 20; 

    // // 小球到達起點並去掉小球的display: none;
    var outer = $('#points .pointPre').first().removeClass("pointPre").css({
        left: left + 'px',
        top: top + 'px'
    });
    var inner = outer.find(".point-inner"); 

    setTimeout(function() { 
        // 將jquery對象轉換為DOM對象
        outer[0].style.webkitTransform = 'translate3d(0,' + (endTop - top) + 'px,0)';
        inner[0].style.webkitTransform = 'translate3d(' + (endLeft - left) + 'px,0,0)';
        
        // 小球運動完畢恢復到原點
        setTimeout(function() {
            outer.removeAttr("style").addClass("pointPre");
            inner.removeAttr("style");
        }, 1000);  //這裡的延遲值和小球的運動時間相關
    }, 1); 
}

註意點:

  • 嵌套的setTimeout中的時間之所以設置為1s,是因為css中規定的小球運動時間為1s,所以在小球1s運動完以後會令它恢復到原來的位置,你想想,小球一共就只有那麼幾個,如果不恢復的話下次用戶點擊了小球就不夠啊...

總結

以上是餓了麽購物車模塊主頁面的幾個主要技術點,這個demo註重功能所以UI什麼的沒有完全copy餓了麽,大家也可以把項目fork下來自己添加組件來擴充成一個高仿的餓了麽購物車模塊。

源碼地址:vue-eleme-shoppingCart


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 兩台ubuntu 雲伺服器,分別redis主從伺服器,ip地址是:123.207.96.138(主)139.199.167.251(從) 安裝redis,在這裡我建議給redis設置密碼,之前看過一篇文章,就是因為redis沒有設置密碼,導致redis伺服器被黑了。首先修改redis.conf配置文 ...
  • MongoDB 中的關係運算符,邏輯運算符,數組條件,內嵌文檔,正則過濾,正、倒序排序,限定數量 ...
  • 首先,需要打開手機的USB調試和微信的TBS 調試。然後,打開chrome://inspect,點擊Inspect。此時,如果沒有Fan牆或使用離線開發者工具包,會出現空白頁面: 解決方法: Fan牆或使用離線開發者工具包後,還是會出現左側空白,簡單修改css樣式激活一下就可以了,如下動圖演示: 微 ...
  • 一、項目介紹 【知識準備】 ①Android Interface definition language(aidl,android介面定義語言),其目的實現跨進程的調用。進程是程式在os中執行的載體,一個程式對應一個進程,不同進程就是指不同程式,aidl實現不同程式之間的調用。 ②主線程與子線程通信 ...
  • 做安卓開發時一定要註意,主線程不能更改UI界面,如果出現程式運行時崩潰的情況,如果沒有明顯的語法錯誤,請檢查自己的進程是否出現衝突,崩潰。如果有與後臺的連接,即請求向伺服器發送請求的時尤其需要註意,或出現沒有報錯,但就是網路請求這段代碼不會執行,這種情況下,如果設置的參數或者其他地方沒有什麼問題,但 ...
  • 前言: ​ 這是每天看github上面的一位大佬 "冴羽" [的博客 自己加以自己的理解總結的 是指程式源碼中定義變數的區域 作用域決定瞭如何查找變數,也就是度額定當前執行代碼對變數的訪問許可權 JavaScript 使用的是 (lexical scoping) 也就是靜態作用域 靜態作用域與動態作用 ...
  • 先上效果預覽: Web Components 首先,什麼是 Web Components ? "MDN" 給出的定義是: Web Components 是一套不同的技術,允許您創建可重用的定製元素(它們的功能封裝在您的代碼之外)並且在您的web應用中使用它們。 ... ... 實現web compo ...
  • 今天在寫html5中播放曠視C2攝像頭視頻監控的功能,查了很多資料,才發現Html5 <video>並不支持rtsp協議。後來查到使用第三方轉碼才得以實現。 這裡把方法寫下來分享給大家。 首先要獲取攝像機品牌的RTSP地址: 如大華的是 rtsp://user:pwd@ip:port/cam/ re ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...