Анимация для движения блока вниз и вверх
Добрый день!
Впервые хочу задать сложный вопрос. Есть страница с частыми вопросами и ответами на них, вот здесь я подготовил. И есть плагин с очень хорошим эффектом анимации на нём — «swingFromTo». (!Работает только в -webkit- почему-то. Конкретно в Chrome) Уважаемые знатоки, подскажите пожалуйста, как приспособить этот эффект (swingFromTo) для прокрутки к нужному вопросу и обратно вот сюда? Буду невероятно признателен. |
snovapavel,
чем swing в jQuery.animate не устраивает https://jsfiddle.net/uxjp0cg7/1/ или выберите сами http://api.jqueryui.com/easings/ jQuery UI только подключите если нужно что-то кроме 'linear' и 'swing' https://jsfiddle.net/uxjp0cg7/2/ |
Уважаемый, Рони!
Я их естественно смотрел уже (эффекты) ). Но там нет необходимого мне. Обратите внимание, в нужном мне эффекте, как-бы происходит разгон (в начале движения, чуть откатывается назад, за рамку), затем движение вперёд до конца и опять же небольшой вылет за границу рамки и только после этого останавливается на месте. Поэтому я и прошу Вашей помощи, уважаемый, Рони, в реализации этого. Я тут вот нашёл какой-то плагин, где присутствует название нужного эффекта, может его можно приспособить? |
snovapavel, функция swingFromTo из указанного вами плагина
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <meta name="robots" content="noindex"> <title> - jsFiddle demo</title> <script type='text/javascript' src='http://code.jquery.com/jquery-2.1.4.js'></script> <script> $(function() { var duration = 2000, play = false; function swingFromTo(a) { var b = 1.70158; return (a /= 0.5) < 1 ? 0.5 * a * a * (((b *= 1.525) + 1) * a - b) : 0.5 * ((a -= 2) * a * (((b *= 1.525) + 1) * a + b) + 2) } $('a[href*=#]:not([href=#])').click(function() { if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) { var target = $(this.hash); target = target.length ? target : $('[name=' + this.hash.slice(1) +']'); if (target.length) { if (play) return; play = true; var d = performance.now(); var from = window.pageYOffset; var to = target.offset().top window.requestAnimationFrame(function foo(a) { var a = (a - d) / duration; 1 < a && (a = 1); var progress = swingFromTo(a); window.scrollTo(0, from - (from-to) * progress); if (a == 1) { play = false; } else window.requestAnimationFrame(foo) }); return false } } }); }); </script> </head> <body> <section> <article> <h2 id="top">Часто задаваемые вопросы — ЧаВо</h2> <ul> <li><a href="#101" title="Вопрос номер пять">Вопрос номер пять</a></li> <li><a href="#100" title="Вопрос номер четыре">Вопрос номер четыре</a></li> <li><a href="#99" title="Вопрос номер три">Вопрос номер три</a></li> <li><a href="#98" title="Вопрос номер два">Вопрос номер два</a></li> <li><a href="#97" title="Вопрос номер один">Вопрос номер один</a></li> </ul> <article id="post-101" class="post-101 chastye-voprosy type-chastye-voprosy status-publish hentry"> <h3>Вопрос номер пять</h3> <section class="entry-content"> <p class="hyphenate text" lang="ru">Многие думают, что Lorem Ipsum — взятый с потолка псевдо-латинский набор слов, но это не совсем так. Его корни уходят в один фрагмент классической латыни 45 года н.э., то есть более двух тысячелетий назад. Ричард МакКлинток, профессор латыни из колледжа Hampden-Sydney, штат Вирджиния, взял одно из самых странных слов в Lorem Ipsum, «consectetur», и занялся его поисками в классической латинской литературе. В результате он нашёл неоспоримый первоисточник Lorem Ipsum в разделах 1.10.32 и 1.10.33 книги «de Finibus Bonorum et Malorum» («О пределах добра и зла»), написанной Цицероном в 45 году н.э. Этот трактат по теории этики был очень популярен в эпоху Возрождения. Первая строка Lorem Ipsum, «Lorem ipsum dolor sit amet..», происходит от одной из строк в разделе 1.10.32</p> <br> <a href="#top">↑ Вверх</a> </section><!-- .entry-content --> </article> <article id="100"> <h3>Вопрос номер четыре</h3> <section> <p>Многие думают, что Lorem Ipsum — взятый с потолка псевдо-латинский набор слов, но это не совсем так. Его корни уходят в один фрагмент классической латыни 45 года н.э., то есть более двух тысячелетий назад. Ричард МакКлинток, профессор латыни из колледжа Hampden-Sydney, штат Вирджиния, взял одно из самых странных слов в Lorem Ipsum, «consectetur», и занялся его поисками в классической латинской литературе. В результате он нашёл неоспоримый первоисточник Lorem Ipsum в разделах 1.10.32 и 1.10.33 книги «de Finibus Bonorum et Malorum» («О пределах добра и зла»), написанной Цицероном в 45 году н.э. Этот трактат по теории этики был очень популярен в эпоху Возрождения. Первая строка Lorem Ipsum, «Lorem ipsum dolor sit amet..», происходит от одной из строк в разделе 1.10.32</p> <br> <a href="#top">↑ Вверх</a> </section> </article> <article id="99"> <h3>Вопрос номер три</h3> <section> <p>Многие думают, что Lorem Ipsum — взятый с потолка псевдо-латинский набор слов, но это не совсем так. Его корни уходят в один фрагмент классической латыни 45 года н.э., то есть более двух тысячелетий назад. Ричард МакКлинток, профессор латыни из колледжа Hampden-Sydney, штат Вирджиния, взял одно из самых странных слов в Lorem Ipsum, «consectetur», и занялся его поисками в классической латинской литературе. В результате он нашёл неоспоримый первоисточник Lorem Ipsum в разделах 1.10.32 и 1.10.33 книги «de Finibus Bonorum et Malorum» («О пределах добра и зла»), написанной Цицероном в 45 году н.э. Этот трактат по теории этики был очень популярен в эпоху Возрождения. Первая строка Lorem Ipsum, «Lorem ipsum dolor sit amet..», происходит от одной из строк в разделе 1.10.32</p> <br> <a href="#top">↑ Вверх</a> </section> </article> <article id="98"> <h3>Вопрос номер два</h3> <section> <p>Многие думают, что Lorem Ipsum — взятый с потолка псевдо-латинский набор слов, но это не совсем так. Его корни уходят в один фрагмент классической латыни 45 года н.э., то есть более двух тысячелетий назад. Ричард МакКлинток, профессор латыни из колледжа Hampden-Sydney, штат Вирджиния, взял одно из самых странных слов в Lorem Ipsum, «consectetur», и занялся его поисками в классической латинской литературе. В результате он нашёл неоспоримый первоисточник Lorem Ipsum в разделах 1.10.32 и 1.10.33 книги «de Finibus Bonorum et Malorum» («О пределах добра и зла»), написанной Цицероном в 45 году н.э. Этот трактат по теории этики был очень популярен в эпоху Возрождения. Первая строка Lorem Ipsum, «Lorem ipsum dolor sit amet..», происходит от одной из строк в разделе 1.10.32</p> <br> <a href="#top">↑ Вверх</a> </section> </article> <article id="97"> <h3>Вопрос номер один</h3> <section> <p>Многие думают, что Lorem Ipsum — взятый с потолка псевдо-латинский набор слов, но это не совсем так. Его корни уходят в один фрагмент классической латыни 45 года н.э., то есть более двух тысячелетий назад. Ричард МакКлинток, профессор латыни из колледжа Hampden-Sydney, штат Вирджиния, взял одно из самых странных слов в Lorem Ipsum, «consectetur», и занялся его поисками в классической латинской литературе. В результате он нашёл неоспоримый первоисточник Lorem Ipsum в разделах 1.10.32 и 1.10.33 книги «de Finibus Bonorum et Malorum» («О пределах добра и зла»), написанной Цицероном в 45 году н.э. Этот трактат по теории этики был очень популярен в эпоху Возрождения. Первая строка Lorem Ipsum, «Lorem ipsum dolor sit amet..», происходит от одной из строк в разделе 1.10.32</p> <br> <a href="#top">↑ Вверх</a> </section> </article> </article> </section> </body> </html> |
Уважаемый, Рони.
Огромное спасибо вам за вашу помощь. Не могли бы вы ещё немного помочь исправить несколько ошибок в самом скрипте, вот здесь сервис их показывает. И вторая просьба (чтобы довести до ума), при выборе первого пункта меню, код упирается в верхнюю часть браузера (ему некуда откатываться для разгона) и полсекунды тупит прежде чем ехать вниз. И при выборе последнего пункта, тоже самое с точностью до наоборот (упирается в нижнюю часть браузера). Можно ли как-нибудь решить этот вопрос для моего сниппета, может как нибудь разрешить прокрутку чтобы она не упиралась в начале и в конце? Огромное спасибо Вам за помощь! |
Цитата:
посмотрите easeInOutBounce тут http://api.jqueryui.com/easings/ Цитата:
|
snovapavel,
тут все формулы плагина, выберите что вам больше нравится. { easeInQuad: function(a) { return Math.pow(a, 2) }, easeOutQuad: function(a) { return -(Math.pow(a - 1, 2) - 1) }, easeInOutQuad: function(a) { if ((a /= 0.5) < 1) return 0.5 * Math.pow(a, 2); return -0.5 * ((a -= 2) * a - 2) }, easeInCubic: function(a) { return Math.pow(a, 3) }, easeOutCubic: function(a) { return Math.pow(a - 1, 3) + 1 }, easeInOutCubic: function(a) { if ((a /= 0.5) < 1) return 0.5 * Math.pow(a, 3); return 0.5 * (Math.pow(a - 2, 3) + 2) }, easeInQuart: function(a) { return Math.pow(a, 4) }, easeOutQuart: function(a) { return -(Math.pow(a - 1, 4) - 1) }, easeInOutQuart: function(a) { if ((a /= 0.5) < 1) return 0.5 * Math.pow(a, 4); return -0.5 * ((a -= 2) * Math.pow(a, 3) - 2) }, easeInQuint: function(a) { return Math.pow(a, 5) }, easeOutQuint: function(a) { return Math.pow(a - 1, 5) + 1 }, easeInOutQuint: function(a) { if ((a /= 0.5) < 1) return 0.5 * Math.pow(a, 5); return 0.5 * (Math.pow(a - 2, 5) + 2) }, easeInSine: function(a) { return -Math.cos(a * (Math.PI / 2)) + 1 }, easeOutSine: function(a) { return Math.sin(a * (Math.PI / 2)) }, easeInOutSine: function(a) { return -0.5 * (Math.cos(Math.PI * a) - 1) }, easeInExpo: function(a) { return a == 0 ? 0 : Math.pow(2, 10 * (a - 1)) }, easeOutExpo: function(a) { return a == 1 ? 1 : -Math.pow(2, -10 * a) + 1 }, easeInOutExpo: function(a) { if (a == 0) return 0; if (a == 1) return 1; if ((a /= 0.5) < 1) return 0.5 * Math.pow(2, 10 * (a - 1)); return 0.5 * (-Math.pow(2, -10 * --a) + 2) }, easeInCirc: function(a) { return -(Math.sqrt(1 - a * a) - 1) }, easeOutCirc: function(a) { return Math.sqrt(1 - Math.pow(a - 1, 2)) }, easeInOutCirc: function(a) { if ((a /= 0.5) < 1) return -0.5 * (Math.sqrt(1 - a * a) - 1); return 0.5 * (Math.sqrt(1 - (a -= 2) * a) + 1) }, easeOutBounce: function(a) { return a < 1 / 2.75 ? 7.5625 * a * a : a < 2 / 2.75 ? 7.5625 * (a -= 1.5 / 2.75) * a + 0.75 : a < 2.5 / 2.75 ? 7.5625 * (a -= 2.25 / 2.75) * a + 0.9375 : 7.5625 * (a -= 2.625 / 2.75) * a + 0.984375 }, easeInBack: function(a) { return a * a * (2.70158 * a - 1.70158) }, easeOutBack: function(a) { return (a -= 1) * a * (2.70158 * a + 1.70158) + 1 }, easeInOutBack: function(a) { var b = 1.70158; if ((a /= 0.5) < 1) return 0.5 * a * a * (((b *= 1.525) + 1) * a - b); return 0.5 * ((a -= 2) * a * (((b *= 1.525) + 1) * a + b) + 2) }, elastic: function(a) { return -1 * Math.pow(4, -8 * a) * Math.sin((a * 6 - 1) * 2 * Math.PI / 2) + 1 }, swingFromTo: function(a) { var b = 1.70158; return (a /= 0.5) < 1 ? 0.5 * a * a * (((b *= 1.525) + 1) * a - b) : 0.5 * ((a -= 2) * a * (((b *= 1.525) + 1) * a + b) + 2) }, swingFrom: function(a) { return a * a * (2.70158 * a - 1.70158) }, swingTo: function(a) { return (a -= 1) * a * (2.70158 * a + 1.70158) + 1 }, bounce: function(a) { return a < 1 / 2.75 ? 7.5625 * a * a : a < 2 / 2.75 ? 7.5625 * (a -= 1.5 / 2.75) * a + 0.75 : a < 2.5 / 2.75 ? 7.5625 * (a -= 2.25 / 2.75) * a + 0.9375 : 7.5625 * (a -= 2.625 / 2.75) * a + 0.984375 }, bouncePast: function(a) { return a < 1 / 2.75 ? 7.5625 * a * a : a < 2 / 2.75 ? 2 - (7.5625 * (a -= 1.5 / 2.75) * a + 0.75) : a < 2.5 / 2.75 ? 2 - (7.5625 * (a -= 2.25 / 2.75) * a + 0.9375) : 2 - (7.5625 * (a -= 2.625 / 2.75) * a + 0.984375) }, easeFromTo: function(a) { if ((a /= 0.5) < 1) return 0.5 * Math.pow(a, 4); return -0.5 * ((a -= 2) * Math.pow(a, 3) - 2) }, easeFrom: function(a) { return Math.pow(a, 4) }, easeTo: function(a) { return Math.pow(a, 0.25) } } |
Вот, все ошибки...
![]() |
snovapavel,
ошибки не существенные, могли бы сами точки с запятыми добавить или можно не обращать внимания. $(function() { var duration = 2000, play = false; function swingFromTo(a) { var b = 1.70158; return (a /= 0.5) < 1 ? 0.5 * a * a * (((b *= 1.525) + 1) * a - b) : 0.5 * ((a -= 2) * a * (((b *= 1.525) + 1) * a + b) + 2); } $("a[href*=#]:not([href=#])").click(function() { if (location.pathname.replace(/^\//, "") == this.pathname.replace(/^\//, "") && location.hostname == this.hostname) { var target = $(this.hash); target = target.length ? target : $("[name=" + this.hash.slice(1) + "]"); if (target.length) { if (play) return; play = true; var d = performance.now(); var from = window.pageYOffset; var to = target.offset().top; window.requestAnimationFrame(function foo(a) { a = (a - d) / duration; if(1 < a) a = 1; var progress = swingFromTo(a); window.scrollTo(0, from - (from - to) * progress); if (a == 1) play = false; else window.requestAnimationFrame(foo); }); return false; } } }); }); |
Огромное спасибо!
|
Часовой пояс GMT +3, время: 00:37. |