2016-09-30 10 views
1

私はカルーセルのjQueryプラグインを作成していますが、左右のボタンが数秒後にしか機能しない理由を理解できません...すぐに1つをクリックしようとすると、フェード効果には望ましくない遅れがありますが、最初に少し待ってからクリックすると、すぐにフェードします。私は間隔を取り除こうとしましたが、それは助けになりませんでした。以下のコードスニペットを実行して、私の言いたいことを確認してください。本当に奇妙なのは、エフェクトを「フェード」から「スプリット」に変更すると、ボタンをクリックするとすぐにエフェクトが発生するということです。jQuery Carousel Pluginボタンの遅延の問題

(function ($) { 
 
/* jSlide */ 
 
$.fn.jSlide = function(options) { 
 
    
 
    var settings = $.extend({ 
 
     buttons: true, 
 
     speed: 3000, 
 
     effect: "slide", 
 
     sizing: "auto", 
 
     fadeSpeed: 1000 
 
    }, options); 
 

 
    //Main wrapper 
 
    var styles = { 
 
     'position': 'relative', 
 
     'overflow': 'hidden' 
 
    }; 
 
    $(this).css(styles); 
 

 
    //Anchors & Sizing 
 
    this.children().each(function() { 
 
     
 
     //Sizing 
 
     if (settings.sizing == "auto") { 
 
      var styles = { 
 
       'position': 'absolute', 
 
       'width': 'auto', 
 
       'height': 'auto', 
 
       'min-width': '100%', 
 
       'min-height': '100%' 
 
      } 
 
      $(this).css(styles); 
 
     } else if (settings.sizing == "fullWidth") { 
 
      var styles = { 
 
       'position': 'absolute', 
 
       'width': '100%', 
 
       'height': 'auto' 
 
      } 
 
      if (settings.effect == "split") { 
 
       styles.width = '200%'; 
 
      } 
 
      $(this).css(styles); 
 
     } else if (settings.sizing == "fullHeight") { 
 
      var styles = { 
 
       'position': 'absolute', 
 
       'width': 'auto', 
 
       'height': '100%', 
 
      } 
 
      $(this).css(styles); 
 
     } 
 

 
     //Anchors 
 
     if (settings.effect == "split") { 
 
      $(this).wrap('<div class="j-slide-wrapper"></div>').wrap('<div class="j-split-anchor"></div>'); 
 
      $(this).clone().appendTo($(this).closest('.j-slide-wrapper')).wrap('<div class="j-split-anchor"></div>'); 
 
     } else { 
 
      $(this).wrap('<div class="j-slide-wrapper"></div>'); 
 
     } 
 

 
     var length = $('.j-slide-wrapper').length; 
 
     $('.j-slide-wrapper').each(function (index) { 
 
      $(this).css('z-index', length - index) 
 
     }).promise().done(function() { 
 
      $('.j-slide-wrapper').each(function() { 
 
       $(this).animate({ 
 
        'opacity': 1 
 
       }, 1000) 
 
      }); 
 
     }); 
 

 
    }); 
 

 
\t //Buttons 
 
    if (settings.buttons) { 
 
     this.prepend(
 
      '<button id="j-slide-left-btn" class="j-slide-btn styled-button"></button>' + 
 
      '<button id="j-slide-right-btn" class="j-slide-btn styled-button"></button>' 
 
     ) 
 
    } 
 
    var length = $('.j-slide-wrapper').length; 
 
    $('.j-slide-btn').css('z-index', length + 1); 
 

 
    //Effect 
 
    var i = 0, 
 
     wrapper = $(this).find('.j-slide-wrapper'); 
 
     timer = setInterval(function() { 
 
      var length = wrapper.length; 
 
      
 
      if (settings.effect == "fade") { 
 
       fadeSlides(i, wrapper, length, 'right', settings.fadeSpeed); 
 
      } else if (settings.effect == "split") { 
 
       splitSlides(i, wrapper, length, 'right'); 
 
      } 
 
      
 
      if (i + 1 == length) { 
 
       i = 0; 
 
      } else { 
 
       i = i + 1; 
 
      } 
 
     }, settings.speed); 
 
\t 
 
\t $('#j-slide-left-btn').click(function() { 
 
\t \t clearInterval(timer); 
 
     var length = wrapper.length; 
 
     
 
     if (settings.effect == "fade") { 
 
      fadeSlides(i, wrapper, length, 'left', settings.fadeSpeed); 
 
     } else if (settings.effect == "split") { 
 
      splitSlides(i, wrapper, length, 'left'); 
 
     } 
 
     
 
     if (i - 1 < 0) { 
 
      i = length - 1; 
 
     } else { 
 
      i = i - 1; 
 
     } 
 
\t }); 
 
\t $('#j-slide-right-btn').click(function() { 
 
\t \t clearInterval(timer); 
 
     var length = wrapper.length; 
 
     
 
     if (settings.effect == "fade") { 
 
      fadeSlides(i, wrapper, length, 'right', settings.fadeSpeed); 
 
     } else if (settings.effect == "split") { 
 
      splitSlides(i, wrapper, length, 'right'); 
 
     } 
 
     if (i + 1 == length) { 
 
      i = 0; 
 
     } else { 
 
      i = i + 1; 
 
     } 
 
\t }); 
 

 
    function fadeSlides (i, wrapper, length, dir, speed) { 
 

 
     wrapper.eq(i).css('z-index', 3); 
 
     wrapper.filter(':gt(' + i + ')').css('z-index', 1); 
 
     wrapper.filter(':lt(' + i + ')').css('z-index', 1); 
 
     
 
     if (dir == 'right') { 
 
\t \t \t if (i + 1 == length) { 
 
       wrapper.eq(0).css('z-index', 2); 
 
\t \t \t \t wrapper.eq(0).fadeTo(1, 1); 
 
\t \t \t } else { 
 
       wrapper.eq(i + 1).css('z-index', 2); 
 
\t \t \t \t wrapper.eq(i + 1).fadeTo(1, 1); 
 
\t \t \t } 
 
\t \t } else { 
 
      if (i - 1 < 0) { 
 
       wrapper.eq(length - 1).css('z-index', 2); 
 
       wrapper.eq(length - 1).fadeTo(1, 1) 
 
      } else { 
 
       wrapper.eq(i - 1).css('z-index', 2); 
 
       wrapper.eq(i - 1).fadeTo(1, 1) 
 
      } 
 
     } 
 
     
 
     wrapper.eq(i).fadeTo(speed, 0, function() { 
 
      $(this).css('z-index', 1); 
 
     }); 
 
      
 
    } 
 

 
    function splitSlides (i, wrapper, length, dir) { 
 

 
     wrapper.eq(i).css('z-index', 2); 
 
\t \t 
 
\t \t if (dir == 'right') { 
 
\t \t \t if (i + 1 == length) { 
 
\t \t \t \t wrapper.eq(0).css('z-index', 1); 
 
\t \t \t \t wrapper.eq(0).find('.j-split-anchor').each(function() { 
 
\t \t \t \t \t $(this).animate({ 
 
\t \t \t \t \t \t left: 0 
 
\t \t \t \t \t }, 0); 
 
\t \t \t \t }); 
 
\t \t \t } else { 
 
\t \t \t \t wrapper.eq(i + 1).css('z-index', 1); 
 
\t \t \t \t wrapper.eq(i + 1).find('.j-split-anchor').each(function() { 
 
\t \t \t \t \t $(this).animate({ 
 
\t \t \t \t \t \t left: 0 
 
\t \t \t \t \t }, 0); 
 
\t \t \t \t }); 
 
\t \t \t } 
 
\t \t } else { 
 
\t \t \t if (i - 1 < 0) { 
 
\t \t \t \t wrapper.eq(length - 1).css('z-index', 1); 
 
\t \t \t \t wrapper.eq(length - 1).find('.j-split-anchor').each(function() { 
 
\t \t \t \t \t $(this).animate({ 
 
\t \t \t \t \t \t left: 0 
 
\t \t \t \t \t }, 0); 
 
\t \t \t \t }); 
 
\t \t \t } else { 
 
\t \t \t \t wrapper.eq(i - 1).css('z-index', 1); 
 
\t \t \t \t wrapper.eq(i - 1).find('.j-split-anchor').each(function() { 
 
\t \t \t \t \t $(this).animate({ 
 
\t \t \t \t \t \t left: 0 
 
\t \t \t \t \t }, 0); 
 
\t \t \t \t }); 
 
\t \t \t } 
 
\t \t } 
 
\t \t 
 
\t \t wrapper.eq(i).find('.j-split-anchor:first-child').animate({ 
 
\t \t \t 'left': '-100%' 
 
\t \t }, 750); 
 
\t \t wrapper.eq(i).find('.j-split-anchor:last-child').animate({ 
 
\t \t \t 'left': '100%' 
 
\t \t }, 750); 
 
     
 
    } 
 

 
    return this; 
 
} 
 
} (jQuery)); 
 

 
$(window).on("load", function() { 
 
    $('#split-images').jSlide({ 
 
     effect: "fade", 
 
     sizing: "auto", 
 
     speed: 3000, 
 
    }); 
 
});
body, html{ 
 
    height: 100%; 
 
    width: 100%; 
 
    overflow-x: hidden; 
 
    padding: 0; 
 
    margin: 0; 
 
} 
 
#split-images{ 
 
    display: block; 
 
    width: 100%; 
 
    height: 100%; 
 
} 
 
.j-slide-wrapper{ 
 
    height: 100%; 
 
    width: 100%; 
 
    position: absolute; 
 
    top: 0; 
 
    left: 0; 
 
    opacity: 0; 
 
} 
 
/* .j-slide-wrapper::before{ 
 
    display: table; 
 
    table-layout: fixed; 
 
    content: ""; 
 
} 
 
.j-slide-wrapper::after{ 
 
    display: table; 
 
    table-layout: fixed; 
 
    content: ""; 
 
    clear: both; 
 
} */ 
 
.j-split-anchor { 
 
    width: 50%; 
 
    height: 100%; 
 
    float: left; 
 
    position: relative; 
 
    overflow: hidden; 
 
} 
 
.j-slide-wrapper:nth-of-type(n + 2) .j-split-anchor:first-child{ 
 
    left: -100%; 
 
} 
 
.j-slide-wrapper:nth-of-type(n + 2) .j-split-anchor:last-child{ 
 
    left: 100%; 
 
} 
 
.j-split-anchor:first-child img{ 
 
    right: 0; 
 
    -ms-transform: translateX(50%); 
 
    -moz-transform: translateX(50%); 
 
    -o-transform: translateX(50%); 
 
    -webkit-transform:translateX(50%); 
 
    transform: translateX(50%); 
 
} 
 
.j-split-anchor:last-child img{ 
 
    left: 0; 
 
    -ms-transform: translateX(-50%); 
 
    -moz-transform: translateX(-50%); 
 
    -o-transform: translateX(-50%); 
 
    -webkit-transform:translateX(-50%); 
 
    transform: translateX(-50%); 
 
} 
 

 
/* ************************************** BUTTONS ************************** */ 
 
.j-slide-btn{ 
 
    position: absolute; 
 
    height: 25px; 
 
    width: 25px; 
 
    top: 50%; 
 
    -ms-transform: translateY(-50%); 
 
    -moz-transform: translateY(-50%); 
 
    -o-transform: translateY(-50%); 
 
    -webkit-transform:translateY(-50%); 
 
    transform: translateY(-50%); 
 
    z-index: 3; 
 
    opacity: 0.7; 
 
} 
 
#j-slide-left-btn{ 
 
    background: #3f3a3e url(../images/arrow-left-light.png) center center no-repeat; 
 
    left: 2%; \t 
 
} 
 
#j-slide-right-btn{ 
 
    background: #3f3a3e url(../images/arrow-right-light.png) center center no-repeat; 
 
    right: 2%; \t 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="split-images"> 
 
     <img src="https://pixabay.com/static/uploads/photo/2015/03/25/06/48/love-688582_960_720.jpg" alt= "" /> 
 
     <img src="https://prod01-cdn04.cdn.firstlook.org/wp-uploads/sites/1/2016/04/GoogleWH-lead-FIN-article-header.jpg" alt= "" /> 
 
     <img src="https://lh4.googleusercontent.com/KRvgImt_ugjuflC9uMurL5Dln3PTeofLN9xQtHESNs_ehRbFDezNrD9IkBYmzPqFeZ6tFb_lG08=s640-h400-e365" alt= "" /> 
 
    </div>

+0

ここでわかるように、このスニペットでは...前のボタンまたは次のボタンの最初のクリックは、より長いフェード遅延を持っています...これ以外は...働くように見えます。 –

+0

これはまったく遅延がないはずです。残りのクリックのようにすぐにフェードアウトするはずです。 –

答えて

1

私は問題がspeedfadeSpeed VARS間の混乱から来ていると思います。

speedまたはsetting.speedが、ほとんどの場合遅延(3000s)に使用されます。

しかしfadespeed(1000ミリ秒)ここで定義されているようfadeSlides()関数の引数として使用されます。ロードオン

function fadeSlides (i, wrapper, length, dir, speed) {...}); 

、あなたはこの定義:

$(window).on("load", function() { 
    $('#split-images').jSlide({ 
     effect: "fade", 
     sizing: "auto", 
     speed: 3000, 
    }); 
}); 

、ドキュメントの準備を、あなたはjSlideを拡張このように:

(function ($) { 
    /* jSlide */ 
    $.fn.jSlide = function(options) { 
     var settings = $.extend({ 
      buttons: true, 
      speed: 3000, 
      effect: "slide", 
      sizing: "auto", 
      fadeSpeed: 1000 
     }, options); 

     //... More code lines skipped here 

    } 
} (jQuery)); 

私は100%確信していません...しかし、それを見てください。

スニペット動作で気づいた "私はあなたの質問のコメントで奇妙に1000msではなく3000msのように見えます。

+0

私はちょうどz-インデックスに関連する "// Anchors"コメントの下にコードを取り出し、ボタンがすぐに機能することに気付きましたが、画像がフェードインするのではなく現れています。これは手掛かりかもしれないと思っています –

+0

あなたはこの確認について正しいです...ヒュー...私は知らない。 –

+0

私はちょうどそれを考え出した!問題はここにある.. $( '.j-slide-wrapper')。それぞれ(function){ $(this).css( 'z-index'、length - index) })約束{ 'opacity':1 }、1000) } {'opacity':1 } {$(this)} { ); }); スライドラッパーが既にアニメーション化されているため、新しいアニメーションが機能しません。 –

1

問題は、このコードのビットにあった:彼らは、アニメーションの過程ですでにだったので

$('.j-slide-wrapper').each(function (index) { 
     $(this).css('z-index', length - index) 
    }).promise().done(function() { 
     $('.j-slide-wrapper').each(function() { 
      $(this).animate({ 
       'opacity': 1 
      }, 1000) 
     }); 
    }); 

スライドは、再びアニメーション化できませんでした!この問題を解決するために、アニメーションの時間を1000から1に短縮しました。結局のところ、すべての画像がロードされたら、カルーセル全体をフェードインするより良い解決策を望みますが、今のところこれができます。