以下SVG路径可以绘制一个圆的99.99%:(在http://jsfiddle.net/DFhUF/46/上尝试它,看看你是否看到4个弧或只有2个,但请注意,如果它是IE,它会被渲染在VML中,而不是SVG,但有类似的问题)
M 100 100 a 50 50 0 1 0 0.00001 0
Run Code Online (Sandbox Code Playgroud)
但是当它是一个圆圈的99.99999999%时,什么都没有显示出来?
M 100 100 a 50 50 0 1 0 0.00000001 0
Run Code Online (Sandbox Code Playgroud)
这与100%的圆圈相同(它仍然是弧形,不是它,只是一个非常完整的圆弧)
M 100 100 a 50 50 0 1 0 0 0
Run Code Online (Sandbox Code Playgroud)
怎么能修好?原因是我使用一个函数绘制一个弧的百分比,如果我需要"特殊情况"一个99.9999%或100%的弧来使用圆函数,那就太傻了.
同样,使用RaphaelJS的jsfiddle上的测试用例位于http://jsfiddle.net/DFhUF/46/
(如果它是IE 8上的VML,即使第二个圆圈也不会显示......你必须将它改为0.01)
更新:
这是因为我在我们的系统中为得分渲染弧,所以3.3点得到1/3的圆.0.5得到半圈,9.9得到99%的圈.但是如果我们的系统中得分为9.99呢?我是否必须检查它是否接近圆的99.999%,并相应地使用arc
函数或circle
函数?那么得分9.9987怎么样?哪一个使用?要知道什么样的分数将映射到"太完整的圆圈"并切换到圆形函数是荒谬的,当它是圆圈的"某个99.9%"或9.9987分数时,则使用弧函数.
我正在写一些javascript,需要在SVG或VML之间进行选择(或两者兼而有之,它是一个奇怪的世界).虽然我知道目前只有IE支持VML,但我更倾向于检测功能而不是平台.
SVG似乎有一些属性,你可以去:例如window.SVGAngle.
这是检查SVG支持的最佳方法吗?
VML有任何等价物吗?
不幸的是 - 在firefox中,我可以非常愉快地在VML中完成所有渲染而不会出现错误 - 屏幕上没有任何反应.从脚本中检测出这种情况非常困难.
我需要在我正在处理的网站上显示一些交互式(附带DOM侦听器等和事件处理)矢量图形.有一个针对SVG的W3C建议,虽然这种格式仍然无法被Internet Explorer支持认可(对于公共网站而言).IE处理VML,甚至还有javascript库根据浏览器(SVG与VML)做一些类似画布的绘图 - excanvas,Dojo Toolkit的GFX等等.虽然它们都不能显示给定标记的SVG图像,但这样会很好并且可以接受.
所以问题实际上包括几个部分:
[ 编辑 ]谢谢大家的意见/建议.以下是关于此事的随机笔记/结论:
[ 编辑2 ]出现了更多评论.我想澄清一下,"Windows锁定"是指Silverlight通常在Windows上运行的情况,更具体地说是IE.我怀疑它是其他系统上可接受的解决方案(例如Flash或Java Applet).是的,我毫不怀疑一个人能够在任何系统上启动Silverlight应用程序,但我担心这对普通用户来说太费劲了.
@Akira:你对IE7上的那些"SVG渲染器"有任何问题吗?我总是抛出Javascript错误.
我几天前开始使用Raphael.js,我真的很享受它.我唯一无法弄清楚的是如何让"paper"或svg/vml标签像swf一样填充浏览器窗口.看这个例子.
请注意上面的示例使用浏览器窗口调整大小的方式
我能够通过浏览器窗口调整"纸张",但没有运气让所有矢量图形调整它们的大小.任何反馈将不胜感激.
编辑
我尝试了一堆不同的路线.viewBox工作得很好但只有它的SVG.我只想知道如何使用Raphael集和window.onresize事件上的一些代码来做到这一点.我会在今晚或明天晚些时候发布我的发现.如果有的话,我还是真的希望看到问题的其他解决方案.
在将Internet Explorer的SVG实现基于其自己的VML格式时,我遇到了将SVG椭圆弧转换为VML椭圆弧的问题.
在VML中,弧由下式给出:椭圆上的两个点和半径的长度的两个角度.在SVG中,弧由下式给出:椭圆上的两个点的两对坐标和椭圆边界框的大小
因此,问题是:如何将椭圆上的两个点的角度表示为两对坐标.一个中间问题可能是:如何通过曲线上一对点的坐标找到椭圆的中心.
更新:让我们有一个前提条件,即通常放置椭圆(其半径与线性坐标系轴平行),因此不应用旋转.
更新:此问题与svg:ellipse元素无关,而与svg:path元素中的"a"椭圆弧命令无关(SVG路径:椭圆弧曲线命令)
我使用Raphaël(一个JavaScript库)完成了一些漂亮的图形,我想添加一个功能来将其保存为PNG文件.
这在除Internet Explorer之外的每个浏览器上都很简单,因为在非Internet Explorer浏览器上我将SVG作为Raphaël的输出,然后我可以将其转换为canvas(使用cansvg库)并且canvas有一个toDataURL()
方法.但在Internet Explorer上,Raphaël输出VML.我无法使用Chrome框架插件.为什么?
我的应用程序的用户选择Internet Explorer只是因为它预装在Windows上,并且他们无权安装任何其他内容.所以他们无法安装这个插件.所以我的第二个想法是在Internet Explorer上获取一个SVG字符串,将其传递给cansvg以获取画布然后使用flashCanvas
.
我试图欺骗Raphaël认为它在非Internet Explorer浏览器上运行并获得SVG作为输出,但我失败了,因为Raphaël使用了一些在Internet Explorer中不存在的JavaScript函数来生成SVG.
那么如何在Internet Explorer下完成此任务?
获得几个Raphael对象的边界框的最佳方法是什么?
我可以将它们全部放入set
并打电话mySet.getBBox()
吗?
或者我是否需要遍历它们,获取bbox
每个并计算整体高度和宽度?
(另外,我不能直接使用SVG - 我需要VML支持.)
我正在使用RaphaelJS直观地表示一些数据.基础技术是SVG,所以显然在IE中并不总是能很好地工作,但是库仍然能够提供有用的东西,尽管它往往看起来很差.
无论如何,我似乎无法解决这个基本问题.Chrome或FireFox中的文本呈现正常,但在IE8中,所有内容都呈现为粗体和斜体.
要查看我的问题,请转到RaphaelJS游乐场并使用以下代码
paper.text(100, 100, "this is the text")
Run Code Online (Sandbox Code Playgroud)
以下是Chrome和IE的结果.
这有什么解决方法吗?
我有一个网站,突然开始崩溃Internet Explorer.
网站加载并开始执行javascript,但在那里机器爆炸.我甚至没有得到脚本错误,它只是崩溃.我试图用内置的调试器手动遍历每一行js,但当然问题不会发生.
如果我选择在崩溃时调试应用程序,我会看到以下消息.
iexplore.exe中0x6c5dedf5处的未处理异常:0xC0000005:访问冲突读取位置0x00000090.
调用堆栈中的前5项看起来像这样
VGX.dll!6c5dedf5()
[下面的框架可能不正确和/或丢失,没有为VGX.dll加载符号]
VGX.dll!6c594d70()
VGX.dll!6c594f63()
VGX.dll!6c595350()
VGX.dll !6c58f5e3()
mshtml.dll!6f88dd17()
VGX.dll似乎是vml渲染器的一部分,我实际上使用的是VML.我并不感到惊讶,因为我有很多vml的问题,属性必须按特定的顺序设置,有时你不能设置属性当你有元素附加到dom或反之亦然(一切没有文档btw)但然后问题通常可以在调试时重现,但现在不能:(
没有插件模式也会出现此问题.
有没有比试错更好的方法来解决这个问题?
编辑: 添加控制台输出每个可疑的修改到DOM使得问题有时只发生.(控制台也在同一页面上的javascript中实现,我甚至可以在崩溃后看到输出,因为窗口仍然可见)显然它似乎是某种竞争条件.
我设法进一步跟踪它,并且它似乎发生在刚刚添加后从DOM中删除对象太快.(最有可能只针对具有某些特殊属性的vml元素,没有进一步尝试)并且无法通过在removeChild前面添加一个死循环来修复它(无论如何都是非常糟糕的解决方案),页面必须由浏览器一旦在addChild之后,你可以调用removeChild.叹