關於Element中popup的z-index問題


1.前言

我們知道Element中新的彈出框的展示,總是覆蓋着上一個彈出框。實現覆蓋功能需要保證新的彈出框的z-index要比舊的彈出框的z-index值相等或着更高,

為達到這個目的element為所有的彈出框(所有下拉框、提示框、Dialog對話框等等)直接或間接的使用到一個js組件element-ui/src/utils/vue-popper

而這個vue-popper又使用了另一個組件element-ui/src/utils/popup/popup-manager.js

 

PopupManager

PopupManager中有一個zIndex屬性初始值為2000,所有的彈出框的z-index其實都是從這個PopupManager.zIndex中獲取的,當要展示一個新的彈出框時,

組件便會通過 PopupManager.nextZIndex()  獲取最新的PopupManager.zIndex,nextZIndex返回PopupManager.zIndex++,這樣就保證了新的彈出框總是比舊的彈出框z-index大,

省去自己一個個設置的麻煩,也減少問題的出現。

2.遇到的問題

使用原生element組件彈窗沒什么問題,但是因為項目中需要改動日期組件的,所以復制了一份element日期組件源碼做改動

按照項目要求的邏輯改完,在項目中運行一切正常,但是后面有客戶提出彈窗中日期選擇面板被覆蓋的問題,需要點擊很多次才會正常展示,通過調試發現日期組件的z-index 和其他彈窗的z-index 是分開計數的,所以其他彈窗的z-index大於日期組件的z-index,就會出現被覆蓋的問題,這只能說明日期和其他組件獲取z-index的不是同一個PopupManager
查看了先data-picker下的picker.vue其中引用vue-popper

import Popper from 'element-ui/lib/utils/vue-popper';

沒毛病,但是其實毛病就出在這引用路徑上的src,src就是source源的意思,源碼中互相引用沒問題,但是我們在項目中使用element組件的使用,並不是來自源碼,而是來自源碼編譯出來的依賴庫,是npm模塊中lib目錄下的文件。所以我們的自定義組件用了一個新的PopupManager對象跟原生element組件不同的PopupManager,導致zIndex不同步,展示錯誤。

3.解決

修改picker.vue,將原先
import Popper from 'element-ui/src/utils/vue-popper'
修改為
import Popper from 'element-ui/lib/utils/vue-popper'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM