2016-09-15 14 views
0

問題は、スティッキー・ナビゲーションがページの幅全体に広がることです。 http://stickyjs.com/からjquery sticky navプラグインを使用しています。幅を100%に設定しようとしましたが、コンテナの幅をオーバーライドするelement.styleプロパティがあります。この問題を研究した後、このelement.style値はこのプラグインのjavascriptから来ているようです。私はコードが新しく、javascriptに関する知識が限られているため、element.styleの値を変更/削除する方法についてのガイダンスは高く評価されます。jqueryスティッキー・ナビゲーションの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-インデックスの値を変更することができました。これは、スティッキー・ナビゲーションで追加した問題を解決しました。これらのgetWidthFromとwidthFromWrapperの値を変更するための推奨事項はありますか?もう少し複雑なようです。 –

+0

申し訳ありません、以前はプラグインを使用していませんでしたので、特定のことは言えませんが、nav要素の直接の親がページの全幅でない場合は、 'getWidthFrom'をそうする要素を対象とするセレクタ。 – Serlite

答えて

0

私は強くライブラリファイルを変更しないことをお勧めします。は、ライブラリを最初に使用して目的を捨てるでしょう。ライブラリは特定の方法で動作するように設計されており、大部分は厳密なコードに従います。つまり、単一のコンポーネントを変更すると、悪影響が悪化したり、デバッグできないことがあります。

必要に応じて、独自のカスタムファイルでコードを上書きする必要があります。あなたのケースでは、<script src="js/jquery.sticky.js"></script>

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

たり、内部<script>内に同じ行を追加(これは単なる基本的な例である)あなた自身の言う、<script src="js/custom.js"></script>のJSファイルを作成し、そこにこれを追加しますあなたのHTML(あなたがスティッキーバーを起動した場所)もうまくいくでしょう。

関連する問題