Перейти к содержимому


Jquery - эффект летящей картинки при добавлении в корзину товара


  • Вы не можете ответить в тему
Сообщений в теме: 21

#1 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 23 December 2012 - 08:28 PM

Для того, чтобы показать вашим покупателям где находится корзина можно сделать интересный эффект, при котором например кнопочка "добавить в корзину" улетает в корзину.

В данном случае эта кнопочка сделана в виде картинки
<input type="button" id="product64749" src="/images/cart.png" onclick="animate_cart_my(this);">


Для обработки нажатия на кнопку есть функция animate_cart_my
тут я не буду описывать аяксовые отправки форм, это у каждого по своему, но вы можете вызывать функцию либо из аяксовой анимацию либо из анимации аякс.

function animate_cart_my (obj)
{
src = obj.src;

$('<img src="'+src+'"
	id="temp_cart_animate"
	style="z-index: 2000;
	position: absolute;
	top:'+Math.ceil($(obj).offset().top)+'px;
	left:'+Math.ceil($(obj).offset().left)+'px;">
	').prependTo('body');

	$('#temp_cart_animate').animate(
	{
		top: 150+$(window).scrollTop(),
		left: $('body').width()
	},
	700,
	function() {$('#temp_cart_animate').remove();});
}



А теперь распишу всё подробней
Math.ceil($(obj).offset().top)
и
Math.ceil($(obj).offset().left)
тут мы получаем координаты нашей исходной картинки



$('вася').prependTo('body');
добавление слова вася после открытого тега body, в моей функции добавляется новая картинка и располагается поверх исходной

$('#temp_cart_animate').animate(
	{
		top: 150+$(window).scrollTop(),
		left: $('body').width()
	},
	700,
	function() {$('#temp_cart_animate').remove();});


тут мы для вновь созданную картинку анимировано сдвигаем, сверху отступ будет 150 пикселей с учетом скрола страницы

слева отступ будет таким, чтобы картинка улетела за пределы страницы вправо, далее мы удаляем нашу картинку, чтобы не мешалась
  • 0

#2 idal

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 243 сообщений
Репутация: 7
Начинающий
  • ГородКиев

Отправлено 27 December 2012 - 12:01 PM

А куда что нужно ставить ?
  • 0

#3 ssergioss25

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 56 сообщений
Репутация: 24
Ассистент
  • ГородСПБ

Отправлено 10 March 2014 - 04:14 PM

Предложу один из вариантов. Не могу гарантировать, что будет правильно работать у всех, тк не имею возможности проверить на дефолтовом шаблоне. Предполагается, что jquery подключен, корзина на ajax, а ее картинка имеет :

id = "cart"


В user.js находим строку :

function doLoad(forse) {

и меняем ее на :


function doLoad(forse,pr_id) {

$("#target_"+pr_id)
.clone()
.css({'position' : 'absolute', 'z-index' : '1000'})
.appendTo("#fly_"+pr_id)
.animate({opacity: 0.5,marginTop: $("#cart").offset().top - $("#fly_"+pr_id).offset().top,marginLeft: $("#cart").offset().left - $("#fly_"+pr_id).offset().left, width: 50, height: 50}, 700,
function() {
$(this).remove();
});


В этой же функции имеет смысл закоментировать или удалить :

document.getElementById('axcrt').style.display = '';
document.getElementById('axcrt').style.visibility = 'visible';

для того, чтобы убрать сообщение об успешно добавленном в корзину товаре.

В product_detailed.tpl к картинкам товара (обычно прописаны условия, какую картинку отображать, в зависимости от присутствия большой,средней,маленькой, поэтому прописать нужно в нескольких местах) добавлем :

id="target_{$product_info.productID}"

а перед ними вставляем :

<span id="fly_{$product_info.productID}"></span>

например :

<span id="fly_{$product_info.productID}"></span><img id="target_{$product_info.productID}" src="data/medium/{$product_info.thumbnail}" alt="{$product_info.name}" id="{$product_info.big_picture}" class="vert">

В ссылке отправки товара в корзину, в вызове функции doLoad, до завершения передаваемых параметров знаком ")" добавляем :

, '{$product_info.productID}'

То есть, строку :

onclick="doLoad('do=cart&amp;addproduct={$product_info.productID}{counter name='select_counter_hidden' start=0 skip=1 print=false}{counter name='select_counter_hidden_extra' start=0 skip=1 print=false}{section name=i loop=$product_extra}{if $product_extra[i].option_type eq 1}{section name=s loop=$product_extra[i].option_show_times}&amp;option_select_hidden_{counter name=select_counter_hidden}='+document.HiddenFieldsForm.option_select_hidden_{counter name=select_counter_hidden_extra}.value+'{/section}{/if}{/section}&amp;xcart=yes&amp;multyaddcount='+document.HiddenFieldsForm.multyaddcount.value+'')

меняем на :

onclick="doLoad('do=cart&amp;addproduct={$product_info.productID}{counter name='select_counter_hidden' start=0 skip=1 print=false}{counter name='select_counter_hidden_extra' start=0 skip=1 print=false}{section name=i loop=$product_extra}{if $product_extra[i].option_type eq 1}{section name=s loop=$product_extra[i].option_show_times}&amp;option_select_hidden_{counter name=select_counter_hidden}='+document.HiddenFieldsForm.option_select_hidden_{counter name=select_counter_hidden_extra}.value+'{/section}{/if}{/section}&amp;xcart=yes&amp;multyaddcount='+document.HiddenFieldsForm.multyaddcount.value+'', '{$product_info.productID}')

По аналогии делается и в кратком описании товара.
  • 1

#4 Jeck2000

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 159 сообщений
Репутация: 8
Начинающий
  • ГородСанкт-Петербург

Отправлено 16 November 2014 - 05:24 PM

Не удалось чего-то никак реализовать. Может кто-то уже сделал подобное и по подробней распишет, если не жалко ?

У меня так после замены

function doLoad(forse) {

на

function doLoad(forse,pr_id) {
$("#target_"+pr_id)
.clone()
.css({'position' : 'absolute', 'z-index' : '1000'})
.appendTo("#fly_"+pr_id)
.animate({opacity: 0.5,marginTop: $("#cart").offset().top - $("#fly_"+pr_id).offset().top,marginLeft: $("#cart").offset().left - $("#fly_"+pr_id).offset().left, width: 50, height: 50}, 700,
function() {
$(this).remove();
});

корзина уже перестает работать
  • 0

#5 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 16 November 2014 - 05:40 PM

(шепотом) а jquery в head.tpl.html грузится?
Нынче редко у кого уже не грузится, но вдруг.
Код явно предполагает наличие библиотеки jquery.

PS. Поставь уже браузер FireFox и плагин firebug для него. Он все тебе скажет - что не так и чего не хватает. Скорее всего.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#6 Jeck2000

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 159 сообщений
Репутация: 8
Начинающий
  • ГородСанкт-Петербург

Отправлено 16 November 2014 - 07:56 PM

если у меня отключить jquery, то у меня сайт развалится по частям :) процентов 70 всяких примочек там ней работают , конечно же она грузиться :).

Файрфокс стоит, но честно говоря че-то я видимо не очень понимаю ,какую информацию смотреть в файрбаге по этому поводу

Я не совсем корректно выразился об ошибке. Не то, чтобы корзина не работает, а получается, что при замене кода, которая указана выше, перестает работать кнопка добавления в корзину, т.е. нажимаешь на нее , а не происходит вообще ничего. (ни в подробном описании, ни в спец-предложении, короче везде

  • 0

#7 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 16 November 2014 - 09:09 PM

при замене кода, которая указана выше, перестает работать кнопка добавления в корзину

Это понятно. Плагин FireBug поможет увидеть, почему и где это происходит. Это дебаггер такой довольно удобный. ИМХО, самый удобный.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#8 Jeck2000

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 159 сообщений
Репутация: 8
Начинающий
  • ГородСанкт-Петербург

Отправлено 16 November 2014 - 09:55 PM

при замене кода, которая указана выше, перестает работать кнопка добавления в корзину

Это понятно. Плагин FireBug поможет увидеть, почему и где это происходит. Это дебаггер такой довольно удобный. ИМХО, самый удобный.

Firebug, безусловно удобнейшая штука и при отладки разметки страницы она мне безумно помогает (а еще удобно драть ченить с других сайтов из CSS :) , но тут видимо надо смотреть, что с Java скриптом происходит, а я от него немного далек :) , но вот что он мне выдет

TypeError: $(...).offset(...) is null

....5,marginTop: $("#cart").offset().top - $("#fly_"+pr_id).offset().top,marginLeft...
  • 0

#9 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 16 November 2014 - 11:17 PM

null оно скорее всего потому, что такого элемента просто нет.
offset-ов там всего два - с #target_ и #fly_.
Элементы с id="target_{product_info.productID}" и id="fly_{product_info.productID}" должны были быть добавлены как указано выше. Если их offset().top равен null, значит их не существует на момент выполнения яваскрипта. Собственно, именно про это написано "обычно прописаны условия, какую картинку отображать, в зависимости от присутствия большой,средней,маленькой, поэтому прописать нужно в нескольких местах".

PS. Я поставил себе ради спортивного интереса - все работает.

Визуально очень симпатичное, кстати, дополнение. И простейшее по реализации.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#10 Jeck2000

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 159 сообщений
Репутация: 8
Начинающий
  • ГородСанкт-Петербург

Отправлено 17 November 2014 - 07:54 AM

PS. Я поставил себе ради спортивного интереса - все работает.

Визуально очень симпатичное, кстати, дополнение. И простейшее по реализации.


А не подскажешь тогда, куда чего прописывать правильно ? а то очень хотелось бы его на проект на один повесить :)
  • 0

#11 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 17 November 2014 - 01:14 PM

А не подскажешь тогда, куда чего прописывать правильно ?

Ты не поверишь, но я сделал банально по вышенаписанной инструкции :).
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#12 Jeck2000

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 159 сообщений
Репутация: 8
Начинающий
  • ГородСанкт-Петербург

Отправлено 17 November 2014 - 02:10 PM

Блин, да не работает оно ни хрена, я уже и на дефолтовый шаблон повесил, ну не работает. Тут же делать не фиг, ну вот смотри,

Я беру блок user.js

function doLoad(forse) {
var agt=navigator.userAgent.toLowerCase();
var is_major = parseInt(navigator.appVersion);
var is_ie	 = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
var is_ie6    = (is_ie && (is_major == 4) && (agt.indexOf("msie 6.")!=-1) && (agt.indexOf("msie 7.")==-1) && (agt.indexOf("msie 8.")==-1));
    if(document.getElementById('axcrt')){
	    if ( !is_ie6 ){
	    document.getElementById('axcrt').style.left = Math.ceil((document.documentElement.clientWidth-300)/2)+'px';
	    document.getElementById('axcrt').style.top = Math.ceil((document.documentElement.clientHeight-100)/2)+'px';
	    }
	    if ( is_ie ){
		    if (document.styleSheets.length == 0) document.createStyleSheet();
		    var oSheet = document.styleSheets[0];
		    oSheet.addRule(".WCHhider", "visibility:hidden");
	    }
	    document.getElementById('axcrt').style.display = '';
	    document.getElementById('axcrt').style.visibility = 'visible';
    }
	    JsHttpRequest.query(
		    'index.php', forse,
		    // Function is called when an answer arrives.
		    function(result, errors) {
			    setTimeout('doHide()',1500);
			    doCart(result);
		    },
		    true  // do not caching
	    );
}

заменяю и получается так

function doLoad(forse,pr_id) {
$("#target_"+pr_id)
.clone()
.css({'position' : 'absolute', 'z-index' : '1000'})
.appendTo("#fly_"+pr_id)
.animate({opacity: 0.5,marginTop: $("#cart").offset().top - $("#fly_"+pr_id).offset().top,marginLeft: $("#cart").offset().left - $("#fly_"+pr_id).offset().left, width: 50, height: 50}, 700,
function() {
$(this).remove();
});
var agt=navigator.userAgent.toLowerCase();
var is_major = parseInt(navigator.appVersion);
var is_ie	 = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
var is_ie6    = (is_ie && (is_major == 4) && (agt.indexOf("msie 6.")!=-1) && (agt.indexOf("msie 7.")==-1) && (agt.indexOf("msie 8.")==-1));
    if(document.getElementById('axcrt')){
	    if ( !is_ie6 ){
	    document.getElementById('axcrt').style.left = Math.ceil((document.documentElement.clientWidth-300)/2)+'px';
	    document.getElementById('axcrt').style.top = Math.ceil((document.documentElement.clientHeight-100)/2)+'px';
	    }
	    if ( is_ie ){
		    if (document.styleSheets.length == 0) document.createStyleSheet();
		    var oSheet = document.styleSheets[0];
		    oSheet.addRule(".WCHhider", "visibility:hidden");
	    }
	    document.getElementById('axcrt').style.display = '';
	    document.getElementById('axcrt').style.visibility = 'visible';
    }
	    JsHttpRequest.query(
		    'index.php', forse,
		    // Function is called when an answer arrives.
		    function(result, errors) {
			    setTimeout('doHide()',1500);
			    doCart(result);
		    },
		    true  // do not caching
	    );
}


После это замены кнопка перестает работать. Я тут правильно замену делаю ?
  • 0

#13 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 17 November 2014 - 07:31 PM

Блин, да не работает оно ни хрена

http://cpu.badisoft.ru/BookReaders/PocketBook/PocketBook-IQ-701.html
Там корзины нет (нет элемента c id="cart"), поэтому оба $("#cart").offset() заменены на ноль, т.е. мувить картинку в левый верхний угол, а не в корзину. В остальном все так же.
Не работает? :).

я уже и на дефолтовый шаблон повесил, ну не работает. Тут же делать не фиг

Хм... Т.е. мы сейчас что-то обсуждаем именно потому, что там делать нефиг, но ты решил приколоться? :)

После это замены кнопка перестает работать. Я тут правильно замену делаю ?

Тут - правильно.
А работать кнопка перестает потому, что не сделана замена где-то в другом месте, где должна быть сделана. Поэтому этот совершенно правильный код не работает. Выпадает в ошибку раньше, чем доходит дело до исполнения штатных действий "нажата кнопка в корзину".

PS. Йопть, там все написано, в инструкции. А в firebug-е твоем ИСЧЕРПЫВАЮЩЕ написано, почему не работает кнопка. Точнее, какая ошибка случается.
  • 1
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#14 ssergioss25

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 56 сообщений
Репутация: 24
Ассистент
  • ГородСПБ

Отправлено 18 November 2014 - 02:45 PM

Визуально очень симпатичное, кстати, дополнение. И простейшее по реализации.


Спасибо, приятно слышать ) Давненько я тут не был.Уже совсем и забыл все ) По поводу этого дополнения,помню лишь,что пришлось изменить

<span id="fly_{$product_info.productID}"></span>

на

<div id="fly_{$product_info.productID}"></div>

Тк FireFox (именно он почему то) в случае с тегом span некоррекно рассчитывал координаты анимации картинки.
  • 0

#15 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 18 November 2014 - 03:26 PM

Тк FireFox (именно он почему то) в случае с тегом span некоррекно рассчитывал координаты анимации картинки.

Рассчитывает-то, скорее всего, правильно. Просто сам тэг располагает в другом месте, ниже картинки, хотя по коду он перед картинкой.
По крайней мере, у меня так. Так что я оставил span, но заменил appendTo() на prependTo(). А вообще оно от остальной окружающей верстки, как я понимаю, сильно зависит.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#16 Jeck2000

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 159 сообщений
Репутация: 8
Начинающий
  • ГородСанкт-Петербург

Отправлено 18 November 2014 - 04:45 PM

УРА ! Заработало ! Спасибо за эффектик ! Очень кстати пришелся к проекту магазина игрушек
  • 0

#17 Jeck2000

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 159 сообщений
Репутация: 8
Начинающий
  • ГородСанкт-Петербург

Отправлено 18 November 2014 - 06:43 PM

Подскажите пожалуйста , как бы это еще реализовать для спец-предложения ?

Проделав те же манипуляции по установке, при нажатии "в корзину" получается, что пытается взлететь только перва я картинка, причем какой бы товар не клал в корзину, пытается взлететь именно картинка от первого товара, а пытается, потому что не взлетает, а привзлетывает :)
  • 0

#18 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 18 November 2014 - 07:39 PM

После добавления в product_detailed работает хорошо, улетает в корзину (хотя она у меня встроена в шаблон, а не выводится блоком, но картинка улетает в нее .Как только добавляю в product_brief - картинка сразу начинает лететь мимо корзины наверх в край сайта (хотя и в ее сторону, но мимо), причем как в кратком, так и в полном описании (хотя как это связано - не понимаю)

Судя по тому, что я вижу - она одинаково "куда-то в верхний угол" улетает и в кратком, и в полном описании.
Хотя нет. Теперь у меня в результате попыток выяснения есть две страницы полного описания и две страницы краткого. Т.е. по два экземпляра каждой страницы, где на одной картинка улетает в корзину, на другой - в угол :).

Подскажите пожалуйста , как бы это еще реализовать для спец-предложения ?

Очевидно, добавлять к функции doLoad не product_info, которого в спецпредложениях нет, а special_offers, если я правильно помню название массива.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#19 Jeck2000

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 159 сообщений
Репутация: 8
Начинающий
  • ГородСанкт-Петербург

Отправлено 18 November 2014 - 09:20 PM

Очевидно, добавлять к функции doLoad не product_info, которого в спецпредложениях нет, а special_offers, если я правильно помню название массива.


Пробовал, одна фигня (ему почему то по фиг, что там, хоть product_info, хоть special_offers , результат один, пытается лететь (точнее на дефолтном шаблоне даже полетела куда надо), только вот летит все равно только одна и та же картинка - первого товара, на какой бы не нажал. Попробовал special_offers[i] - вообще работать перестает

В подробном и кратком все полетело как надо, (div в любом случае пришлось поставить вместо спана), теперь летит в корзину, ног картинка для вылета появляется справа, практически на целое расстояние размера от самой картинки. Но это впринципе терпимо при учете, что летит куда надо
  • 0

#20 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 18 November 2014 - 09:31 PM

Пробовал, одна фигня

Второй раз в этой теме я понимаю, что зря тебе что-то пишу бесплатно.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)