16

スクロール可能なdivに親指のリストがあり、次へ/前へボタンでアニメーション化されています。「次へ」ボタンをクリックするたびに、最初に表示される要素の属性と一致する必要があります。「前へ」ボタンをクリックするたびに、最後に表示された要素の属性が表示されます。

リストが終了するとスクロール距離が可変になるため、数学的にそれを解決する方法がわかりません。誰かが私を助けてくれますか?

HTML

$<div id="scrollContent">
    <ul id="assetList">
        <li data-asset-id="15201"></li>
        <li data-asset-id="15202"></li>
        <li data-asset-id="15203"></li>
        ...        
    </ul>
</div>
<a class="next" href="#">next</a>
<a class="prev" href="#">prev</a>

jQuery

$('a.next').click(function() {
    var scrollheight = $("#scrollContent").scrollTop();
    $("#scrollContent").animate({scrollTop:scrollheight+375},500,function() {  
        // get "data-asset-id" of first visible element in viewport

    });
});

$('a.prev').click(function() {
    var scrollheight = $("#scrollContent").scrollTop();
    $("#scrollContent").animate({scrollTop:scrollheight-375},500,function() {
        // get "data-asset-id" of last visible element in viewport

    });
});

フィドルをチェックしてください:http: //jsfiddle.net/desCodLov/77xjD/10/

ありがとうございました。

4

3 に答える 3

8

これはあなたが探しているものですか?? :

var first, last;

$('a.next').click(function() {
    var scrollheight = $("#scrollContent").scrollTop();
    $("#scrollContent").animate({scrollTop:scrollheight+375},500,function() {  
        $("#assetList li").each(function() {
            if ($(this).offset().top == 1 && $(this).offset().left == 0) {
                first = $(this).attr('data-asset-id');
            }
        });
    });
});

$('a.prev').click(function() {
    var scrollheight = $("#scrollContent").scrollTop();
    $("#scrollContent").animate({scrollTop:scrollheight-375},500,function() {
        var Otop = $("#scrollContent").height() - $("#assetList li").height() - parseInt($("#assetList li").css('margin-top'));
        var Oleft = ($("#assetList li").width() + parseInt($("#assetList li").css('margin-right'))) * 3;
        $("#assetList li").each(function() {
            if ($(this).offset().top == Otop && $(this).offset().left == Oleft) {
                last = $(this).attr('data-asset-id');
            }
        });
    });
});

フィドル: http://jsfiddle.net/77xjD/17/

于 2011-12-04T16:43:05.783 に答える
4

可視性により、要素には少なくとも右上隅が表示されている必要があると思います。完全に表示されている要素のみを選択する場合は、要素の値width()height()値を加算または減算します。基本的なコードを以下に示します。

var $first, $last,
    $container = $("#assetList"),
    $items = $container.children("li"),
    positions = container.offset(),
    rightside = positions.left + $container.width(),
    bottomside = positions.top + $container.height();
$items.each(function(){
    var $this = $(this),
        position = $this.offset();
               // If <li> top post >= <ul> top
    if ($first && position.top >= positions.top
               // If <li> left >= <ul> left
               && positions.left >= position.left) {
             /* Optionally, add two more conditions, to only accept elememts
                which are fully visible: 
               && positions.top + $this.height() <= bottomside
               && positions.left + $this.width() <= leftside
              */
        $first = this;
    }
    // See previous comments.
    if (position.top < bottomside && position.left < rightside) {
        $last = this;
    }
});
// $first = first visible element, eg [HTMLLiElement]
// $last = last visible element, eg [HTMLLiElement]
于 2011-12-04T15:40:28.787 に答える
2

私はあなたのフィドルの解決策を更新しました。

初期化時に最初のliの最上位と最後のliの最上位の位置をキャッシュし、それらを使用して、次または前のボタンをクリックしたときに、どの要素が位置を取得しているかを調べました。

そしてもちろん、私はロブWの答えから以下の行をコピーしました。

var $container = $("#assetList"),
$items = $container.children("li"),
于 2011-12-04T16:40:11.247 に答える