任何有开发经验的前端工程师都会考虑到不成体系的设备生态所带来的挑战。设备间不同的屏幕尺寸、分辨率和比例使得产品难以提供一致的体验,对于那些对产品有着像素级完美追求的人这种体验差异尤其显著! SVG(可缩放的矢量图形)完美地解决了上文中提到的部分问题。尽管 SVG 有它的局限性,但是在某些场景下是非常有用的,如果你有一个好的设计团队,你也可以基于SVG创建一些震撼的视觉体验,而不必担心给浏览器带来过重的渲染负担或阻碍页面的加载时间。

在过去的几个月里,我一直在做一个大量使用了 SVG 及其动画效果的项目。在本文中,我将介绍如何使用SVG及其动画技术为你的 Web 前端开发带来一些新鲜的体验。

可缩放矢量图形

SVG 是一种基于 XML 文档的图片格式,所以大部分情况其特性表现类似于 HTML。它为许多常见的几何图形定义了不同的元素,通过组合这些不同的形状元素可以生成 SVG 二维图形。SVG 规范是由万维网联盟(W3C)于1999制定的标准,所有的主流浏览器目前均支持了 SVG 的渲染。由于 SVG 图形是 XML 文档,因此 Web 浏览器提供的 DOM 相关的 API,同样可作用于与 SVG 图形的交互。

SVG 路径

如果要说出 SVG 中最强大的元素,毫无疑问是 (路径元素)。 路径元素是一个可以构建出你所能想象的几乎任何高级的2D图形的基本形状。路径元素通过一系列绘图命令来生效,它非常类似于1967年的 Logo 编程语言,不同的是它只是更现代化的,为复杂花哨的图形而设计的。这些绘图命令如下图所示,被写在路径元素的 d 属性中 :

 <!-- A right-angled triangle -->
<path d="M10 10 L75 10 L75 75 Z" />

你可以把它想象成一支虚拟的画笔在屏幕上作画,而路径元素的 d 属性中的绘图命令控制着画笔的走向。上图的示例中,画笔一开始移动到起点坐标 (10,10) (M10 10),以 (75,10)为终点画直线(L75 10),接着又画一条直线至 (75,75) (L75 75),最后的 Z 表示画笔回到起点坐标以闭合路径。

使用一些其他的绘图命令,例如绘圆弧(A)、二次贝塞尔曲线(Q)、三次贝塞尔曲线(C)等等,你可以在 SVG 中创建出很多组合的形状和矢量图形。

你可以点击这里了解更多关于路径元素的知识 >> path element。

SVG 路径与 CSS

也许你会问:“好吧我知道 Paths 很强大,但是我怎样才能对它做路径动画呢?”。

因此我们第一步需要利用到 SVG 的两个属性: stroke-dasharray 和 stroke-dashoffset 。

stroke-dasharray 属性可以控制图案描边路径的样式,如果你并不想用连续的直线去绘制路径,而希望通过一些不同样式的虚线,你就可以使用这个属性。

由于 SVG 图形其实也是浏览器 DOM 的组成部分,因此 stroke-dasharray 作为一个控制外观的属性,也可以直接用作一个 CSS 样式属性,达到同样的设置效果。

类似的,stroke-dashoffset 属性(虚线在原路径下的偏移量)也同样可以使用 CSS 来进行设置。

这两个属性的组合使用可以生成 SVG 路径动画,给人一种图案的轮廓线逐渐拟合的视觉感受。

例如下面这个二次贝塞尔曲线的例子:

 <path fill="transparent" stroke="#000000" stroke-width="" d="M10 80 Q 77.5 10, 145 80 T 280 80" class="path"></path>

为了平稳流畅地绘制出这个路径,首先我们需要通过 stroke-dasharray 属性设置虚线段的长度,将 stroke-dasharray 属性的值设为该路径的长度。这样的话就将虚线的每一段 dash 和 gap 的长度等于整段路径的长。

下一步我们需要使用 stroke-dashoffset 属性将虚线的偏移量设置为 0,此时我们看到的路径描边就是没有间断的连续曲线(实际上看到的是虚线段的第一段,前面已经设置每一虚线段的长度等于该曲线的长)。通过设置虚线偏移量等于曲线的长度,那该曲线恰好“消失”(实际上看到的是虚线段的一段间隙)。

通过 stroke-dashoffset 属性,同时结合 CSS3 的 animation,你可以让该曲线一点点的出现在屏幕上,这就是 SVG 路径动画的原理。

 <svg width="300px" height="175px" version="1.1">

    <path fill="transparent" stroke="#000000" stroke-width="" d="M10 80 Q 77.5 10, 145 80 T 280 80" class="path"></path>

 </svg>
svg {
width: 300px;
display: block;
position: absolute;
.path {
stroke-dasharray: ;
stroke-dashoffset: ;
animation: dash 1s linear;
}
@keyframes dash {
from {
stroke-dashoffset: ;
}
to {
stroke-dashoffset: ;
}
}
}

可以看到,我们只是改变了虚线的偏移来让虚线段的部分一点一点地出现。

运用相同的原理来设置多条路径的动画,可以得到更炫酷的效果:

 <svg width="300px" height="175px" version="1.1">
<path fill="transparent" stroke="#000000" stroke-width="" d="M10 80 Q 77.5 10, 145 80 T 280 80" class="path"></path>
<path fill="transparent" stroke="#FF2851" stroke-width="" d="M10 80 Q 77.5 10, 145 80 T 280 80" class="line2"></path>
<path fill="transparent" stroke="#000000" stroke-width="" d="M10 80 Q 77.5 10, 145 80 T 280 80" class="line1"></path>
</svg> svg {
width: 300px;
display: block;
position: absolute;
} svg .line1 {
stroke-dasharray: ;
stroke-dashoffset: ;
animation: dash .5s linear alternate infinite;
} svg .line2 {
stroke-dasharray: ;
stroke-dashoffset: ;
animation: dash2 .5s linear alternate infinite;
} @keyframes dash {
from {
stroke-dashoffset: ;
}
to {
stroke-dashoffset: ;
}
} @keyframes dash2 {
from {
stroke-dashoffset: ;
}
to {
stroke-dashoffset: -;
}
}

办公资源网址导航 https://www.wode007.com

上面在 SVG 中画了3条路径:其中一条是固定的黑色曲线, 有一条沿着路径移动的红色曲线,后面跟着另一条黑色曲线。

stroke-dasharray 和 stroke-dashoffset 是创造大量 SVG 路径动画所要用到的两个重要属性,你可以点击这里(一个方便的小工具)来体会这两个属性。

沿 SVG 路径的动画对象

通过 SVG 和 CSS,我们可以让一个对象或者元素沿着 SVG 路径做一些动效,过程中我们会用到两个属性:

  • offset-path:offset-path 是一个 CSS 属性,它表示元素的运动路径;

  • offset-distance:同样是一个 CSS 属性,定义了元素在路径上运动的距离,单位是数值或百分比;

通过组合使用这两个属性,你可以非常容易地创建出类似下面的动画:

 <svg width="300px" height="175px" version="1.1">
<path fill="transparent" stroke="#888888" stroke-width="" d="M10 80 Q 77.5 10, 145 80 T 280 80" class="path"></path>
</svg>
<div class="ball"></div> svg {
width: 300px;
display: block;
position: absolute;
} .ball {
width: 10px;
height: 10px;
background-color: red;
border-radius: %;
offset-path: path('M10 80 Q 77.5 10, 145 80 T 280 80');
offset-distance: %;
animation: red-ball 2s linear alternate infinite;
} @keyframes red-ball {
from {
offset-distance: %;
}
to {
offset-distance: %;
}
}

上面我们让一个 div.ball 的元素动了起来,同样的我们可以对任何元素( div , image , text...)做这种路径动画。在这个例子中我们简单的用 offset-path 画出了元素的运动路径,然后用 offset-distance 控制元素在路径上的运动距离从 0% 到100%。

使用 JavaScript 做 SVG 动画

以上如果还不足以满足你的动画需求,你可以考虑借助 JavaScript。

使用 JavaScript 对 SVG 元素做动画与对 DOM 元素做动画相似。然而我们可以更容易地实现上面提到的动画效果。之前,我们需要将路径长度硬编码在 CSS 中。借助 JavaScript 的 path.getTotalLength() 函数可以获取 DOM 上路径的长度,你可以点击这里了解更多。除此之外,有很多第三方库可以帮助你十分容易地制作 SVG 动画。

Snap.svg 不仅可以使 JavaScript 绘制 SVG 图形变得更容易,它的使用也异常简单,只需要调用 .animate({}) 这个API即可。 另外一个库 anime.js 通过几行代码就可以让一个元素沿着 SVG 路径运动,点击这里 常看更多 DEMO。

如果你需要一个本身已经为你做了大部分操作来生成复杂的动画的库,Vivus 是比较适合你的,它采取了一种不同的调用方式,仅需要通过配置项的方式去生成 SVG 路径动画。你只需要用你想作用的 SVG 元素的 id 来新建一个 Vivus 对象,然后就交给 Vivus 来处理剩下的事情。

如何使用SVG及其动画技术为你的 Web 前端开发带来一些新鲜的体验的更多相关文章

  1. Web前端开发大系概览 (前端开发技术栈)

    前言 互联网建立50多年了,网站开发技术日新月异,但web前端始终离不开浏览器,最终还是HTML+JavaScript+CSS这3个核心,围绕这3个核心而开发出来大量技术框架/解决方案. 我从2000 ...

  2. 通往成功的钥匙--Web前端开发技术

    互联网是一个服务性行业,用户对网站良好的体验度,直接影响到网站的效果.无论你做了多少广告推广,没有用户体验度等于零.Web前端技术是为了解决用户体验度而诞生的.无论是百度.新浪.阿里巴巴等大型网站,还 ...

  3. 网络统计学与web前端开发基础技术

    网络统计学与web前端开发基础技术 学习web前端开发基础技术(网页设计)需要了解:HTML.CSS.JavaScript三种语言.下面我们就来了解一下这三门技术在网页设计中的用途: HTML是网页内 ...

  4. [转] Web前端开发工程师常用技术网站整理

    1.常用工具相关 有道云笔记 http://note.youdao.com/signIn/index.html 36镇-最好用的共享收藏夹 http://www.36zhen.com/ 浏览器同步测试 ...

  5. Web前端开发工程师常用技术网站整理

    1.常用工具相关 有道云笔记 http://note.youdao.com/signIn/index.html 36镇-最好用的共享收藏夹 http://www.36zhen.com/ 浏览器同步测试 ...

  6. Web前端开发最佳实践(7):使用合理的技术方案来构建小图标

    大家都对网站上使用的小图标肯定都不陌生,这些小图标作为网站内容的点缀,增加了网站的美观度,提高了用户体验,可是你有没有看过在这些网站中使用的图标都是用什么技术实现的?虽然大部分网站还是使用普通的图片实 ...

  7. 上海洋码头(www.ymatou.com)急招技术人才(职位:互联网软件开发工程师,.NET网站架构师,Web前端开发工程师,高级测试工程师,产品经理)

    对公司招聘职位有兴趣的童鞋可以把简历发送到zhangzhiqiang@ymatou.com,我们HR会快速给你答复. 互联网软件开发工程师 岗位职责: 1.参与洋码头各个平台(www.ymatou.c ...

  8. 学习Web前端开发时有哪些技术点

    现在学前端的人是越来越多,学习质量也是参差不齐.过来人的身份告诉你,如果你还没有下定决心花时间去学习Web前端,那也可以先找些视频学习下,Web前端开发有哪些常见技术点!接下来,就看看Web前端开发有 ...

  9. 2020年Web前端开发工程师市场怎么样?学会什么技术才能拿到高薪

    几乎整个互联网行业都缺前端工程师,不仅在刚起步的创业公司,对上市公司乃至巨头这个问题也一样存在.据统计,国外的前端开发人员和后端开发人员比例约1:1,但是在国内比例却在1:3以下, Web前端开发职位 ...

随机推荐

  1. java实现还款计算

    标题: 还款计算 银行贷款的等额本息还款方法是: 每月还固定的金额,在约定的期数内正好还完(最后一个月可能会有微小的零头出入). 比如说小明在银行贷款1万元.贷款年化利率为5%,贷款期限为24个月. ...

  2. Java实现考察团组成

    考察团组成 某饭店招待国外考察团.按照标准,对领导是400元/人,随团职员200元/人,对司机50元/人. 考察团共36人,招待费结算为3600元,请问领导.职员.司机各几人. 答案是三个整数,用逗号 ...

  3. pytorch入门2.0构建回归模型初体验(数据生成)

    pytorch入门2.x构建回归模型系列: pytorch入门2.0构建回归模型初体验(数据生成) pytorch入门2.1构建回归模型初体验(模型构建) pytorch入门2.2构建回归模型初体验( ...

  4. ODEINT 求解常微分方程(4)

    import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt # function tha ...

  5. HashMap(三)之源码分析

    通过分析HashMap来学习源码,那么通过此过程我们要带着这几个问题去一起探索 为什么要学习源码 怎么去学习 0.1 为什么要学习源码 这个问题,直接给出结论,学习源码肯定是有好处的,比如: 学习优秀 ...

  6. PHP配合JS导出Excel大量数据

    一般使用PHP导出Excel表格都会用PHPExcel,但是当遇到要导出大量数据时,就会导致超时,内存溢出等问题.因此在项目中放弃使用这种方式,决定采用前段生成Excel的方式来解决问题. 步骤如下: ...

  7. [LOJ#500]「LibreOJ β Round」ZQC的拼图

    题目   点这里看题目. 分析   首先不难发现答案具有单调性,因此可以二分答案.答案上限为\(V=2m\times \max\{a_i, b_i\}\).   考虑如何去判断当前的答案.设这个答案为 ...

  8. .Net Core微服务入门全纪录(三)——Consul-服务注册与发现(下)

    前言 上一篇[.Net Core微服务入门全纪录(二)--Consul-服务注册与发现(上)]已经成功将我们的服务注册到Consul中,接下来就该客户端通过Consul去做服务发现了. 服务发现 同样 ...

  9. 2019-02-02 Python学习之死锁和Rlock

    死锁:"当一个线程永远地持有一个锁,并且其他线程都尝试去获得这个锁时,那么它们将永远被阻塞" e.g. import threading import time mutexboy ...

  10. LeetCode 77,组合挑战,你能想出不用递归的解法吗?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode第46篇文章,我们一起来LeetCode中的77题,Combinations(组合). 这个题目可以说是很精辟了,仅仅 ...