Анимация добавления товара в корзину, Minishop2
        Привет всем!
Может кому-то пригодится данное решение. Анимация при добавлении товара в корзину.

На странице каталога подключаем скрипт:
И вызов:
Можно анимировать кнопку AddCart.
Все настроено под стандартную верстку Minishop2 или можно поправить .eq(1) 1,2,3… в зависимости от вложенности.
Пример
Вариант 2
Просто вставляем на странице каталога:
    
    
                                                                                
            Может кому-то пригодится данное решение. Анимация при добавлении товара в корзину.

На странице каталога подключаем скрипт:
<script type='text/javascript' src="js/fly.js"></script>скрипт fly.js И вызов:
<script type="text/javascript"> 
$("button[name='ms2_action']").on('click', function () { 
var btn = $(this).parent('.ms2_form').find('button'); 
var flyimg = $(btn).parents().eq(1).siblings().find('img').eq(0); 
flyToElement($(flyimg), $('.not_empty .glyphicon-shopping-cart')); 
// Анимация кнопки AddCart
//flyToElement($(btn), $('.not_empty .glyphicon-shopping-cart')); 
// Автопрокрутка
$('html, body').animate({ 
'scrollTop' : $("body").position().top 
}); 
}); 
</script> Можно анимировать кнопку AddCart.
Все настроено под стандартную верстку Minishop2 или можно поправить .eq(1) 1,2,3… в зависимости от вложенности.
var flyimg = $(btn).parents().eq(2).siblings().find('img').eq(0); Пример
Вариант 2
Просто вставляем на странице каталога:
<script>
$("button[name='ms2_action']").on('click', function () {
        var cart = $('#msMiniCart');
        var btn = $(this).parent('.ms2_form').find('button'); 
        var flyimg = $(btn).parents().eq(1).siblings().find('img').eq(0); 
        
        if (flyimg) {
            var imgclone = flyimg.clone()
                .offset({
                top: flyimg.offset().top,
                left: flyimg.offset().left
            })
                .css({
                'opacity': '0.7',
                    'position': 'absolute',
                   /* 'height': '150px',
                    'width': '150px',*/
                    'z-index': '100'
            })
                .appendTo($('body'))
                .animate({
                'top': cart.offset().top + 10,
                    'left': cart.offset().left + 10,
                    'width': 75,
                   /* 'height': 75*/
            }, 1000, 'easeInOutExpo');
            
             setTimeout(function () {
                 $('html, body').animate({ 'scrollTop' : $("body").position().top }); 
            }, 300);
            setTimeout(function () {
                cart.effect("shake", {
                    times: 2
                }, 200);
            }, 1500);
 
            imgclone.animate({
                'width': 0,
                    'height': 0
            }, function () {
                $(this).detach()
            });
        }
    });
</script>Так же, при необходимости указывая нужную вложенность .parents().eq(2), для поиска изображения.    Комментарии: 19
                чёт не хочет работать…            
                    
                Посмотрите рабочий пример https://codepen.io/Rs10Fl/pen/YYmqVN должно получиться            
                    
                Пробовал этот код на страницу категории, вообще перестает работать, белый экран…            
                    
                У вас наверное включен Fenom, добавьте пробел между фигурной скобкой в этой строке: 
$(flyerClone).css({ ПРОБЕЛ position: 'absolute'…
                    $(flyerClone).css({ ПРОБЕЛ position: 'absolute'…
                точно, с пробелом страница работает, а анимация не хочет..( хм… 
прикольная штука…
                    прикольная штука…
                оно и в примере как то через раз выдаёт ошибку…            
                    
                Какую ошибку? Там в примере срабатывает submit формы, поэтому страница перезагружается.
Вот пример codepen.io/Rs10Fl/pen/JjoRzMe без форм.
                    Вот пример codepen.io/Rs10Fl/pen/JjoRzMe без форм.
                без форм теперь нормально работает в примере, но у меня на странице категории не хочет… как с формами, так и без них…            
                    
                блин, в примерах работает отлично, а на сайте не хочет…
срабатывает только сообщение jGrowl
                    срабатывает только сообщение jGrowl
                Покажите содержимое чанка вывода товара в категорию. Или сами попробуйте отладить в codepen.io/Rs10Fl/pen/JjoRzMe            
                    
                Вот шаблон категории:
                    <!DOCTYPE html>
<html lang="ru">
  <head>
	[[$counters]]
	[[$meta]]	
  </head>  
  <body>
	<div class="wrapper">
	  [[$headerInner]]
	  <section id="category-grid">	  
		[[!mFilter2?
		&paginator=`pdoPage`
		&class=`msProduct`
		&element=`msProducts`
		&includeThumbs=`small,medium,big`
		&parents=`[[*id]]`
		&includeTVs=`avaible`
		&processTVs=`1`
		&tplOuter=`mFilter2OuterTpl`
		&tpls=`gridProductTpl,listProductTpl`
		
		&limit=`12`
		&sort=`resource|menuindex:asc`
		&aliases=`
		ms|price==price,
		ms|vendor==vendor,
		msoption|fasovka==fasovka,
		msoption|srok==srok,
		msoption|reprodukcia==reprodukcia
		`
		&filters=`
		ms|price:number,
		ms|vendor:vendors,
		msoption|fasovka:default,
		msoption|srok:default,
		msoption|reprodukcia:default
		`
		&tplFilter.outer.price=`tpl.mFilter2.filter.slider`
		&tplFilter.row.price=`tpl.mFilter2.filter.number`
		
		
		]]
	  </section>	  
	  [[$footer]]
	</div>
	[[$scripts]]	
  </body>
</html>А вот код чанка gridProductTpl:<div class="col-xs-12 col-sm-4 no-margin product-item-holder hover ms2_product">
  <div class="product-item">
    <form method="post" class="ms2_form">
	  <input type="hidden" name="id" value="{$id}">
	  <input type="hidden" name="count" value="1">
	  <input type="hidden" name="options" value="[]">
	  <div class="ribbons">
		{if $favorite?}
		<div class="ribbon red"><span>[[%product.skidka1? &namespace=`babel` &topic=`translate`]]</span></div>
		{/if}
		{if $new?}
		<div class="ribbon blue"><span>[[%product.new? &namespace=`babel` &topic=`translate`]]</span></div>
		{/if}
		{if $popular?}
		<div class="ribbon green"><span>[[%product.popular? &namespace=`babel` &topic=`translate`]]</span></div>
		{/if}
	  </div>
	  <div class="image">
		{if $image?}
		<a href="{$id | url}">
		  <img class="lazy" src="[[+medium]]" alt="[[+longtitle:default=`[[+pagetitle]]`]] -фото" title="[[+longtitle:default=`[[+pagetitle]]`]] -изображение"  width="200"/>
		</a>
		{else}
		<img class="lazy" src="{'assets_url' | option}components/minishop2/img/web/ms2_small.png"
		srcset="{'assets_url' | option}components/minishop2/img/web/ms2_small@2x.png 2x"
		alt="[[+longtitle:default=`[[+pagetitle]]`]] -фото" title="[[+longtitle:default=`[[+pagetitle]]`]] -изображение"/>
		{/if}
	  </div>
	  <div class="body">
		[[+old_price:neq=`0`:then=`<div class="label-discount green">-[[percent? &newprice=`[[+price]]` &oldprice=`[[+old_price]]`]]% [[%product.skidka2? &namespace=`babel` &topic=`translate`]]</div>`]]
		<div class="title">
		  <a href="{$id | url}">{$pagetitle}</a>
		</div>
		<div class="brand">{$_pls['vendor.name']}</div>
		<div class="reviews_product">
		  <i class="fa fa-comments-o"> <p>  [[!ecMessagesCount:default=`0` ? &thread=`resource-[[+id]]`]]</p></i>
		</div> 	
		<div class="availability">
		  <label>[[%product.nalichie? &namespace=`babel` &topic=`translate`]]</label>
		  [[+avaible:eq=`1`:then=`<span class="available">[[%product.est? &namespace=`babel` &topic=`translate`]]</span>`]]
		  [[+avaible:eq=`2`:then=`<span class="available">[[%product.zakanchivaetsa? &namespace=`babel` &topic=`translate`]]</span>`]]
		  [[+avaible:eq=`0`:then=`<span class="available">[[%product.net? &namespace=`babel` &topic=`translate`]]</span>`]]
		</div>
	  </div>
	  <div class="prices">
	    {if $old_price?}
		<div class="price-prev">{$old_price} грн</div>
		{/if}
		{if $price?}
		<div class="price-current pull-right">{$price} грн</div>
		{else}
		<div class="price-current pull-right"><p>[[%product.dog.cena? &namespace=`babel` &topic=`translate`]]</p></div>
		{/if}
	  </div>
	  <div class="hover-area">
		[[+avaible:neq=`0`:then=`<div class="add-cart-button">
		<button type="submit" name="ms2_action" value="cart/add" class="le-button">[[%product.in.basket? &namespace=`babel` &topic=`translate`]]</button>
		</div>
		`]]
		<div class="wish-compare">
		  [[!addComparison?
		  &list_id=`[[++sravnenie_tovarov]]`
		  &list=`semena`
		  &id=`[[+id]]`
		  &tpl=`addComparisonTpl`
		  ]]
		</div>
	  </div>
	</form>
  </div>
</div>            
                В вашем случае так будет:
На:
                    <script type="text/javascript"> 
$(document).ready(function(){ $('.ms2_form').on('submit', function(){ }); 
$("button[name='ms2_action']").on('click', function () { 
 
var btn = $(this).parent('.add-cart-button').find('button'); 
var flyimg = $(btn).parents().eq(1).siblings().find('img').eq(0); 
flyToElement($(flyimg), $('.not_empty .glyphicon-shopping-cart')); 
// Анимация кнопки AddCart
//flyToElement($(btn), $('.not_empty .glyphicon-shopping-cart')); 
// Автопрокрутка
$('html, body').animate({ 
'scrollTop' : $("body").position().top 
}); 
}); 
}); 
  
  
function flyToElement(flyer, flyingTo) {
	var $func = $(this);
	var divider = 3;
	var flyerClone = $(flyer).clone();
	$(flyerClone).css({position: 'absolute', top: $(flyer).offset().top + "px", left: $(flyer).offset().left + "px", opacity: 1, 'z-index': 1000});
	$('body').append($(flyerClone));
	var gotoX = $(flyingTo).offset().left + ($(flyingTo).width() / 2) - ($(flyer).width()/divider)/2;
	var gotoY = $(flyingTo).offset().top + ($(flyingTo).height() / 2) - ($(flyer).height()/divider)/2;
	 
	$(flyerClone).animate({
		opacity: 0.4,
		left: gotoX,
		top: gotoY,
		width: $(flyer).width()/divider,
		height: $(flyer).height()/divider
	}, 700,
	function () {
		$(flyingTo).fadeOut('fast', function () {
			$(flyingTo).fadeIn('fast', function () {
				$(flyerClone).fadeOut('fast', function () {
					$(flyerClone).remove();
				});
			});
		});
	});
}
</script>Исправить нужно было:var btn = $(this).parent('.ms2_form').find('button'); На:
var btn = $(this).parent('.add-cart-button').find('button');            
                класс! +тысяча в карму вам и спасибо огромное)
всё заработало.
только первый раз когда добавляешь в корзину, то картинка летит куда-то в бок, а уже затем в корзину, я вот что поменял:
на:
                    всё заработало.
только первый раз когда добавляешь в корзину, то картинка летит куда-то в бок, а уже затем в корзину, я вот что поменял:
flyToElement($(flyimg), $('.not_empty .glyphicon-shopping-cart')); на:
flyToElement($(flyimg), $('.not_empty .ms2_total_count'));            
                всё решил.
поменял на:
теперь и первый товар тоже в корзину летит, фух.
                    поменял на:
flyToElement($(flyimg), $('.basket .dropdown-toggle')); теперь и первый товар тоже в корзину летит, фух.
                Наверное более правильнее вешать этот код не на клик по кнопке. Ведь клик не всегда будет означать успешное добавление товара в корзину.
Правильнее на
miniShop2.Callbacks.add('Cart.add.response.success', 'orders_add_ok', function(response) {
console.log(response);
});
docs.modx.pro/komponentyi/minishop2/razrabotka/skriptyi-i-stili
Так конечно потеряется контекст и найти картинку через this будет невозможно. Зато напрашивается еще более простой путь — response вернет id товара, если в верстке добавить аналогичный id для изображения товара, то найти и анимировать картинку станет легко.
                    Правильнее на
miniShop2.Callbacks.add('Cart.add.response.success', 'orders_add_ok', function(response) {
console.log(response);
});
docs.modx.pro/komponentyi/minishop2/razrabotka/skriptyi-i-stili
Так конечно потеряется контекст и найти картинку через this будет невозможно. Зато напрашивается еще более простой путь — response вернет id товара, если в верстке добавить аналогичный id для изображения товара, то найти и анимировать картинку станет легко.
                Интересно, а для карточки товара есть такое решение?            
                    
                А что мешает указать нужные классы для карточки товара?            
                    
                А оно так сработает? Попробую. Спасибо.
Это новый скрипт надо делать, + к предыдущему?
                    Это новый скрипт надо делать, + к предыдущему?
                Попробовал, не хочет работать, поменять классы не достаточно к сожалению            
                    
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.