0

私はこのウェブページを持っています: http://miloarc.pyrogenicmedia.com/

どのatmも特別なものではありません。いくつかの効果がありますが、銀行を壊すものはありません。

タイルの上にマウスを置くと、不透明度が変化してフェード効果が得られます。これは、CSS ではなく Jquery アニメーションを介して行われます (単純な変更ではなく、フェードできるようにするためです)。ページが読み込まれるとすべてが見栄えがよく、フェードも完璧に見えます。実際、マウスをあちこちにドラッグすると、ほとんどヘビのような「軌跡」が得られます。

とにかく、私の次の問題は、左上にボックスがあり、ホバリングしているタイルに関する情報が表示されることです。これはうまくいくようです。その情報ボックスにマウスを合わせると、その位置が切り替わります (以前はその下に隠れていたタイルにアクセスできるようになります)。私の理解では、これはすべて正常に機能しており、文字どおりです。

ただし、情報ボックスを1回移動した後(1回のホバー)。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>

助けてくれてありがとう:)。

編集:私の要点を繰り返します。情報ボックスを移動した後にのみ動作が遅くなる理由を知りたいです。この前は、すべてがまったく問題ありません。ボックスを移動した後 (および元に戻した後)、UI が非常に遅くなります。

4

3 に答える 3

3

クラス セレクターがより具体的である場合、jQuery はより高速に実行されます。特定のクラスの DOM 内のすべてを$('.activeInfo')検索しますが、div のみを選択し、次に一致するクラスを持つ div のサブセットを選択します。$('div.activeInfo')

また、これらすべての同じ div で角丸スクリプトがアクティブになっているため、レンダリングのパフォーマンスが低下する可能性があります。

于 2010-06-08T02:33:45.453 に答える
2

予想どおり、パフォーマンスの結果は順調に進んでいるようです。Chrome が最速で、次に Safari、Firefox、IE です。(本日リリースされたSafari 5はChromeに匹敵すると言われていますが。)

他の誰かが他のアイデアを持っているかもしれませんが、私が考えることができる唯一のことは、アニメーションの期間を短くして、それぞれがより速く終了し、重なりが少なくなるようにすることです.

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

どれだけ役立つかはわかりませんが、試してみる価値はあります。

参考までに - 一連の要素を表す jQuery オブジェクトにイベント ハンドラーを設定する場合、 を使用する必要はありませんeach()。セット全体に 1 回バインドできます。したがって、これの代わりに:

$('.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});
     }); 

パフォーマンスの問題には役立ちませんが、要素のセットに影響を与えるには適切な方法です。

于 2010-06-08T02:34:04.450 に答える
0

Javascript は、あなたがしていることを処理できないかもしれません。しかし、いくつかのことを試す前にあきらめないでください。

  • 関数がすぐに不透明度を変更するようにしてからhover()、「unhover()」トランジションでのみフェードを使用してください。これは、きびきびと感じますが、スムーズでもあります。それを試してみると、処理が半分近く削減され、十分かもしれません。

  • animate()メソッドを見てください。次のアニメーションを開始する前に、実行中のすべてのアニメーションを完了するように指示できます。そのため、ホバーすると、次のアニメーションを開始する前に、他のすべてのアニメーションを終了させます。これは理想的ではありませんが、「尻尾」が引きずられるのを減らすことができます。これは最初の提案とは少し矛盾するので、ご自身で判断してください。

  • IE の不透明度機能は「フィルター」を使用します。詳細はわかりませんが、生のJavascriptよりも重いようです。ボックスにテキストを含めようとすると、非常に問題があります。とにかく、他のアプローチを試す必要があるかもしれません。ブラウザーごとに異なるアプローチを取る必要があるだけで、処理できないブラウザーではアニメーションが少し失われます。

  • フェード効果を行う「アニメーション gif」を作成する方法があるかもしれません。このアプローチについてはわかりません-単なるアイデアです。

そうは言っても、非常によく似たページを作成しました。一度に 17 枚の画像があり、他の 17 枚の画像にクロスフェードします。すべてのブラウザでうまく機能します。ただし、私たちのデザインはもう少し寛容です。エッジはそれほど難しくありません。

幸運を。他に思い当たる節があればまた調べます。

于 2010-06-08T04:52:59.737 に答える