0

私は一連の画像を持っていますが、それらはすべて同じ高さですが幅が異なります。固定幅を維持する必要があり、画像を無限ループで左にスライドさせる必要があります。部分的な画像でも表示できるように、コンテナの幅を埋める画像も必要です。スクロールは段階的 (例: 200px) で設定された間隔で行われます。

Cycle、NivoSlider、EasySlider など、多数の jQuery スライドショー プラグインを調べました。しかし、クライアントが必要としているものを正確に教えてくれるものは見たことがありません。クリック可能なナビゲーションやセンタリングは必要ありません。設定された幅のステップと設定された間隔でスクロールする単なる連続フィルムストリップ。

連続ループ部分に関しては、一番左の画像が見えなくなるまで待つことができると考えていました。本来は だけでやってみたのですappend()が、一番左を最後まで動かすとスライドがジャンプしてしまいました。それで、私はそれを最後まで、次に最初から始めようとしましappend()た。clone()$('#slides').children()remove()$('#slides')

これまでのところ、私は持っています:

<div id="outer" style="width:300px;">
    <div id="slides">
        <img src="/images/slide1.jpg" alt="" style="height:150px;width:200px;" />
        <img src="/images/slide2.jpg" alt="" style="height:200px;width:200px;" />
        <img src="/images/slide3.jpg" alt="" style="height:150px;width:200px;" />
        <img src="/images/slide4.jpg" alt="" style="height:300px;width:200px;" />
    </div>
</div>

/* some code ideas taken from easySlider */
(function($){
    $.fn.stepSlider = function() {
        var slideInterval;

        this.each(function() {
            // this will be the width of $('#slides')
            var width = 0;
            // shortcut I saw in easySlider code; liked it, used it.
            var o = $(this);
            // set width of $('#slides') based on total width of child images
            o.children().each(function(){width+=$(this).width();});

            function scroll() {
                o.children().each(
                    function(index){
                        // slide each of the children to the left by 150px
                        $(this).animate({'left':'-=150'}, 2000);
                    }
                );

                // after children have been animated() left, check to see
                // if the left-most child has gone out of sight
                if (o.children(':first-child').position().left + o.children(':first-child').width() < 0) {
                    // cloning the first child now
                    var el = o.children(':first-child').clone(true);
                    // removing the first child
                    o .children(':first-child').remove();
                    // trying to reset the css('left') of all of the children now that the first
                    // element is supposed to be gone
                    o.children().css('left', o.children(':first-child').position().left + o.children(':first-child').width());
                    // appending the clone()
                    o.append(el);
                }
            }

            slideInterval = setInterval(function(){scroll();}, 2000);
        });
    }
})(jQuery);

スライディングが効く。しかし、最初の画像を最後に移動すると、スライドがジャンプします。そして、物事は完全に停止するところまで崩壊し始めます。

どんな洞察も大歓迎です。いいえ、私は jQuery をまったく初めて使用するわけではありませんが、はい: これは私の最初のプラグインの試みです。

よろしくお願いします

4

2 に答える 2

1

scrollTo プラグインを使用する (または独自に作成する) ことをお勧めします。以下は領域を 300 px スクロールするので、何を入れても問題ありません。最後に停止するか、必要に応じて実行する領域の位置と幅を管理する必要があります。

スクロールする: http://demos.flesler.com/jquery/scrollTo/

JSFiddle: http://jsfiddle.net/YZ9vA/2/

    $(document).ready(function(){
    var areaWidth = 0, x=0;        
    $('#slideshow img').each(function() {
        areaWidth = areaWidth + $(this).width();
    });
    $('#slideshow').width(areaWidth);

    function ScrollMe() {
     x += 300;
     $('#sliders').scrollTo({top:0, left:x},800);

     }


   setInterval(ScrollMe,1000);

});​

元の回答:

あなたへの私の提案は、永遠に繰り返される jquery サイクルを使用することです。画像を循環させる代わりに、これらの幅を 200px に設定し、内部の画像を必要に応じて配置できるように div を循環させます (中央揃え、幅 100% など)。

http://jquery.malsup.com/cycle/

#slides, #slides div {width:200px;height:300px}
#slides img {width:100%;height:100%}  

<div id="slides">
    <div><img src="/images/slide1.jpg" alt="" style="" /></div>
    <div><img src="/images/slide2.jpg" alt="" style="" /></div>
    <div><img src="/images/slide3.jpg" alt="" style="" /></div>
    <div><img src="/images/slide4.jpg" alt="" style="height:300px;width:200px;" /></div>
<!-- I left the last inline style on, you can use that to override or use css externally -->
</div>

$('#slides').cycle({fx:'scrollHorz', 
                   continuous: 1, 
                   easeIn: 'linear',
                   easeOut: 'linear'});
于 2012-05-15T21:34:57.080 に答える
0

ルクマの助けのおかげで、私は何かが働いています.

CSS:

<style type="text/css">
    #outer  {height: 250px; width: 760px; overflow:hidden;}
    #mid    {height: 250px; width: 760px; overflow:hidden;}
    #slides {height: 250px; width: auto; overflow:hidden;}
    #slides img {float: left; height: 250px;} /* height specified just for clarity */
</style>

HTML:

#slides div を 1 つではなく 2 つの別の div でラップする必要がありました。たった 1 つのラッパーで、scrollTo プラグインは 760px の制約を尊重するのではなく、div を 100% 幅に設定してしまいました。時間の制約のため、これ以上調査しませんでした。余分なdivを追加して、1日と呼びました。

<div id="outer">
    <div id="mid">
        <div id="slides">
            <img src="images/image1.jpg" alt="" style="width:760px;" />
            <img src="images/image2.jpg" alt="" style="width:529px;" />
            <img src="images/image3.jpg" alt="" style="width:720px;" />
            <img src="images/iamge4.jpg" alt="" style="width:563px;" />
            <!-- my live version has 16 total images -->
        </div>
    </div>
</div>

JavaScript:

<script type="text/javascript" src="scripts/jquery.scrollTo.min.js"></script>
<script type="text/javascript">
    $(function(){
        var areaWidth = 0, x = 0, lelements=$('#slides img').length * -1;

        /* This is the same essential functionality that I had in my original post
         * to set the width of the images container
         */
        function setWidth() {
            $('#slides img').each(function() {
                areaWidth = areaWidth + $(this).width();
            });
            $('#slides').width(areaWidth);
        }

        /* This is also essentially what I was doing before: checking
         * to see if an image is no longer viewable. It appends a clone
         * to the $('#slides'), but it differs from my original idea by
         * not trying to remove any :first element.
         * So $('#slides img').length will continue to increase as the
         * program runs. I was trying to avoid this, but in reality, it
         * probably doesn't matter a ton unless someone is watching the
         * same page for quite a long time.
         */
        function checkIt() {
            $('#slides img').slice(lelements).each(function() {
                if ($(this).position().left + $(this).width() < 0) {
                    $(this).clone().appendTo($('#slides'));
                }
            });
        }            

        /* This is where we use Flesler's scrollTo plugin to handle the motion.
         * I changed scrollTo({}, 3000) to scrollTo({}, {duration: 1000})
         * to slow the transition speed.
         */
        function scrollMe() {
            $('#outer').scrollTo({top:0, left:x}, {duration:1000});

            /* x += 300 was the first line in scrollMe(), but ended up
             * resulting in a 600px slide for the first transition,
             * so I moved it here. The first transition takes longer
             * to occur, but all other transitions are fine
             */
            x += 300;

            checkIt();
            setWidth();
        }

        setInterval(scrollMe, 3000);  
    });
</script>

私がしなければならなかったもう 1 つのことは、最初のスライドが全幅 (760px) であることを確認することでした。それよりも小さい場合、2 番目の画像は最初は非表示になり、コンテナの左側のスペースに突然表示され、スクロールが発生します。後続の画像はすべて問題ありませんでした。明らかに、最初の画像が全幅を埋めるようにすると、そのアーティファクトがなくなります。

ルクマに再び感謝します - あなたは助けのトンでした!

于 2012-05-16T16:43:31.730 に答える