简体   繁体   English

如何在幻灯片中为可见幻灯片添加“活动”类?

[英]How do I add a class of “active” to a visible slide within a slideshow?

I have a page that is mainly a large slider, I am using unslider (unslider.com) right now, but would be willing to switch to a different slider if it provides the functionality I need. 我有一个主要是大滑块的页面,我现在正在使用unslider(unslider.com),但如果它提供了我需要的功能,它会愿意切换到不同的滑块。 The goal is to have the slide show move through my different projects. 目标是让幻灯片放映我的不同项目。 At the bottom of the page, will be an arrow button that when clicked will slide in the specific project details for the current or visible slide. 在页面底部,将是一个箭头按钮,单击该按钮将滑动当前或可见幻灯片的特定项目详细信息。 I was planning to load the project details into a hidden div via ajax based on the data attribute of the "active" slide. 我计划根据“活动”幻灯片的数据属性,通过ajax将项目详细信息加载到隐藏的div中。

The problem I am having is that I don't know how to add a class of "active" to the visible slide. 我遇到的问题是我不知道如何在可见幻灯片中添加一类“活动”。 I am fairly new, but I believe I will need to use javascript or jquery to change the "active" class appropriately. 我相当新,但我相信我需要使用javascript或jquery来适当地更改“活动”类。 Here is the HTML and jQuery for the slider: 这是滑块的HTML和jQuery:

<div class="banner">
        <ul>  
            <li class="slide_1" data-link="ajaxed_content_url">
                <img src="slide_1.jpg" />           
            </li>
            <li class="slide_2" data-link="ajaxed_content_url">
                <img src="slide_2.jpg" />           
            </li>
            <li class="slide_3" data-link="ajaxed_content_url">
                <img src="slide_3.jpg" />           
            </li>
        </ul>

    <a class="details_btn" href="#"></a>
</div>

<script>
    $('.banner').unslider({
        speed: 500,              
        delay: 5000,              
        complete: function() {},  
        keys: true,              
        dots: true,              
        fluid: true              
    });
</script>

When the slider is rendered in the browser, an "active" class is not added to the code. 在浏览器中呈现滑块时,“活动”类不会添加到代码中。 Any help would be greatly appreciated. 任何帮助将不胜感激。

Unslider simply animates the ul, so it does not actually change the picture li's. Unslider简单地为ul设置动画,因此它实际上并没有改变图片li。 However, it DOES add an active class to the dots. 但是,它会为点添加活动类。 Digging through the source code, I found where it adds the active class to the dots and edited in a similar line that should apply an active class to the pictures. 通过源代码挖掘,我发现它将活动类添加到点并在类似的行中编辑,应该将活动类应用于图片。 Here is the edited source code: 这是编辑过的源代码:

/**
 *   Unslider by @idiot
*/

(function($, f) {
//  If there's no jQuery, Unslider can't work, so kill the operation.
if(!$) return f;

var Unslider = function() {
    //  Set up our elements
    this.el = f;
    this.items = f;

    //  Dimensions
    this.sizes = [];
    this.max = [0,0];

    //  Current inded
    this.current = 0;

    //  Start/stop timer
    this.interval = f;

    //  Set some options
    this.opts = {
        speed: 500,
        delay: 3000, // f for no autoplay
        complete: f, // when a slide's finished
        keys: !f, // keyboard shortcuts - disable if it breaks things
        dots: f, // display ••••o• pagination
        fluid: f // is it a percentage width?,
    };

    //  Create a deep clone for methods where context changes
    var _ = this;

    this.init = function(el, opts) {
        this.el = el;
        this.ul = el.children('ul');
        this.max = [el.outerWidth(), el.outerHeight()];         
        this.items = this.ul.children('li').each(this.calculate);

        //  Check whether we're passing any options in to Unslider
        this.opts = $.extend(this.opts, opts);

        //  Set up the Unslider
        this.setup();

        return this;
    };

    //  Get the width for an element
    //  Pass a jQuery element as the context with .call(), and the index as a parameter: Unslider.calculate.call($('li:first'), 0)
    this.calculate = function(index) {
        var me = $(this),
            width = me.outerWidth(), height = me.outerHeight();

        //  Add it to the sizes list
        _.sizes[index] = [width, height];

        //  Set the max values
        if(width > _.max[0]) _.max[0] = width;
        if(height > _.max[1]) _.max[1] = height;
    };

    //  Work out what methods need calling
    this.setup = function() {
        //  Set the main element
        this.el.css({
            overflow: 'hidden',
            width: _.max[0],
            height: this.items.first().outerHeight()
        });

        //  Set the relative widths
        this.ul.css({width: (this.items.length * 100) + '%', position: 'relative'});
        this.items.css('width', (100 / this.items.length) + '%');

        if(this.opts.delay !== f) {
            this.start();
            this.el.hover(this.stop, this.start);
        }

        //  Custom keyboard support
        this.opts.keys && $(document).keydown(this.keys);

        //  Dot pagination
        this.opts.dots && this.dots();

        //  Little patch for fluid-width sliders. Screw those guys.
        if(this.opts.fluid) {
            var resize = function() {
                _.el.css('width', Math.min(Math.round((_.el.outerWidth() / _.el.parent().outerWidth()) * 100), 100) + '%');
            };

            resize();
            $(window).resize(resize);
        }

        if(this.opts.arrows) {
            this.el.parent().append('<p class="arrows"><span class="prev">â†</span><span class="next">→</span></p>')
                .find('.arrows span').click(function() {
                    $.isFunction(_[this.className]) && _[this.className]();
                });
        };

        //  Swipe support
        if($.event.swipe) {
            this.el.on('swipeleft', _.prev).on('swiperight', _.next);
        }
    };

    //  Move Unslider to a slide index
    this.move = function(index, cb) {
        //  If it's out of bounds, go to the first slide
        if(!this.items.eq(index).length) index = 0;
        if(index < 0) index = (this.items.length - 1);

        var target = this.items.eq(index);
        var obj = {height: target.outerHeight()};
        var speed = cb ? 5 : this.opts.speed;

        if(!this.ul.is(':animated')) {          
            //  Handle those pesky dots
            _.el.find('.dot:eq(' + index + ')').addClass('active').siblings().removeClass('active');
           //HERE IS WHAT I ADDED
           _.el.find('ul li:eq(' + index + ')').addClass('active').siblings().removeClass('active');
            this.el.animate(obj, speed) && this.ul.animate($.extend({left: '-' + index + '00%'}, obj), speed, function(data) {
                _.current = index;
                $.isFunction(_.opts.complete) && !cb && _.opts.complete(_.el);
            });
        }
    };

    //  Autoplay functionality
    this.start = function() {
        _.interval = setInterval(function() {
            _.move(_.current + 1);
        }, _.opts.delay);
    };

    //  Stop autoplay
    this.stop = function() {
        _.interval = clearInterval(_.interval);
        return _;
    };

    //  Keypresses
    this.keys = function(e) {
        var key = e.which;
        var map = {
            //  Prev/next
            37: _.prev,
            39: _.next,

            //  Esc
            27: _.stop
        };

        if($.isFunction(map[key])) {
            map[key]();
        }
    };

    //  Arrow navigation
    this.next = function() { return _.stop().move(_.current + 1) };
    this.prev = function() { return _.stop().move(_.current - 1) };

    this.dots = function() {
        //  Create the HTML
        var html = '<ol class="dots">';
            $.each(this.items, function(index) { html += '<li class="dot' + (index < 1 ? ' active' : '') + '">' + (index + 1) + '</li>'; });
            html += '</ol>';

        //  Add it to the Unslider
        this.el.addClass('has-dots').append(html).find('.dot').click(function() {
            _.move($(this).index());
        });
    };
};

//  Create a jQuery plugin
$.fn.unslider = function(o) {
    var len = this.length;

    //  Enable multiple-slider support
    return this.each(function(index) {
        //  Cache a copy of $(this), so it 
        var me = $(this);
        var instance = (new Unslider).init(me, o);

        //  Invoke an Unslider instance
        me.data('unslider' + (len > 1 ? '-' + (index + 1) : ''), instance);
    });
};
})(window.jQuery, false);

I don't think you will be able to add an active class. 我认为您无法添加active课程。 However, The complete function is executed after every slide animation, try something like this: 但是,在每个幻灯片动画之后执行complete功能,尝试这样的事情:

<script>
    var NB_OF_SLIDES = ...;
    var i = 0;
    loadAjaxForSlide i;
    $('.banner').unslider({
        speed: 500,              
        delay: 5000,              
        complete: function() {
            i++;
            if(i >= NB_OF_SLIDES){
               i = 0;
            }
            loadAjaxForSlide i;
        },  
        keys: true,              
        dots: true,              
        fluid: true              
    });
</script>

But I wouldn't consider loading data via Ajax after every slide animation, it's kinda messy. 但我不会考虑在每个幻灯片动画后通过Ajax加载数据,这有点混乱。 Try loading everything at once at page load. 尝试在页面加载时立即加载所有内容。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何修复卡在第一张幻灯片上的这个简单的 javascript 幻灯片? - How do I fix this simple javascript slideshow stuck on the first slide? 我想在活动幻灯片中添加“is-active” class 并在出现的幻灯片中添加“is-out” class - I want to add the “is-active” class in the active slide and the “is-out” class in the slide that comes out carouFredSel将类别添加到活动幻灯片 - carouFredSel add class to active slide 当某个幻灯片在fullpage.js滑块中具有活动类别时,如何隐藏元素? - How do I hide an element when a certain slide has a class of active in fullpage.js slider? Fullpage.js:如何将CSS类“活动”添加到滑动锚点 - Fullpage.js: How to add css class “active” to slide anchor flexslider幻灯片处于活动状态时添加类(flex-active-slide) - Add class when flexslider slide is active(flex-active-slide) 如何将活动班级添加到我选择的li的父级? - How do I add active class to parent of li that i selected? 我如何为Foundation手风琴dd元素添加一个活动类? - How do I add an active class to Foundation accordion dd element? 如何将“活动”class 添加到 javascript 中单击的导航链接? - How do I add 'active' class to the clicked nav link in javascript? 如何使用jQuery将类添加到手风琴的活动选项卡中? - How do I add a class to the active tab in an accordion using jQuery?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM