博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
有弹性效果的SVG元素
阅读量:6479 次
发布时间:2019-06-23

本文共 2452 字,大约阅读时间需要 8 分钟。

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

|

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

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

的演示用到 David DeSandro 的 。

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

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

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' ) );})();

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

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

|

英文原文:

由整理编译

转载地址:http://hxwuo.baihongyu.com/

你可能感兴趣的文章
突发小事件,USB接口问题
查看>>
Nginx负载均衡配置实例详解
查看>>
L1-009. N个数求和
查看>>
实参传递不当导致的运行时错误
查看>>
PHP生成静态html文件 的三种方法
查看>>
sqlserver 批量删除存储过程(转)
查看>>
自建型呼叫中心
查看>>
Inno setup中定制安装路径
查看>>
要懂得对你的老板好一点!
查看>>
HDU5139:Formula(找规律+离线处理)
查看>>
visio如何让动态连接线的单箭头变成双箭头?
查看>>
poj 1273 Drainage Ditches 网络流最大流基础
查看>>
Bash: how to check if a process id (PID) exists
查看>>
Mirantis Fuel fundations
查看>>
启动Tomcat一闪而过——分析及解决过程
查看>>
Android intent action大全
查看>>
使用 Flash Builder 的 Apple iOS 开发过程
查看>>
Android OpenGL ES(一)OpenGL ES介绍
查看>>
RabbitMq_05_Topics
查看>>
redis.conf
查看>>