有弹性效果的SVG元素

简介: 今天分享一下带有弹性元素的灵感。这个想法是整合SVG元素成为带有弹性动画的组件。使用SVG能使菜单、按钮和其他元素变得更有趣,让交互也更加自然友好。但是不能过度使用弹性效果,只要有微小的变化即可。

今天分享一下带有弹性元素的灵感。这个想法是整合SVG元素成为带有弹性动画的组件。使用SVG能使菜单、按钮和其他元素变得更有趣,让交互也更加自然友好。但是不能过度使用弹性效果,只要有微小的变化即可。


演示 | 代码下载

为了实现 SVG 动画,我们可以使用 Snap.svg,这是一个很棒的 JavaScript SVG 库,适合主流现代浏览器。

在一些演示中使用的图标是由大卫·甘迪设计的 Font Awesome

draggable & droppable element的演示用到 David DeSandro 的 Dragabilly

请注意,这些演示只在新版本的现代浏览器中正常运行。

下面的代码将演示如何使用 SVG 的组件做工具条的动画:

<navid="menu"class="menu">

   <buttonclass="menu__handle"><span>Menu</span></button>

   <divclass="menu__inner">

       <ul>

           <li><ahref="#"><iclass="fa fa-fw fa-home"></i><span>Home<span></a></li>

           <li><ahref="#"><iclass="fa fa-fw fa-heart"></i><span>Favs<span></a></li>

           <li><ahref="#"><iclass="fa fa-fw fa-folder"></i><span>Files<span></a></li>

           <li><ahref="#"><iclass="fa fa-fw fa-tachometer"></i><span>Stats<span></a></li>

       </ul>

   </div>

   <divclass="morph-shape"data-morph-open="M300-10c0,0,295,164,295,410c0,232-295,410-295,410"data-morph-close="M300-10C300-10,5,154,5,400c0,232,295,410,295,410">

       <svgwidth="100%"height="100%"viewBox="0 0 600 800"preserveAspectRatio="none">

           <pathfill="none"d="M300-10c0,0,0,164,0,410c0,232,0,410,0,410"/>

       </svg>

   </div>

</nav>

SVG插入到菜单到后面,我们用两个 data 属性来存储路径,动画将会使用这个默认的路径。

SVG 在菜单里为绝对位置,并且保证两侧有足够的空间以免弹性动画时元素被截断。SVG设置高宽为100%,而不是按比例,就可以做成自适应的。这对保持特定的形状很重要。包裹SVG的.morph-shape要设置固定的宽度:

.morph-shape {

   position: absolute;

   width: 240px;

   height: 100%;

   top: 0;

   right: 0;

}

.morph-shape svg path {

   stroke: #5f656f;

   stroke-width: 5px;

}

通过 Snap.svg,我们可以很容易的做到变形动画:

(function() {

   function SVGMenu( el, options ) {

       this.el = el;

       this.init();

   }

   SVGMenu.prototype.init = function() {

       this.trigger = this.el.querySelector( 'button.menu__handle' );

       this.shapeEl = this.el.querySelector( 'div.morph-shape' );

       var s = Snap( this.shapeEl.querySelector( 'svg' ) );

       this.pathEl = s.select( 'path' );

       this.paths = {

           reset : this.pathEl.attr( 'd' ),

           open : this.shapeEl.getAttribute( 'data-morph-open' ),

           close : this.shapeEl.getAttribute( 'data-morph-close' )

       };

       this.isOpen = false;

       this.initEvents();

   };

   SVGMenu.prototype.initEvents = function() {

       this.trigger.addEventListener( 'click', this.toggle.bind(this) );

   };

   SVGMenu.prototype.toggle = function() {

       var self = this;

       if( this.isOpen ) {

           classie.remove( self.el, 'menu--anim' );

           setTimeout( function() { classie.remove( self.el, 'menu--open' );   }, 250 );

       }

       else {

           classie.add( self.el, 'menu--anim' );

           setTimeout( function() { classie.add( self.el, 'menu--open' );  }, 250 );

       }

       this.pathEl.stop().animate( { 'path' : this.isOpen ? this.paths.close : this.paths.open }, 350, mina.easeout, function() {

           self.pathEl.stop().animate( { 'path' : self.paths.reset }, 800, mina.elastic );

       } );

       this.isOpen = !this.isOpen;

   };

   new SVGMenu( document.getElementById( 'menu' ) );

})();

通过正确的函数和合适的时间设置,一个略有弹性、有组织的运动效果做好了。但是选项多种多样,并依赖于特定上下文的整体感觉,所以可能性是无穷无尽的:)

希望你喜欢这些小的特效,并做出更多有意思的效果!

相关文章
|
存储 编解码 监控
C++与OpenGL结合实现的屏幕监控软件:高性能屏幕录制解决方案
使用C++和OpenGL结合,本文展示了如何创建高性能屏幕录制软件。通过OpenGL的`glReadPixels`获取屏幕图像,存储为视频文件,再利用C++的网络编程(如libcurl)将监控数据提交到网站。示例代码包括了屏幕捕获和数据上传的简单实现。
518 2
|
云安全 存储 供应链
云上快报 | 阿里云混合云再攀新高 斩获信通院2项大奖 高分通过电子四院云基准评测获引领级
随着企业数字化转型进程推进,各行业企业在数字基础设施一体化云平台、研运数字化治理、客户服务、人力资源、供应链等业务单元对数字化产品平台以及相关服务商数字化服务能力的需求逐渐明晰,如何选择可信的数字化服务成为企业推进自身数字化工作的关键。近日,阿里云混合云凭借业界领先的能力,屡获多个国家权威级机构的认证和大奖:高分通过电子四院云基准评测获引领级、混合云解决方案顺利通过可信云【混合云安全能力要求】增强级(最高级)认证、全国首批通过数字化可信服务评估的企业等,成为政企数字化转型的首选技术基础设施。
4232 0
云上快报 | 阿里云混合云再攀新高 斩获信通院2项大奖 高分通过电子四院云基准评测获引领级
|
SQL 自然语言处理 关系型数据库
MySQL的match匹配多个字符串的语法
【8月更文挑战第27天】MySQL的match匹配多个字符串的语法
459 67
|
Java UED
Java中String强转int:一种常见的错误和解决方法
在Java中将非数字字符串转换为整数会导致`NumberFormatException`。要解决这个问题,可以使用`try-catch`捕获异常,正则表达式验证数字格式,或利用异常信息提供错误提示。例如,`Integer.parseInt()`会因遇到非数字字符如`&quot;123abc&quot;`而抛出异常,但通过异常处理或正则`\\d+`可确保安全转换。记得在编程时避免直接强转,以防止程序异常中断。
|
监控 安全 Java
Spring Boot优雅Shutdown时异步线程安全优化
Spring Boot优雅Shutdown时异步线程安全优化
|
9月前
|
数据采集 监控 搜索推荐
商业案例 I 数据中台用户场景案例
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
|
10月前
|
Java
BIO、NIO、AIO 有什么区别
BIO(阻塞I/O)模型中,服务器实现模式为一个连接一个线程;NIO(非阻塞I/O)使用单线程或少量线程处理多个请求;AIO(异步I/O)则是在NIO基础上进一步优化,采用事件通知机制,提高并发处理能力。
326 6
|
机器学习/深度学习 自然语言处理 算法
AIGC技术的核心算法与发展趋势
【7月更文第27天】随着人工智能技术的迅速发展,AIGC技术已经逐渐成为内容创造领域的一个重要组成部分。这些技术不仅能够帮助人们提高工作效率,还能创造出以往难以想象的新颖内容。本文将重点介绍几种核心算法,并通过一个简单的代码示例来展示如何使用这些算法。
358 7
|
弹性计算
阿里云10M带宽收费价格表
阿里云10M带宽收费价格表,阿里云服务器上海地域10M带宽一年优惠价格5355元,10M带宽一个月525元,地域不同带宽价格不同,阿里云服务器网以华东1(上海)地域为例,5M及5M以下带宽按照23元一个月的价格收取,6M及6M以上公网带宽按照80元一个月的价格收取。阿里云百科使用阿里云价格计算器,计算一下阿里云10M公网带宽一个月价格和一年价格
280 0
|
负载均衡 关系型数据库 分布式数据库
【PolarDB开源】PolarDB读写分离实践:优化读取性能与负载均衡策略
【5月更文挑战第26天】PolarDB是云原生关系型数据库,通过读写分离优化性能和扩展性。它设置主节点处理写操作,从节点处理读操作,异步复制保证数据一致性。优化读取性能的策略包括增加从节点数量、使用只读实例和智能分配读请求。负载均衡策略涉及基于权重、连接数和地理位置的分配。实践示例中,电商网站通过主从架构、只读实例和负载均衡策略提升商品查询效率。PolarDB的读写分离与负载均衡为企业应对大数据和高并发提供了有效解决方案。
445 0