2009年4月23日星期四

各浏览器下的绘图

浏览器支持的绘图:
ie(貌似6+): vml(性能比svg和canvas差)
ff(貌似1.5+): (svg canvas) ff下canvas绘制的图像只能以矩形方式响应事件(貌似是这样)
safari(貌似3+): svg canvas(canvas以绘制的不规则区域响应事件,webkit内核)
chrome(貌似1+): svg canvas(canvas以绘制的不规则区域响应事件,webkit内核)
opera(貌似9+): svg canvas

各地图厂商使用的绘图技术:
google ie(vml) ff和opera(svg) safari和chrome(canvas)
mapbar ie(vml) 其余浏览器(canvas) mapbar解决了svg两个bug,非常不错!!!
mapabc flash
51ditu ie(vml) 其余浏览器(用一像素div拼,这样的问题很明显...性能不好,且没有虚线)

性能排序(canvas(调用浏览器底层的c++绘图api) svg vml,本人瞎猜,请勿相信)


注意:
svg (ff是以边的中心为起点,safari和chrome以边为起点,webkit内核有难缠的bug)
另注意:在svg下,事件响应在path时,offsetParent为空.

注意bug:

bug1:解决方法,viewBox起始不要为负数
bug重现,在safari和chrome下面,使用opacity会导致边框被切(当viewBox有负数,如svgns.setAttributeNS(null,"viewBox","-5 -5 200 200")),被切的距离就是那个负数值(好像也不完全是)
被切示例如下:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
style="top:60px;left:60px; overflow: visible; position: absolute;" width="6px" height="93px" viewBox="-3 -3 6 93">
<path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke="#0000FF" stroke-width="3px" stroke-dasharray="" d="M 0 0 L 0 87"/>
</svg>


bug2:解决方法,(mapbar的解决方法,目前没看懂)
bug重现,移动svg,左上和右上各有一部分不跟着绘制,并且有残影效果
bug解决(大力感谢mapbar,简直比Google还强!!!),


<marker id="svgArrow" viewBox="0 0 10 10" refX="6" refY="5" markerUnits="strokeWidth" orient="aotu">
<path d="M 0 0 L 10 5 L 0 10 L 4 5 z" fill="#FF0000" fill-opacity="0.6">
</marker>

var spath= document.createElementNS(svgNamespace, "marker");
svgns.appendChild(spath);
var mpath=document.createElementNS(svgNamespace, 'path');
var dp="M 0 0 L 1 1";
mpath.setAttributeNS(null,"d",dp);
spath.appendChild(mpath);

2009年4月18日星期六

fixed定位下offsetParent问题

代码如下(dtd省去),一个网友提供的,

position为fixed时;各浏览器返回的offsetParent不相同,

ie7返回null
ie6返回div
ff返回body
safari返回div
chrome返回div
opera返回div



<style type="text/css">
#target{position: fixed;}
</style>
<script type="text/javascript">
window.onload=function(){
  vartarget=document.getElementById('target');
alert(vartarget.offsetParent.tagName);
 };
</script>
</head>
<body>
<div id="outer" class="test">
  <div id="inner" style="position:absolute;">
    <div id="target" class="test">Target<br/>rainman</div>
  </div>
</div>
</body>
</html>

2009年4月16日星期四

认识 reflow

怿飞blog:
http://www.planabc.net/2009/04/13/reflow/

aoao blog:
http://www.aoao.org.cn/blog/2008/05/reflow/

流放之忆 blog:
http://www.missormiss.com/reflow.html

2009年4月15日星期三

flash9下保存文本文件的方法(只支持IE)

flash10可以保存文件,会弹出一个文件保存对话框,不过flash9就不行了,可以借助于一个IE的函数实现:execCommand("saveAs",true,"a.txt"),只能保存以下几种格式:1,html 2,xml 3,txt

代码如下:
flash.net.navigateToURL(new URLRequest('javascript: var b=window.open(); '
+' b.document.open();'
+' b.document.write("dwdwadwadwadawde"); '
+' b.document.close(); '
+' b.document.execCommand("saveAs",true,"a.txt");void(0)'),"_self");

2009年4月6日星期一

通过file选择框预览本地图片

有时候有这么一个需求,要求用户在input file中选择完文件以后可以预览选中的图片,在ie6中是没问题的,ff3和Google浏览器已经不能这样做了,因为取不到本地的图片路径,value值只是图片文件名,ff2中一个函数可以取到文件路径,不过ff2的用户已经很少了...


ie7中无法访问本地路径的图片,除非是本地的网页或者服务器和本机位于同一台机器上,解决方案是用AlphaImageLoader来加载图片.ff可以浏览本机图片,用file:///开头

随着浏览器安全限制的提高,用户通过file选择框然后预览本机图片变得不可能了,ie8已经不能取得文件的完整路径了...

以后遇到这种事程序员可以省心了...现在流行的方法是用flash选择然后预览,flash10可以实现这样的功能,flash10可以得到文件的byte数组,预览时还可以顺便对图片处理一下,感觉比较好