element-ui: 滾動頁面,為什麼date-picker不隨之移動?

先說結論:

DOM結構中,溢出(overflow: scroll/auto;)容器以下,el-date-picker的輸入框(動圖中焦點所處位置)以上,存在一個overflow/overflow-x/overflow-y是auto/scroll的容器

為了讓我們的fixed定位的控制項在el-dialog里可以指哪打哪,我把項目引用的element-ui版本從1.x升級到了2.x(原因見 CSS Transform對定位的影響)

升級之後帶來了一個問題:之前在el-dialog老老實實長到24px的控制項莫名其妙的長高了2px(這裡是另一個問題,下一篇再談),demo在即,就臨時給這些長高的控制項的父容器加了overflow-y:hidden;(同時心裡充滿了膈應),demo過後我偶然發現,el-date-picker出現了上邊動圖的情況。

首先,彈出的這個日期picker是fixed定位的,如果想要讓它能夠跟隨頁面滾動,實現原理就一定是:在溢出容器上綁定scroll事件,回調方法中計算輸入框相對窗口的offset,減去滾動offset(scrollTop,scrollLeft),作為picker的offset。

這其中的重點是:如何找到這個溢出容器。element-ui的方式是在彈出的picker生成的時候,在DOM樹種遞歸向上查找第一個overflow/overflow-x/overflow-y是auto/scroll的容器,在其上綁定scroll事件。

代碼片段如下:

簡單一調試,發現尼瑪我加了overflow-y: hidden的那個容器的overflow-x自動從visible變成auto了,所以scroll事件沒有綁定到我們看到的那個溢出容器上。去掉overflow-y之後,輸入框和picker就又形影不離了。

莫非overflow的x和y默認需要同時設置的?只設置其中一個,另一個就會賭氣變成auto?

所以這事兒一步一步發展的原因是:

1. element-ui 1.x 用了transform,讓我們的fixed控制項定位不準

2. 升級到2.x,控制項莫名其妙長高了2px

3. 臨時加上overflow-y: hidden導致picker不願跟隨input

下一篇就講講為啥2.x讓控制項長高了,想長高的(我)沒長高,不想長高的控制項瞎長高。。。

最後:希望大家不要因為我遇到的一點點問題覺得element-ui到處是坑


推薦閱讀:

合格前端系列第十一彈-揭秘組件庫一二事(中)
JS中的原型對象
2018最新web前端面試題
合格前端系列第十彈-揭秘組件庫一二事(上)

TAG:前端開發框架和庫 |