在J*aScript中动态操作SVG:从XML到DOM对象的转换与应用


在JavaScript中动态操作SVG:从XML到DOM对象的转换与应用

本教程详细介绍了如何在纯j*ascript环境中动态创建和操作svg图形。文章首先探讨了使用`createelementns`手动构建svg元素的方法,适用于小型或动态生成的svg。随后,重点讲解了通过`fetch` api获取外部svg文件内容,并利用`domparser`将其解析为可操作的dom对象,从而实现对svg元素的属性修改、样式调整及交互性增强。教程强调了跨域资源共享(cors)的重要性,并提供了清晰的代码示例和实践建议,帮助开发者高效地在web应用中集成和控制svg。

在现代Web开发中,SVG(可缩放矢量图形)因其矢量特性、小文件大小和高可伸缩性而广受欢迎。然而,直接在HTML中嵌入SVG或从外部文件加载SVG后,有时需要通过J*aScript进行动态修改和交互。本教程将深入探讨如何使用纯J*aScript(Vanilla J*aScript)动态地创建、加载并操作SVG图形,从而实现更灵活和强大的视觉效果。我们将介绍两种主要方法:手动构建SVG元素和通过解析现有SVG文件进行操作。

一、手动创建SVG元素

当需要从零开始生成简单的SVG图形,或者SVG结构相对固定且复杂性不高时,可以使用J*aScript的DOM API手动创建SVG元素。这种方法的核心是使用document.createElementNS函数,它允许我们指定元素的命名空间,这对于SVG元素至关重要(SVG的命名空间是http://www.w3.org/2000/svg)。

1. 创建SVG根元素

首先,我们需要创建一个svg根元素,并设置其基本属性,如viewBox、width、height以及必要的命名空间。

// 创建一个 SVG 元素
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
svg.setAttribute("viewBox", "0 0 482.026 172.554");
svg.setAttribute("width", "482.026");
svg.setAttribute("height", "172.554");
svg.setAttribute("id", "myDynamicSvg"); // 建议使用更具描述性的ID
svg.setAttribute("xmlns", "http://www.w3.org/2000/svg");
svg.setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink");

// 将 SVG 元素添加到页面中的某个容器
document.body.appendChild(svg); // 例如添加到 body

2. 添加defs和filter元素

SVG中的defs元素用于定义可重用的图形对象,例如滤镜(filter)。滤镜内部包含一系列的滤镜基元(feOffset, feGaussianBlur, feFlood, feComposite等),它们共同作用于图形以产生视觉效果。创建这些元素同样需要createElementNS,并通过setAttribute设置其属性。

MarketingBlocks AI MarketingBlocks AI

AI营销助理,快速创建所有的营销物料。

MarketingBlocks AI 27 查看详情 MarketingBlocks AI
// 创建 defs 元素
const defs = document.createElementNS("http://www.w3.org/2000/svg", "defs");

// 创建第一个滤镜:layerOuter
const filterOuter = document.createElementNS("http://www.w3.org/2000/svg", "filter");
filterOuter.setAttribute("id", "layerOuter");
filterOuter.setAttribute("x", "0");
filterOuter.setAttribute("y", "35.6");
filterOuter.setAttribute("width", "364.473");
filterOuter.setAttribute("height", "100.059");
filterOuter.setAttribute("filterUnits", "userSpaceOnUse");

// 创建 feOffset 元素
const feOffsetOuter = document.createElementNS("http://www.w3.org/2000/svg", "feOffset");
feOffsetOuter.setAttribute("dy", "3");
feOffsetOuter.setAttribute("input", "SourceAlpha");

// 创建 feGaussianBlur 元素
const feGaussianBlurOuter = document.createElementNS("http://www.w3.org/2000/svg", "feGaussianBlur");
feGaussianBlurOuter.setAttribute("stdDeviation", "3");
feGaussianBlurOuter.setAttribute("result", "blur");

// 创建 feFlood 元素
const feFloodOuter = document.createElementNS("http://www.w3.org/2000/svg", "feFlood");
feFloodOuter.setAttribute("flood-opacity", "0.459");

// 创建 feComposite 元素 (in2="blur")
const feCompositeOuter = document.createElementNS("http://www.w3.org/2000/svg", "feComposite");
feCompositeOuter.setAttribute("operator", "in");
feCompositeOuter.setAttribute("in2", "blur");

// 创建 feComposite 元素 (in="SourceGraphic")
const feCompositeOuter2 = document.createElementNS("http://www.w3.org/2000/svg", "feComposite");
feCompositeOuter2.setAttribute("in", "SourceGraphic");

// 将滤镜基元添加到 filterOuter
filterOuter.appendChild(feOffsetOuter);
filterOuter.appendChild(feGaussianBlurOuter);
filterOuter.appendChild(feFloodOuter);
filterOuter.appendChild(feCompositeOuter);
filterOuter.appendChild(feCompositeOuter2);

// 创建第二个滤镜:layerBase (此处为简化,省略具体创建和设置过程,逻辑与 layerOuter 类似)
const filterBase = document.createElementNS("http://www.w3.org/2000/svg", "filter");
filterBase.setAttribute("id", "layerBase");
filterBase.setAttribute("x", "0");
filterBase.setAttribute("y", "107.175");
filterBase.setAttribute("width", "364.473");
filterBase.setAttribute("height", "35.78");
filterBase.setAttribute("filterUnits", "userSpaceOnUse");
// ... (添加 feOffsetBase, feGaussianBlurBase, feFloodBase, feCompositeBase, feCompositeBase2)

// 将滤镜添加到 defs
defs.appendChild(filterOuter);
defs.appendChild(filterBase);

// 将 defs 添加到 svg 根元素
svg.appendChild(defs);

3. 创建g和path元素

g元素用于将多个SVG图形元素进行分组,方便统一应用变换或样式。path元素则用于绘制复杂的形状。它们的创建方式与上述元素相同,关键在于正确设置属性,特别是path元素的d(data)属性,它定义了路径的形状。

// 示例:创建分组 g 元素
const gElement = document.createElementNS("http://www.w3.org/2000/svg", "g");
gElement.setAttribute("id", "frmMenu");
gElement.setAttribute("transform", "translate(-1395.974 -860.8)"); // 应用变换

// 示例:创建 path 元素
const pathElement = document.createElementNS("http://www.w3.org/2000/svg", "path");
pathElement.setAttribute("id", "layerOuter-2");
pathElement.setAttribute("data-name", "layerOuter");
pathElement.setAttribute("d", "M730.735,40.209q-.821-5.562-7.2-5.562H398.941q-6.382,0-7.112,5.562l-.182,1.732v60.177q0,7.294,7.294,7.294h324.59q7.294,0,7.294-7.294V41.941l-.091-1.732M388,102.574V41.941Q388,31,398.941,31h324.59q10.941,0,10.941,10.941v60.633q-.273,10.485-10.941,10.485H398.941q-10.668,0-10.941-10.485");
pathElement.setAttribute("transform", "translate(-379 10.6)");
pathElement.setAttribute("fill", "#9b9dad");
pathElement.setAttribute("filter", "url(#layerOuter)"); // 引用定义的滤镜

// 将 path 元素添加到 g 元素
gElement.appendChild(pathElement);
// 将 g 元素添加到 svg 根元素
svg.appendChild(gElement);

手动创建方法的局限性: 手动创建SVG元素对于复杂的图形来说会非常冗长和易错。每次修改SVG结构都需要手动调整J*aScript代码,维护成本高。因此,对于现有SVG文件的动态操作,通常推荐使用第二种方法。

二、通过解析现有SVG文件动态操作

更常见且高效的方法是加载一个现有的SVG文件,将其解析为DOM对象,然后使用标准的DOM操作API来修改其内容

以上就是在J*aScript中动态操作SVG:从XML到DOM对象的转换与应用的详细内容,更多请关注其它相关文章!


# java  # 两种  # 多个  # 第一个  # 文档  # 创建一个  # 加载  # 将其  # 跨域  # csv  # app  # svg  # html  # javascript  # 滤镜  # 天津德阳网站建设  # 工装公司网站建设  # 美国关键词排名查询  # 成都市关键词排名  # 泰兴seo技术  # 新手店铺营销推广计划书  # 兴化网站推广欢迎来电  # 美妆vi设计营销推广  # 涂料怎么营销推广产品  # 新都网站推广营销招聘网  # 适用于  # 推荐使用 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: Sublime怎么格式化HTML代码_Sublime前端代码美化插件使用指南  《幻兽帕鲁》手游帕鲁捕捉技巧分享  折叠屏手机充不进电是什么问题? 特殊结构带来的维修难点  网页版网易云音乐入口_网易云音乐在线官网登录  《淘宝联盟》推广自己的店铺方法  Three.js中动态更换3D模型纹理的教程  PHP 4 函数中引用参数的默认值限制与解决方案  解决VS Code中Python版本冲突与输出异常的指南  Dash应用多值文本输入处理与类型转换教程  使用document.execCommand实现Web文本编辑器加粗/取消加粗  微星主板BIOS怎么调整内存时序_内存参数手动优化BIOS设置教程  如何在 WordPress 前端实现内容提交:古腾堡编辑器的替代方案与实践  食品生产用水只要符合国家规定的生活饮用水卫生标准就可以吗  win11关机几秒又自己开机 Win11关机自动重启问题修复  Firefox OS应用开发:解决XMLHttpRequest跨域请求阻塞问题  优化 WooCommerce 产品价格显示与自定义短代码集成  《伊瑟》凶影追缉库卢鲁boss攻略  WooCommerce购物车:强制显示所有交叉销售商品教程  C++中的explicit关键字有什么作用_C++类型转换控制与explicit使用  如何在Golang中处理表单文件上传_Golang 表单文件上传示例  苹果iPhone14ProMax如何新建AppleID_iPhone14ProMax新建AppleID具体流程  yy漫画登录页面官方入口_yy漫画在线阅读网址入口  Word如何将文字快速转成表格 Word文本转换成表格功能使用技巧【效率】  PHP多语言网站的实现:会话管理与翻译函数优化教程  win11怎么更改账户类型 Win11标准用户和管理员权限切换【教程】  优化 React onClick 事件处理:函数引用与箭头函数的对比  PDF文件去水印平台入口 PDF水印删除网址  研招网官方网站正版登录网址_中国研究生招生信息网官网首页  微信如何设置字体大小_微信字体设置的阅读舒适  批改网网页版登录 批改网电脑版学生登录入口  VS Code快捷键when上下文子句的妙用  支付宝登录刷脸不是本人如何解决  我居然低估了 DeepSeek,这次更新它做到了这些!  优化Leaflet弹出层图片显示:条件渲染策略  聚水潭ERP后台管理系统登录 聚水潭ERP官方登录通道  虫虫漫画排行榜单入口_虫虫漫画编辑推荐入口  composer licenses 命令:如何检查项目依赖的许可证?  b站如何管理订阅_b站订阅标签分类管理  PHP页面重载后变量状态保持:实现用户档案连续浏览的教程  汽水音乐车机版 汽水音乐车机版官方入口  《火影忍者:木叶高手》快速升级攻略  VS Code如何设置默认配置  iPhone14无法连接蓝牙设备如何解决  天堂漫画网页版在线阅读 天堂漫画手机版入口  Lar*el怎么实现全文搜索_Lar*el Scout集成Algolia教程  51漫画网实时入口 51漫画网页版官方免费漫画入口  圆通快递包裹轨迹查询 圆通速递快件实时位置跟踪  Safari浏览器自动填表功能失效怎么办 Safari表单管理修复  12306APP选座怎么选充电位置_12306APP带充电插座座位选择方法与技巧  Win10显卡驱动安装失败怎么办 Win10使用DDU彻底卸载驱动【解决】 

 2025-11-13

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.