【问题标题】:Flexslider and scrollspy are conflicting with each otherFlexslider 和 scrollspy 相互冲突
【发布时间】:2014-12-26 09:27:10
【问题描述】:

我正在使用模板。我在一个页面中实现了两次 flexslider。但在那之后我遇到了scrollspy的问题。我已经尝试了在这里或网上找到的所有解决方案,但还没有运气。 问题是当我从导航菜单中选择“任务”时,它将滚动到适当的部分,但前一个按钮“技术”被激活并突出显示。同样适用于其他部分。并且当您在单击任务后手动滚动一点时,它将被激活。可以看问题Here

我已尝试在以下代码中更改 flexslider(此处为技术部分)的偏移值和高度。有人能帮忙吗? FlexSlider的版本是v2.2.0

    function ScrollSpy(element, options) {
        var href;
        var process  = $.proxy(this.process, this);
        this.$element       = $(element).is('body') ? $(window) : $(element);
        this.$body          = $('body');
        this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process);
        this.options        = $.extend({}, ScrollSpy.DEFAULTS, options);
        this.selector       = (this.options.target || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) || '') + ' > ul > li > a';
        this.offsets        = $([]);
        this.targets        = $([]);
        this.activeTarget   = null;
        this.refresh();
        this.process();
    }

    ScrollSpy.DEFAULTS = {
        offset: 30
    }

    ScrollSpy.prototype.refresh = function () {
        var offsetMethod = this.$element[0] == window ? 'offset' : 'position';

        this.offsets = $([]);
        this.targets = $([]);

        var self     = this;
        var $targets = this.$body.find(this.selector).map(function () {
            var $el   = $(this);
            var href  = $el.data('target') || $el.attr('href');
            var $href = /^#\w/.test(href) && $(href);

            return ($href && $href.length && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null
        }).sort(function (a, b) {
            return a[0] - b[0]
        }).each(function () {
            self.offsets.push(this[0]);
            self.targets.push(this[1]);
        });
    }

    ScrollSpy.prototype.process = function () {
        var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset,
            scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight,
            maxScroll    = scrollHeight - this.$scrollElement.height(),
            offsets      = this.offsets,
            targets      = this.targets,
            activeTarget = this.activeTarget, i;

        if (scrollTop >= maxScroll) {
            return activeTarget != (i = targets.last()[0]) && this.activate(i);
        }

        for (i = offsets.length; i--;) {
            activeTarget != targets[i] && scrollTop >= offsets[i] && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) && this.activate( targets[i] );
        }

    }

    ScrollSpy.prototype.activate = function (target) {
        this.activeTarget = target;
        $(this.selector).parent('li').removeClass('current-menu-item');
        var selector = this.selector + '[data-target="' + target + '"],' + this.selector + '[href="' + target + '"]';
        var active = $(selector).parents('li').addClass('current-menu-item');
        active.trigger('activate');
    }

    // SCROLLSPY PLUGIN DEFINITION
    // ===========================

    $.fn.scrollspy = function (option) {
        return this.each(function () {
            var $this   = $(this),
                data    = $this.data('bs.scrollspy'),
                options = typeof option == 'object' && option;
            if (!data) {
                 $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)));
            }
            if (typeof option == 'string') { data[option](); }
        });
    }

    $.fn.scrollspy.Constructor = ScrollSpy;

【问题讨论】:

  • 当你在点击任务后手动滚动一点,它会被激活 - 因为你要进入其他菜单的区域。因此它将被突出显示
  • 没错,但是 flexslider 在该部分中是有界的,因此该#technologies 部分的限制应该在此结束,但它正在扩展到下一部分。这就是让我困惑的地方,我应用的解决方案不起作用。
  • 如果增加偏移值(比如增加200)会有什么影响?
  • 哇,伙计,我没有尝试增加这么多。现在,当它的 200 时,默认激活的菜单是第二个菜单项“JEGenres”而不是“home”,并且点击任务后的手动滚动量减少了。所以我尝试了300,手动滚动问题解决了,但是第二个菜单项被选中了。

标签: jquery flexslider scrollspy


【解决方案1】:

让初始偏移值为 30px,以便它默认保持在“home”。现在给出一个 if 条件来检查 scrolltop 是否超过某个值。修改您的ScrollSpy.prototype.process = function (),如下所示:

if(this.$scrollElement.scrollTop() > check){
        var scrollTop    = this.$scrollElement.scrollTop() + 300px,
} else {
        var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset,
}

尝试更改check的值(如100、200等)

【讨论】:

  • 嗨,谢谢里奥。我试图应用您的建议,但可能某处出现错误,页面根本没有加载,整个空白。我认为 300px 应该以不同的方式编写,因为它是 css 的一个单位。对不起,如果我误解了它,因为我是 js 新手。请建议。
  • 错误可能是因为我无法运行它。不是 300px,而是写 offset*10。看看这是否有效。还可以尝试使用此函数中的警报进行调试,以跟踪控件的移动。
  • 我明白了兄弟..我创建了新变量并将其放在 300px 的位置。太感谢了。我觉得是时候多了解js了。
猜你喜欢
  • 2014-09-15
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
  • 2019-12-07
  • 2020-06-29
相关资源
最近更新 更多