整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

HTML5(八)-SVG 之 path 详解

ath 是 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 动画,其实包含了以下三大类:

1、CSS3 动画

2、javascript 动画(canvas)

3、html 动画(SVG)

3 种动画各有优劣,实际应用中根据情况作出取舍,本文讨论的是我认为 SVG 中在实际项目中非常有应用价值 SVG 线条动画。

SVG 的历史和优势(W3C)

在 2003 年一月,SVG 1.1 被确立为 W3C 标准。 参与定义 SVG 的组织有:太阳微系统、Adobe、苹果公司、IBM 以及柯达。 与其他图像格式相比,使用 SVG 的优势在于:

1、SVG 可被非常多的工具读取和修改(比如记事本)

2、SVG 与 JPEG 和 GIF 图像比起来,尺寸更小,且可压缩性更强。

3、SVG 是可伸缩的

4、SVG 图像可在任何的分辨率下被高质量地打印

5、SVG 可在图像质量不下降的情况下被放大

6、SVG 图像中的文本是可选的,同时也是可搜索的(很适合制作地图)

7、SVG 可以与 Java 技术一起运行

8、SVG 是开放的标准

9、SVG 文件是纯粹的 XML

10、SVG 的主要竞争者是 Flash。

与 Flash 相比,SVG 最大的优势是与其他标准(比如 XSL 和 DOM)相兼容。而 Flash 则是未开源的私有技术。

SVG 是什么

可缩放矢量图形,即SVG,是W3C XML的分枝语言之一,用于标记可缩放的矢量图形。(摘自MDN)

上面代码中,先谈谈 svg 标签:

  • version: 表示 <svg> 的版本,目前只有 1.0,1.1 两种
  • xmlns:http://www.w3.org/2000/svg 固定值
  • xmlns:xlink:http://www.w3.org/1999/xlink 固定值
  • xml:space:preserve 固定值,上述三个值固定,表示命名空间,当数据单独存在svg文件内时,这3个值不能省略
  • class:就是我们熟悉的 class 类选择器
  • width | height: 定义 svg 画布的大小
  • viewbox: 定义了画布上可以显示的区域,当 viewBox 的大小和 svg 不同时,viewBox 在屏幕上的显示会缩放至 svg 同等大小

有了 svg 标签,我们就可以愉快的在内部添加 SVG 图形了

SVG 基本形状

SVG 线条动画基础入门知识

MDN Web 有基本形状的文档,建议去看看。包含矩形、圆形、椭圆、线条、多边形、折线等等。

好了,有了基本的了解,我们继续今天的话题,SVG 线条动画。

SVG 线条动画

先看看效果图,然后想想如果是你,该怎么实现这个效果了?

SVG 线条动画基础入门知识

ok,像以前一样,我们先来解析一下(按步骤实现):

1、svg画个按钮(基础形状-矩形)

2、矩形只保留下方底边

3、实现鼠标:hover事件 + 动画效果

svg画个按钮

<div class="button"> 
 <svg 
 viewBox="0 0 320 60" 
 version="1.1" 
 xmlns="http://www.w3.org/2000/svg" 
 > 
 <rect class="shape" height="60" width="320"></rect> 
 </svg> 
 <div class="hover-text">Web 秀</div> 
</div>

添加样式

.button { 
 position: absolute; 
 width: 320px; 
 height: 60px; 
 top: 50%; 
 left: 50%; 
 transform: translate(-50%, -50%); 
} 
.hover-text { 
 position: absolute; 
 line-height: 60px; 
 width: 320px; 
 top: 0; 
 color: #1199ff; 
 font-size: 28px; 
 text-align: center; 
 cursor: pointer; 
} 
.shape { 
 fill: transparent; 
 stroke-width: 4px; 
 stroke: #1199ff; 
}

SVG 线条动画基础入门知识

button垂直水平居中、shape透明填充,边框宽度4px,边框颜色#1199ff。

也许你会对fill、stroke-width等属性有点懵,下面看看他们的描述:

  • fill:类比 css 中的 background-color,给 svg 图形填充颜色;
  • stroke-width:类比 css 中的 border-width,给 svg 图形设定边框宽度;
  • stroke:类比 css 中的 border-color,给 svg 图形设定边框颜色;
  • stroke-linejoin | stroke-linecap:设定线段连接处的样式;
  • stroke-dasharray:值是一组数组,没数量上限,每个数字交替表示划线与间隔的宽度;
  • stroke-dashoffset:则是划线与间隔的偏移量

重点讲讲能够实现线条动画的关键属性 stroke-dasharray 。属性 stroke-dasharray 可控制用来描边的点划线的图案范式。

SVG 矩形只留底边

这里我们给按钮添加stroke-dasharray:

.shape { 
 ... 
 stroke-dasharray: 160 520; 
 stroke-dashoffset: -460; 
}

SVG 线条动画基础入门知识

SVG hover动画

.button:hover .hover-text { 
 transition: 0.5s; 
 color: pink; 
} 
 
.button:hover .shape { 
 -webkit-animation: draw 0.5s linear forwards; 
 animation: draw 0.5s linear forwards; 
} 
 
@keyframes draw { 
 0% { 
 stroke-dasharray: 160 520; 
 stroke-dashoffset: -460; 
 stroke-width: 4px; 
 } 
 100% { 
 stroke-dasharray: 760; 
 stroke-dashoffset: 0; 
 stroke-width: 2px; 
 stroke: pink; 
 } 
}

hover时,改变文字颜色,利用stroke-dasharray和stroke-dashoffset实现动画效果。

后续文章将会详述非规则图形,如何使用 PS + AI 生成 path 路径,实现 SVG 动画,敬请期待。

公告

喜欢小编的点击关注,了解更多知识!

源码地址和源文件下载请点击下方“了解更多”

击右上方红色按钮关注“web秀”,让你真正秀起来

前言

通常我们说的 Web 动画,其实包含了以下三大类:

1、CSS3 动画

2、javascript 动画(canvas)

3、html 动画(SVG)

3 种动画各有优劣,实际应用中根据情况作出取舍,本文讨论的是我认为 SVG 中在实际项目中非常有应用价值 SVG 线条动画。

SVG 的历史和优势(W3C)

在 2003 年一月,SVG 1.1 被确立为 W3C 标准。 参与定义 SVG 的组织有:太阳微系统、Adobe、苹果公司、IBM 以及柯达。 与其他图像格式相比,使用 SVG 的优势在于:

1、SVG 可被非常多的工具读取和修改(比如记事本)

2、SVG 与 JPEG 和 GIF 图像比起来,尺寸更小,且可压缩性更强。

3、SVG 是可伸缩的

4、SVG 图像可在任何的分辨率下被高质量地打印

5、SVG 可在图像质量不下降的情况下被放大

6、SVG 图像中的文本是可选的,同时也是可搜索的(很适合制作地图)

7、SVG 可以与 Java 技术一起运行

8、SVG 是开放的标准

9、SVG 文件是纯粹的 XML

10、SVG 的主要竞争者是 Flash。

与 Flash 相比,SVG 最大的优势是与其他标准(比如 XSL 和 DOM)相兼容。而 Flash 则是未开源的私有技术。

SVG 是什么

可缩放矢量图形,即SVG,是W3C XML的分枝语言之一,用于标记可缩放的矢量图形。(摘自MDN)

上面代码中,先谈谈 svg 标签:

  • version: 表示 <svg> 的版本,目前只有 1.0,1.1 两种
  • xmlns:http://www.w3.org/2000/svg 固定值
  • xmlns:xlink:http://www.w3.org/1999/xlink 固定值
  • xml:space:preserve 固定值,上述三个值固定,表示命名空间,当数据单独存在svg文件内时,这3个值不能省略
  • class:就是我们熟悉的 class 类选择器
  • width | height: 定义 svg 画布的大小
  • viewbox: 定义了画布上可以显示的区域,当 viewBox 的大小和 svg 不同时,viewBox 在屏幕上的显示会缩放至 svg 同等大小

有了 svg 标签,我们就可以愉快的在内部添加 SVG 图形了

SVG 基本形状

SVG 线条动画基础入门知识

MDN Web 有基本形状的文档,建议去看看。包含矩形、圆形、椭圆、线条、多边形、折线等等。

好了,有了基本的了解,我们继续今天的话题,SVG 线条动画。

SVG 线条动画

先看看效果图,然后想想如果是你,该怎么实现这个效果了?

SVG 线条动画基础入门知识

ok,像以前一样,我们先来解析一下(按步骤实现):

1、svg画个按钮(基础形状-矩形)

2、矩形只保留下方底边

3、实现鼠标:hover事件 + 动画效果

svg画个按钮

<div class="button"> 
 <svg 
 viewBox="0 0 320 60" 
 version="1.1" 
 xmlns="http://www.w3.org/2000/svg" 
 > 
 <rect class="shape" height="60" width="320"></rect> 
 </svg> 
 <div class="hover-text">Web 秀</div> 
</div>

添加样式

.button { 
 position: absolute; 
 width: 320px; 
 height: 60px; 
 top: 50%; 
 left: 50%; 
 transform: translate(-50%, -50%); 
} 
.hover-text { 
 position: absolute; 
 line-height: 60px; 
 width: 320px; 
 top: 0; 
 color: #1199ff; 
 font-size: 28px; 
 text-align: center; 
 cursor: pointer; 
} 
.shape { 
 fill: transparent; 
 stroke-width: 4px; 
 stroke: #1199ff; 
}

SVG 线条动画基础入门知识

button垂直水平居中、shape透明填充,边框宽度4px,边框颜色#1199ff。

也许你会对fill、stroke-width等属性有点懵,下面看看他们的描述:

  • fill:类比 css 中的 background-color,给 svg 图形填充颜色;
  • stroke-width:类比 css 中的 border-width,给 svg 图形设定边框宽度;
  • stroke:类比 css 中的 border-color,给 svg 图形设定边框颜色;
  • stroke-linejoin | stroke-linecap:设定线段连接处的样式;
  • stroke-dasharray:值是一组数组,没数量上限,每个数字交替表示划线与间隔的宽度;
  • stroke-dashoffset:则是划线与间隔的偏移量

重点讲讲能够实现线条动画的关键属性 stroke-dasharray 。属性 stroke-dasharray 可控制用来描边的点划线的图案范式。

SVG 矩形只留底边

这里我们给按钮添加stroke-dasharray:

.shape { 
 ... 
 stroke-dasharray: 160 520; 
 stroke-dashoffset: -460; 
}

SVG 线条动画基础入门知识

SVG hover动画

.button:hover .hover-text { 
 transition: 0.5s; 
 color: pink; 
} 
 
.button:hover .shape { 
 -webkit-animation: draw 0.5s linear forwards; 
 animation: draw 0.5s linear forwards; 
} 
 
@keyframes draw { 
 0% { 
 stroke-dasharray: 160 520; 
 stroke-dashoffset: -460; 
 stroke-width: 4px; 
 } 
 100% { 
 stroke-dasharray: 760; 
 stroke-dashoffset: 0; 
 stroke-width: 2px; 
 stroke: pink; 
 } 
}

hover时,改变文字颜色,利用stroke-dasharray和stroke-dashoffset实现动画效果。

后续文章将会详述非规则图形,如何使用 PS + AI 生成 path 路径,实现 SVG 动画,敬请期待。

公告

喜欢小编的点击关注,了解更多知识!

源码地址和源文件下载请点击下方“了解更多”