2013-09-08 19 views
34

Ich bin auf Bootstrap 3.0.0 migrieren und ich habe Probleme mit einem angebrachten Menü auf der linken Seite: Sobald es befestigt wird (nach 10px scroll), ändert sich seine Breite. In this fiddle wird es kleiner, in meiner realen Site wird es breiter und erweitert den eigentlichen Inhalt.Bootstrap 3.0 Affix mit Listenänderungen Breite

Es funktionierte perfekt mit Bootstrap v2.3.2. Nach der Überprüfung sieht es so aus, als würden die Listeneinträge nicht gut mit der angezeigten .affix {position: fixed;} abgespielt werden.

Irgendwelche Ideen?

LÖSUNG: auf der Basis der neuesten Kommentare ich endlich dieses JS Stück hinzugefügt haben, die es schön, ohne setzen eine feste Breite an dem daran befestigten Element fixiert:

$(function() { 
    var $affixElement = $('div[data-spy="affix"]'); 
    $affixElement.width($affixElement.parent().width()); 
}); 
+0

Eigentlich hat es das gleiche Verhalten ohne eine Liste (mit Formelementen zum Beispiel) – Davor

+2

[Affix Breite Ausgabe und einige Korrekturen] (https://github.com/twbs/bootstrap/issues/6350), wenn jemand interessiert. – Sisir

+0

@Sisir sehr cool, danke! Ich kann endlich den Hack aus meinem Code entfernen und habe eine richtige Lösung (hoffentlich fügen sie sie zu v3.1 hinzu) – Davor

Antwort

11

hatte ich das gleiche Problem und dieses Problem behoben:

$(window).resize(function() { 
       $('#category-nav.affix').width($('#content').width()); 
      }); 

grundsätzlich in einem Fall von Resize mir den Inhalt div Breite berechnen und die Breite des daran befestigten Elements, dass ein.

+0

Nur das resize-Ereignis funktioniert nicht für mich (Primefaces/Bootsfaces). Aber das Scroll-Ereignis (unter Lösungen) hat den Trick gemacht. – tak3shi

1

einmal das gleiche Problem hatte (nur in BS 2.3.2).

Keine Antwort, mehr ein hack: Ich gab dem angefügten Element eine Breite. Das saugte, weil ich Breite für alle Auflösungen (RWD) einstellen musste und der Wert eigentlich Standardspaltenbreite (z. B. span4) sein sollte.

Ja: position: fixed entfernt das Element aus dem gegebenen Kontext (in Ihrem Fall col-md-3).

+0

Danke - es hat funktioniert, aber ein ziemlich harter Hack mit vielen Medienabfragen, um es reaktionsschnell zu machen ... Hoffentlich repariert Bootstrap es irgendwann! – Davor

8
$(window).scroll(function() { 
    $('#secondary .widget-area.affix').width($('#secondary').width()); 
}); 
3

Hier ist eine andere Version:

$('.sitebar .affix-top').width($('.sitebar .affix-top').width()); 
$(window).resize(function() { 
    $('.sitebar .affix').width($('.sitebar .affix-top').width()); 
}); 
$(window).scroll(function() { 
    $('.sitebar .affix').width($('.sitebar .affix-top').width()); 
}); 
3

Hier ist meine Version.

var fixAffixWidth = function() { 
    $('[data-spy="affix"]').each(function() { 
    $(this).width($(this).parent().width()); 
    }); 
} 
fixAffixWidth(); 
$(window).resize(fixAffixWidth); 

CSS

div.affix { 
    position: fixed !important; 
} 
0

Hier ist mein HTML

  <div class="sidebar-nav"> 
       <div class="navbar navbar-default" role="navigation"> 
        <div class="navbar-header"> 
         <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#committees-navbar"> 
          <span class="sr-only"></span> 
          <span class="icon-bar"></span> 
          <span class="icon-bar"></span> 
          <span class="icon-bar"></span> 
         </button> 
         <span class="visible-xs navbar-brand">Committees</span> 
        </div> 
        <div id="committees-navbar" class="navbar-collapse collapse"> 
         <ul class="nav navbar-nav nav-stacked" data-spy="affix" data-offset-top="250"> 
          <li class="col-xs-12"><a ng-click="scrollTo('boardCommittee')">BOARD OF DIRECTORS</a></li> 
          <li class="col-xs-12"><a ng-click="scrollTo('madrasaCommittee')">MADRASATUL JAMALIYAH</a></li> 
          <li class="col-xs-12"><a ng-click="scrollTo('shababCommittee')">SHABAB</a></li> 
          <li class="col-xs-12"><a ng-click="scrollTo('bwaCommittee')">BURHANI WOMEN</a></li> 
          <li class="col-xs-12"><a ng-click="scrollTo('tncCommittee')">TAISEER UN NIKAH</a></li> 
          <li class="col-xs-12"><a ng-click="scrollTo('fmbCommittee')">FAIZUL MAWAIDUL BURHANIYAH</a></li> 
          <li class="col-xs-12"><a ng-click="scrollTo('websiteCommittee')">WEBSITE</a></li> 
          <li class="col-xs-12"><a ng-click="scrollTo('tadfeenCommittee')">TADFEEN</a></li> 
         </ul> 
        </div><!--/.nav-collapse --> 
       </div> 
      </div> 

Und das ist mein JS beheben

$(function() { 
    var resize = function() { 
     var sidebarNav = $(".sidebar-nav"); 
     var sidebarNavAffix = $(".sidebar-nav .affix"); 
     if (sidebarNavAffix.length && (sidebarNavAffix.width() !== sidebarNav.width())) { 
      sidebarNavAffix.width(sidebarNav.width()); 
     } 
    } 

    $(window).on({"scroll" : resize, "resize" : resize}); 
}); 
1

ich diesen Code verwenden, um die Breite des Affix zu beheben .

Das Affix erhalten die Breite seiner Eltern und überprüfen Sie diese Breite auf jeder Seite im Web. Die letzte Zeile uncommencing, führen Sie auch auf resize window Ereignis.

1

I verwendet $('.affix-element').width($('.affix-element-parent').width()).affix()

Funktioniert gut :)

1

Meine Lösung auch:

$('.menu-card').affix(); 
$(document).on('affix.bs.affix', '.menu-card', function() { 
    $(this).width($(this).width()); 
}); 

(.Menü-Karte ist meine klebrigen div)

Ich habe diese die Größe des Fensters für die Unterstützung:

Lassen Sie uns das Affix nehmen sind in einem übergeordneten div # Menü-Karte-Fenster aus.

$(window).resize(function() { 
    var parentSize = $('#menu-card-pane').width(); 
    $('.affix').each(function() { 
     var affixPadding = $(this).innerWidth() - $(this).width(); 
     $(this).width(parentSize - affixPadding); 
    }); 
});