Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.01.2017, 16:58
Профессор
Отправить личное сообщение для smart-create Посмотреть профиль Найти все сообщения от smart-create
 
Регистрация: 25.10.2016
Сообщений: 157

Скрипт не работает для нескольких объектов
Добрый день! Создаю дизайн кнопки с анимационным эффектом при нажатии, с помощью фильтров svg.

в результате получилось вот это: http://villabavaria.net/catering/test/

Эффект делаю с помощью библиотеки TweenMax и вот такого скрипта:

function initBt8() {
  var bt = $('.component-8')[0];
  var turb = $('#filter-ripple-1 feImage')[0];
  var dm = $('#filter-ripple-1 feDisplacementMap')[0];
  
  bt.addEventListener('click', function(e) {
    TweenLite.set(turb, { attr: { x: isFF ? e.offsetX : e.offsetX + 10, y: isFF ? e.offsetY : e.offsetY + 10, width: 0, height: 0 } });
    TweenLite.to(turb, 3, { attr: { x: '-=300', y: '-=300', width: 600, height: 600 } });
    TweenLite.fromTo(dm, 2, { attr: { scale: 30 } }, { attr: { scale: 0 } });
  });
  
}


Кнопка имеет разметку:
<a href="#" class="component-8 button button--8" style="filter: url('#filter-ripple-1')">ЗАБРОНИРОВАТЬ</a>


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

Теоретически я понимаю что где-то в скрипте не хватает $(this), но не понимаю куда его нужно приткнуть.

Прошу помощи
Ответить с цитированием
  #2 (permalink)  
Старый 04.01.2017, 17:13
Профессор
Отправить личное сообщение для Царь Леонид Посмотреть профиль Найти все сообщения от Царь Леонид
 
Регистрация: 22.08.2013
Сообщений: 217

Я думаю как-то так надо:
//выбирать надо класс, общий для всех кнопок 
var btn = document.querySelector(".component-8");
[].forEach.call(btn, function(item){
var turb = item.querySelector('#filter-ripple-1 feImage');
var dm = item.querySelector('#filter-ripple-1 feDisplacementMap');
item.addEventListener('click', function(e) {
    TweenLite.set(turb, { attr: { x: isFF ? e.offsetX : e.offsetX + 10, y: isFF ? e.offsetY : e.offsetY + 10, width: 0, height: 0 } });
    TweenLite.to(turb, 3, { attr: { x: '-=300', y: '-=300', width: 600, height: 600 } });
    TweenLite.fromTo(dm, 2, { attr: { scale: 30 } }, { attr: { scale: 0 } });
  });
})

Последний раз редактировалось Царь Леонид, 04.01.2017 в 17:22.
Ответить с цитированием
  #3 (permalink)  
Старый 04.01.2017, 17:16
Аспирант
Отправить личное сообщение для TestUser013 Посмотреть профиль Найти все сообщения от TestUser013
 
Регистрация: 13.07.2013
Сообщений: 94

Как-то так...

function initBt8() {
 $('.component-8').each(function(i,bt) {
  var turb = $('#filter-ripple-1 feImage')[i];
  var dm = $('#filter-ripple-1 feDisplacementMap')[i];
  
  bt.addEventListener('click', function(e) {
    TweenLite.set(turb, { attr: { x: isFF ? e.offsetX : e.offsetX + 10, y: isFF ? e.offsetY : e.offsetY + 10, width: 0, height: 0 } });
    TweenLite.to(turb, 3, { attr: { x: '-=300', y: '-=300', width: 600, height: 600 } });
    TweenLite.fromTo(dm, 2, { attr: { scale: 30 } }, { attr: { scale: 0 } });
  });
  
}

Последний раз редактировалось TestUser013, 04.01.2017 в 17:17. Причина: Опередили :)
Ответить с цитированием
  #4 (permalink)  
Старый 04.01.2017, 18:43
Профессор
Отправить личное сообщение для smart-create Посмотреть профиль Найти все сообщения от smart-create
 
Регистрация: 25.10.2016
Сообщений: 157

TestUser013, Царь Леонид, спасибо за попытку, но не помогло, при чем без каких либо видимых причин, консоль молчит.

Я воспользовался идей, TestUser013, и не много её докрутил, получилось вот так:
function initBt8() {
	$('.component-8').click(function() {
		var bt = $(this)[0];
		var turb = $('#filter-ripple-1 feImage')[0];
		var dm = $('#filter-ripple-1 feDisplacementMap')[0];
	  
		bt.addEventListener('click', function(e) {
			TweenLite.set(turb, { attr: { x: isFF ? e.offsetX : e.offsetX + 10, y: isFF ? e.offsetY : e.offsetY + 10, width: 0, height: 0 } });
			TweenLite.to(turb, 3, { attr: { x: '-=300', y: '-=300', width: 600, height: 600 } });
			TweenLite.fromTo(dm, 2, { attr: { scale: 30 } }, { attr: { scale: 0 } });
		});
	})
}


В итоге - эффект теперь срабатывает при нажатии на любую из кнопок - и это уже хорошо, НО он и отражается на всех кнопках сразу(

вот пример/

Есть у кого-то какие-то идеи?
Ответить с цитированием
  #5 (permalink)  
Старый 04.01.2017, 19:36
Аспирант
Отправить личное сообщение для TestUser013 Посмотреть профиль Найти все сообщения от TestUser013
 
Регистрация: 13.07.2013
Сообщений: 94

Сообщение от smart-create Посмотреть сообщение
эффект теперь срабатывает при нажатии на любую из кнопок
Нет, только при нажатии на первую. Попробуйте вот так:

$('.component-8').each(function(i,bt) {
    bt.addEventListener('click', function(e) {
        var turb = $('#filter-ripple-1 feImage')[0];
        var dm = $('#filter-ripple-1 feDisplacementMap')[0];
        TweenLite.set(turb, { attr: { x: isFF ? e.offsetX : e.offsetX + 10, y: isFF ? e.offsetY : e.offsetY + 10, width: 0, height: 0 } });
        TweenLite.to(turb, 3, { attr: { x: '-=300', y: '-=300', width: 600, height: 600 } });
        TweenLite.fromTo(dm, 2, { attr: { scale: 30 } }, { attr: { scale: 0 } });
    });
});


А после этого разбирайтесь как работает TweenLite.
Ответить с цитированием
  #6 (permalink)  
Старый 04.01.2017, 20:01
Профессор
Отправить личное сообщение для smart-create Посмотреть профиль Найти все сообщения от smart-create
 
Регистрация: 25.10.2016
Сообщений: 157

Большое спасибо, заработало. Сейчас буду разбираться с TweenLite.

И пользуясь случаем задам другой вопрос, поскольку уже к этой теме приковано внимание.

Есть самый обычный скрипт который обеспечивает плавную прокрутку при нажатии на якорную ссылку:

$(document).ready(function(){ 
	$('a[href*=#]').bind("click", function(e){ 
		var anchor = $(this); 
		$('html, body').stop().animate({ 
			scrollTop: $(anchor.attr('href')).offset().top - $('.navbar').outerHeight()
			}, 1000); 
			e.preventDefault(); 
		}); 
	return false; 
});


Тут все понятно, нажал человек на объект в ссылке которого указан не урл а id-блока и промотало его до блока с соответствующим id за 1000.

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

Заранее благодарен
Ответить с цитированием
  #7 (permalink)  
Старый 04.01.2017, 20:18
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

smart-create,
}, 1000, 'easeInElastic'); при наличии jqueryui на странице
Ответить с цитированием
  #8 (permalink)  
Старый 04.01.2017, 23:53
Профессор
Отправить личное сообщение для smart-create Посмотреть профиль Найти все сообщения от smart-create
 
Регистрация: 25.10.2016
Сообщений: 157

рони, сделал вот так:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script>
$(document).ready(function(){ 
	$('a[href*="#"]').bind("click", function(e){ 
		var anchor = $(this); 
		$('html, body').stop().animate({ 
			scrollTop: $(anchor.attr('href')).offset().top - $('.navbar').outerHeight()
			}, 1000, 'easeInElastic'); 
			e.preventDefault(); 
		}); 
	return false; 
});
</script>


При нажатии на нужную ссылку нечего не происходит визуально, но по факту происходит "dos-атака" клиента)) в консоли с бешеной скоростью появляется одна и та же ошибка:
jquery.min.js:3 Uncaught TypeError: r.easing[this.easing] is not a function
    at init.run (jquery.min.js:3)
    at i (jquery.min.js:3)
    at Function.r.fx.timer (jquery.min.js:3)
    at hb (jquery.min.js:3)
    at HTMLHtmlElement.g (jquery.min.js:3)
    at Function.dequeue (jquery.min.js:3)
    at HTMLHtmlElement.<anonymous> (jquery.min.js:3)
    at Function.each (jquery.min.js:2)
    at r.fn.init.each (jquery.min.js:2)
    at r.fn.init.queue (jquery.min.js:3)


И этот процесс не останавливается, я в первый раз не заметил, и не мог понять посему кулер на процессоре стал вращаться быстрее винта реактивного двигателя, а комп полностью умер - пришлось перезагружать)) Потом увидел что за минуту набегает приблизительно 15 000 ошибок.

Не подскажите в чем дело может быть? Как видите библиотека jq подключена - последняя версия с гугла
Ответить с цитированием
  #9 (permalink)  
Старый 05.01.2017, 00:08
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от рони
при наличии jqueryui
строка 2 в начало добавить
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
Ответить с цитированием
  #10 (permalink)  
Старый 05.01.2017, 00:38
Профессор
Отправить личное сообщение для smart-create Посмотреть профиль Найти все сообщения от smart-create
 
Регистрация: 25.10.2016
Сообщений: 157

рони, большое спасибо и приношу извинения за невнимательность
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Один скрипт для всех форм на странице smart-create Events/DOM/Window 18 01.11.2016 14:06
jquery для placeholder работает только для первого input в ie Nailya jQuery 1 13.05.2014 09:57
Прогресс бар для загрузки нескольких файлов через XHR Ваяс AJAX и COMET 0 04.12.2013 13:03
скрипт для браузерки ванка Общие вопросы Javascript 11 11.10.2013 12:20
поиск классов внутри тега yozuul jQuery 24 14.06.2013 22:00