Flex 布局在IE瀏覽器下的糟糕表現

2022-07-20 14:39:14 字數 4058 閱讀 4340

flex 容器如果設定豎排,並且垂直居中,flex子專案的文字會溢位容器。解決辦法是給子專案設定乙個 max-width:100%。edge修復了這個bug。

下面這段**,來動手看下在ie10、11下的表現。

<

style

>

.flexcontainer

.flexitem

style

>

<

script

src="js/jquery-1.9.1.min.js"

>

script

>

head

>

<

body

>

<

div

class

="flexcontainer"

>

<

div

class

="flexitem"

>

the contents inside of this box are overflowing their container.

div>

div>

body

>

在ie11下預覽,如圖:

經過試驗發現,就算不設定 flex-direction:column, 這段文字依舊義無反顧地溢位,而不會像在其他瀏覽器下那樣,自動換行。比如chrome瀏覽器:

給子專案設定 max-width: 100%,並不會對其他瀏覽器造成額外的影響。

為什麼會這樣?原來和 flex-shrink 的預設值有關係。ie預設為 0,既空間不足,專案不縮小。

但是如果設定了 flex-shrink 為 1 呢,ie 依舊固執地不縮小這個專案,原因在於容器同時設定了 flex-direction:column 和 align-items:center。

原來是這倆屬性在ie10不能並存。只要取消其中乙個,並把flex-shrink設定為1,該溢位問題就可以得到解決。

簡寫的flex屬性,第三個引數 flex-basis 的值如果不寫單位,在ie10,11下會該 flex 被忽略。比如 flex: 0 1 0%; 這個百分號不能省略。

edge修復了這個bug。

也可以寫成0px,但是推薦用0%。因為有些css壓縮工具會把 0px 轉換成 0,而不會對 0% 下手轉換。

豎排彈性容器下,如果子項寬度大於容器寬度,子項並不會隨著容器保持寬高比例。

解決辦法是給這個子項再包裹乙個容器,這樣子項就不再是乙個伸縮專案,尺寸上就可以正常縮放。

<

style

>

*/.flexcontainer

.flexitem

img

style

>

head

>

<

body

>

<

div

class

="flexcontainer"

>

<

div

class

="flexitem"

>

<

img

src=""

>

div>

div>

body

>

比如這個寬高為800*200,flex容器寬度300。給加乙個容器,正常縮放。小聲的說,這個問題貌似chrome也有呢...

新的規範更改了flex的預設值,而ie10,11依舊沿用舊的預設語法。如圖:

declaration

what it should mean

what it means in ie 10

(no flex declaration)

flex: 0 1 auto

flex: 0 0 auto

flex: 1

flex: 1 1 0%

flex: 1 0 0px

flex: auto

flex: 1 1 auto

flex: 1 0 auto

flex: initial

flex: 0 1 auto

flex: 0 0 auto

flex-basis如果有乙個明確的值,既除了auto以外的值,那麼該專案就相當於有乙個明確的寬度/高度,佔據固定空間。

在ie10/11下,盒子內容的寬度是 flex-basis 設定的具體的寬度,它會無視我們設定的 

box-sizing:border-box;

如果 flex-basis 值是100%,元素就會溢位容器。比如看這段**在ie下的表現:

<

style

>

.flexcontainer

.flexitem

style

>

head

>

<

body

>

<

div

class

="flexcontainer"

>

<

div

class

="flexitem"

>item with padding and border

div>

div>

body

>

在ie11的效果如下:

這個bug在edge已經修復。但是基於ie10和11的廣大使用者群,還是得想辦法解決。解決辦法有兩種:

1. flex-basis 設定為 auto,不給它設定具體寬度,然後再給這個元素加乙個width:100%。

2. 給子項再包裹乙個容器,把這個容器當成flex容器的子項,在這個容器上設定flex: 0 0 100%。

ie10 、11,不支援 flex 第三個引數flex-basis 的值為 calc()。如圖:

ie11下直接報錯,單獨寫 flex-basis 則可以識別。

而在ie10下,無論簡寫不簡寫,都無法識別這個值。

解決辦法:

1.  針對ie10和ie11:

.flexitem
2. 如果是ie 11,不採用flex簡寫即可。

.flexitem
ie10、11: 內斂元素不能作為彈性伸縮專案,包括:before::after 這些偽類元素。ie11修復了這個bug,但是:before::after 仍然不能作為伸縮彈性專案。解決辦法是給內聯元素加個display: block; 即可。

flex: 0 0 100%!important;
給flex簡寫加 !important,在ie10,只對前兩個引數有效,第三個引數無效。這個bug在ie11修復。而在ie10,再單獨寫上flex-bsis即可:

.flexitemimportantoverride
實際專案應用中的補充:在ie10,justify-content 對子專案的span不起作用。這時候把span設定為 display:block; 即可。

在Ubuntu 下快速安裝IE瀏覽器

絕大多數時間我都是用 firefox 但是 ie 也有 ie 的用處,有不少網頁非 ie 不可,尤其是中國這些銀行的網上銀行的網頁,用 firefox 都不太容易對付,不如 ie 來的方便。浦東發展銀行的倒是支援 firefox 可惜我還沒有辦浦發銀行的銀行卡。在 linux 下執行 ie,無非是用...

ajax方法在IE瀏覽器下快取問題

最近在做專案的時候,遇到乙個問題,使用jquery的ajax方法進行非同步提交時,在ie瀏覽器下會存在快取問題,即當第一次請求傳送到伺服器後,如果後續的請求引數跟第一次相同,則瀏覽器會直接返回快取的結果而不是去伺服器獲取 經測試,在火狐與谷歌瀏覽器中不存在這樣的問題 通過上網查詢有關資料,現將解決方...

vue專案在IE瀏覽器下的異常解決

vue cli2構建vue專案,在google瀏覽器下渲染 互動正常。在ie11瀏覽器開啟頁面未能正常渲染。某單頁面專案是,導航無法正常路由。分析報錯 promise 未定義,推測js的六瀏覽器相容性問題。其他類似報錯 vuex vuex requires a promise polyfill in...