14

上下の矢印でナビゲートできるこの縦型スライドショーがあります。スライドショーのコンテナー div 内には 7 つの項目 (div) がありますが、一度に表示できるのはそのうちの 3 つだけです。実際、このスライドショーはメニューです。表示されている 3 つの項目のうち、中央にある項目をクリックすると、ページの別の場所にある div にコンテンツが読み込まれます。

現在、3 つの項目があり、2 番目の項目 (中央の項目) のみがクリック可能であるため、それらの違いを作成する必要があります。そこで、アイテムのborder/border-radiusを次のように変更することを考えました:

ここに画像の説明を入力

問題は、div が表示領域の場所を常に変更しているため、その方法がわからないことです。ここで本当に助けが必要です。

HTML マークアップ:

<div id="rocksType_btns">
    <div id="rocksType_btnUp"></div>
    <div id="rocksType_btnDown"></div>
</div>

<div id="rocksType_subtypeSlider">
    <div id="rocksType_DBitems_container">
        <div id="rocksType_DB_1" class="rocksType_DBitem">Item 1</div>
        <div id="rocksType_DB_2" class="rocksType_DBitem">Item 2</div>
        <div id="rocksType_DB_3" class="rocksType_DBitem">Item 3</div>
        <div id="rocksType_DB_4" class="rocksType_DBitem">Item 4</div>
        <div id="rocksType_DB_5" class="rocksType_DBitem">Item 5</div>
        <div id="rocksType_DB_6" class="rocksType_DBitem">Item 6</div>
        <div id="rocksType_DB_7" class="rocksType_DBitem">Item 7</div>
    </div>
</div> <!-- End of id="rocksMenu_subtypeSlider" -->

前/現在/後の状態用に定義された CSS コードが既にあります。それらを割り当てる必要があります。

これがFiddleです。

ありがとう。

ペドロ

4

5 に答える 5

5

代わりにこのようなことを試してください...

HTML:

<div id="viewport">
    <ul id="list">
        <li class="above">Foo</li>
        <li class="selected">Bar</li>
        <li class="below">Barf</li>
        <li>Boo</li>
        <li>Huh</li>
        <li>Wha</li>
        <li>Oh</li>
    </ul>
</div>
<a href="#" id="up">UP</a> -- <a href="#" id="down">DOWN</a>

CSS:

#viewport{
    height: 175px;
    overflow: hidden;
    padding: 0;
}

ul{
    list-style-type: none;
    padding: 0;
    margin: 0;
}

li{
    border: 1px solid #ccc;
    width: 70px;
    height: 50px;
    line-height: 50px;
    padding: 0 0 0 30px;
    margin: 5px;
    font-size: 1.5em;
    color: #999;
    background-color: #fed;
}

li.selected{
    border-radius: 20px;
    background-color: #fe0
}

li.above{
    border-radius: 10px;
    border-top-left-radius: 35px;    
}

li.below{
    border-radius: 10px;
    border-bottom-left-radius: 35px;    
}

JS:

var viewport = $('#viewport'),
    list = $('#list'),
    itemHeight = $('li', list).first().outerHeight(),
    btnUp = $('#up'),
    btnDown = $('#down'),
    busy = false,
    selected, above, below;

var update = function(){
    selected = $('li:nth-of-type(2)', list).addClass('selected', 200);
    above = selected.prev().addClass('above', 200);
    below = selected.next().addClass('below', 200); 
    setTimeout(function(){ busy = false; }, 200);
};

var goUp = function(){
    if(busy) return; else busy = true;
    $('li', list).removeClass('selected above below');
    list.animate({marginTop: -itemHeight}, 600, 'easeOutBounce', function(){ 
        list.css({marginTop: 0}).append($('li', list).first());
        update();
    });
}
var goDown = function(){
    if(busy) return; else busy = true;
    $('li', list).removeClass('selected above below');
    list
        .css({marginTop: -itemHeight})
        .prepend($('li',list).last())
        .animate({marginTop: 0}, 600, 'easeOutBounce', update);
}
btnUp.on('click', goUp);  
btnDown.on('click', goDown);

ここでフィドル少し派手なバージョン

これを行う唯一の方法は、アニメーションを中心に構築するのではなく、何が何であるかを追跡することだと思います.

于 2013-04-12T14:34:05.677 に答える
2

私の変更をチェックしてください。

更新: 前のクラスと次のクラスの管理スタイルを含むリンク

更新: 派手な色を削除するためのリンク

http://jsfiddle.net/M3QkB/5/

これが私が変更したものです。明らかにスタイリングはまだ完了していません。

up メソッドでは:

    $('.rocksType_DBitem').removeClass('current');
    $('.rocksType_DBitem').removeClass('before');
    $('.rocksType_DBitem').removeClass('after');
    var middleRock = rocksType_place;
    rocksType_place--;           
    $('#rocksType_DBitems_container :eq(' + middleRock + ')').addClass('current');
    $('.current').prevAll().addClass('before');
    $('.current').nextAll().addClass('after');

down メソッドでは:

    $('.rocksType_DBitem').removeClass('current');
    $('.rocksType_DBitem').removeClass('before');
    $('.rocksType_DBitem').removeClass('after');
    rocksType_place++;
    var middleRock = rocksType_place + 1;        
    $('#rocksType_DBitems_container :eq(' + middleRock + ')').addClass('current');
    $('.current').prevAll().addClass('before');
    $('.current').nextAll().addClass('after');

共通コードは、追加したクラスのクリーニングなどの機能にリファクタリングできます

于 2013-04-12T13:07:40.810 に答える
1

CSSのような 3 つのクラスを割り当て.before、アイテムを移動するときにそれらをシフトします.current.afterこれらのクラスにボーダー設定を割り当てることができます。

フィドルの例を次に示します: http://jsfiddle.net/DBBVU/3/

于 2013-04-12T13:12:42.670 に答える
0

最良の方法は、中央の div に異なる境界線を持つ css クラスを割り当てることです。クリックできるので、それがどこにあるかを知っている必要があります。あとは同じように外します。

于 2013-04-12T13:20:35.250 に答える