要使用VML,我們首先要開辟一個命名空間。以前動態創建比較麻煩 
document.namespaces.add('vml', 'urn:schemas-microsoft-com:vml', "#default#VML"); 
ie8出現后,微軟一口氣升級了IE6,IE7。創建方法更簡單。 
document.namespaces.add('vml', 'urn:schemas-microsoft-com:vml'); 
它們的作用相當于把HTML標簽搞成下面這個樣子: 
<html xmlns:vml="urn:schemas-microsoft-com:vml"> 
接著就是在樣式中調用對應的CSS hehavior。靜態代碼應該是這個樣子: 
<style type="text/css"> 
vml/:* { behavior: url(#default#VML) } 
</style> 
網上風傳IE8對VML支持不友好,要放棄VML云云,主要原因在于“vml/:*”這個選擇器被IE8認為不合法(反面證明IE在努力修正其 CSS bug)。由此,人們被迫利用v/:line, v/:rect, v/:roundrect, v/:oval這樣子的聯合選擇器來調用相關的CSS hehavior。不過只要是合法選擇器就可以調用CSS hehavior,因此這里用聯合選擇器實在太累贅了。我想換類選擇器是否更合適點呢?試驗一下,是無問題的。但僅僅是這樣是渲染不出來的,由于IE8已 經重寫了內核,因此此bug不是hasLayout可以解決的。官方給出答案是使用display:inline-block,這樣就可以強逼它繼續渲染了。后來我又發現display:block也有此功效,但考慮到內聯元素的問題,還是用官方的補丁吧 。至此,開辟命名空與與渲染VML元素的問題就告一段落。 
再來看如何動態創建VML元素,由于是非標準,我們就用非標準的createElement方式來創建它。我們需要拼接一個字符串,作為createElement 的參數,它應該包含命名空間與類名。 
var createVML = function (tagName) { 
return doc.createElement('<vml:' + tagName + ' class="vml">'); 
}; 
隨便做了一個小工具,看看后果如何: 
 代碼如下: 
function(){ 
if(!window.vml){ 
window.vml = {}; 
document.createStyleSheet().addRule(".vml", "behavior:url(#default#VML);display:inline-block;"); 
if (!document.namespaces.vml && !+"/v1"){ 
document.namespaces.add("vml", "urn:schemas-microsoft-com:vml"); 
} 
} 
var vml = window.vml = function(name){ 
return vml.fn.create(name || "rect"); 
} 
vml.fn = vml.prototype = { 
create : function(name){ 
this.node = document.createElement('<vml:' + name + ' class="vml">'); 
return this; 
}, 
appendTo: function(parent){ 
if(typeof this.node !== "undefined" && parent.nodeType == 1){ 
parent.appendChild(this.node); 
} 
return this; 
}, 
attr : function(bag){ 
for(var i in bag){ 
if(bag.hasOwnProperty(i)){ 
this.node.setAttribute(i,bag[i]) 
} 
} 
return this; 
}, 
css: function(bag){ 
var str = ";" 
for(var i in bag){ 
if(bag.hasOwnProperty(i)) 
str += i == "opacity" ? ("filter:alpha(opacity="+ bag[i] * 100+");"):(i+":"+bag[i]+";") 
} 
this.node.style.cssText = str; 
return this; 
}             
新聞熱點
疑難解答
圖片精選