嘗試用 ie9.js、ieBetter-min.js 等 Polyfill 在 IE7/8 完美復現 CSS3(圓角、陰影、漸變、Flexbox、Grid)屬於「反模式」:
- 性能災難:JS 模擬渲染引擎,頁面卡頓嚴重。
- 覆蓋不全:偽類、動畫、媒體查詢等核心特性無法模擬。
- 維護地獄:雙套代碼邏輯,Bug 定位極難。
// postcss.config.js
module.exports = {
plugins: {
'postcss-preset-env': {
stage: 0,
browsers: ['ie 7', 'ie 8', 'ie 9'], // 目標瀏覽器
features: {
'nesting-rules': true,
'custom-properties': { preserve: true }, // 保留 CSS 變量供現代瀏覽器
'color-mod-function': { unresolved: 'warn' }
}
},
'cssnano': { preset: 'advanced' }
}
};
構建產出:
- main.modern.css:給 IE9+/現代瀏覽器,保留原生 CSS3。
- main.legacy.css:給 IE7/8,自動轉換為 filter: progid:DXImageTransform.Microsoft.gradient(...)、behavior: url(PIE.htc) 等私有濾鏡/HTC 行為。
<!--[if lt IE 9]>
<link rel="stylesheet" href="main.legacy.css">
<script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
<![endif]-->
<!--[if gte IE 9]><!-->
<link rel="stylesheet" href="main.modern.css">
<!--<![endif]-->
關鍵補丁:
- html5shiv:讓 IE6-8 識別 HTML5 語義標簽(article/section/nav...)。
- Respond.js:polyfill 媒體查詢,實現響應式佈局。
- CSS3 PIE (PIE.htc):HTC 行為文件實現圓角、盒陰影、漸變,需配合 behavior: url(PIE.htc); position: relative; 使用。
| CSS3 特性 | 現代瀏覽器 | IE7/8 降級效果 | 驗收標準 |
|---|---|---|---|
| 圓角 | border-radius | PIE.htc 模擬 / 直角 | 功能無阻礙,視覺差異可接受 |
| 盒陰影 | box-shadow | PIE.htc / 無陰影 | 層級關係通過邊框/間距區分 |
| 線性漸變 | linear-gradient | DX 濾鏡 / 純色兜底 | 文字可讀性達標(對比度 ≥ 4.5:1) |
| Flexbox | display: flex | float + clearfix / table 布局 | 佈局不崩潰,內容可讀 |
| Grid | display: grid | float / flex 降級 | 核心內容區塊正常顯示 |
若業務允許,引導用戶安裝 Google Chrome Frame(已停止更新)或直接彈窗提示升級至 Edge/Chrome/Firefox,從根源消除兼容成本。對於企業內網強制 IE 環境,可申請「企業模式站點列表」讓 IE11 以 IE7/8 文檔模式渲染,同時享受現代 JS 引擎性能。
總結:拋棄「像素級完美還原」執念,建立「功能完備、視覺可接受、性能可控」的降級體系,才是專業前端工程師的選擇。