0

絶対に配置された 4 つの div (クラス 'eachthumb') の垂直スタックがあり、カルーセルのような動作をエミュレートしようとしています。4 つの div すべてが上に移動し、次に上の 1 つが下に移動します。上から2番目のものは「currindex」のクラスを持っています。値が 0 から 3 の間の 2 つの変数があり、移動中の div (mover と呼ばれます) と上から 2 番目の div (newnow) のデータ インデックス値を表します。すべてのコードを表示することはできませんが、面倒だと思われる部分を次に示します。

$('.eachthumb').animate({top: "-=110px"},200);
$('.eachthumb').removeClass('currindex');
$(".eachthumb[data-index='" + newnow +"']").addClass('currindex');
$(".eachthumb[data-index='" + mover +"']").css("top", "342px");

予想どおり div が上に移動し、予想どおり currindex クラスが新しい div に渡されます。ただし、最後の行は実行されないようです。

これらのステートメントの実行が速すぎるのか、それとも最後のステートメントを animate ステートメントへのコールバックとして設定する必要があるのか​​疑問に思っています。それが違いを生むかどうかはわかりませんが、「トップ」の値は、スタイルシート スタイルではなく、インライン スタイルです。または、私が見ていない構文の問題である可能性があります。とにかく、共有する考えがあれば、それは素晴らしいことです。

編集:

ここにいくつかのコードがあります。これには、HTML を生成する smarty テンプレート コードとすべてのスクリプトが含まれます。ご覧のとおり、問題のミニ カルーセルは、Flux Sliderであるメイン ローテーターからのコールバックとしてトリガーされます。mouseenter/mouseleave 関数への 2 つの呼び出しがあることに気付くかもしれません。「currindex」クラスが新しい要素に再割り当てされると、効果が破棄されることに気付きました。

{*debug*}

<div id="fluxslider">
{foreach from=$events item=event}
    <img src="{$event.tf_photo}" alt="{$event.name}" data-value="{$evt.id}"/>
{/foreach}
</div>
<div class="fluxtopfade"></div>
<div class="fluxbotfade"></div>
<div id="fluxthumbs">
    {foreach from=$events item=thumb name=thumb}
        <div class="eachthumb{if $smarty.foreach.thumb.index eq 0} currindex{/if}" data-index="{$smarty.foreach.thumb.index}">
            <img src="{$thumb.tf_photo}" />
            <div class="evtinfo invisible">
                <h5>
                    {if $thumb.date_start|date_format:"%b-%d" != $thumb.date_end|date_format:"%b-%d"}
                        {if $thumb.date_start|date_format:"%b" != $thumb.date_end|date_format:"%b"}
                            {$thumb.date_start|date_format:"%b %d"} - {$thumb.date_end|date_format:"%b %d, %Y"}
                        {else}
                            {$thumb.date_start|date_format:"%B %d"} - {$thumb.date_end|date_format:"%d, %Y"}
                        {/if}
                    {else}
                        {$thumb.date_start|date_format:"%B %d, %Y"}
                    {/if}
                </h5>
                <p>{$thumb.date_start|date_format:"%l:%M %p"}</p>
                <a href="{$path_http}events/?evtid={$thumb.id}" class="amoreinfo">More Info</a>
                {if $event.custom.1.data.0}<a href="{$event.custom.2.data.0}" target="_blank" class="atickets">Buy Tickets</a>{/if}
            </div>
        </div>
    {/foreach}
</div>

<script src="{$path_http}css/flux.min.js"></script>
{literal}
    <script type="text/javascript">
        $(function(){
            $(".eachthumb[data-index='" + 3 +"']").css("top", "12px");
            $(".eachthumb[data-index='" + 0 +"']").css("top", "122px");
            $(".eachthumb[data-index='" + 1 +"']").css("top", "232px");
            $(".eachthumb[data-index='" + 2 +"']").css("top", "342px");
            window.myFlux = new flux.slider('#fluxslider', {
                controls: true,
                width: 736,
                height: 354,
                transitions: ['blinds'],
                delay: 20000,
                onTransitionEnd: function() {
                    var oldnow = $('.currindex').data('index');
                    console.log(oldnow);
                    if (oldnow == 3){
                        var newnow = 0;
                    } else {
                        var newnow = oldnow + 1;
                    }
                    if (oldnow == 0){
                        var rover = 3;
                    } else {
                        var rover = oldnow - 1;
                    }
                    $('.eachthumb').animate({top: "-=110px"},200);
                    $('.eachthumb').removeClass('currindex');
                    $(".eachthumb[data-index='" + newnow +"']").addClass('currindex');
                    $('.currindex').on('mouseenter',function(){
                        $(this).find('.evtinfo').removeClass('invisible');
                    });
                    $('.currindex').on('mouseleave',function(){
                        $(this).find('.evtinfo').addClass('invisible');
                    });
                    $(".eachthumb[data-index='" + rover +"']").css("top", "342px");
                }
            });
        });
        $(function(){
            $('.currindex').on('mouseenter',function(){
                $(this).find('.evtinfo').removeClass('invisible');
            });
            $('.currindex').on('mouseleave',function(){
                $(this).find('.evtinfo').addClass('invisible');
            });
        });
    </script>
{/literal}
4

3 に答える 3

1

このコードは最終的に機能しました。おそらく animate メソッドが終了する前に、CSS メソッドを呼び出すのが早すぎて、シャッフルで失われたと思います。CSS メソッドをコールバック関数に配置することで、この問題は解決しました。興味深いことに、私が今日書いた別の関数では、動きがアニメーションの前に来るため、コールバックは必要ありませんでした。

$('.eachthumb').animate({top: "-=110px"},200, function(){
    $(".eachthumb[data-index='" + mover +"']").css("top", "342px");
}
于 2013-10-24T01:05:56.923 に答える