Angular Material Flex-layout:fxFlex与mat-form-field在IE11不显示问题
解决Angular 6 + Material 6 + Flex-Layout Beta在IE11中带fxFlex的mat-form-field不显示问题
我之前踩过类似的IE11兼容性坑,结合你的场景来看,这明显是flex-layout、Angular Material和IE11的布局规则冲突导致的——毕竟只有mat-form-field搭配fxFlex才出问题,说明问题出在组件样式和flex属性的叠加兼容上。给你几个针对性的解决方法:
1. 确保父容器正确使用fxLayout布局
fxFlex属性是依赖父容器的fxLayout来生效的,如果你的mat-form-field没有包裹在fxLayout容器中,IE11会无法正确解析flex属性,直接导致元素被隐藏。修改你的代码结构:
<div fxLayout="row" fxLayoutGap="16px"> <mat-form-field fxFlex="25"> <input matInput name="dob_day" placeholder="{{'dob_day'| translate}}" [(ngModel)]="data.dob_day" pattern='(0?[1-9]|[12][0-9]|3[01])' maxlength="2" required> </mat-form-field> <mat-form-field> <input matInput name="dob_day" placeholder="{{'dob_day'| translate}}" [(ngModel)]="data.dob_day" pattern='(0?[1-9]|[12][0-9]|3[01])' maxlength="2" required> </mat-form-field> </div> <p fxFlex="25">hello , how are you?</p> <p>hello , how are you?</p>
2. 添加IE11专属的CSS兼容补丁
IE11对flex属性的解析有不少bug,比如不支持flex简写的某些写法,或者默认的min-width: auto会导致容器收缩异常。在全局样式文件(比如styles.css)中添加以下代码:
/* 针对IE11的兼容样式 */ @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) { mat-form-field[fxFlex] { /* 强制IE11识别flex属性,替换成兼容写法 */ flex: 0 0 25% !important; /* 确保元素正确显示,避免被压缩为0高度 */ display: inline-flex !important; min-width: 0 !important; /* 匹配Material表单域的默认高度,防止内容溢出 */ min-height: 56px; } }
如果你的fxFlex值不是固定的25%,可以根据实际情况调整flex属性的第三个值。
3. 完善polyfills.ts的IE11配置
你的polyfills已经有基础配置,但还有几个关键项需要调整:
- 启用Zone.js的IE/Edge跨上下文检查,取消注释这行代码:
这能避免IE11中Zone.js对事件监听的包装导致的布局异常。(window as any).__Zone_enable_cross_context_check = true; - 确认已安装
classlist.js和web-animations-js依赖:
虽然你的注释里提到了,但还是要确保已经执行过安装命令:npm install --save classlist.js web-animations-js
4. 升级flex-layout到对应版本的稳定兼容版
你使用的是flex-layout 6-beta版本,可能存在IE11的兼容性bug,建议升级到同大版本的最新beta版(比如6.0.0-beta.18),这个版本修复了不少IE11的布局问题:
npm install @angular/flex-layout@6.0.0-beta.18 --save
按照以上步骤逐一排查,应该能解决IE11中带fxFlex的mat-form-field不显示的问题。
内容的提问来源于stack exchange,提问作者Ahmed Elkoussy
相关产品推荐
相关产品推荐

