【CSS動(dòng)畫】餓了么加入購(gòu)物車拋物線動(dòng)畫實(shí)現(xiàn)

前言

每次吃飯點(diǎn)外賣的時(shí)候(暴露了自己是個(gè)死肥宅逆皮,手動(dòng)滑稽),或者在淘寶購(gòu)物的時(shí)候柳譬,將商品加入購(gòu)物車時(shí)會(huì)有一個(gè)很炫酷的動(dòng)畫群扶,如下圖餓了么點(diǎn)餐動(dòng)畫:


餓了么原圖

所以百度了一下前端使用css實(shí)現(xiàn)這個(gè)效果,然后就自己就照葫蘆畫瓢的寫了一個(gè)小小的demo笨使,完全當(dāng)作學(xué)習(xí)了一把卿樱。

界面

在界面上,我是參考了圖片上的界面硫椰,寫的css繁调,然后在美團(tuán)上面扒的數(shù)據(jù)。完成后的界面如下圖:


界面UI

開始想著只是做一個(gè)簡(jiǎn)單的實(shí)現(xiàn)效果靶草,界面上只有div框蹄胰,按鈕什么的這些,反正想著很丑的界面奕翔,但是自己看到餓了么這么好看的界面裕寨,自己就忍不住模仿著寫了一下下。
主要用到的是移動(dòng)端適配方案:flexible.js + rem的方案

動(dòng)畫實(shí)現(xiàn)

  1. 用戶在點(diǎn)擊圖片中標(biāo)注1的時(shí)候,創(chuàng)建一個(gè)div宾袜,插入到body中捻艳,改div暫且叫bar
  2. 設(shè)置bar的css樣式為
    {
      position: absolute;
      top: 點(diǎn)擊位置X坐標(biāo);
      left: 點(diǎn)擊位置Y坐標(biāo);
      width: 0.533333rem;
      height: 0.533333rem;
      border-radius: 50%;
      background: #02b6fd;
      transition: left .6s linear, top .6s cubic-bezier(0.5, -0.5, 1, 1)
    }
    
    其中,點(diǎn)擊位置的X坐標(biāo)點(diǎn)擊位置的Y坐標(biāo)是通過點(diǎn)擊時(shí)js獲取到的
  3. 然后設(shè)置最終位移的位置到標(biāo)注2的位置

代碼實(shí)現(xiàn)

首先獲取到頁(yè)面上所有按鈕庆猫,然后給按鈕添加點(diǎn)擊事件认轨,獲取到點(diǎn)擊當(dāng)前按鈕的位置坐標(biāo)信息

    var buttons = document.getElementsByClassName('ele_main_goods_add')
    for (let i = 0; i < buttons.length; i++) {
        buttons[i].onclick = function () {
            let x = event.pageX - this.offsetWidth / 2;
            let y = event.pageY - this.offsetWidth / 2;
            // 方案一
            // createBall01(x, y)
            // 方案二
            // createBall02(x, y)
        }
    }

方案一:使用定位+transition的方式實(shí)現(xiàn)

    function createBall01(left, top) {
        let bar = document.createElement('div');
        bar.style.position = 'absolute'
        bar.style.left = (left) + 'px'
        bar.style.top = (top) + 'px'
        bar.style.width = '0.533333rem'
        bar.style.height = '0.533333rem'
        bar.style.borderRadius = '50%'
        bar.style.backgroundColor = '#02b6fd'
        bar.style.transition = 'left .6s linear, top .6s cubic-bezier(0.5, -0.5, 1, 1)'

        document.body.appendChild(bar)
        // 添加動(dòng)畫屬性
        setTimeout(() => {
            let target = document.querySelector('.ele_car_icon')
            bar.style.left = (target.offsetLeft + target.offsetWidth / 2) + 'px'
            bar.style.top = (target.offsetTop) + 'px'
        }, 0);

        /**
         * 動(dòng)畫結(jié)束后,刪除自己
         */
        bar.ontransitionend = function () {
            this.remove()
        }
    }

方案二:使用transform + transition的方式實(shí)現(xiàn)

    function createBall02(x, y) {
        const bar = document.createElement('div')
        bar.style.position = 'absolute'
        bar.style.left = '0'
        bar.style.top = '0'
        bar.style.width = '0.533333rem'
        bar.style.height = '0.533333rem'
        bar.style.borderRadius = '50%'
        bar.style.backgroundColor = '#02b6fd'
        // transform
        bar.style.transform = 'translate(' + x + 'px,' + y + 'px)'
        bar.style.transition = 'transform .5s linear'


        document.body.appendChild(bar)
        // 添加動(dòng)畫屬性
        setTimeout(() => {
            let target = document.querySelector('.ele_car_icon')
            let targetX = (target.offsetLeft + target.offsetWidth / 2)
            let targetY = (target.offsetTop)
            bar.style.transform = 'translate(' + targetX + 'px,' + targetY + 'px)'
        }, 0);

        /**
         * 動(dòng)畫結(jié)束后月培,刪除自己
         */
        bar.ontransitionend = function () {
            this.remove()
        }

    }

最終效果

實(shí)現(xiàn)效果

其實(shí)還可以使用css的animate來實(shí)現(xiàn)嘁字,只不過由于需要?jiǎng)討B(tài)計(jì)算目標(biāo)位置的坐標(biāo),實(shí)現(xiàn)起來比較困難节视,所以我就沒有寫拳锚,如果目標(biāo)位置的坐標(biāo)值固定,那么可以通過animate改變top寻行、left或者translateX霍掺、translateY的值來實(shí)現(xiàn)這個(gè)效果,垂直方向的動(dòng)畫使用貝塞爾曲線的function-timing拌蜘。

參考資料

初識(shí)CSS拋物線動(dòng)畫

源碼

https://github.com/HyFun/CSS-Sample-ElemeAnimate

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末杆烁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子简卧,更是在濱河造成了極大的恐慌兔魂,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件举娩,死亡現(xiàn)場(chǎng)離奇詭異析校,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)铜涉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門智玻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人芙代,你說我怎么就攤上這事吊奢。” “怎么了纹烹?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵页滚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我铺呵,道長(zhǎng)裹驰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任陪蜻,我火速辦了婚禮邦马,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己滋将,他們只是感情好邻悬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著随闽,像睡著了一般父丰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掘宪,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天蛾扇,我揣著相機(jī)與錄音,去河邊找鬼魏滚。 笑死镀首,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鼠次。 我是一名探鬼主播更哄,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼腥寇!你這毒婦竟也來了成翩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤赦役,失蹤者是張志新(化名)和其女友劉穎麻敌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掂摔,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡术羔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乙漓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聂示。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖簇秒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情秀鞭,我是刑警寧澤趋观,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站锋边,受9級(jí)特大地震影響皱坛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜豆巨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一剩辟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦贩猎、人聲如沸熊户。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嚷堡。三九已至,卻和暖如春艇棕,著一層夾襖步出監(jiān)牢的瞬間蝌戒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工沼琉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留北苟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓打瘪,卻偏偏與公主長(zhǎng)得像友鼻,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瑟慈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355