百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

HTML5(八)——SVG 之 path 详解 svg pathdata

myzbx 2024-12-26 15:15 13 浏览

path 是 SVG 基本形状中最强大的一个,不仅可以实现我们上一篇《HTML5(七)——SVG基础入门》中,介绍的 SVG 预定义的 line、rect、circle、ellipse、line、polyline、polygon 六种基本形状。还可以实现更复杂的效果,我们就开始学习 path 如何应用。

一、path 路径详解

1.1、path 命令

path 用于定义一个路径,其中命令就是控制这条路径的,以下命令就是可用于路径数据:

注:以上所有命令大小写都可以,区别是大写命令表示绝对定位,小写表示相对定位。

1.2、path 使用

使用语法:<path d=" M x1 y1 L x2 y2 H x3.... " stroke="red"></path>

d:引出路径,d 中的值由多条命令组合而成。

圆弧在实际场景中应用非常广泛,A 命令中参数较多,large-arc 和 sweep 较难理解,详细介绍下。

使用语法:<path d="M x y A rx ry x-axis-rotation large-arc sweep x y"></path>

如上图所示,A 到 B 两个点再加半径,可以绘制出 4 条弧线,具体选哪一条呢?就是由 large-arc (是否是大弧)和 sweep(是否逆时针旋转) 两个参数决定。

large-arc = 1 表示弧度大于等于180,反之就是小于180。

sweep = 0 表示逆时针旋转,反正顺时针旋转。

所以上述 4 条弧线分别对应的两个参数为:

  • 1:(0 0)
  • 2:(0,1)
  • 3:(1,1)
  • 4:(1,0)

eg:使用 path 绘制一条直线、半圆、直线,连接起来形成一个拱桥,代码如下:

<svg  version="1.1" height="400" width="550">
 <path d="
  M 0 100  //(0,100)是起点
  L 100 100  // 画一条直接到 (100,100)
  A 100 100 0 1 1 300 100  // 画一段圆弧
  L 400 100 //画一条直线到 (400,100)
" stroke="black" stroke-width="1" fill="none"></path>    
</svg>

运行结果如下:

可以自己修改上述 A 中 参数观察半圆的变化。

1.3、js 操作path

我们经常使用js动态添加、移除元素等,可以实现更炫酷的特效,那js能动态操作path吗?如何操作呢?

我们使用js动态绘制一个与上边案例eg1一样的path。

<svg  version="1.1" height="400" width="550" id="svg"></svg>
<script >
 window.onload = function(){
  let svg = document.getElementById("svg")
  let path = document.createElement("path")
  path.setAttribute('d',"M 0 100  L 100 100  A 100 100 0 1 1 300 100   L 400 100")
  svg.appendChild(path)
}
</script>

运行代码,我们发现没有报错,也没有显示任何结果。

添加:alert(path),打印出 [object HTMLUnknownElement]。

说明 html 把 path 当作普通的 html 标签解析了,发现并不认识该标签,所以页面没有任何效果,此时我们需要介绍一个新的创建元素方法。

createElementNS介绍

createElementNS 是创建一个具有指定的命名空间URI和限定名称的元素。

使用语法:document.createElementNS(namespaceURI, qualifiedName[, options]);

  • namespaceURI 指定与元素相关联的命名空间URI的字符串。创建的元素的namespaceURI (en-US)属性使用namespaceURI的值进行初始化。
  • qualifiedName指定要创建的元素的类型的字符串。 创建的元素的nodeName (en-US)属性使用qualifiedName的值进行初始化。
  • options可选的一个可选的包含单个属性的ElementCreationOptions对象,其值是预先使用customElements.define()定义的自定义元素的标签名称。为了向后兼容自定义元素规范的早期版本,一些浏览器允许您在此使用字符串替代对象,其中字符串的值是自定义元素的标签名称。

生成path元素代码:

let path = document.createElementNS(
  "http://www.w3.org/2000/svg",
  "path"
)

js操作属性时,html元素与SVG元素区别:

普通html元素可以使用两种方法:

  1. setAttribute(x,val) / getAttribute(x)
  2. obj.x

SVG操作方法只有一种

  1. setAttribute(x,val) / getAttribute(x)

eg3:图表中饼图是特别常见的,我们就先使用 js 动态地绘制一个扇形圆弧。

<svg  version="1.1" height="400" width="550" id="svg"></svg>
<script >
 function d2a(n){
  return Math.PI*n/180
 }
 function pie(ang1,ang2,r,cx,cy){
  let svg = document.getElementById("svg")
  let path = document.createElementNS("http://www.w3.org/2000/svg","path")
  let arr = []
  let x1 = cx + Math.sin(d2a(ang1))*r
  let y1 = cy - Math.cos(d2a(ang1))*r
  let x2 = cx + Math.sin(d2a(ang2))*r
  let y2 = cy - Math.cos(d2a(ang2))*r
  arr.push(`M ${cx} ${cy} L ${x1} ${y1} A ${r} ${r} 0 0 1 ${x2} ${y2} `)
  arr.push("Z")
  path.setAttribute('d',arr.join(' '))
  svg.appendChild(path)
 }
 window.onload = function(){
  pie(20,180,200,200,200)
 }
</script>

运行结果如图所示:

如果有兴趣,可以自己修改开始角度和结束角度,可以绘制出很多种不同效果的圆弧。

二、样式以及优先级

上述代码

<path d="
  M 0 100  //(0,100)是起点
  L 100 100  // 画一条直接到 (100,100)
" stroke="black" stroke-width="1" fill="none"></path>

上述属性可以分为两类:

  • 只能为属性 - 决定图形或路径形状的
  • 可以放样式 - 视觉上的效果

如 troke、fill等是控制视觉上的效果,这样的属性可以放入 style 样式中。所以上述代码可以改写为:

<path d="
  M 0 100  //(0,100)是起点
  L 100 100  // 画一条直接到 (100,100)
" style="stroke:black;stroke-width:1;fill:none"></path>

该样式可以放到 head 的 style 中,代码为:

path{
 fill:none;
 stroke:black;
 stroke-width:1
}

还可以通过 class、id、标签等添加样式,他们的优先级分别为:

属性< * < 标签 < class < id < 行间

path 的样式控制同样适用于 SVG 预定义的 rect、circle、ellipse 等元素。

如果觉得还不错!

点个关注,下篇解密 SVG 动画 !

相关推荐

Web 界面开发指南,持续更新(web界面开发工具)

最近看到了一份非常精简但很实用的《Web界面开发指南》,其中仅有4页,却详细阐述了前端交互体验的关键要点。这份指南的思路和方法相当于一个最佳实践,比许多冗长的内容介绍更易于理解。实际上即使没有太...

矢量图标LOGO绘制教程(二):短信应用

前言本次教程使用软件为:InkscapeInkscape是一款功能强大的免费设计工具。无论您是插画家、设计师、网页设计师,还是只是需要创建一些矢量图像的人,Inkscape都适合您!它具有以下功能...

Deepseek生成图片的几个方法,示例模板附上

针对DeepSeek生成图片场景设计的原创提示语模板及示例,结合了多步引导、参数化要求和第三方工具协同策略,可适配不同设计需求:一、SVG代码生成法(适用技术型用户)提示语结构:请将下方文本内容转化为...

这个质量超高的PPT背景生成器,开发者居然才12岁,来自加拿大

很多人在上手PPT设计的时候,最头疼的可能就是背景的问题了,想找一些既能丰富视觉层次,又不影响文字呈现的背景图:但是又不知道,该去哪里找?或者找到了能不能商用:其实,你可以用一些免费的,背景生成器做出...

免费好用还高级!3个必须知道的设计网站,让你的PPT好看10倍

哈喽,大家早上好鸭~好久不见,我是三石,今天我又来进行PPT技巧分享啦~诶,这不前几天编辑部的萌萌就来找我约稿,说小叶子们对于神器网站的呼声很高,问我能不能写一篇文章汇总一下,我二话没说就答应了。常言...

前端必备!干货满满的前端周刊(第三期)

前端周刊是一份专为前端从业人员,以及对前端、设计领域感兴趣的朋友们打造的技术周刊。程小狮会精选出前端、设计领域近期相关的资讯、热点以及技术干货,与大家一同分享。前端周刊专注于前端领域技术分享。希望这份...

筛选了100个配色工具后,我挑出了这25个

研究主题:提升色彩感知的配色工具研究对象:配色工具UI设计中,颜色几乎是最先被感知到的设计元素,好的色彩感知是成为一个优秀的设计师的基础,配色工具层出不穷,辞典酱在筛选了100多种配色工具后,精选了...

前端开发-SVG从入门到实战(前端swc)

SVG(可缩放矢量图形)是前端开发中不可或缺的技术,它既能实现高清无损缩放,又能通过代码动态控制,完美适配复杂交互场景。本文将从基础到进阶,带你快速掌握SVG的核心技巧。SVG的核心优势矢量图形,无限...

一场演唱会,揭开了那英的“真面目”,怪不得被宋祖德喊话封杀

还在为运气发愁?别担心,关注我,好运连连,财运亨通!那英,大家都知道,这是个响当当的名字,作为华语乐坛的“天后”,她的歌声陪伴了无数人的青春,可最近这场在澳门的演唱会,可把她的热度压得有点低,甚至让人...

【消防宣传月】居家遇初火千万别着急!这就教你怎么灭→

“消防安全大家谈”“119”消防宣传月策划持续推新这次带来的是趣味互动科普第四弹!渝仔消妹精心设计了SVG互动式消防知识主题秀以屏幕互动的方式将知识点一步步鲜活地呈现给大家家庭初起火灾如何扑救家是温馨...

Winform革命:如何用aardio版AntdUI打造Web级美观界面?

大家好,我是风行者,一个拥有15年开发经验和教学经验的80后嘿,Winform开发者们!你是否还在为那些老掉牙的界面设计头疼?是不是每次看到那些光鲜亮丽的Web应用,心里就痒痒的,想着:“要是我的应用...

FastReport.Net v2016.6发布,添加打印对话框等新功能

新版本的FastReport添加了报表对象:PolyLineObject-中断曲线,PolygonObject-填充密闭多边形。除此之外,用户也能够通过移动、添加或者去除定位点来编辑已经准备好的对象...

高效办公,你值得拥有之原型工具AXURE篇

简介AxureRP是美国AxureSoftwareSolution公司旗舰产品,是一个专业的快速原型设计工具,让负责定义需求和规格、设计功能和界面的专家能够快速创建应用软件或Web网站的线框图...

300 多行代码搞定微信 8.0 的「炸」「裂」特效!

微信8.0更新的一大特色就是支持动画表情,如果发送的消息只有一个内置的表情图标,这个表情会有一段简单的动画,一些特殊的表情还有全屏特效,例如烟花表情有全屏放烟花的特效,炸弹表情有爆炸动画并且消息和...

基于Vue的yyds图片编辑器(vue editormd)

一、项目简介基于Vue的yyds图片编辑器二、实现功能支持复制粘贴支持自定义字体支持自定义素材支持自定义设计模板支持多元素垂直、水平对齐方式支持拆分/组合组合支持保存为SVG、PNG、JSON文件支持...