Эластичные SVG элементы
Несколько примеров эластичных SVG для анимации элементов пользовательского интерфейса.
Сегодня мы бы хотели продемонстрировать несколько примеров эффекта эластичности. Идея заключается в внедрении SVG элемента в компонент страницы, с целью его дальнейшей анимации. Данную технику можно применить к меню, кнопкам или другим элементам пользовательского интерфейса.
Для анимации SVG, будем использовать Snap.svg. Это блестящая JavaScript библиотека для работы с SVG.
В качестве иконок используем Font Awesome.
Помните, что данные примеры будут работать как следует в последних версиях браузеров.
Вот как мы будем использовать SVG с компонентами (в нашем случае в меню):
Мы используем два data атрибута для хранения SVG путей, которые в дальнейшем будем видоизменять (в зависимости от открытия и закрытия меню).
Элементы SVG будут располагаться абсолютно по отношению к меню; так же нам нужно немного пространства для того, чтобы во время анимации элементы не обрезались. Помните, что при расширении SVG на 100%, пропорции не сохраняются. Это очень важно в случае использования некоторых фигур. В данном примере мы выставляем не только 100% высоте и ширине элемента, но и задали фиксированные размеры контейнеру с SVG:
Используя Snap.svg мы можем видоизменить форму объекта:
Надеемся, что данные примеры произвели на вас впечатление!
Сегодня мы бы хотели продемонстрировать несколько примеров эффекта эластичности. Идея заключается в внедрении SVG элемента в компонент страницы, с целью его дальнейшей анимации. Данную технику можно применить к меню, кнопкам или другим элементам пользовательского интерфейса.
Для анимации SVG, будем использовать Snap.svg. Это блестящая JavaScript библиотека для работы с SVG.
В качестве иконок используем Font Awesome.
Помните, что данные примеры будут работать как следует в последних версиях браузеров.
Вот как мы будем использовать SVG с компонентами (в нашем случае в меню):
Код
<nav id="menu" class="menu">
<button class="menu__handle"><span>Menu</span></button>
<div class="menu__inner">
<ul>
<li><a href="#"><i class="fa fa-fw fa-home"></i><span>Home<span></a></li>
<li><a href="#"><i class="fa fa-fw fa-heart"></i><span>Favs<span></a></li>
<li><a href="#"><i class="fa fa-fw fa-folder"></i><span>Files<span></a></li>
<li><a href="#"><i class="fa fa-fw fa-tachometer"></i><span>Stats<span></a></li>
</ul>
</div>
<div class="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">
<svg width="100%" height="100%" viewBox="0 0 600 800" preserveAspectRatio="none">
<path fill="none" d="M300-10c0,0,0,164,0,410c0,232,0,410,0,410"/>
</svg>
</div>
</nav>
<button class="menu__handle"><span>Menu</span></button>
<div class="menu__inner">
<ul>
<li><a href="#"><i class="fa fa-fw fa-home"></i><span>Home<span></a></li>
<li><a href="#"><i class="fa fa-fw fa-heart"></i><span>Favs<span></a></li>
<li><a href="#"><i class="fa fa-fw fa-folder"></i><span>Files<span></a></li>
<li><a href="#"><i class="fa fa-fw fa-tachometer"></i><span>Stats<span></a></li>
</ul>
</div>
<div class="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">
<svg width="100%" height="100%" viewBox="0 0 600 800" preserveAspectRatio="none">
<path fill="none" d="M300-10c0,0,0,164,0,410c0,232,0,410,0,410"/>
</svg>
</div>
</nav>
Мы используем два data атрибута для хранения SVG путей, которые в дальнейшем будем видоизменять (в зависимости от открытия и закрытия меню).
Элементы SVG будут располагаться абсолютно по отношению к меню; так же нам нужно немного пространства для того, чтобы во время анимации элементы не обрезались. Помните, что при расширении SVG на 100%, пропорции не сохраняются. Это очень важно в случае использования некоторых фигур. В данном примере мы выставляем не только 100% высоте и ширине элемента, но и задали фиксированные размеры контейнеру с SVG:
Код
.morph-shape {
position: absolute;
width: 240px;
height: 100%;
top: 0;
right: 0;
}
.morph-shape svg path {
stroke: #5f656f;
stroke-width: 5px;
}
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' ) );
})();
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' ) );
})();
Надеемся, что данные примеры произвели на вас впечатление!
-
FalleN -
5201 -
1 -
327
Но только нужно ставить наверное на те модули которые обновляться должны не раньше через пару тройку минут
С Уважением, Андрей...