日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

FLIP,一種高端優雅但簡單易用的前端動畫思維

來源: 責編: 時間:2024-05-16 08:58:35 203觀看
導讀有一種能夠快速實現復雜動畫交互的動畫思維 FLIP,為了介紹這個動畫思維,我準備了三個案例。一、FLIPFLIP 是四個單詞的首字母,First、Last、Invert、Play,這四個單詞給我們提供了完成動畫的具體思路。First 表示元素初始

Kfc28資訊網——每日最新資訊28at.com

有一種能夠快速實現復雜動畫交互的動畫思維 FLIP,為了介紹這個動畫思維,我準備了三個案例Kfc28資訊網——每日最新資訊28at.com

一、FLIP

FLIP 是四個單詞的首字母,First、Last、Invert、Play,這四個單詞給我們提供了完成動畫的具體思路。Kfc28資訊網——每日最新資訊28at.com

First 表示元素初始時的具體信息,在 html 環境中,這個事情是比較容易就能做到的,我們可以利用 getBoundingClientRect 或者 getComputedStyle 來拿到元素的初始信息。Kfc28資訊網——每日最新資訊28at.com

Last 表示元素結束時的位置信息。此時我們可以直接改變元素的位置,把元素放到新的節點上去。這樣我們就可以直接使用同樣的方式拿到結束時的元素具體信息。Kfc28資訊網——每日最新資訊28at.com

Invert 表示倒置。雖然元素到了結束時的節點位置,但是視覺上我們并沒有看到,此時要設計讓元素動畫從 First 通過動畫的方式變換到 Last,剛好我們又記錄了動畫的開始和結束信息,因此我們可以利用自己熟悉的動畫方式來完成 Invert。Kfc28資訊網——每日最新資訊28at.com

Play 表示動畫開始執行。在代碼上通常 Invert 表示傳參,Play 表示具體的動畫執行。Kfc28資訊網——每日最新資訊28at.com

接下來我們使用三個案例來進一步學習這個動畫思想。Kfc28資訊網——每日最新資訊28at.com

二、案例一:元素 X 軸位置隨機變化

案例效果如圖所示。Kfc28資訊網——每日最新資訊28at.com

Kfc28資訊網——每日最新資訊28at.com

案例的 html 結構如下:Kfc28資訊網——每日最新資訊28at.com

<div id="container">  <div class="item">1</div>  <div class="item">2</div>  <div class="item">3</div>  <div class="item">4</div>  <div class="item">5</div></div><button id="sort">隨機排序</button>

先獲取兩個關鍵 DOM 對象。Kfc28資訊網——每日最新資訊28at.com

const container = document.getElementById('container')const sortBtn = document.getElementById('sort')

First,記錄元素初始位置信息。此時我們把開始的 X 位置信息保存在子節點對象上,我們也可以單獨另起一個數組來保存所有子節點的具體信息。Kfc28資訊網——每日最新資訊28at.com

// 記錄開始位置信息function record(container) {  const all = [...container.children]  all.forEach((item, i) => {    const rect = item.getBoundingClientRect()    item.startX = rect.left  })}

Last,直接改變元素的節點位置。因為改變之后,元素在新的節點上,那么我們這里就可以單獨快捷獲取元素改變之后的位置信息,所以可以封裝一個方法,只改變元素的節點位置信息,而在需要的時候獲取 Last 即可。Kfc28資訊網——每日最新資訊28at.com

當然也可以單獨在這一步把屬性位置信息保存起來。Kfc28資訊網——每日最新資訊28at.com

function change() {  const all = [...container.children]  const len = all.length  all.forEach((item, i) => {    const newIndex = Math.floor(Math.random() * len)    if (newIndex !== i) {      const nextDOM = item.nextElementSibling      container.insertBefore(item, all[newIndex])      container.insertBefore(all[newIndex], nextDOM)    }  })}

Invert 和 play 在代碼實現上往往會耦合在一起,Invert 表示參數傳入,play 表示動畫執行。因此我們可以最后再定義一個方法 play 表示動畫的執行。Kfc28資訊網——每日最新資訊28at.com

function play(container) {  const all = [...container.children]  const len = all.length  all.forEach((item, i) => {    const rect = item.getBoundingClientRect()    const currentX = rect.left    item.animate([      { transform: `translateX(${item.startX - currentX}px)` },      { transform: 'translateX(0px)' }    ], {duration: 600})  })}

這里我使用了一個 DOM 元素自帶的 animate 方法,來完成動畫的實現,該方法目前還是一個實驗性的 api,在 2022 年提出,目前最新版的 chrome 瀏覽器已經支持。Kfc28資訊網——每日最新資訊28at.com

該動畫接口使用起來也比較簡單,跟 keyframes 類似。Kfc28資訊網——每日最新資訊28at.com

animate(keyframes, options)

keyframes 表示關鍵幀數組,options 表示動畫持續時間,或者包含多個時間屬性,用于配置動畫函數或者 iterations、delay 等常見屬性,與 css 的動畫屬性基本保持一致。Kfc28資訊網——每日最新資訊28at.com

你也可以自己封裝一個類似的方法,或者使用成熟的第三方工具庫,能達到類似效果的方式也比較多。Kfc28資訊網——每日最新資訊28at.com

然后在點擊按鈕時,執行即可。Kfc28資訊網——每日最新資訊28at.com

sortBtn.onclick = () => {  record(container)  change()  play(container)}

三、案例二:多屬性變化

案例效果展示如圖:Kfc28資訊網——每日最新資訊28at.com

Kfc28資訊網——每日最新資訊28at.com

元素多屬性動畫并不會增加多少實現復雜度,只是多記錄幾個元素而已。這個案例包含了 x/y/backgroundColor 三個屬性。Kfc28資訊網——每日最新資訊28at.com

First,記錄初始信息。Kfc28資訊網——每日最新資訊28at.com

// 記錄開始位置信息function record(container) {  const all = [...container.children]  all.forEach((item, i) => {    const rect = item.getBoundingClientRect()    item.startX = rect.left    item.startY = rect.top    item.bgColor = getComputedStyle(item)['backgroundColor']  })}

Last,直接改變元素節點位置。Kfc28資訊網——每日最新資訊28at.com

因為改變節點位置之后,能夠輕易獲取到元素新的位置的具體屬性,所以這一步可以稱之為 Last。Kfc28資訊網——每日最新資訊28at.com

function change() {  const all = [...container.children]  const len = all.length  all.forEach((item, i) => {    const newIndex = Math.floor(Math.random() * len)    if (newIndex !== i) {      const nextDOM = item.nextElementSibling      container.insertBefore(item, all[newIndex])      container.insertBefore(all[newIndex], nextDOM)    }  })}

Invert and Play。Kfc28資訊網——每日最新資訊28at.com

function play(container) {  const all = [...container.children]  const len = all.length  all.forEach((item, i) => {    const rect = item.getBoundingClientRect()    const currentX = rect.left    const currentY = rect.top    const bgColor = getComputedStyle(item, false)["backgroundColor"]    item.animate([      { transform: `translate(${item.startX - currentX}px, ${item.startY - currentY}px)`, backgroundColor: item.bgColor },      { transform: 'translate(0px, 0px)', backgroundColor: bgColor }    ], {duration: 600})  })}

最后,點擊執行。Kfc28資訊網——每日最新資訊28at.com

sortBtn.onclick = () => {  record(container)  change()  play(container)}

四、案例三:共享元素動畫

上面那兩個案例,在實踐中基本上沒什么用,主要用于輔助學習。因此大家可能對于高級感和優雅感的體會不是那么深刻。Kfc28資訊網——每日最新資訊28at.com

第三個案例則以在實踐中,在前端很少有項目能夠做到的共享元素動畫,來為大家介紹這種動畫思想方案的厲害之處。Kfc28資訊網——每日最新資訊28at.com

Kfc28資訊網——每日最新資訊28at.com

共享元素動畫在前端是一個很少被提及的概念,但是在客戶端的開發中,卻已經運用非常廣泛。Kfc28資訊網——每日最新資訊28at.com

Kfc28資訊網——每日最新資訊28at.com

對于前端而言,這代表了未來頁面交互的主要發展方向。例如在小紅書的 web 端已經實現了該功能。Kfc28資訊網——每日最新資訊28at.com

在 FLIP 的指導思想下,該功能實現起來也并不復雜。Kfc28資訊網——每日最新資訊28at.com

First,記錄元素的初始信息。Kfc28資訊網——每日最新資訊28at.com

const all = [...list.children]// 記錄開始位置信息all.forEach((item, i) => {  const rect = item.getBoundingClientRect()  item.startX = rect.left  item.startY = rect.top  item.width = rect.width  item.height = rect.height})

當我們點擊元素時,此時有兩個元素位置信息在發生變化,一個是背景彈窗。他的變化比較簡單,就是透明度的變化,因此我們不用記錄他的信息。另外一個就是共享的元素 item,此時我們記錄了四個信息:startX、startY、width、height。Kfc28資訊網——每日最新資訊28at.com

Last,點擊元素之后,出現彈窗。此時我們把相關的兩個節點插入到正確的位置上即可。Kfc28資訊網——每日最新資訊28at.com

function change(element) {  current = element.cloneNode(true)  modal = document.createElement('div')  modal.id = 'modal'  modal.appendChild(current)  document.body.appendChild(modal)}

Invert and Play. 也是比較簡單,就是獲取新節點的位置,然后設置動畫即可。Kfc28資訊網——每日最新資訊28at.com

function play(preItem) {  modal.animate([    {backgroundColor: `rgba(0, 0, 0, 0)`},    {backgroundColor: `rgba(0, 0, 0, ${0.3})`}  ], {duration: 600})  const rect = current.getBoundingClientRect()  const currentX = rect.left  const currentY = rect.top  const width = rect.width  const height = rect.height  const x = preItem.startX - currentX - (width - preItem.width) / 2  const y = preItem.startY - currentY - (height - preItem.height) / 2  console.log(x, y)  current.animate([    {      transform: `translate(${x}px, ${y}px)`,      width: `${preItem.width}px`,      height: `${preItem.height}px`    },    {      transform: 'translate(0px, 0px)',      height: `${height}px`,      width: `${width}px`    }  ], {duration: 600})}

最后給每個元素添加點擊事件。Kfc28資訊網——每日最新資訊28at.com

all.forEach((item, i) => {  item.onclick = (event) => {    change(event.target)    play(event.target)  }})

彈窗上也需要新增一個點擊事件,用于執行彈窗消失的動畫。Kfc28資訊網——每日最新資訊28at.com

modal.onclick = () => {  const ani = modal.animate([    {backgroundColor: `rgba(0, 0, 0, ${0.3})`},    {backgroundColor: `rgba(0, 0, 0, 0)`}  ], {duration: 600})  const rect = current.getBoundingClientRect()  const currentX = rect.left  const currentY = rect.top  const width = rect.width  const height = rect.height  const x = element.startX - currentX - (width - element.width) / 2  const y = element.startY - currentY - 100  current.animate([    {      transform: 'translate(0px, 0px)',      height: `${height}px`,      width: `${width}px`    },    {      transform: `translate(${x}px, ${y}px)`,      width: `${element.width}px`,      height: `${element.height}px`    },  ], {duration: 600})  console.log(x, y)  ani.onfinish = () => {    modal.remove()  }}

并在運動結束之后,刪除彈窗節點。Kfc28資訊網——每日最新資訊28at.com

ani.onfinish = () => {  modal.remove()}

一個共享元素動畫,就這么簡單的實現了。Kfc28資訊網——每日最新資訊28at.com

五、共享元素動畫擴展思考

如果我們要結合路由切換轉場來實現共享元素動畫,其實實現原理也是一樣的,非常的簡單,我們只需要在路由切換時,把共享元素的初始位置信息記錄下來并作為參數傳遞給下一個頁面即可。Kfc28資訊網——每日最新資訊28at.com

也就是說,我們只需要把這里的兩個點擊事件,結合路由事件和參數傳遞,就能做到跟小紅書一樣的共享元素路由轉場效果。Kfc28資訊網——每日最新資訊28at.com

不過至于如何封裝讓代碼更加簡潔,本文就不再擴展啦,交給大家自己思考。Kfc28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-88310-0.htmlFLIP,一種高端優雅但簡單易用的前端動畫思維

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 詳解 PyTypeObject,Python 類型對象的載體

下一篇: Android:excludeFromRecents屬性使用分析

標簽:
  • 熱門焦點
  • 小米平板5 Pro 12.4簡評:多專多能 兼顧影音娛樂的大屏利器

    疫情帶來了網課,網課盤活了安卓平板,安卓平板市場雖然中途停滯了幾年,但好的一點就是停滯的這幾年行業又有了新的發展方向,例如超窄邊框、高刷新率、多攝鏡頭組合等,這就讓安卓
  • 2023 年的 Node.js 生態系統

    隨著技術的不斷演進和創新,Node.js 在 2023 年達到了一個新的高度。Node.js 擁有一個龐大的生態系統,可以幫助開發人員更快地實現復雜的應用。本文就來看看 Node.js 最新的生
  • 企業采用CRM系統的11個好處

    客戶關系管理(CRM)軟件可以為企業提供很多的好處,從客戶保留到提高生產力?! RM軟件用于企業收集客戶互動,以改善客戶體驗和滿意度?! RM軟件市場規模如今超過580
  • 一文掌握 Golang 模糊測試(Fuzz Testing)

    模糊測試(Fuzz Testing)模糊測試(Fuzz Testing)是通過向目標系統提供非預期的輸入并監視異常結果來發現軟件漏洞的方法??梢杂脕戆l現應用程序、操作系統和網絡協議等中的漏洞或
  • 阿里大調整

    來源:產品劉有媒體報道稱,近期淘寶天貓集團啟動了近年來最大的人力制度改革,涉及員工績效、層級體系等多個核心事項,目前已形成一個初步的&ldquo;征求意見版&rdquo;:1、取消P序列
  • 消息稱小米汽車開始篩選交付中心:需至少120個車位

    IT之家 7 月 7 日消息,日前,有微博簡介為“汽車行業從業者、長三角一體化擁護者”的微博用戶 @長三角行健者 發文表示,據經銷商集團反饋,小米汽車目前
  • 三星電子Q2營收60萬億韓元 存儲業務營收同比仍下滑超過50%

    7月27日消息,據外媒報道,從三星電子所發布的財報來看,他們主要利潤來源的存儲芯片業務在今年二季度仍不樂觀,營收同比仍在大幅下滑,所在的設備解決方案
  • iQOO Neo8系列今日官宣:首發天璣9200+ 全球安卓最強芯!

    在昨日舉行的的聯發科新一代旗艦芯片天璣9200+的發布會上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品將全球首發搭載這款當前性能最強大的移動平臺
  • onebot M24巧系列一體機采用輕薄機身設計,現已在各平臺開售

    onebot M24 巧系列一體機目前已在線上線下各平臺同步開售。onebot M24 巧系列采用一體化輕薄機身設計,最薄處為 10.15mm,擁有寶石紅、午夜藍、石墨綠、雅致
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲一区二区三区精品在线观看| 欧美午夜精彩| 国产欧美va欧美不卡在线| 在线成人av.com| 亚洲国产精品精华液网站| 亚洲精品综合| 亚洲欧美精品在线| 久久久久久免费| 欧美精品激情| 国产伦精品一区二区三区四区免费| 国内外成人免费激情在线视频网站| 在线不卡视频| 亚洲素人在线| 另类春色校园亚洲| 国产精品成人观看视频国产奇米| 狠狠入ady亚洲精品| 亚洲精品乱码久久久久久蜜桃91| 亚洲欧美精品中文字幕在线| 久久亚洲高清| 国产精品高清在线| 亚洲国产精品一区在线观看不卡| 亚洲一级免费视频| 狂野欧美激情性xxxx| 欧美日韩在线视频观看| 黑人巨大精品欧美黑白配亚洲| 99re6这里只有精品| 久久久久国产一区二区| 欧美日韩一卡二卡| 精品不卡一区二区三区| 亚洲一区三区在线观看| 欧美大片91| 国产亚洲毛片| 亚洲午夜精品| 欧美国产亚洲视频| 国产亚洲一级| 亚洲午夜视频在线观看| 欧美不卡在线| 国产一区二区三区久久久久久久久| 一区二区av在线| 免费观看成人网| 国产私拍一区| 亚洲视频视频在线| 欧美国产日本在线| 一区精品久久| 翔田千里一区二区| 欧美视频一区二| 亚洲激情一区| 老色鬼精品视频在线观看播放| 国产精品嫩草99a| 一本综合久久| 欧美激情一区二区三区| 激情久久久久| 久久精品亚洲| 国产日韩欧美精品一区| 亚洲午夜久久久久久尤物 | 精品福利免费观看| 欧美亚韩一区| 久久精品国产成人| 欧美性久久久| 9久re热视频在线精品| 免费在线成人| 国内综合精品午夜久久资源| 亚洲欧美日韩综合国产aⅴ| 欧美日韩亚洲精品内裤| 亚洲日韩欧美一区二区在线| 老司机免费视频一区二区| 国产一区二区三区高清在线观看| 亚洲自拍偷拍麻豆| 欧美性事在线| 一本一本久久a久久精品综合妖精| 欧美成人官网二区| 亚洲国产精品va在线观看黑人| 久久婷婷久久| 伊人久久婷婷| 裸体歌舞表演一区二区| 一区二区视频免费完整版观看| 西瓜成人精品人成网站| 国产精品视频专区| 午夜电影亚洲| 国产美女精品免费电影| 午夜一区二区三区不卡视频| 国产精品一卡二卡| 午夜免费日韩视频| 国产欧美一区视频| 久久精品人人爽| 好看的亚洲午夜视频在线| 久久久久久999| 在线日韩电影| 欧美电影在线播放| 亚洲免费av电影| 欧美日本一区二区高清播放视频| 日韩一二三在线视频播| 欧美午夜视频网站| 亚洲欧美激情精品一区二区| 国产日产欧美一区| 久久久99久久精品女同性| 在线精品视频在线观看高清| 免费欧美在线视频| 亚洲美女少妇无套啪啪呻吟| 欧美午夜电影在线| 欧美一级播放| 亚洲国产精品黑人久久久| 欧美激情按摩| 亚洲一区二区三区777| 国产日韩欧美在线看| 久久全国免费视频| 亚洲精品美女在线观看播放| 欧美三级在线播放| 午夜精品久久久久久久白皮肤 | 国内伊人久久久久久网站视频| 久久精品国产一区二区三区| 伊人久久综合97精品| 欧美高清日韩| 亚洲亚洲精品在线观看| 国产午夜精品在线观看| 免费看成人av| 亚洲网站视频福利| 国产日韩在线一区| 蜜臀av性久久久久蜜臀aⅴ| 日韩午夜在线电影| 国产欧美精品| 免费不卡在线观看av| 亚洲免费成人av电影| 国产精品久久久久aaaa九色| 久久精品视频导航| 亚洲精品一区二区在线| 国产精品丝袜白浆摸在线| 久久资源在线| 亚洲性色视频| 一色屋精品视频免费看| 国产精品mv在线观看| 久久婷婷麻豆| 亚洲愉拍自拍另类高清精品| 亚洲激情另类| 欧美在现视频| 日韩天天综合| 国语自产在线不卡| 欧美日韩一级黄| 久久免费黄色| 亚洲伊人第一页| 91久久国产自产拍夜夜嗨| 国产精品一区二区你懂的| 欧美成人一品| 欧美一区二区高清在线观看| 亚洲人体1000| 国内精品久久久久久影视8 | 亚洲欧美在线网| 亚洲国产另类精品专区| 国产精品香蕉在线观看| 欧美成人一区二区三区片免费| 亚洲影视在线| 亚洲欧洲精品一区| 国产一二精品视频| 欧美日韩亚洲视频| 免费久久99精品国产自在现线| 亚洲欧美卡通另类91av| 亚洲美女在线看| 黄色一区二区三区| 国产精品蜜臀在线观看| 欧美黄色aaaa| 久久久综合网站| 亚洲一区二区三区涩| 亚洲三级观看| 在线成人亚洲| 国产亚洲美州欧州综合国| 欧美视频中文字幕| 欧美激情国产精品| 久久影院午夜论| 欧美一区午夜视频在线观看| 亚洲视频1区| 日韩视频免费看| 亚洲国产精品999| 伊人成人开心激情综合网| 国产麻豆一精品一av一免费| 欧美午夜电影完整版| 欧美日韩亚洲精品内裤| 欧美激情亚洲| 欧美成人四级电影| 久久综合999| 久久久噜久噜久久综合| 欧美一区二区三区在线视频 | 老司机67194精品线观看| 久久av红桃一区二区小说| 亚洲欧美国产高清| 亚洲视频导航| 一区二区三区久久网| 亚洲日本中文| 91久久中文| 亚洲欧洲精品成人久久奇米网| 一区二区在线观看av| 国产自产精品| 国产综合色一区二区三区| 国产视频综合在线| 国产日韩精品久久| 国产一区二区| 黄色成人免费观看| 永久555www成人免费| 激情另类综合| 在线观看国产欧美| 亚洲大胆人体视频| 亚洲国产精品久久人人爱蜜臀| 一区免费观看| 国产精品视频xxx| 国产精品日韩欧美一区|