使用vue指令實現(xiàn)吸頂效果
更新時間:2023年11月17日 11:56:49 作者:爛橘子妙用
要想實現(xiàn)一個吸頂效果不是很難,網(wǎng)絡(luò)上有很多教程,其中有一種就是通過fiexd加top來實現(xiàn),今天突然就想做一個吸頂效果,因為最近都在用vue,所以想用vue來做一個吸頂效果的案例,感興趣的朋友可以參考下
實現(xiàn)思路
- 獲取當(dāng)前dom節(jié)點相對offsetParent的offsetTop,將這個offsetTop保存起來(防止當(dāng)前dom的position為fixed時導(dǎo)致offsetTop重置為0)。
- 監(jiān)聽頁面滑動距離,當(dāng)滑動距離-offsetTop>0的時候,當(dāng)前dom節(jié)點就吸頂,反之恢復(fù)之前狀態(tài)。
實現(xiàn)代碼
話不多說上代碼:
export default { stick: { bind: (el, binding, vnode) => { let oldOffsetTop = null; // 保存當(dāng)前元素的offsetTop,防止吸頂后offsetTop重置為0 addEventListener('scroll', e => { const scrollTop = window.pageYoffset || document.documentElement.scrollTop || document.body.scrollTop// 滾動距離 const { offsetTop } = el // 元素距離offsetParent的距離 if (!oldOffsetTop) oldOffsetTop = offsetTop if (scrollTop - oldOffsetTop > 0) { el.style.position = 'fixed' if (binding.value) { el.style.top = binding.value + 'px' } else { el.style.top = '0px' } } else { if (el.style.position === 'fixed') { el.style.position = 'static' } } }) } } }
上述代碼實現(xiàn)了一個吸頂效果的vue指令,最后只需要在main.js文件中將這個指令注冊即可使用。
main.js文件中加入
import directive from './common/directive' for (const key in directive) { Vue.directive(key, directive[key]) }
使用方式:
<li class="stick" v-stick>吸頂效果指令</li>
或者加入偏移量
<li class="stick" v-stick="100">吸頂效果指令</li>
<template> <div id="app"> <!-- <starrySky /> --> <div class="p"></div> <ul> <li>1</li> <li>1</li> <li>1</li> <li>1</li> <li>1</li> <li>1</li> <li>1</li> <li>1</li> <li>1</li> <li>1</li> <li>1222222</li> <li class="stick" v-stick>吸頂效果指令</li> <li>12222222</li> <li>1</li> <li>1</li> <li>1</li> <li>1</li> <li>1</li> <li>1</li> <li>1</li> </ul> </div> </template> <script> export default { components: { } } </script> <style> #app { } .p { height: 100vh; } ul { } li{ padding: 30px; } </style>
到此這篇關(guān)于使用vue指令實現(xiàn)吸頂效果的文章就介紹到這了,更多相關(guān)vue指令實現(xiàn)吸頂內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue webpack build資源相對路徑的問題及解決方法
這篇文章主要介紹了vue webpack build資源相對路徑的問題,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06