zoukankan      html  css  js  c++  java
  • javascript动态创建VML

     VML是The Vector Markup Language(矢量可标记语言)的缩写。VML用于将图形数据矢量化的标记语言。这是一种基于 XML 语法的语言,由 AutoDesk 、 Macromedia 和 Microsoft 和 HP 公司向 W3C 提出的方案,于1999年9月附带IE5.0发布的。使用VML可以在IE中绘制矢量图形,所以有人认为VML就是在IE中实现了画笔的功能。要使用VML,我们首先要开辟一个命名空间。

    document.namespaces.add('vml', 'urn:schemas-microsoft-com:vml', "#default#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;
              }
            }
          })()
    

    想学VML,请百度《VML极道教程》或《Vml:美洲豹系列教程》。

    
          var doc = document;
          doc.createStyleSheet().addRule(".vml", "behavior:url(#default#VML);display:inline-block;");
          try {
            if (!doc.namespaces.rvml) {
              doc.namespaces.add("vml", "urn:schemas-microsoft-com:vml");
            }
            var createVML = function (tagName) {
              return doc.createElement('<vml:' + tagName + ' class="vml">');
            };
          } catch (e) {
            var createVML = function (tagName) {
              return doc.createElement('<' + tagName + ' xmlns="urn:schemas-microsoft.com:vml" class="vml">');
            };
          }
    

    最后附上三种创建VML元素的方法:

    1. var VmlElement = document.createElement('<vml:' + tagName + ' class="vml">');
              
    2. var VmlElement = document.createElement('<' + tagName + ' 
            xmlns="urn:schemas-microsoft.com:vml" class="vml">')
              
    3. var VmlElement = document.createElement('vml:' + tagName );
      VmlElement.className = "vml";//最后必须把命名空间当作类名加上
              
  • 相关阅读:
    python笔记
    React+router和react+redux使用过程的记录
    jQuery源码分析随笔
    安装nodejs+ionic+cordova环境心得
    win10系统Nodejs安装包总是失败原因
    silverlight中dialogresult和close
    安卓HTTP访问的两种方式
    安卓Activity跳转的几种方式
    Android开发Content Provider
    web.xml中filter的用法
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/1581891.html
Copyright © 2011-2022 走看看