2012-08-29 9 views
9

Ho un sito dove desidero 'navigazione secondaria'. Quindi, quando si scorre verso la sezione, la relativa barra degli strumenti verrà apposta sotto la barra degli strumenti principale. Ho questo funzionamento, ma non posso cambiare l'offset superiore dopo l'inizializzazione. La documentazione dicono:Cambio bootstrap di Twitter offset affisso

affix('refresh')

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

ma quando provo questo ottengo:

Uncaught TypeError: Object # has no method 'refresh'

Ecco il mio codice:

$(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(); 
    }); 
}); 

ho provato diverse variazioni di

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

compresi:

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

Non riesco a modificare lo scostamento. Come modifichi l'offset del plugin affisso? Grazie.

+1

Si può incollare un blocco dell'HTML? Abbastanza difficile da dire altrimenti ... Se provate a sostituire '$ ('. Sec-nav'). AddClass (" affix-top ");' con '$ ('. Sec-nav'). Affix();' questo non aiuta affatto? O hai già ottenuto l'attributo 'data-spy =" affix "' su '.sec-nav'? –

risposta

20

L'ho capito. Invece di aggiornare dinamicamente l'offset, ho cambiato il valore di offset per una funzione:

$(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}}); 
    }); 
}); 

Ora, quando una sezione modifica a dom manipolazione o finestra ridimensionare, l'offset è automaticly cambiato dovuto alle funzioni valore cambia ritorno .

+0

Idea geniale! – viniciusnz

+2

Puoi fornire l'html utilizzato o un esempio di lavoro? Sto cercando di farlo nel mio codice esistente, ma non so cosa sia .sec. – davecave

+1

tentando di ridimensionare la finestra '$ ('. MyMeny'). Affix ({offset: {top: myOffet}});' ma non funzionante, il valore non si scosta – sreginogemoh

2

Ho semplificato leggermente la risposta di Fatmuemoo per un caso più semplice: La barra di navigazione della mia home page (il predefinito bootstrap #masthead) si trova sotto un grande dispositivo di scorrimento di sfondo con id #bg. L'altezza del cursore varia con 3 punti di rottura css. Abbiamo appena impostato l'offset di #masthead per uguagliare l'altezza del cursore. Facile!

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

Grazie, semplice ed efficiente, funziona alla grande ed è facile creare una somma di tutti gli elementi necessari. – EPurpl3

Problemi correlati