2012-08-29 32 views
9

Tôi có trang web nơi tôi muốn 'điều hướng phụ'. Vì vậy, khi bạn di chuyển đến phần, thanh công cụ của nó sẽ đóng bên dưới thanh công cụ chính. Tôi có điều này làm việc, nhưng tôi không thể thay đổi bù đắp đầu sau khi initailization. Các tài liệu nói:Twitter thay đổi khởi động bù đắp bù đắp

affix('refresh')

When using affix in conjunction with adding or removing of elements from the DOM, you'll want to call the refresh method:

nhưng khi tôi cố gắng này, tôi nhận được:

Uncaught TypeError: Object # has no method 'refresh'

Đây là mã của tôi:

$(function() { 
    $('.sec-nav').addClass("affix-top"); 
    var adjustNavs = function (first) { 
     $('.sec-nav').each(function(){ 
      var $p = $(this).closest('.sec'); 
      var $$ = $p.prevAll('.sec'); 
      console.log($$); 
      var h = 0; 
      $$.each(function() { h+=$(this).outerHeight();}); 
      console.log(h); 

      if (first) { 
       $(this).affix({offset: {top: h}}); 
      } else { 
       $(this).data('affix', {b: {options: {offset:{top: h}}}}); 
       console.log(this); 
       $(this).affix('refresh') 
      } 

     }); 
    } 
    adjustNavs(true); 
    $('.sec').bind('DOMSubtreeModified', function() { 
     adjustNavs(); 
    }); 
}); 

tôi đã cố gắng biến thể khác nhau của

   $(this).data('affix', {b: {options: {offset:{top: h}}}}); 

bao gồm:

   $(this).affix({offset: {top: h}}); 

Tôi không thể nhận bù đắp thay đổi. Làm thế nào để bạn thay đổi bù đắp của plugin affix? Cảm ơn.

+1

Bạn có thể dán một khối HTML không? Rất khó để nói cách khác ... Nếu bạn thử thay thế '$ ('. Sec-nav'). AddClass (" affix-top ");' với '$ ('. Sec-nav'). Affix();' Điều đó có giúp ích gì không? Hay bạn đã có thuộc tính 'data-spy =" affix "' trên '.sec-nav'? –

Trả lời

20

Tôi đã tìm ra. Thay vì tự động cập nhật các bù đắp, tôi đã thay đổi giá trị bù đắp cho một chức năng:

$(function() { 
    $('.sec-nav').addClass("affix-top").each(function(){ 
     var $self = $(this); 
     var offsetFn = function() { 
      var $p = $self.closest('.sec'); 
      var $$ = $p.prevAll('.sec'); 
      var h = 0; 
      $$.each(function() { h+=$(this).outerHeight();}); 
      return h; 
     } 
     $self.affix({offset: {top: offsetFn}}); 
    }); 
}); 

Bây giờ khi một phần thay đổi do thao tác DOM hoặc cửa sổ lại kích thước, bù đắp được automaticly thay đổi do các chức năng trả lại giá trị thay đổi .

+0

Ý tưởng tuyệt vời! – viniciusnz

+2

Bạn có thể cung cấp html được sử dụng hoặc ví dụ làm việc không? Tôi đang cố gắng để làm việc này vào mã hiện tại của tôi, nhưng tôi không biết những gì. – davecave

+1

thử thay đổi kích thước cửa sổ '$ ('. MyMeny') .ixix ({offset: {top: myOffet}});' nhưng không hoạt động, giá trị không chage – sreginogemoh

2

Tôi đơn giản hóa câu trả lời của Fatmuemoo một chút cho trường hợp cơ bản hơn: Thanh điều hướng trang chủ của tôi (mặc định bootstrap #masthead) nằm bên dưới thanh trượt nền lớn có id #bg. Chiều cao của thanh trượt thay đổi với 3 điểm ngắt css. Chúng tôi chỉ thiết lập độ lệch của #masthead bằng với chiều cao của thanh trượt. Dễ dàng!

$('header#masthead').affix({ //sticky header at bottom of bg 
     offset: { 
      top: function(){return $("#bg").outerHeight();} 
     } 
    }); 
+0

Cảm ơn, đơn giản và hiệu quả, hoạt động tuyệt vời và rất dễ dàng để tạo tổng của tất cả các yếu tố bạn cần. – EPurpl3

Các vấn đề liên quan