1. 程式人生 > >element-ui的table元件在flex佈局下的寬高自適應

element-ui的table元件在flex佈局下的寬高自適應

分割線之前,是半年多前隨手記的,很亂。分割線後,是如今的歸納整理。

言簡意賅,長話短說。

需要的效果:element-ui的table元件在垂直和水平方向能適應不同大小的顯示區域,超出區域部分可實現滾動。進而強化對於控制元件自適應方面的理解。注:此處的顯示區域不等於螢幕,顯示區域大小=k * (螢幕解析度+遊覽器視窗)

應用場景將一塊flex橫向佈局下的子區域劃再分成兩個部分,垂直排列,上半部分固定高度,下半部分自動獲取剩餘顯示空間。table元件位於下半部分。

解決方案:1,仍舊使用flex佈局,將主軸方向設為垂直起點在上;2,table元件的高度採用由外部樣式控制,寬度設定成所在區域的寬度。

測試結果:變更遊覽器視窗大小顯示比例不失真,超出顯示區域部分,無論垂直還是水平都可滾動。

過程:

1,關於flex佈局:1)flex下的子控制元件在主軸方向上的尺寸是無效的。如:橫向排列,子控制元件的width屬性無效,子控制元件的尺寸受flex屬性影響。2)子控制元件在主軸方向上的尺寸可以被子子控制元件撐大。比如:橫向排列,子控制元件下的子子控制元件的width超出了子控制元件,則子控制元件會被撐大;3)非主軸方向上的尺寸不會被子子控制元件撐大。比如:橫向排列,子子控制元件的height超出子控制元件,子控制元件不會被撐大。4)flex下子控制元件為了自適應顯示區域,把width和height設定100%時,在子控制元件的外層包一層absolute,否則設定的100%會很離奇。100%的參照是很有意思的。以flex橫向排列時的width為例,我目前的理解是:子控制元件的width

屬性100% = 遞迴(佈局,父控制元件的實際大小及width屬性),就是說:a)position!=absolute時,子控制元件會依據父控制元件的width來確定100%,但是父控制元件如果沒有width屬性,則會向上遞迴。b)position==absolute時,width100%根據其參照父控制元件的實際大小來確定。上述兩點是經過驗證的,其實也很好驗證,下文的table獲取width時,就很好驗證了上述兩點。題外話:給子子控制元件設定成position:absolute,則可免除對子控制元件的影響。absolute除了提供參照外,還免除了子控制元件對父控制元件的影響。

2,table元件自適應:1)根據element-ui的文件table元件可設定高度也可受控於外部樣式。設定高度時,所設高度覆蓋外部樣式,但如果table處於flex佈局下,根據上述“關於flex佈局”第1)點,

所設高度自然會無效。也就實現了自適應高度。2)table在flex佈局下,height屬性無論是自設還是受控於外部樣式,都不起作用,實際height由flex確定。但是,height必須設定,否則會無法滾動。所以,table的height屬性應該是兼顧兩層含義:開啟table滾動以及確定table的高度。此時,height可以隨意填寫。3)table的width設定成100%即可,由於table所在區域整個flex橫向佈局下,width受最近一個帶有width屬性的父控制元件影響,並非時實際顯示區域的width大小。table的width與實際顯示不匹配則無法實現橫向滾動。因此,根據上述“關於flex佈局”第4)點,需要能動態獲得顯示區域的寬度,此時只需將顯示區域設定成absolute,然後將整個顯示區域置於flex橫向佈局下。此處無例項很難理解,但歸納一下就是:將區域A橫向flex,生成區域A-1,A-2,A-1內巢狀的子控制元件,怎麼自適應A變化帶來的A-1的width變化。

總結:緊抓3個知識點--1,flex佈局;2,屬性100%的繼承;3,element-ui的table元件使用。

最後,CSS佈局這塊的內容需要系統學習,目前的理解很多時基於例項驗證後自己推斷。

-------------------------------------------------人造分割線----------------------------------------------------

Appended at 20180811:

上文有太多的錯漏和無關的資訊

現簡化下:

目的:實現element-ui的table根據顯示區域大小的自適應。

1,table要適配顯示區域大小的變化,必須依賴滾動。(其實任何實際內容超出顯示區域的情況都需要滾動)
2,table的橫向縱向滾動都需要一個基本的前提條件--讓table知道顯示區域的大小。(這沒啥好說的)
3,所以,我們可以用彈性佈局,動態的改變table的顯示區域大小。
4,如何讓table準確知道當前顯示區域的動態實時大小,就只有靠100%。 

5,如何保證100%繼承的準確性,那就一定要明白,你定義的每一塊區域的100%繼承的是誰的。

其實,最容易出問題的地方,就是巢狀來巢狀去,自己都沒弄清楚100%屬性繼承的是誰的。

比如:

.A
    display: flex
    .A-1
        flex: 0 0 200px
    .A-2
        flex: 1
        .A-2-1
            width: 100%

以上寫法很坑爹。width: 100%繼承的who?

.A
    display: flex
    .A-1
        flex: 0 0 200px
    .A-2
        flex: 1
        position: relative
        .A-2-1
            position: absolute
            width: 100%

這樣寫,就清清楚楚。A-2-1的width: 100%是繼承自A-2的。A-2的position和A-2-1的position一個都不能少。

為什麼A-2還要定義position,不寫的話A-2-1繼承就亂了。

總結下(區域A橫向flex):

1,A-1&A-2的width屬性此處是無效,但是A-2-1的width屬性是有效的;

2,如果A-2-1不設定position: absolute的話,A-2可以被A-2-1的width撐大;(感覺父控制元件很多時候受子控制元件影響,子控制元件position: absolute可以徹底免除對父控制元件的影響?)

3,為什麼A-2-1要定義width: 100%。因為,flex彈性的是A-2,不是A-2-1。如果不定義width: 100%的話,A-2會隨A大小變化,但A-2-1不會,那就何來實現自適應一說。

4,所以,如果你的table在A-2的位置,那table的width會因為flex自適應,且設定width也不會有效。但是,如果table是巢狀在A-2-1中,那必須設定width: 100%,且繼承自A-2,才能實現width自適應。

5,說回element-ui,table的高度必須設定,否則無法滾動。即便你使用了縱向flex佈局,你也要設定table的高度。估計table的height屬性同時也是縱向滾動的開關。你甚至可以這樣設定:

height="數值無關緊要,但必須要設定"(我就是這麼寫的)

6,說回element-ui,table的寬度,貌似是繼承自父元素,只有width低於:100%才有效。就是,你要麼把table的width弄小點,要麼就讓它自己繼承去。

最最後:巢狀的層級一定要清晰,繼承一定要明確。

PS:CSS這塊內容還是很生疏,後續需要花精力去了解其最底層的佈局策略。