自定义滑块问题

Posted

技术标签:

【中文标题】自定义滑块问题【英文标题】:Custom slider issue 【发布时间】:2016-09-11 10:58:18 【问题描述】:

我用面向对象的 javascript 编写了一个自定义滑块,如下所示。我在https://jsfiddle.net/5z29xhzg/7/ 的小提琴中包含了该模块。在向左或向右滑动后,幻灯片会被克隆并相应地附加,以便用户可以根据需要循环浏览滑块。有一个单独的函数用于控制活动选项卡。当单独使用时,标签和滑块可以完美地工作,但是当两者结合使用时我遇到了问题。例如,单击“蓝色围裙”,然后单击左侧幻灯片按钮(应将您带到“dave & busters”幻灯片)将您带到幸福幻灯片。或者使用选项卡单击最后一张幻灯片,然后单击下一步按钮不会显示任何内容。有人可以指出我写的对象中的缺陷吗?非常感谢任何帮助!

    GiftSlider = 
    prev: '.slider-container .prev',
    next: '.slider-container .next',
    slide: '.slide',
    slidesContainer: '#slides',
    navLink: '.gift-nav li a',
    init: function() 
        // Initialize nextSlide function when clicking right arrow
        $(this.next).click(this.nextSlide.bind(this));
        $(this.next).click(this.activeTabs.bind(this));
        // Initialize prevSlide function when clicking left arrow
        $(this.prev).click(this.prevSlide.bind(this));
        $(this.prev).click(this.activeTabs.bind(this));
        // Initialize toggleSlides and activeTab functions when clicking nav links
        $(this.navLink).click(this.toggleSlides.bind(this));
        $(this.navLink).click(this.activeTabs.bind(this));
    ,
    nextSlide: function(e) 
        // Prevent default anchor click
        e.preventDefault();
        // Set the current slide
        var currentSlide = $('.slide.current');
        // Set the next slide
        var nextSlide = $('.slide.current').next();
        // remove the current class from the current slide
        currentSlide.removeClass("current");
        // Move the current slide to the end so we can cycle through
        currentSlide.clone().appendTo(this.slidesContainer);
        // remove the last slide so there is not two instances
        currentSlide.remove();
        // Add current class to next slide to display it
        nextSlide.addClass("current");
    ,
    prevSlide: function(e) 
        // Prevent defaulct anchor click
        e.preventDefault();
        // Set the current slide
        var currentSlide = $('.slide.current');
        // Set the last slide
        var lastSlide = $('.slide').last();
        // remove the current class from the current slide
        currentSlide.removeClass("current");
        // Move the last slide to the beginning so we can cycle through
        lastSlide.clone().prependTo(this.slidesContainer);
        // remove the last slide so there is not two instances
        lastSlide.remove();
        // Add current class to new first slide
        $('.slide').first().addClass("current");
    ,
    toggleSlides: function(e) 
        // Prevent defaulct anchor click
        e.preventDefault();
        var itemData = e.currentTarget.dataset.index;
        var currentSlide = $('.slide.current');
        currentSlide.removeClass("current");
        newSlide = $('#slide-' + itemData);
        // currentSlide.clone().appendTo(this.slidesContainer);
        newSlide.addClass("current");
        // console.log(newSlide);
    ,
    activeTabs: function() 
        // *** This could be much simpler if we didnt need to match the slider buttons
        // *** up with nav tabs.  Because I need to track the slider as well, I have
        // *** made this its own function to be used in both instances
        // get the active slide
        var activeSlide = $('.slide').filter(':visible');
        // get the active slide's id
        var currentId = activeSlide.attr('id');
        // grab just the number from the active slide's id
        var currentNum = currentId.slice(-1);
        // remove any active gift-nav links
        $(this.navLink).removeClass("active");
        // get the current tab by matching it to the current slide's id
        var currentTab = $('.gift-nav li a[data-index="' + currentNum + '"]');
        // make that active
        currentTab.addClass("active");
    


$(document).ready(function()

    // Init our objects
    GiftSlider.init();

);

【问题讨论】:

小提琴不是很清楚,因为缺少一些图像?并且有各种图片,但顶部只出现了 2 个链接。无论如何,从我的使用情况来看...您能否更新链接并添加评论。预期的行为? @RachelGallen 是的,很抱歉。我会说得更清楚 @RachelGallen 滑块中的图像都是外部来源,因此您应该能够看到所有这些图像。我删除了jsfiddle.net/5z29xhzg/7 中不相关的“徽标”图像。有四个导航链接,所以我不知道为什么你只会看到两个。 盛大。我实际上在火车上,即将换乘另一辆火车,在去我姐姐吃饭的途中。以后得看。如果有人在此期间提供帮助,那就更好了!我建议在实际问题中更新小提琴链接。 @RachelGallen 听起来不错,谢谢! 【参考方案1】:

错误似乎在toggleSlides

编辑:以下不起作用

当页面加载时,currentSlide 是幻灯片 1。现在假设您单击了第三个选项卡。此时,您需要将幻灯片移到第三个选项卡之前,即第二个选项卡到末尾。当您说currentSlide.clone().appendTo(this.slidesContainer); 时,您是在将第一张幻灯片移到末尾。因此,无论您单击哪个选项卡,当您单击上一个按钮时,它都会转到第一张幻灯片。

如果您改为使用newSlide.prev().clone().appendTo(this.slidesContainer);,代码似乎可以正常工作。

toggleSlides: function(e) 
    // Prevent defaulct anchor click
    e.preventDefault();
    var itemData = e.currentTarget.dataset.index;
    var currentSlide = $('.slide.current');
    currentSlide.removeClass("current");
    newSlide = $('#slide-' + itemData);
    //currentSlide.clone().appendTo(this.slidesContainer);
    newSlide.prev().clone().appendTo(this.slidesContainer);
    newSlide.addClass("current");
    //console.log("In toggle slide: "+newSlide.next().attr("id"));
    //console.log("In toggle slide: "+newSlide.prev().attr("id"));
    //console.log("In toggle slide: "+$('.slide.current').next().attr("id"));
,

这似乎有效。查看https://jsfiddle.net/rfgnm992/1/。您的nextSlidepreviousSlide 似乎将当前幻灯片保留在开头。 toggleSlides 没有这样做。

toggleSlides: function(e) 
        // Prevent defaulct anchor click
        e.preventDefault();
        var itemData = e.currentTarget.dataset.index;
        var currentSlide = $('.slide.current');
        currentSlide.removeClass("current");
        newSlide = $('#slide-' + itemData);
        //keep new slide at the beginning and move the preceding slides to the end 
        newSlide.nextAll().addBack().prependTo(this.slidesContainer);
    //console.log("NewSlide.next: "+newSlide.next().attr('id') + "NewSlide.next.next: "+newSlide.next().next().attr('id')+"newSlide.next.next.next: "+newSlide.next().next().next().attr('id'));
        //currentSlide.clone().appendTo(this.slidesContainer);
        newSlide.addClass("current");
        // console.log(newSlide);
    ,

【讨论】:

感谢您的帮助,但这实际上似乎不起作用。使用上面的 toggleSlides 功能,单击“极乐”导航选项卡,然后开始使用右滑块箭头。你陷入了最后三张幻灯片的无限循环 @JordanBarber 对不起乔丹。现在检查。我已经编辑了答案。让我知道它是否有效。 @JordanBarber 更新了小提琴链接。旧的没有更新。【参考方案2】:

抱歉,我回来的时间比预期的晚了一点。在那里看了看。认为您将整个附加/前置/克隆的事情过度复杂化了。

我让它工作了,但它仍然有一个小错误。它循环大,前进和后退并且正确的链接突出显示,但是当您单击随机链接时,它不会立即突出显示,但是当您单击下一个/上一个按钮时,所选图像中的相关链接会突出显示。肯定是提前!!!我确定我可以换个角度来推出它,但现在是凌晨 2 点,我已经看了一个半小时了!

这是一个fiddle和一个sn-p(只是js因为我的msg太长了-我只是把内容末尾的那段拿出来,没有css更改)

GiftSlider = 
    prev: '.slider-container .prev',
    next: '.slider-container .next',
    slide: '.slide',
    slidesContainer: '#slides',
    navLink: '.gift-nav li a',
    init: function() 
        // Initialize nextSlide function when clicking right arrow
        $(this.next).click(this.nextSlide.bind(this));
        $(this.next).click(this.activeTabs.bind(this));
        // Initialize prevSlide function when clicking left arrow
        $(this.prev).click(this.prevSlide.bind(this));
        $(this.prev).click(this.activeTabs.bind(this));
        // Initialize toggleSlides and activeTab functions when clicking nav links      
        $(this.navLink).click(this.activeTabs.bind(this));
    $(this.navLink).click(this.toggleSlides.bind(this));
    ,
    nextSlide: function(e) 
        // Prevent default anchor click
        e.preventDefault();
        // Set the current slide
        var currentSlide = $('.slide.current');
        // Set the next slide
    var currentId = currentSlide.attr('id');
   var currNum = (currentId.slice(-1));
   var nextNum;
   var increment = 1;
   if (currNum == 4)
       nextNum = 1;
   
   else
      
       nextNum = parseInt(currNum) + parseInt(increment) ;
   
        var nextSlide = $('#slide-' + nextNum); 
        // remove the current class from the current slide
        currentSlide.removeClass("current");
        // Add current class to next slide to display it
        nextSlide.addClass("current");
    // remove the last slide so there is not two instances
    ,
    prevSlide: function(e) 
        // Prevent default anchor click
        e.preventDefault();
        // Set the current slide
        var currentSlide = $('.slide.current');
        // Set the last slide
   var currentId = currentSlide.attr('id');
   var currNum = (currentId.slice(-1));
   var prevNum;
   var decrement =1;
   if (currNum == 1)
       prevNum = 4;
   
   else
      
       prevNum = parseInt(currNum) - parseInt(decrement) ;
   
        var prevSlide = $('#slide-' + prevNum);
    // Move the last slide to the beginning so we can cycle through
        currentSlide.removeClass("current");
    // Add current class to new first slide
        prevSlide.addClass("current");
    ,
    toggleSlides: function(e) 
        // Prevent defaulct anchor click
        e.preventDefault();     
    var itemData = e.currentTarget.dataset.index;
        var currentSlide = $('.slide.current');
        currentSlide.removeClass("current");  
        newSlide = $('#slide-' + itemData);
        newSlide.addClass("current");

    ,
    activeTabs: function() 
        var activeSlide = $('.slide').filter('.current');
        // get the active slide's id
        var currentId = activeSlide.attr('id');
        // grab just the number from the active slide's id
      var currentNum = currentId.slice(-1);
        // remove any active gift-nav links
        $(this.navLink).removeClass("active");
        // get the current tab by matching it to the current slide's id
        var currentTab = $('.gift-nav li a[data-index="'+  currentNum + '"]');
        // make that active
        currentTab.addClass("active");
    


$(document).ready(function()

    // Init our objects
    GiftSlider.init();

);

【讨论】:

...我的天哪。太感谢了!我很抱歉让你看了这么久。感谢您的帮助! 总是乐于提供帮助:)

以上是关于自定义滑块问题的主要内容,如果未能解决你的问题,请参考以下文章

自定义滑块轨道图像

如何使用自定义形状创建 QML 滑块?

请教个Qt相关问题:对于QSlider如何自定义设置滑块滑动区域?

自定义 UI 滑块,拇指图像大小问题

自定义 jquery 移动滑块标签

自定义滑块控件