当前位置: 首页 > 面试题库 >

无限循环滑块概念

邵赞
2023-03-14
问题内容

我想知道使用JavaScript / jQuery为网站构建Infinity-Image-Loop-
Slider的最佳(好的可读性代码,有害生物实践代码,可重用性)概念是什么?我不知道如何编码幻灯片,但是什么蓝图符合上面提到的要求。我的问题的主要重点是如何排列图片以获得无限循环滑块的印象。

通过查看来自不同滑块的代码,我遇到了两种解决方案:

每次显示下一张/上一张图像时,更改所有图像的z索引。

-更改DOM中图像的位置。

但是检查和理解他人的代码非常耗时-这就是为什么我问这个问题:-)


问题答案:

tl; dr-

无需花费太多精力即可创建无限图像滑块的一种简单方法如下:为了简单起见,您可以<n>循环滑动图像,以便在n第一个图像之后可视化的下一个图像是1st(并且反之亦然)。

这个想法是创建第一个和最后一个图像的克隆,以便

  • 最后一张图片的副本位于第一张图片之前;
  • 第一个图像的副本将附加在最后一个图像之后。

无论您的图像量是多少,您最多只需要追加2个克隆的元素。

再次为简单起见,假设所有图像都是100px宽的,并且将它们包裹在一个容器中,您可以使用左右将其移动到剪切蒙版中overflow:hidden。然后,所有图像都可以轻松地与容器连续对齐display: inline-blockwhite-space: nowrap设置在容器上(flexbox现在更容易了)。

对于n = 4DOM结构,将如下所示:

offset(px)     0       100     200     300     400     500
images         |   4c   |   1   |   2   |   3   |   4   |   1c

/*                 ^^                                       ^^
       [ Clone of the last image ]              [ Clone of the 1st image ]
*/

在开始时,您的容器将与一起放置left: -100px(或也margin-left: -100px
可能更好(出于性能方面的考虑)transform:translateX(-100px)),因此滑块可以显示第一张图像。要从一张图片切换到另一张图片,您需要在以前选择的同一属性上应用javascript动画。

当你的滑块是目前在4个图像,你必须从图像切换41c,这样的想法是在动画结束后执行的回调,不久在真正的1个重新定位你的滑盖包装ST图像偏移量(例如你设置left:-100px到容器)

这类似于当滑块当前位于第一个元素上时:要显示先前的图像,您只需要从一个图像执行动画1即可4c;当动画完成后,只需移动容器即可,将滑块固定地位于第4个位置个图像偏移(例如,你设置left:-400px的容器)。

您可以看到上面的提琴效果:这是js/jquery我使用的最少代码(当然,甚至可以对代码进行优化,以使项目的宽度不会硬编码到脚本中)

$(function() {

  var gallery = $('#gallery ul'),
      items   = gallery.find('li'),
      len     = items.length,
      current = 1,  /* the item we're currently looking */

      first   = items.filter(':first'),
      last    = items.filter(':last'),

      triggers = $('button');

  /* 1. Cloning first and last item */
  first.before(last.clone(true)); 
  last.after(first.clone(true));

  /* 2. Set button handlers */
  triggers.on('click', function() {

    var cycle, delta;

    if (gallery.is(':not(:animated)')) {

        cycle = false;
        delta = (this.id === "prev")? -1 : 1;
        /* in the example buttons have id "prev" or "next" */

        gallery.animate({ left: "+=" + (-100 * delta) }, function() {

            current += delta;

            /** 
             * we're cycling the slider when the the value of "current" 
             * variable (after increment/decrement) is 0 or when it exceeds
             * the initial gallery length
             */          
            cycle = (current === 0 || current > len);

            if (cycle) {
                /* we switched from image 1 to 4-cloned or 
                   from image 4 to 1-cloned */
                current = (current === 0)? len : 1; 
                gallery.css({left:  -100 * current });
            }
        });   
     }

  });
});

如前所述,此解决方案不需要太多的工作和性能,只需将这种方法与不带循环的普通滑块进行比较即可,它仅需要在初始化滑块时再进行两次DOM插入,以及一些(非常琐碎的)额外逻辑管理后退/前进循环。

这是另一个示例,当您一次看到两个元素时:在这种情况下,您需要克隆更多的元素并对逻辑进行一些简单的更改

我不知道是否存在更简单或更佳的方法,但希望无论如何会有所帮助。



 类似资料:
  • hasNext()的定义是“如果此扫描仪的输入中有另一个标记,则返回true。此方法可能会在等待输入扫描时阻塞。扫描仪不会前进超过任何输入。” 当我把 standardInput.hasNext() 放在 for 循环中时,程序会向无穷大运行。但是如果我把它放在 while-loop 中,它不会运行到无穷大。这两个程序之间的区别在哪里,为什么其中一个有效而另一个无效? for循环: while-l

  • 我正在用我的java书复习数据结构,我需要重新创建一个循环链表。我对这个无限循环的链表有问题,弄不清楚为什么。我可以将值插入到列表中,但是打印和删除这些值似乎会无限循环最初插入的值。我如何更改我的List类以避免无限循环? CircularList.Class 链接类

  • 基本上,findNode()搜索其数据等于作为参数插入的字符串的节点,但当我调用outputList()方法(该方法返回屏幕上当前节点的字符串表示)时,它将继续无限循环。 outputList方法是: 如有任何帮助,我们将不胜感激。提前道谢。

  • 我有一个带感应帽的覆盆子皮。我制作了一个二进制时钟,我想在Sense hat的显示器上显示并保持更新。然而,我想要的能力,开关时钟与操纵杆中间。一切都很好,除了我的时钟的更新循环阻止任何新的输入一旦启动。 我一直在考虑如何解决这个问题。如何允许脚本/时钟保持运行,并且仍然接受来自操纵杆的新操作。但是一旦while循环开始,我就卡住了。我不知道该用谷歌搜索什么。我已经开始研究async/await,

  • 问题内容: 为什么我在递归方法中遇到无限循环,而没有机会输入任何符号来破坏它? 如果您尝试创建错误(将字符串值输入键,然后尝试向其添加数字),则您将在控制台中获得无限的“错误”文本,而不是在第一次错误后,程序应再次询问该数字和然后才决定要做什么。 问题答案: 如果失败,则抛出异常,但不使用无效数据。从文档中: 当扫描程序抛出时,扫描程序将不会传递导致异常的令牌,因此可以通过其他方法检索或跳过该令牌

  • 我一直在玩React 16.7-alpha中的新钩子系统,当我处理的状态是一个对象或数组时,我陷入了useEffect中的无限循环中。 首先,我使用useState并用一个像这样的空对象启动它: 然后,在useffect中,我使用setObj再次将其设置为空对象。作为第二个参数,我正在传递[obj],希望如果对象的内容没有改变,它不会更新。但它一直在更新。我猜是因为无论内容是什么,它们总是不同的对