javascript - 覆盖 element.style{width : ;} value in jquery sticky nav

标签 javascript jquery html css navigation

我遇到的问题是让我的粘性导航跨越页面的整个宽度。我正在使用来自 http://stickyjs.com/ 的 jquery 粘性导航插件- 我尝试将宽度设置为 100%,但有一个 element.style 属性覆盖了容器宽度。在研究了这个问题之后,这个 element.style 值似乎来自这个插件的 javascript。我是代码新手,我的 javascript 知识有限,所以任何关于如何更改/删除该 element.style 值的指导将不胜感激。

<!DOCTYPE html>
<html lang="en">
<head>
<script src="http://code.jquery.com/jquery-1.11.0.min.js" type="text/javascript" charset="utf-8"></script>
<script src="js/jquery.sticky.js"></script>
</head>
<body>
<div class="wrapper">
<header id="sticker" class="clearfix">
  <a href="#home" class="logo"><img src="img/logo.png" alt="Conference Logo"></a>
  <nav>
      <ul class="monquan">
        <li><a href="#schedule">Schedule</a></li>
        <li><a href="#locations">Locations</a></li>
        <li><a href="#workshops">Workshops</a></li>
        <li><a href="#register">Register</a></li>
      </ul>
  </nav>
</header>
</div>
<script>
$(document).ready(function(){
$("#sticker").sticky({topSpacing:0});
});
</script>
</body>
</html>

我的元素有 HTML,下面是 jquery.sticky.js 代码,我相信它可以解决我的问题。

// Sticky Plugin v1.0.4 for jQuery
// =============
// Author: Anthony Garand
// Improvements by German M. Bravo (Kronuz) and Ruud Kamphuis (ruudk)
// Improvements by Leonardo C. Daronco (daronco)
// Created: 02/14/2011
// Date: 07/20/2015
// Website: http://stickyjs.com/
// Description: Makes an element on the page stick on the screen as you scroll
//              It will only set the 'top' and 'position' of your element, you
//              might need to adjust the width in some cases.

(function (factory) {
if (typeof define === 'function' && define.amd) {
    // AMD. Register as an anonymous module.
    define(['jquery'], factory);
} else if (typeof module === 'object' && module.exports) {
    // Node/CommonJS
    module.exports = factory(require('jquery'));
} else {
    // Browser globals
    factory(jQuery);
}
}(function ($) {
var slice = Array.prototype.slice; // save ref to original slice()
var splice = Array.prototype.splice; // save ref to original slice()

var defaults = {
  topSpacing: 0,
  bottomSpacing: 0,
  className: 'is-sticky',
  wrapperClassName: 'sticky-wrapper',
  center: false,
  getWidthFrom: '',
  widthFromWrapper: true, // works only when .getWidthFrom is empty
  responsiveWidth: false,
  zIndex: 'auto'
},
$window = $(window),
$document = $(document),
sticked = [],
windowHeight = $window.height(),
scroller = function() {
  var scrollTop = $window.scrollTop(),
    documentHeight = $document.height(),
    dwh = documentHeight - windowHeight,
    extra = (scrollTop > dwh) ? dwh - scrollTop : 0;

  for (var i = 0, l = sticked.length; i < l; i++) {
    var s = sticked[i],
      elementTop = s.stickyWrapper.offset().top,
      etse = elementTop - s.topSpacing - extra;

    //update height in case of dynamic content
    s.stickyWrapper.css('height', s.stickyElement.outerHeight());

    if (scrollTop <= etse) {
      if (s.currentTop !== null) {
        s.stickyElement
          .css({
            'width': '',
            'position': '',
            'top': '',
            'z-index': ''
          });
        s.stickyElement.parent().removeClass(s.className);
        s.stickyElement.trigger('sticky-end', [s]);
        s.currentTop = null;
      }
    }
    else {
      var newTop = documentHeight - s.stickyElement.outerHeight()
        - s.topSpacing - s.bottomSpacing - scrollTop - extra;
      if (newTop < 0) {
        newTop = newTop + s.topSpacing;
      } else {
        newTop = s.topSpacing;
      }
      if (s.currentTop !== newTop) {
        var newWidth;
        if (s.getWidthFrom) {
            newWidth = $(s.getWidthFrom).width() || null;
        } else if (s.widthFromWrapper) {
            newWidth = s.stickyWrapper.width();
        }
        if (newWidth == null) {
            newWidth = s.stickyElement.width();
        }
        s.stickyElement
          .css('width', newWidth)
          .css('position', 'fixed')
          .css('top', newTop)
          .css('z-index', s.zIndex);

        s.stickyElement.parent().addClass(s.className);

        if (s.currentTop === null) {
          s.stickyElement.trigger('sticky-start', [s]);
        } else {
          // sticky is started but it have to be repositioned
          s.stickyElement.trigger('sticky-update', [s]);
        }

        if (s.currentTop === s.topSpacing && s.currentTop > newTop || s.currentTop === null && newTop < s.topSpacing) {
          // just reached bottom || just started to stick but bottom is already reached
          s.stickyElement.trigger('sticky-bottom-reached', [s]);
        } else if(s.currentTop !== null && newTop === s.topSpacing && s.currentTop < newTop) {
          // sticky is started && sticked at topSpacing && overflowing from top just finished
          s.stickyElement.trigger('sticky-bottom-unreached', [s]);
        }

        s.currentTop = newTop;
      }

      // Check if sticky has reached end of container and stop sticking
      var stickyWrapperContainer = s.stickyWrapper.parent();
      var unstick = (s.stickyElement.offset().top + s.stickyElement.outerHeight() >= stickyWrapperContainer.offset().top + stickyWrapperContainer.outerHeight()) && (s.stickyElement.offset().top <= s.topSpacing);

      if( unstick ) {
        s.stickyElement
          .css('position', 'absolute')
          .css('top', '')
          .css('bottom', 0)
          .css('z-index', '');
      } else {
        s.stickyElement
          .css('position', 'fixed')
          .css('top', newTop)
          .css('bottom', '')
          .css('z-index', s.zIndex);
      }
    }
  }
},
resizer = function() {
  windowHeight = $window.height();

  for (var i = 0, l = sticked.length; i < l; i++) {
    var s = sticked[i];
    var newWidth = null;
    if (s.getWidthFrom) {
        if (s.responsiveWidth) {
            newWidth = $(s.getWidthFrom).width();
        }
    } else if(s.widthFromWrapper) {
        newWidth = s.stickyWrapper.width();
    }
    if (newWidth != null) {
        s.stickyElement.css('width', newWidth);
    }
  }
},
methods = {
  init: function(options) {
    var o = $.extend({}, defaults, options);
    return this.each(function() {
      var stickyElement = $(this);

      var stickyId = stickyElement.attr('id');
      var wrapperId = stickyId ? stickyId + '-' + defaults.wrapperClassName : defaults.wrapperClassName;
      var wrapper = $('<div></div>')
        .attr('id', wrapperId)
        .addClass(o.wrapperClassName);

      stickyElement.wrapAll(function() {
        if ($(this).parent("#" + wrapperId).length == 0) {
                return wrapper;
        }
});

      var stickyWrapper = stickyElement.parent();

      if (o.center) {
        stickyWrapper.css({width:stickyElement.outerWidth(),marginLeft:"auto",marginRight:"auto"});
      }

      if (stickyElement.css("float") === "right") {
        stickyElement.css({"float":"none"}).parent().css({"float":"right"});
      }

      o.stickyElement = stickyElement;
      o.stickyWrapper = stickyWrapper;
      o.currentTop    = null;

      sticked.push(o);

      methods.setWrapperHeight(this);
      methods.setupChangeListeners(this);
    });
  },

  setWrapperHeight: function(stickyElement) {
    var element = $(stickyElement);
    var stickyWrapper = element.parent();
    if (stickyWrapper) {
      stickyWrapper.css('height', element.outerHeight());
    }
  },

  setupChangeListeners: function(stickyElement) {
    if (window.MutationObserver) {
      var mutationObserver = new window.MutationObserver(function(mutations) {
        if (mutations[0].addedNodes.length || mutations[0].removedNodes.length) {
          methods.setWrapperHeight(stickyElement);
        }
      });
      mutationObserver.observe(stickyElement, {subtree: true, childList: true});
    } else {
      if (window.addEventListener) {
        stickyElement.addEventListener('DOMNodeInserted', function() {
          methods.setWrapperHeight(stickyElement);
        }, false);
        stickyElement.addEventListener('DOMNodeRemoved', function() {
          methods.setWrapperHeight(stickyElement);
        }, false);
      } else if (window.attachEvent) {
        stickyElement.attachEvent('onDOMNodeInserted', function() {
          methods.setWrapperHeight(stickyElement);
        });
        stickyElement.attachEvent('onDOMNodeRemoved', function() {
          methods.setWrapperHeight(stickyElement);
        });
      }
    }
  },
  update: scroller,
  unstick: function(options) {
    return this.each(function() {
      var that = this;
      var unstickyElement = $(that);

      var removeIdx = -1;
      var i = sticked.length;
      while (i-- > 0) {
        if (sticked[i].stickyElement.get(0) === that) {
            splice.call(sticked,i,1);
            removeIdx = i;
        }
      }
      if(removeIdx !== -1) {
        unstickyElement.unwrap();
        unstickyElement
          .css({
            'width': '',
            'position': '',
            'top': '',
            'float': '',
            'z-index': ''
          })
        ;
      }
    });
  }
};

// should be more efficient than using $window.scroll(scroller) and $window.resize(resizer):
if (window.addEventListener) {
window.addEventListener('scroll', scroller, false);
window.addEventListener('resize', resizer, false);
} else if (window.attachEvent) {
window.attachEvent('onscroll', scroller);
window.attachEvent('onresize', resizer);
}

$.fn.sticky = function(method) {
if (methods[method]) {
  return methods[method].apply(this, slice.call(arguments, 1));
} else if (typeof method === 'object' || !method ) {
  return methods.init.apply( this, arguments );
} else {
  $.error('Method ' + method + ' does not exist on jQuery.sticky');
}
};

$.fn.unstick = function(method) {
if (methods[method]) {
  return methods[method].apply(this, slice.call(arguments, 1));
} else if (typeof method === 'object' || !method ) {
  return methods.unstick.apply( this, arguments );
} else {
  $.error('Method ' + method + ' does not exist on jQuery.sticky');
}
};
$(function() {
setTimeout(scroller, 0);
});
}));

如果我可以提供任何其他信息来简化此问题的回答,请告诉我,非常感谢任何意见。

最佳答案

我强烈建议不要更改库文件,这将大大破坏您使用库的初衷。库旨在以特定方式工作,并且大多遵循严格的代码,这意味着如果您更改单个组件,其影响可能很糟糕或更糟,无法调试。

如果需要,您必须始终使用自己的自定义文件覆盖代码。在您的情况下,之后 <script src="js/jquery.sticky.js"></script>创建一个你自己的 js 文件,<script src="js/custom.js"></script>并在那里添加它(这只是一个基本示例)

element.css({"width":"100%"});

或者将相同的行添加到您的内部 <script>在您的 HTML 中(您启动粘性栏的地方)也可以正常工作。

关于javascript - 覆盖 element.style{width : ;} value in jquery sticky nav,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39514815/

相关文章:

javascript - 如何使用 HTML、CSS 或 JavaScript 创建一个循环倒数计时器?

javascript - 如何以干净的方式在辅助函数中访问cheerio的 `$`?

javascript - js、jquery、ajax的区别

html - 响应式 CSS 标题 |鼠标悬停在图像上

javascript - 在我的例子中,如何获取 Select 元素中的选定值?

javascript - 动态添加和删除的选择框

javascript - 文本区域中的快捷方式

javascript - Jquery animate scrollTop 导致点击事件停止在 IOS safari 上工作

javascript - 使用 JSON 和 Javascript 生成嵌套的 UL 列表

javascript - 在 Canvas 背景或矩形中打一个洞