現(xiàn)側(cè)滑導(dǎo)航動畫(附核心代碼解析))
深入Sidr源碼CSS3 transitions如何平滑實(shí)現(xiàn)側(cè)滑導(dǎo)航動畫附核心代碼解析【免費(fèi)下載鏈接】sidrSidr is a jQuery plugin for creating side menus and the easiest way for doing your menu responsive.項(xiàng)目地址: https://gitcode.com/gh_mirrors/si/sidrSidr是一個用 CSS3 transitions 驅(qū)動的 jQuery 側(cè)滑菜單插件也是實(shí)現(xiàn)響應(yīng)式側(cè)邊導(dǎo)航最輕量的方案之一。它不用 JS 逐幀計(jì)算位置而是把transition屬性注入到菜單元素上再配合transitionend事件管理開合狀態(tài)——這正是側(cè)滑動畫絲滑的關(guān)鍵。本文帶你從源碼視角拆解這套機(jī)制看完你就能在任何項(xiàng)目里復(fù)刻同樣的平滑側(cè)滑效果。一、動畫的起點(diǎn)菜單其實(shí)藏在屏幕外側(cè)滑導(dǎo)航滑的感覺并不是 JS 移動出來的而是 CSS 擺好的。看基礎(chǔ)樣式 sidr.bare.css.sidr { position: fixed; top: 0; height: 100%; width: var(--sidrSidebarWidth); /* 260px定義在 variables.css */ } .sidr-left { left: -var(--sidrSidebarWidth); } /* 藏在左側(cè)屏幕外 */ .sidr-right { right: -var(--sidrSidebarWidth); }菜單寬度由 CSS 變量--sidrSidebarWidth: 260px統(tǒng)一控制見 variables.css。初始時left為負(fù)值菜單完整位于視口之外——只要把left改回0再聲明一個transition瀏覽器就會自動補(bǔ)間出滑入動畫。這就是整個動畫的全部原理。二、核心一行用 JS 動態(tài)注入 transition打開 menu.js 的init()方法找到最關(guān)鍵的一行this.style(dom.transitions.cssProperty, this.side (this.speed / 1000) s this.timing)拆解后等價(jià)于menu.style.transition left 0.2s easethis.side默認(rèn)left由side: left | right配置this.speed / 1000把毫秒轉(zhuǎn)成秒默認(rèn) 200msthis.timing緩動函數(shù)默認(rèn)ease這三個參數(shù)都能在 default.options.js 里找到也就是說動畫時長、方向、緩動曲線全部開放給用戶配置但注入動作只發(fā)生在初始化時一次。dom.transitions是什么它不是一個常量而是一次特性探測見 dom.js先在body.style上檢測標(biāo)準(zhǔn)屬性transition是否存在若不存在依次嘗試moz / webkit / o / ms廠商前綴輸出{ cssProperty, supported, event }其中event會對應(yīng)成transitionend或webkitTransitionEnd。這樣老版 Safari 等環(huán)境也能拿到正確的屬性名和事件名是兼容層里最優(yōu)雅的一段代碼。三、打開動畫改一個值 監(jiān)聽一個事件打開邏輯在 menu.js 的openMenu()openMenu (callback) { this.style(this.side, 0) // left: 0 → 觸發(fā) CSS transition this.temporalOpenMenuCallback () { self.onOpenMenu(callback) } this.bind(dom.transitions.event, this.temporalOpenMenuCallback) }流程非常清晰步驟動作說明1style(left, 0)從-260px變到0瀏覽器自動補(bǔ)間 200ms2綁定transitionend動畫結(jié)束瞬間執(zhí)行回調(diào)3onOpenMenu()解綁事件、打上sidr-open類、更新狀態(tài)、觸發(fā)onOpenEnd關(guān)閉則是對稱操作closeMenu()把left置空讓 CSS 落回-260px再等transitionend后在 onCloseMenu() 里清理樣式和sidr-open類。 用transitionend而不是setTimeout判斷動畫結(jié)束是保證回調(diào)時機(jī)精確的關(guān)鍵——無論用戶把 speed 改成多長回調(diào)都嚴(yán)格落在動畫終點(diǎn)不會出現(xiàn)動畫沒滑完先執(zhí)行后續(xù)邏輯的錯位。四、正文為何跟著平移displace 機(jī)制displace: true時正文會隨菜單推開而不是被菜單遮蓋這個效果由 body.js 實(shí)現(xiàn)open () { this.style({ width: this.offsetWidth() px, position: absolute }) this.style(transitions.cssProperty, this.side 0.2s ease) setTimeout(() this.style(this.side, this.menuWidth px), 1) }三步連招固定 body 寬度 position: absolute防止重排閃動給 body 也注入同樣的transitionsetTimeout(..., 1)延遲 1ms 再設(shè)置left: 260px——必須讓瀏覽器先渲染出初始狀態(tài)才能產(chǎn)生過渡。這是手寫 CSS3 動畫時最容易踩的坑。動畫過程中 body 會帶上sidr-animating類見 body.js 第4行關(guān)閉結(jié)束時在onClose()中統(tǒng)一還原所有樣式。五、防抖設(shè)計(jì)moving 鎖保證動畫不重疊status.js 維護(hù)了一個極簡的全局狀態(tài)機(jī)var sidrStatus { moving: false, opened: false }open()/close()開頭都先檢查status.moving動畫進(jìn)行中直接忽略請求打開 A 菜單時若 B 還開著會先close()B、在onCloseEnd回調(diào)里再open()Amenu.js。這保證了同一時刻最多只有一個側(cè)滑動畫在跑狀態(tài)不會錯亂。六、上手速查4 個控制動畫的參數(shù)參數(shù)默認(rèn)值作用speed200動畫時長mstimingease緩動函數(shù)可傳任意 CSS timing 函數(shù)sideleft菜單從左側(cè)還是右側(cè)滑出displacetrue正文平移 or 菜單遮蓋完整的調(diào)用入口在 jquery.fnSidr.js 與 runner.js暴露open / close / toggle / reload四個方法配合onOpen / onOpenEnd / onClose / onCloseEnd四個回調(diào)覆蓋動畫全生命周期。更多演示可參考 examples/ 目錄下的示例頁面??偨Y(jié)Sidr 的側(cè)滑導(dǎo)航動畫堪稱 CSS3 transitions 的最小化最佳實(shí)踐CSS 定位初始態(tài)負(fù)偏移把菜單藏在屏幕外JS 只注入一次 transition方向 時長 緩動全部可配置改屬性值觸發(fā)過渡打開設(shè)left: 0關(guān)閉置空回退transitionend 驅(qū)動狀態(tài)機(jī)回調(diào)精確落在動畫終點(diǎn)moving鎖防重入1ms 技巧保證初始狀態(tài)被渲染后才啟動過渡避免過渡失效。掌握這套模式后無論是做側(cè)滑導(dǎo)航、抽屜彈窗還是任何位移動畫你都能脫離 jQuery.animate 逐幀插值寫出更流暢、性能更好的過渡動畫?!久赓M(fèi)下載鏈接】sidrSidr is a jQuery plugin for creating side menus and the easiest way for doing your menu responsive.項(xiàng)目地址: https://gitcode.com/gh_mirrors/si/sidr創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考