直播系統中網頁類似app頁面切換動畫的實現方式
documentTransition
瀏覽器開啟該功能API
chrome://flags/#document-transition
'documentTransition' in document
如何理解該API
<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>rootTransition示例</title> </head> <style> .list { height: 100vh; } .details { height: 100vh; background-color: aquamarine; } .hide { display: none; } </style> <body> <div class="list"> 列表頁 <button id="btn">點選去詳情頁</button> </div> <div class="details hide">詳情頁</div> <script> const btn = document.querySelector('#btn') const details = document.querySelector('.details') const list = document.querySelector('.list') btn.addEventListener('click', () => { navigateToDetailsPage() }) async function navigateToDetailsPage() { await document.documentTransition.prepare({ rootTransition: "cover-left", }); details.classList.remove('hide') list.classList.add('hide') document.documentTransition.start(); } </script> </body></html>
// 使用者點選按鈕切換頁面時執行async function navigateToSettingsPage() { // 捕捉當前頁面狀態,進行動畫準備 await document.documentTransition.prepare({ rootTransition: 'cover-left', // “頁面”切換效果 }); // 執行更新DOM操作,顯示下一頁的內容 updateDOMForNextPage(); // 呼叫start開始執行動畫 await document.documentTransition.start(); // 動畫結束}
async function navigateToSettingsPage() { await document.documentTransition.prepare({ rootTransition: 'cover-up', sharedElements: [element1, element2, element3], }); // updateDOM await document.documentTransition.start({ sharedElements: [element1, element4, element5], });}
完整程式碼:
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>rootTransition示例</title></head><style>body{margin:0}.flex-center{display:flex;align-items:center;justify-content:center}.list{height:100vh}.details{height:100vh}.hide{display:none!important}.card{display:flex;align-items:center;margin:0 20px;box-shadow:0 0 50px #ccc;border-radius:12px;overflow:hidden}.card .desc{font-size:18px;color:#333;font-weight:bold;margin-left:20px}.details-desc{font-size:22px;color:limegreen}.list{display:flex;flex-direction:column;justify-content:center}.button-wrap{margin-top:20px;text-align:center}.back-btn{display:inline-block;width:100px;height:40px}.details-cover{display:block;width:100%}.details-desc{position:absolute;right:20px;top:20px}.cover,.details-cover,.desc,.details-desc{contain:paint}</style><body> <div class="list"> <div class="card"> <img class="cover" src="http://p1-q.mafengwo.net/s18/M00/52/27/CoUBYGDMNO-AOlK4AAVHKFDW8_Y808.jpg?imageMogr2%2Fthumbnail%2F%21220x150r%2Fstrip%2Fgravity%2FCenter%2Fcrop%2F%21220x150%2Fquality%2F90" /> <span class="desc">人生海海</span> </div> <div class="button-wrap"> <button id="btn">點選去詳情頁</button> </div> </div> <div class="details hide"> <div> <div style="position: relative;"> <img class="details-cover" src="http://p1-q.mafengwo.net/s18/M00/52/27/CoUBYGDMNO-AOlK4AAVHKFDW8_Y808.jpg?imageMogr2%2Fthumbnail%2F%21220x150r%2Fstrip%2Fgravity%2FCenter%2Fcrop%2F%21220x150%2Fquality%2F90" /> <div class="details-desc">人生海海</div> </div> <div class="button-wrap"> <button class="back-btn">返回</button> </div> </div> </div> <script> const btn = document.querySelector('#btn') const details = document.querySelector('.details') const list = document.querySelector('.list') const backBtn = document.querySelector('.back-btn') const cover = document.querySelector('.cover') const desc = document.querySelector('.desc') const detailsCover = document.querySelector('.details-cover') const detailsDesc = document.querySelector('.details-desc') btn.addEventListener('click', () => { navigateToDetailsPage() }, false) backBtn.addEventListener('click', () => { showList() }, false) async function navigateToDetailsPage() { await document.documentTransition.prepare({ rootTransition: "cover-up", sharedElements: [ cover, desc ] }); details.classList.remove('hide') list.classList.add('hide') document.documentTransition.start({ sharedElements: [ detailsCover, detailsDesc ] }); } async function showList() { await document.documentTransition.prepare({ rootTransition: "implode", sharedElements: [ detailsCover, detailsDesc ] }); details.classList.add("hide"); list.classList.remove("hide"); await document.documentTransition.start({ sharedElements: [ cover, desc ] }); } </script></body></html>
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69996194/viewspace-2795231/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- WPF手動實現切換頁面
- CSS實現頁面切換時的滑動效果CSS
- 手機直播原始碼,使用ViewPager2實現頁面滑動切換原始碼Viewpager
- 直播系統app原始碼,Android studio 實現app登入註冊頁面APP原始碼Android
- app直播原始碼,自定義兩種Activity切換動畫實現APP原始碼動畫
- vue路由切換滑動效果 vue頁面跳轉互動 vue實現動畫跳轉Vue路由動畫
- 直播app原始碼,系統首頁或任意頁面下拉自動重新整理APP原始碼
- 類似抖音直播間滑動載入頁
- Flutter 實現類似美團外賣店鋪頁面滑動效果Flutter
- app直播原始碼,平臺登入頁面實現和修改密碼頁面實現APP原始碼密碼
- 直播商城原始碼,實現左右聯動商品分類頁面原始碼
- 直播系統app原始碼,簡潔好看的登入頁面APP原始碼
- 直播系統原始碼,啟動APP時判斷登入狀態,引導頁、登入頁、首頁的跳轉方式原始碼APP
- 如何在 web 頁面中實現類似 excel 固定表頭 / 標題行的效果?WebExcel
- Blazor如何實現類似於微信的Tab切換?Blazor
- 用CSS實現Tab頁切換效果CSS
- Vue 全家桶仿原生App切換效果和頁面快取實踐VueAPP快取
- 直播系統搭建,簡單實現Android應用的啟動頁Android
- Node.js 實現類似於.php,.jsp的伺服器頁面技術,自動路由Node.jsPHP伺服器路由
- 直播賣貨小程式原始碼中,商品分類頁面是如何實現的原始碼
- iOS動畫系列之七:實現類似Twitter的啟動動畫iOS動畫
- 利用ViewPager和Fragment實現頁卡切換ViewpagerFragment
- 網頁柵格系統:蛋糕的切法網頁
- 類似dreamweaver在VSCode實現網頁製作的靜態CMS:Front MatterVSCode網頁
- Threejs實現滴滴官網首頁地球動畫JS動畫
- 提升現代web app中的頁面效能WebAPP
- 直播軟體原始碼,實現頁面滾動到可視區顯示動畫效果原始碼動畫
- anime.js 網頁動畫庫,輕鬆實現網頁數字滾動效果JS網頁動畫
- 直播平臺搭建,切換頁面 捲軸預設最頂端
- flutter實戰6:TAB頁面切換免重繪Flutter
- Flutter 實現底部擴散模糊動畫(二)頁面互動Flutter動畫
- iOS 封裝頁數控制,點選NavigationTabBar切換頁面iOS封裝NavigationtabBar
- python四種方式解析網頁獲取頁面中的連結Python網頁
- flutter Lottie 動畫引導頁的實現Flutter動畫
- 類似微信首頁彈性滾動和慣性滾動效果的實現——OverScroll
- 影片直播原始碼,AndroidStudio登入頁面的切換原始碼Android
- 直播平臺製作,登入頁面的切換
- Android——Activity切換炫酷動畫實現Android動畫