Доброго времени знатоки. Снова нуждаюсь в вашей помощи. Есть анимация svg кнопки "гамбургер". Работает чудесно, нажав на нее открывается и закрывается. Но мне надо добавить, чтобы можно было ее закрыть не нажимая на нее. А закрыв меню скажем свернув нажав в другом месте (не на иконку "гамбургера"). Чтобы запустился обработчик снова.
<script>
(function nadavi() {
function SVGHamburger( el, options ) {
this.el = el;
this.init();
}
SVGHamburger.prototype.init = function() {
this.shapeEl = this.el.querySelector( 'span.morph-shape' );
var s = Snap( this.shapeEl.querySelector( 'svg' ) );
this.pathEl1 = s.select( 'path:nth-of-type(1)' );
this.pathEl2 = s.select( 'path:nth-of-type(2)' );
this.paths = {
reset : {
path1 : this.pathEl1.attr( 'd' ),
path2 : this.pathEl2.attr( 'd' )
},
open : this.shapeEl.getAttribute( 'data-morph-open' ).split( ';' ),
close : this.shapeEl.getAttribute( 'data-morph-close' ).split( ';' )
};
this.isOpen = false;
this.initEvents();
};
SVGHamburger.prototype.initEvents = function() {
this.el.addEventListener( 'click', this.toggle.bind(this) );
};
SVGHamburger.prototype.toggle = function() {
var self = this,
paths = this.isOpen ? this.paths.close : this.paths.open;
if( self.isOpen ) {
setTimeout( function() { classie.remove( self.el, 'menu-button--open' ); }, 200 );
}
else {
setTimeout( function() { classie.add( self.el, 'menu-button--open' ); }, 200 );
}
this.pathEl1.stop().animate( { 'path' : paths[0] }, 300, mina.easeout, function() {
self.pathEl1.stop().animate( { 'path' : self.paths.reset.path1 }, 800, mina.elastic );
} );
this.pathEl2.stop().animate( { 'path' : paths[1] }, 300, mina.easeout, function() {
self.pathEl2.stop().animate( { 'path' : self.paths.reset.path2 }, 800, mina.elastic );
} );
this.isOpen = !this.isOpen;
};
new SVGHamburger( document.getElementById( 'menusToggleBt' ) );
})();
Нажимая на мой код, чтобы закрыть гамбургер, он его закрывает (просто удаляет класс открытой. .removeClass("menu-button--open")
if (document.body.clientWidth<=978) {
$(".navItem a").click(function(){
$("#menusToggleBt").removeClass("menu-button--open");
Но когда я снова нажимаю на гамбургер, получается что он думает что открытый... И потому не добавляет класс menu-button--open. И за этого постоянно проблемы. Помогите как мне это правильно обработать. Чтобы скрыв меню (адаптивное выезжающее) оно и закрыло ПРАВИЛЬНО гамбургер.
Вот на всякий случай код самой кнопки: (без стилей)
<button id="menusToggleBt" class="menu-button">
<span class="nadavi" style="margin-right: 5px;" >МЕНЮ</span><span id="morph-shape" class="morph-shape" data-morph-open="M3,20c0,0,12-4,27-4s27,4,27,4;M3,60c0,0,12,4,27,4s27-4,27-4" data-morph-close="M3,20c0,0,12,4,27,4s27-4,27-4;M3,60c0,0,12-4,27-4s27,4,27,4">
<svg width="100%" height="100%" viewBox="0 0 60 80" preserveAspectRatio="none">
<path d="M3,20C3,20,15,20,30,20C45,20,57,20,57,20"></path>
<line x1="3" y1="40" x2="57" y2="40"></line>
<path d="M3,60C3,60,15,60,30,60C45,60,57,60,57,60"></path>
</svg>
</span>
</button>
(Что такое - "classie"?)
Не следует хранить отдельный флаг состояния isOpen - он неизбежно когда-нибудь рассинхронизируется с действительным состоянием объекта (что и происходит в Вашем коде). Если Вам понадобится выяснить открыт фрагмент или закрыт, используйте $().hasClass.
SVGHamburger.prototype.toggle = function() {
var self = this,
paths = $(this.el).hasClass('menu-button--open') ?
this.paths.close : this.paths.open;
setTimeout(function() { $(self.el).toggleClass('menu-button--open'); }, 200);
...
Продвижение своими сайтами как стратегия роста и независимости