2016-09-15 50 views
0

我遇到的问题是让我的粘贴导航跨越页面的整个宽度。我使用http://stickyjs.com/的jquery粘性导航插件 - 我试图将宽度设置为100%,但是有一个重写容器宽度的element.style属性。在研究这个问题之后,似乎这个element.style的值来自这个插件的javascript。我是新来的代码,我有限的JavaScript知识,所以任何指导如何改变/删除element.style值将不胜感激。覆盖jquery sticky nav中的element.style {width:;}值

<!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); 
}); 
})); 

请让我知道,如果有什么我可以提供让我回答这更容易,我很欣赏任何输入。

+0

你是否尝试过使用'getWidthFrom'和'widthFromWrapper'值玩? – Serlite

+0

@Serlite我还没有,但我相信这将解决我的问题。我能够改变它创建的z-index值,并解决了我使用粘性导航时遇到的另一个问题。你有什么建议,以改变那些getWidthFrom和widthFromWrapper值?这似乎更复杂一点。 –

+0

对不起,我之前没有使用插件,所以我不能肯定地说 - 但是如果nav元素的直接父母不是整个页面的宽度,那么您会希望'getWidthFrom'是一个选择器,其目标是一个元素。 – Serlite

回答

0

我强烈建议不要更改库文件,它首先会破坏你使用库的目的。库被设计为以特定的方式工作,并且大部分遵循严格的代码,这意味着如果更改单个组件,则其影响可能是坏的或者更糟的是不可调试的。

如果需要,您必须始终用您自己的自定义文件覆盖代码。在你的情况,<script src="js/jquery.sticky.js"></script>后创建自己的发言权,<script src="js/custom.js"></script>的js文件,并添加这里面(这只是一个基本的例子)将同一线路到您的内部<script>

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

OR你的HTML(你发起stickybar的地方)也可以很好地工作。