Медленная анимация Jquery - PullRequest
0 голосов
/ 08 июня 2010

У меня есть эта веб-страница: http://miloarc.pyrogenicmedia.com/

В каком банкомате нет ничего особенного.У этого есть несколько эффектов, но ни один не разрушает банк.

Если вы наведите курсор мыши на плитку, она должна изменить ее непрозрачность, чтобы придать ей эффект затухания.Это делается с помощью Jquery Animation, а не с помощью CSS (я делаю это, чтобы оно могло исчезнуть, а не было прямым изменением).Все выглядит хорошо, когда страница загружается, а затухания выглядят идеально.Фактически, если вы перетаскиваете мышь повсюду, если вы получаете «след», почти как змея.

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

Тем не менее, после одного хода информационного окна (One hover).Просмотр страницы в Firefox становится вялым.Например, после успешного перемещения информационного блока эффекты затухания сильно заикаются, и он не воспринимает события так быстро, что означает, что вы не можете нарисовать «след» на экране.

Chrome не имеет этой проблемы.Кажется, работает нормально, несмотря ни на что.Сафари тоже вроде нормально.Хотя я замечаю, что если я двигаю мышь очень быстро, она немного прыгает, но не так сильно, как Firefox.

Internet Explorer вообще не работает.Кажется, что происходит сбой браузера ... И есть ошибка с плагином с закругленными углами, который я использую (Не знаю, почему ...).

В общем, я думаю, что все, что я делаю внутри своего кода, должно быть очень вялым.Но я не знаю, где это происходит.

Вот полный код, но я бы посоветовал перейти по ссылке, чтобы просмотреть все.

        <script type="text/javascript">
        $(document).ready(function()
        {
            var WindowWidth = $(window).width();
            var WindowMod = WindowWidth % 20;
            var WindowWidth = WindowWidth - WindowMod;
            var BoxDimension = WindowWidth / 20;
            var BoxDimensionFixed = BoxDimension - 12;
            var dimensions = BoxDimensionFixed + 'px';


            $('.gamebutton').each(function(i)
            {
                $(this).css('width', dimensions);
                $(this).css('height', dimensions);
            });

            var OuterDivHeight = BoxDimension * 10;
            var TopMargin = ($(window).height() - OuterDivHeight) / 2;
            var OuterDivWidth = BoxDimension * 20;
            var LeftMargin = ($(window).width() - OuterDivWidth) / 2;
            $('#gamePort').css('margin-top', TopMargin).css('margin-left', LeftMargin).css('margin-right', LeftMargin);


            $('.gamebutton img').each(function(i)
            {
                $(this).hover(
                function () {
                $(this).animate({'opacity': 0.65});
                 },
                 function () {
                 $(this).animate({'opacity': 1});
                 }
                 ); 
            });

            $('.rounded').corners();

            $('.gamebutton').each(function(i)
            {
                $(this).hover(function()
                {
                    $('.gameTitlePopup').html($(this).attr('title'));
                    FadeActive();
                });
            });

            function FadeActive()
            {
                $('.activeInfo').fadeIn('slow');
            }

            $('#gameInfoLeft').hover(function()
            {
                $(this).removeClass('activeInfo');
                $(this).fadeOut('slow', function()
                {
                    $('#gameInfoRight').addClass('activeInfo');
                    FadeActive();
                });

            });

            $('#gameInfoRight').hover(function()
            {
                $(this).removeClass('activeInfo');
                $(this).fadeOut('slow', function()
                {
                    $('#gameInfoLeft').addClass('activeInfo');
                    FadeActive();
                });

            });
        });
    </script>

Спасибо за любую помощь :).

РЕДАКТИРОВАТЬ : Просто повторить мою точку зрения.Я хочу знать, почему это происходит вяло только после перемещения информационного окна.До этого все абсолютно нормально.После перемещения окна (и перемещения его назад) пользовательский интерфейс становится очень медленным.

Ответы [ 3 ]

3 голосов
/ 08 июня 2010

jQuery работает быстрее, когда селекторы классов более конкретны. $('.activeInfo') ищет все в DOM для определенного класса, но $('div.activeInfo') выбирает только div (ы), а затем подмножество div, которые имеют соответствующий класс.

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

2 голосов
/ 08 июня 2010

Ваши результаты производительности, как и ожидалось, находятся на должном уровне. Chrome самый быстрый, затем Safari, Firefox, IE. (Хотя Safari 5, выпущенный сегодня, считается, что он сопоставим с Chrome.)

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

$(this).hover(
    function () {
         $(this).animate({'opacity': 0.65}, 300); // Try a quicker animation
    },
    function () {...

Не уверен, насколько это поможет, но, возможно, оно того стоит.

FYI - при настройке обработчиков событий для объекта jQuery, представляющего набор элементов, вам не нужно использовать each(). Вы можете привязать один раз ко всему набору. Так что вместо этого:

$('.gamebutton img').each(function(i) {
      $(this).hover(
         function () {
            $(this).animate({'opacity': 0.65});
         },
         function () {
             $(this).animate({'opacity': 1});
         }); 
 });

сделать это:

$('.gamebutton img').hover(
     function () {
        $(this).animate({'opacity': 0.65});
     },
     function () {
         $(this).animate({'opacity': 1});
     }); 

Это не поможет вашей проблеме с производительностью, но это правильный способ повлиять на наборы элементов.

0 голосов
/ 08 июня 2010

Javascript может просто не справиться с тем, что вы делаете.Но не сдавайтесь, прежде чем пытаться сделать несколько вещей:

  • Попробуйте, чтобы функция hover() немедленно изменила непрозрачность, а затем использовала затухание только в "unhover ()"переход.Это будет чувствовать себя быстро, но также гладко.Я бы попробовал это, так как это уменьшит вашу обработку почти вдвое, и может быть достаточно.

  • Посмотрите на метод animate().Вы можете сказать ему, чтобы завершить все запущенные анимации перед началом следующей анимации.Так что при наведении у него есть закончить все другие анимации перед началом следующей анимации.Это не идеально, но это уменьшит ваш "хвост" от перетаскивания.Это немного несовместимо с первым предложением, так что будьте осторожны.

  • Функциональность непрозрачности в IE использует «фильтр».Я не знаю деталей, но он кажется тяжелее, чем сырой Javascript.Это очень проблематично, если вы попытаетесь включить текст в поля.В любом случае, вам может понадобиться попробовать другие подходы.Возможно, вам просто понадобится использовать разные подходы в разных браузерах, потеряв немного анимации в браузерах, которые не могут с этим справиться.

  • Может быть какой-то способ создания анимацииGIF ", который делает эффект затухания.Не уверен насчет этого подхода - просто идея.

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

Удачи.Я проверю, есть ли у меня другие идеи.

...