【问题标题】:Create slider like infinite scrolling with CSS使用 CSS 创建像无限滚动一样的滑块
【发布时间】:2018-06-29 22:34:54
【问题描述】:

我正在尝试创建 CSS 滑块无限滚动,但没有附加/添加/创建 DOM 元素。无限滚动就像到达最后一张幻灯片时一样,第一张幻灯片应该在它之后再次显示。

我有一个固定宽度的幻灯片,所以使用 slick 和 box 滑块插件对我不起作用。

.slider-wrap {
  white-space: nowrap;
  overflow-x: auto;
  overflow-y: hidden;
  border: 1px solid red;
}

.slider-wrap .slide {
  display: inline-block;
  width: 200px;
  margin: 5px;
}

.slider-wrap .slide img {
  width: 100%;
}
<div class="slider-wrap">

  <div class="slide">
    <img src="http://via.placeholder.com/350x150">
  </div>
  <div class="slide">
    <img src="http://via.placeholder.com/350x150">
  </div>
  <div class="slide">
    <img src="http://via.placeholder.com/350x150">
  </div>
  <div class="slide">
    <img src="http://via.placeholder.com/350x150">
  </div>
  <div class="slide">
    <img src="http://via.placeholder.com/350x150">
  </div>
  <div class="slide">
    <img src="http://via.placeholder.com/350x150">
  </div>
  <div class="slide">
    <img src="http://via.placeholder.com/350x150">
  </div>

</div>

【问题讨论】:

  • 嗨,你有没有尝试过?
  • 尝试了 jquery clone 和其他一些方法..但没有任何成果..
  • 你能给我们看看吗?
  • 当滑块到达最后一张幻灯片时,我克隆并附加到父级,但它不断创建越来越多的 dom 元素..

标签: javascript jquery css


【解决方案1】:

这里有两个选项:

  • 克隆项目:您会得到更自然的方法(克隆还不错)。这是您通常会在网站上找到的用于添加更多内容的系统。

  • 恢复位置滚动位置到另一个位置,使滑块看起来永远不会结束。请注意,这不会使滚动条变小,因为滑块的内容永远不会改变


(a) 克隆

正如你所说,你可以克隆图像。

诀窍是确定滚动条何时到达滑块的末端以克隆更多图像:

$(function() {
  $('.slider-wrap').scroll(function() {
    
    const slider = $(this);
          width = slider.innerWidth()
          scrollWidth = slider[0].scrollWidth;
          scrollLeft = slider.scrollLeft();
    
    if(scrollWidth - width == scrollLeft) {
      slider.children().clone().appendTo(slider);
    }
    
  });
});
.slider-wrap {
  white-space: nowrap;
  overflow-x: auto;
  overflow-y: hidden;
  border: 1px solid red;
}

.slider-wrap .slide {
  display: inline-block;
  width: 200px;
  margin: 5px;
}

.slider-wrap .slide img {
  width: 100%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="slider-wrap">
  <div class="slide">
    <img src="http://via.placeholder.com/350x150">
  </div>
  <div class="slide">
    <img src="http://via.placeholder.com/350x150">
  </div>
  <div class="slide">
    <img src="http://via.placeholder.com/350x150">
  </div>
  <div class="slide">
    <img src="http://via.placeholder.com/350x150">
  </div>
  <div class="slide">
    <img src="http://via.placeholder.com/350x150">
  </div>
  <div class="slide">
    <img src="http://via.placeholder.com/350x150">
  </div>
  <div class="slide">
    <img src="http://via.placeholder.com/350x150">
  </div>

</div>

这是一个演示:

$(function(){$('.slider-wrap').scroll(function(){const slider=$(this);var $width=slider.innerWidth()
var $scrollWidth=slider[0].scrollWidth;var $scrollLeft=slider.scrollLeft();if($scrollWidth-$width==$scrollLeft){slider.children().clone().appendTo(slider)}})})
.slider-wrap{white-space:nowrap;overflow-x:auto;overflow-y:hidden;border:1px solid red}.slider-wrap .slide{display:inline-block;margin:5px}.slider-wrap .slide img{height:120px}
&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;&lt;div class="slider-wrap"&gt; &lt;div class="slide"&gt; &lt;img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTa4e2VF6cfou9oL0cc5OAzVTEbmAgFjIW2r-7lTkpOljG9k38N"&gt; &lt;/div&gt;&lt;div class="slide"&gt; &lt;img src="https://nbocdn.akamaized.net/Assets/Images_Upload/2018/01/06/0060bbce-f2f2-11e7-bf60-029def90d6d6_web_scale_0.0542636_0.0542636__.jpg?maxheight=460&amp;maxwidth=638&amp;scale=both"&gt; &lt;/div&gt;&lt;div class="slide"&gt; &lt;img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQr0xQ-gVF1Sy1a1sHoUyfGdrBwyz-5u0Tirkt-uNCKd-AzNXY1ww"&gt; &lt;/div&gt;&lt;div class="slide"&gt; &lt;img src="https://cdn.pixabay.com/photo/2017/05/29/15/34/kitten-2354016_960_720.jpg"&gt; &lt;/div&gt;&lt;div class="slide"&gt; &lt;img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTJLwVbVu6tjubsduR43je-Muk7p8lAKDu569GuL_yDWGzrZwp2"&gt; &lt;/div&gt;&lt;div class="slide"&gt; &lt;img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQRHeW6zNDdDQBwtpuu3RvLW1ihM3Za-OLBoOMRR_4z7GvwYor2eQ"&gt; &lt;/div&gt;&lt;div class="slide"&gt; &lt;img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRKeCmurlUrTtd4CjvXYskGVAUAiDq5X49iNb3XhOcMss2vN8c6"&gt; &lt;/div&gt;&lt;/div&gt;

(b) 使用 scrollLeft 的 hack

您还可以通过将scrollLeft 设置为首次添加新幻灯片容器时的位置,直接返回到第一个幻灯片容器:

let firstPos = undefined;

$('.slider').scroll(function() {

  const slider = $(this);
        width = slider.innerWidth()
        scrollWidth = slider[0].scrollWidth;
        scrollLeft = slider.scrollLeft();
        isEndOfSlider = (scrollWidth - width) == scrollLeft;
        numberOfWraps = slider.children().length;


  if(isEndOfSlider) {    
    
    if(numberOfWraps == 1) {

      firstPos = scrollLeft;
      slider.children().first().clone().appendTo(slider);

    } else {

      slider.scrollLeft(firstPos);

    }      

  }


});
.slider {
  white-space: nowrap;
  overflow-x: auto;
  overflow-y: hidden;
  border: 1px solid red;
}

.slider-wrap {
  display: inline-block;
}

.slider-wrap .slide {
  display: inline-block;
  width: 200px;
  margin: 5px;
}

.slider-wrap .slide img {
  width: 100%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="slider">
  <div class="slider-wrap">
    <div class="slide">1
      <img src="http://via.placeholder.com/350x150">
    </div>
    <div class="slide">2
      <img src="http://via.placeholder.com/350x150">
    </div>
    <div class="slide">3
      <img src="http://via.placeholder.com/350x150">
    </div>
    <div class="slide">...
      <img src="http://via.placeholder.com/350x150">
    </div>
    <div class="slide">...
      <img src="http://via.placeholder.com/350x150">
    </div>
    <div class="slide">-2
      <img src="http://via.placeholder.com/350x150">
    </div>
    <div class="slide">-1
      <img src="http://via.placeholder.com/350x150">
    </div>
  </div>
</div>

这是一个演示:

let firstPos=undefined;$('.slider').scroll(function(){const slider=$(this);width=slider.innerWidth()
scrollWidth=slider[0].scrollWidth;scrollLeft=slider.scrollLeft();isEndOfSlider=(scrollWidth-width)==scrollLeft;numberOfWraps=slider.children().length;if(isEndOfSlider){if(numberOfWraps==1){firstPos=scrollLeft;slider.children().first().clone().appendTo(slider)}else{slider.scrollLeft(firstPos)}}})
.slider{white-space:nowrap;overflow-x:auto;overflow-y:hidden;border:1px solid red}.slider-wrap{display:inline-block}.slider-wrap .slide{display:inline-block;margin:5px}.slider-wrap .slide img{width:auto;height:120px}
&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;&lt;div class="slider"&gt; &lt;div class="slider-wrap"&gt; &lt;div class="slide"&gt; &lt;img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTa4e2VF6cfou9oL0cc5OAzVTEbmAgFjIW2r-7lTkpOljG9k38N"&gt; &lt;/div&gt;&lt;div class="slide"&gt; &lt;img src="https://nbocdn.akamaized.net/Assets/Images_Upload/2018/01/06/0060bbce-f2f2-11e7-bf60-029def90d6d6_web_scale_0.0542636_0.0542636__.jpg?maxheight=460&amp;maxwidth=638&amp;scale=both"&gt; &lt;/div&gt;&lt;div class="slide"&gt; &lt;img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQr0xQ-gVF1Sy1a1sHoUyfGdrBwyz-5u0Tirkt-uNCKd-AzNXY1ww"&gt; &lt;/div&gt;&lt;div class="slide"&gt; &lt;img src="https://cdn.pixabay.com/photo/2017/05/29/15/34/kitten-2354016_960_720.jpg"&gt; &lt;/div&gt;&lt;div class="slide"&gt; &lt;img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTJLwVbVu6tjubsduR43je-Muk7p8lAKDu569GuL_yDWGzrZwp2"&gt; &lt;/div&gt;&lt;div class="slide"&gt; &lt;img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQRHeW6zNDdDQBwtpuu3RvLW1ihM3Za-OLBoOMRR_4z7GvwYor2eQ"&gt; &lt;/div&gt;&lt;div class="slide"&gt; &lt;img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRKeCmurlUrTtd4CjvXYskGVAUAiDq5X49iNb3XhOcMss2vN8c6"&gt; &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;

【讨论】:

  • 问题来了,dom 元素不断添加..不像滑块插件中只保留幻灯片数量,但仍然具有滚动功能而不添加 dom 元素。
  • 不像滑块插件那样只保留幻灯片的数量,但仍然具有滚动功能而不添加 dom 元素你是什么意思?你没有在你的问题中提到这一点......
  • 请查看 dom,当滚动到最后一张幻灯片时,它会添加 div..关于问题中的提及..对不起,我错过了那部分..
  • @Optimus 它会在滚动到最后一张幻灯片时添加 div,这不是你想要的吗?
  • 是的,但不是这样......它应该再次显示相同的第一张幻灯片而不添加/创建新的 dom 元素......
猜你喜欢
  • 2013-05-02
  • 2021-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
  • 2018-07-30
  • 2023-03-30
相关资源
最近更新 更多