如何在向上和向下两个方向上滑动滑块的最后一张幻灯片后继续滚动页面? [英] How to continue scrolling the page after the last slide of the slick slider in the both direction up and down?

查看:29
本文介绍了如何在向上和向下两个方向上滑动滑块的最后一张幻灯片后继续滚动页面?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个光滑的滑块,当用户到达滑块部分时,它会在鼠标滚动上滑动,但是在滚动所有幻灯片后,滑块卡在该位置并且不允许用户转到页面的任何一侧,例如上侧和下侧.我想让用户在完成滑块后继续他的页面旅程到其他部分,如滑块的上部或滑块的底部.任何对问题的任何建议或更正,并允许用户在完成幻灯片后继续页面滚动.我尝试了一些解决方案,但在所有解决方案中都有相同的问题,或者我想念一些东西.如果您有任何示例或建议,请发表评论.我很感激你.

这是尝试一些的js小提琴链接js小提琴

 

<p>向下滚动</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p>

<div class="slider"><div class="slider-in"><img src="https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_960_720.jpg";/>

<div class="slider-in"><img src="https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_960_720.jpg";/>

<div class="slider-in"><img src="https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_960_720.jpg";/>

<div><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>123</p><p>向上滚动</p>

.main-slider {宽度:100%;box-sizing: borde-box;}.main-slider img {宽度:100%;}/* 滑块 */.slick-slider{位置:相对;显示:块;box-sizing: 边框框;-webkit-user-select:无;-moz-user-select:无;-ms-user-select:无;用户选择:无;-webkit-touch-callout:无;-khtml-user-select: 无;-ms-touch-action: pan-y;触摸动作:泛-y;-webkit-tap-highlight-color:透明;}.slick-list{位置:相对;显示:块;溢出:隐藏;边距:0;填充:0;}.slick-list:focus{大纲:无;}.slick-list.dragging{光标:指针;光标:手;}.slick-slider .slick-track,.slick-slider .slick-list{-webkit-transform: translate3d(0, 0, 0);-moz-transform: translate3d(0, 0, 0);-ms-transform: translate3d(0, 0, 0);-o-transform: translate3d(0, 0, 0);变换:translate3d(0, 0, 0);}.slick-track{位置:相对;顶部:0;左:0;显示:块;左边距:自动;右边距:自动;}.slick-track:before,.slick-track:after{显示:表;内容: '';}.slick-track:after{清楚:两者;}.slick-loading .slick-track{可见性:隐藏;}.slick-slide{显示:无;向左飘浮;高度:100%;最小高度:1px;}[dir='rtl'] .slick-slide{浮动:对;}.slick-slide img{显示:块;}.slick-slide.slick-loading img{显示:无;}.slick-slide.dragging img{指针事件:无;}.slick 初始化 .slick-slide{显示:块;}.slick-loading .slick-slide{可见性:隐藏;}.slick-vertical .slick-slide{显示:块;高度:自动;边框:1px 实心透明;}.slick-arrow.slick-hidden {显示:无;}const 滑块 = $(.main-slider");滑块.slick({幻灯片显示:1,幻灯片滚动:1,点:假,箭头:假});Slider.on('wheel', (function(e) {e.preventDefault();如果(e.originalEvent.deltaY <0){$(this).slick('slickPrev');} 别的 {$(this).slick('slickNext');}}));

解决方案

我认为解决方案是在 wheel 事件期间检查是否已到达滑块的末端.一种方法是将 .slick-current 元素的索引与 slick 元素的数量进行比较.

提示:您可能还想检查滑块是否已经完全可见,否则滑块可能会过早滚动.

我已经添加了对页面多个滑块的支持,并处理了评论的问题.

$(document).ready(function() {const 滑块 = $('.slider');函数 onSliderAfterChange(event, slick, currentSlide) {$(event.target).data('current-slide', currentSlide);}功能 onSliderWheel(e) {var deltaY = e.originalEvent.deltaY,$currentSlider = $(e.currentTarget),currentSlickIndex = $currentSlider.data('current-slide') ||0;如果 (//向上滚动时检查(deltaY < 0 && currentSlickIndex == 0) ||//向下滚动时检查(deltaY > 0 && currentSlickIndex == $currentSlider.data('slider-length') - 1)){返回;}e.preventDefault();如果(e.originalEvent.deltaY <0){$currentSlider.slick('slickPrev');} 别的 {$currentSlider.slick('slickNext');}}滑块.每个(功能(索引,元素){var $element = $(element);//设置每个循环中子元素的长度//但更好的性能方法是在标记中的 div.slider 上设置此数据属性$element.data('slider-length', $element.children().length);}).slick({无限:假,幻灯片显示:1,幻灯片滚动:1,点:假,箭头:假}).on('afterChange', onSliderAfterChange).on('轮', onSliderWheel);});

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.css"/><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick-theme.min.css"/><script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.js"></script><div class="宽度:100%"><div style="height: 500px; background-color: #aaa"></div><div class="slider"><div class="slider-in"><img src="https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_960_720.jpg"/>

<div class="slider-in"><img src="https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_960_720.jpg"/>

<div class="slider-in"><img src="https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_960_720.jpg"/>

<div style="height: 500px; background-color: #ccc"></div><div class="slider"><div class="slider-in"><img src="https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_960_720.jpg"/>

<div class="slider-in"><img src="https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_960_720.jpg"/>

<div class="slider-in"><img src="https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_960_720.jpg"/>

I have a slick-slider that are slide on mouse scroll when user reaches to slider section, but after scrolling all the slides the slider stuck at that position and don't allow the user to go to any side of the page like up and down side. I want to allow user after completing slider to continue his page journey to other section like upper sections of the sliders or bottom sections of the slider. Any one any suggestion or correction for problem and allow user to continue to page scroll after completing the slides. I try some solution but in all solutions there are same problems or I miss understand something. If you have any example or suggestion then please comment down. I am grateful for you.

and here is the js fiddle link to try out some js fiddle

   <div>
    <p>Scroll down</p>
    <p>123</p>
    <p>123</p>
    <p>123</p>
    <p>123</p>
    <p>123</p>
    <p>123</p>
    <p>123</p>
    <p>123</p>
    <p>123</p>
    <p>123</p>
    <p>123</p>
    <p>123</p>
    <p>123</p>
    <p>123</p>
    <p>123</p>
    <p>123</p>
    <p>123</p>
  </div>

  <div class="slider">
    <div class="slider-in">
      <img src="https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_960_720.jpg" />
   </div>
   <div class="slider-in">
     <img src="https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_960_720.jpg" />
   </div>
   <div class="slider-in">
    <img src="https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_960_720.jpg" />
   </div>
 </div>
 <div>
   <p>123</p>
   <p>123</p>
   <p>123</p>
   <p>123</p>
   <p>123</p>
   <p>123</p>
   <p>123</p>
   <p>123</p>
   <p>123</p>
   <p>123</p>
   <p>123</p>
   <p>123</p>
   <p>123</p>
   <p>123</p>
   <p>123</p>
   <p>123</p>
   <p>123</p>
   <p>Scroll up</p>
 </div>


         .main-slider {
      width:100%;
      box-sizing: borde-box;
    }

    .main-slider img {
      width:100%;
    }

    /* Slider */
    .slick-slider
    {
        position: relative;

        display: block;
        box-sizing: border-box;

        -webkit-user-select: none;
           -moz-user-select: none;
            -ms-user-select: none;
                user-select: none;

        -webkit-touch-callout: none;
        -khtml-user-select: none;
        -ms-touch-action: pan-y;
            touch-action: pan-y;
        -webkit-tap-highlight-color: transparent;
    }

    .slick-list
    {
        position: relative;

        display: block;
        overflow: hidden;

        margin: 0;
        padding: 0;
    }
    .slick-list:focus
    {
        outline: none;
    }
    .slick-list.dragging
    {
        cursor: pointer;
        cursor: hand;
    }

    .slick-slider .slick-track,
    .slick-slider .slick-list
    {
        -webkit-transform: translate3d(0, 0, 0);
           -moz-transform: translate3d(0, 0, 0);
            -ms-transform: translate3d(0, 0, 0);
             -o-transform: translate3d(0, 0, 0);
                transform: translate3d(0, 0, 0);
    }

    .slick-track
    {
        position: relative;
        top: 0;
        left: 0;

        display: block;
        margin-left: auto;
        margin-right: auto;
    }
    .slick-track:before,
    .slick-track:after
    {
        display: table;

        content: '';
    }
    .slick-track:after
    {
        clear: both;
    }
    .slick-loading .slick-track
    {
        visibility: hidden;
    }

    .slick-slide
    {
        display: none;
        float: left;

        height: 100%;
        min-height: 1px;
    }
    [dir='rtl'] .slick-slide
    {
        float: right;
    }
    .slick-slide img
    {
        display: block;
    }
    .slick-slide.slick-loading img
    {
        display: none;
    }
    .slick-slide.dragging img
    {
        pointer-events: none;
    }
    .slick-initialized .slick-slide
    {
        display: block;
    }
    .slick-loading .slick-slide
    {
        visibility: hidden;
    }
    .slick-vertical .slick-slide
    {
        display: block;

        height: auto;

        border: 1px solid transparent;
    }
    .slick-arrow.slick-hidden {
        display: none;
    }




           const slider = $(".main-slider");
    slider
      .slick({
        slidesToShow: 1,
      slidesToScroll: 1,
        dots: false,
        arrows:false
      });

    slider.on('wheel', (function(e) {
      e.preventDefault();

      if (e.originalEvent.deltaY < 0) {
        $(this).slick('slickPrev');
      } else {
        $(this).slick('slickNext');
      }
    }));

解决方案

I think the solution would be to check during the wheel event whether the end of the slider has been reached. One way would be to compare the index of the .slick-current element with the amount of slick elements.

Just a hint: You may also want to check if the slider is already fully visible, otherwise the slider may scroll too early.

I've added the support for multiple sliders on the page and handled the problem of the comment.

$(document).ready(function() {

  const slider = $('.slider');
  
  function onSliderAfterChange(event, slick, currentSlide) {
    $(event.target).data('current-slide', currentSlide);
  }
  
  function onSliderWheel(e) {
    var deltaY = e.originalEvent.deltaY,
      $currentSlider = $(e.currentTarget),
      currentSlickIndex = $currentSlider.data('current-slide') || 0;
    
    if (
      // check when you scroll up
      (deltaY < 0 && currentSlickIndex == 0) ||
      // check when you scroll down
      (deltaY > 0 && currentSlickIndex == $currentSlider.data('slider-length') - 1)
    ) {
      return;
    }

    e.preventDefault();

    if (e.originalEvent.deltaY < 0) {
      $currentSlider.slick('slickPrev');
    } else {
      $currentSlider.slick('slickNext');
    }
  }
  
  slider.each(function(index, element) {
    var $element = $(element);
    // set the length of children in each loop
    // but the better way for performance is to set this data attribute on the div.slider in the markup
    $element.data('slider-length', $element.children().length);
  })
  .slick({
    infinite: false,
    slidesToShow: 1,
    slidesToScroll: 1,
    dots: false,
    arrows: false
  })
  .on('afterChange', onSliderAfterChange)
  .on('wheel', onSliderWheel);

});

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick-theme.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.js"></script>

<div class="width: 100%">
  <div style="height: 500px; background-color: #aaa"></div>
  <div class="slider">
    <div class="slider-in">
      <img src="https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_960_720.jpg" />
    </div>
    <div class="slider-in">
      <img src="https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_960_720.jpg" />
    </div>
    <div class="slider-in">
      <img src="https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_960_720.jpg" />
    </div>
  </div>
  <div style="height: 500px; background-color: #ccc"></div>
  <div class="slider">
    <div class="slider-in">
      <img src="https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_960_720.jpg" />
    </div>
    <div class="slider-in">
      <img src="https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_960_720.jpg" />
    </div>
    <div class="slider-in">
      <img src="https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_960_720.jpg" />
    </div>
  </div>
</div>

这篇关于如何在向上和向下两个方向上滑动滑块的最后一张幻灯片后继续滚动页面?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
前端开发最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆