当前位置: 首页 > 知识库问答 >
问题:

从 URL 渲染 SVG 以使用 Velocity 进行动画.js

尉迟远
2023-03-14

我正在构建一个界面来预览应用于SVG的动画。我正在尝试在 React 中使用 Velocity.js 库来定位 SVG 的内部动画路径。我正在使用create-react-app。

我能够将.svg文件拖放到 react-dropzone 输入中,该输入提供了 File 对象的回调。我可以将 File 对象转换为 base64 编码的 DataURL,然后我可以将其提供给

return (
    <object style={{
        width: '100%'
    }}
    id={`svg-${uuid}`} 
    type="image/svg+xml" data={dataURL}
/>)

任何使用javascript访问SVG的contentDocument的尝试(为了直接针对gpath元素进行动画)都会导致以下错误:

document.getElementById('svg-665790ae-2a36-446e-9ea9-856442e8b1dc').contentDocument

Uncaught DOMException: Failed to read the 'contentDocument' property from 'HTMLObjectElement': 
Blocked a frame with origin "http://localhost:3000" from accessing a cross-origin frame.

我正在开发一个本地开发环境,在localhost:3000上为React应用程序提供服务。

作为一种可能的解决方法,我将讨论中的SVG上传到远程AWS S3存储桶。然后,我通过远程URL检索SVG,并试图以某种方式呈现它。我尝试了以下方法:

反应SVG<代码>

<svg>
     <use xlinkHref={url}></use>
</svg>

这会产生以下标记,但没有可见的SVG:

<svg>
    <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://s3.amazonaws.com/.../example.svg">
    </use>
</svg>

<object
    style={{
        width: '100%',
    }}
    id={`svg-${uuid}`} type="image/svg+xml" data={url}
/>

这导致了下面的标记,没有可见的SVG,并导致浏览器立即将SVG下载为文件。

<object id="svg-..." type="image/svg+xml" data="https://s3.amazonaws.com/.../example.svg" style="width: 100%;"></object>

react-inlinesvg库

这个库发出一个XHR请求来检索SVG,然后将它嵌入到DOM中。

<Isvg src={url}/>

这会导致以下错误:

XMLHttpRequest cannot load https://s3.amazonaws.com/.../example.svg. 
No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'http://localhost:3000' is therefore not allowed access.

SVGInjector

首先,我安装了一个简单的

return (
    <img
        ref={node => this.testSVG = node}
        src={url} id="svg" type="image/svg+xml" />
)

这也会导致上述XMLHttpRequest错误。尝试使用节点ref(即SVGInjector(this.testSVG)componentDidMount调用SVGInjector),或者以这种方式:

const el = document.getElementById('svg');
SVGInjector(el);

导致警告消失,但只显示一个损坏的图像标签。

如果您能帮助解决这些<code>COR</code>警告,或者为动画目的在React中正确地将SVG嵌入DOM提供指导,我们将不胜感激。也许我需要做的是通过服务器下载映像,并临时直接从服务器文件系统(例如从<code>/public</code>文件夹)提供映像。这不是我的首选方法,因为我已经在使用AWS S3进行图像托管。


共有1个答案

萧胜
2023-03-14

答案是在AWS S3控制台中启用CORS。见stack overflow . com/questions/17533888/S3-access-control-allow-origin-header。默认情况下,CORS配置似乎没有启用,所以我必须保存它才能生效。

<!-- Sample policy -->
<CORSConfiguration>
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>Authorization</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

感谢sidehowbarker的这个建议。正如他所提到的,如果您要从另一个域提供您无权访问的图像,则可能需要使用代理。有关详细信息,请参阅 stackoverflow.com/a/43881141/441757,请参阅如何使用 CORS 代理解决“无访问控制-允许-源标头”问题一节下。

 类似资料:
  • 问题内容: 我知道如何在AngularJS中创建 视图 条件,该条件将根据条件显示或隐藏dom元素: 但是如何创建确定是否渲染div 的 渲染 条件? 问题答案: 针对angularjs 1.1.5及更高版本用户的更新(在1.0.7中不受支持): 相关提交:https : //github.com/angular/angular.js/commit/2f96fbd17577685bc013a4f7

  • SVGRenderer被用于使用SVG来渲染几何数据,所产生的矢量图形在以下几个方面十分有用: 动画标志(logo)或者图标(icon) 可交互的2D或3D图表或图形 交互式地图 复杂的或包含动画的用户界面 SVGRenderer具有很多优势。它产生清晰并且锐利的图像输出,它和实际视口分辨率无关。 SVG元素可以通过CSS来控制样式;并且由于它可以添加诸如标题或者描述文字之类的元数据(对于搜索引擎

  • 我试图从包含html代码的Java字符串生成pdf文档。我使用“Freemarker”作为模板引擎来生成html内容,然后使用“Flying Discer”将生成的html转换为pdf。我的问题是,图像不会在生成的pdf中呈现。关于我如何生成的具体细节如下: 生成的html(仅显示相关部分)为: 此代码作为部署在Tomcat上的War运行。作为tree命令(在WEB-INF中运行)的输出,图像在战

  • 我想为组件(例如JPanel或JLabel)实现自定义放置位置渲染。我的目标是在用户将可拖放项悬停在组件上时显示蓝色边框,并在离开组件时再次删除边框。 摇摆教程提供了以下内容: 删除位置渲染 这对我一点帮助都没有。我缺少类似和这样的东西,或者这个页面引用的东西与我预期的不同? 所以我通过万维网搜索,找到了一些例子(大部分来自这个博客)。过了一会儿,我可以完成一个我需要的工作示例(来源如下)。但是我

  • 当我在Android Studio中使用模拟器运行一个项目时,我在调试窗口中得到以下错误: /home/me/android/sdk/tools/emulator-netdelay none-netspeed full-AVD Nexus_6P_API_24 警告:不推荐使用Mesa软件渲染器。使用Swiftshader(-GPU Swiftshader)进行软件渲染。 据我所知,这个模拟器工作得

  • 如何在组件返回中使用promise函数,如下所示: 因此,结果将是: 即使我在同一个组件中有几个promise,我也必须使用?