最近維護單位的老項目,要求相關功能可以支持新的瀏覽器。由于是早期項目,在當初完成交付時都沒有考慮過兼容問題,于是留下一些隱患,比如使用 VML 繪制的審批流程圖例在 IE8+ 沒有顯示。
Vector Markup Language 縮寫 VML,一種用于繪制矢量圖形的標記語言,它是微軟自 IE5 以來單方面發布的一種矢量圖方案,所以非IE內核的瀏覽器是無法使用的。在網頁開發日趨規范的形勢下已被 SVG 取代,在 IE9 推出時微軟開始不贊成使用 VML,而在 IE10 發布后干脆放棄了 VML(詳見 不再支持 VML)并建議遷移到 SVG。
好在客戶的工作環境只在 IE 瀏覽器下,而我們知道 IE 每個版本都集成了上一版的內核,這讓我們可以通過切換到特定渲染模式去滿足 VML 的運行環境,使這些元素正常顯示:
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<style>
v\:* {behavior: url(#default#VML)}
.oval {
width: 100px;
height: 50px;
line-height: 50px;
text-align: center;
}
</style>
</head>
<body>
<xml:namespace ns="urn:schemas-microsoft-com:vml" prefix="v">
<v:oval class="oval" fillcolor="red">
oval
</v:oval>
</xml:namespace>
</body>
</html>
相較原先,改進后的代碼多了樣式引入 v\:* {behavior: url(#default#VML)}
和強制渲染聲明 <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
,同時還需要注意標簽的命名空間的統一。
顯示效果圖
現在這段代碼所聲明的圖例在 IE11 下也可以正常顯示。至于 IE 之外的瀏覽器那就不得不借助 SVG 做代碼重構了。另外通過 JS 動態添加 VML 元素也需要做些調整,由于這涉及到 DOM 操作,于是就不是本文力求簡明扼要的筆記風格可以完全涵蓋的范圍了。
參考: