elementPlus中的Autocomplete彈出層錯(cuò)位問(wèn)題解決分析
問(wèn)題描述
- 在餓了么UI中有一個(gè)Autocomplete搜索建議輸入框組件,一般這個(gè)組件是用于做遠(yuǎn)程關(guān)聯(lián)搜索的(類(lèi)似百度一下咱們輸入一個(gè)字,會(huì)提示出相關(guān)的選擇建議)
- 可是在某些情況下,這個(gè)Autocomplete組件的彈出層部分會(huì)出現(xiàn)錯(cuò)位的情況(Autocomplete組件 = 輸入框部分 + 彈出層部分)
- 就像下面的這個(gè)效果圖

對(duì)于這樣的錯(cuò)位問(wèn)題,筆者提供一個(gè)偏向于源頭的寫(xiě)法,能夠快速解決問(wèn)題
思路分析
- 我們知道,就前端而言,彈出層是一個(gè)非常基礎(chǔ)的效果功能
- 目前市面上我們所使用的開(kāi)源組件庫(kù)的,但凡涉及到彈出層功能的,比如
dropdown、Tooltip、Select的彈出層,基本上都是在Popper.js的基礎(chǔ)之上封裝的 - vue2版本中vue團(tuán)隊(duì)基于
Popper.js封裝了一個(gè)vue-popper組件 - 而餓了么團(tuán)隊(duì)又基于
vue-popper組件去封裝成各個(gè)帶有彈出層的組件功能 - PS:前端組件就是不停的封裝(套殼子)...
- 筆者也曾經(jīng)基于
vue-popper組件封裝了一個(gè)屬于自己的tooltip,大家有空了也可以點(diǎn)擊鏈接去瞅瞅
文章地址:http://www.fzitv.net/javascript/29319297k.htm
- 既然Autocomplete組件的彈出層出現(xiàn)了錯(cuò)位的問(wèn)題,那么本質(zhì)上來(lái)說(shuō),還是源頭上
Popper.js的問(wèn)題 - 因?yàn)閺棾鰧拥奈恢茫荘opper.js計(jì)算出來(lái)的
- 所以,當(dāng)彈出層位置錯(cuò)位的時(shí)候,我們只需要讓Popper.js重新計(jì)算一下位置就能恢復(fù)正常了
Popper.js的源代碼中有監(jiān)聽(tīng)resize事件,從而計(jì)算出對(duì)應(yīng)的彈出層位置
popper.js的源代碼
筆者去github上扒了一下popper.js的源代碼,簡(jiǎn)單截圖如下:

所以解決方案就有啦...
解決方案
- 當(dāng)我們的彈出層位置不對(duì)的時(shí)候
- 我們只需要再次派發(fā)一個(gè)resize事件即可
- 因?yàn)镻opper.js監(jiān)聽(tīng)了resize事件,會(huì)自動(dòng)計(jì)算的,相當(dāng)于鉤子函數(shù)
- 需要讓Popper.js重新計(jì)算一下就能“羅漢歸位”
- 如何去派發(fā)一個(gè)resize事件呢?很簡(jiǎn)單:
window.dispatchEvent(new Event('resize'))
window.dispatchEvent(new Event('resize'))
window.dispatchEvent(new Event('resize'))
比如以下代碼demo:
const querySearchAsync = (queryString, cb) => {
setTimeout(() => {
let apiData = [
{
value: '孫悟空',
id: '111'
},
{
value: '豬八戒',
id: '222'
},
{
value: '沙和尚',
id: '333'
},
]
cb(apiData)
// 解決el-autocomplete彈出建議層錯(cuò)位問(wèn)題(poper.js就是監(jiān)聽(tīng)resize事件重新計(jì)算dom位置的)
window.dispatchEvent(new Event('resize'))
}, 340);
}注意,要在合適的時(shí)機(jī)去派發(fā)resize事件哦
以上就是elementPlus中的Autocomplete彈出層錯(cuò)位問(wèn)題解決分析的詳細(xì)內(nèi)容,更多關(guān)于elementPlus Autocomplete彈出層錯(cuò)位的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue實(shí)現(xiàn)離線地圖+leaflet+高德瓦片的詳細(xì)代碼
這篇文章主要給大家介紹了關(guān)于vue實(shí)現(xiàn)離線地圖+leaflet+高德瓦片的詳細(xì)代碼,Vue Leaflet是一種結(jié)合了Vue框架和Leaflet庫(kù)的前端技術(shù),用于展示和操作天地圖,需要的朋友可以參考下2023-10-10
vue-cli如何修改打包項(xiàng)目結(jié)構(gòu)及前綴
這篇文章主要介紹了vue-cli如何修改打包項(xiàng)目結(jié)構(gòu)及前綴問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
vue實(shí)現(xiàn)自定義H5視頻播放器的方法步驟
這篇文章主要介紹了vue實(shí)現(xiàn)自定義H5視頻播放器的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
vite創(chuàng)建的項(xiàng)目如何實(shí)現(xiàn)動(dòng)態(tài)的獲取圖片
在Vite項(xiàng)目中動(dòng)態(tài)獲取圖片,可以創(chuàng)建一個(gè)函數(shù),返回`new URL()`的href,傳入圖片地址和`import.meta.url`,然后將該函數(shù)抽離為公共方法,在定義數(shù)據(jù)時(shí),去掉路徑即可使用2026-02-02

