2013-08-31 13 views
5

Podczas uczenia się bootstrapu i wypróbowywania przykładu na oficjalnej stronie, znalazłem wadę (być może) ze składnikiem modal.Modem Bootstrap ma wadę

Kliknij przycisk "Uruchom moduł demo", zauważysz, że w górnym prawym rogu widoczny jest wyraźny margines, a pasek nawigacji ulegnie rozciągnięciu/zmniejszeniu, gdy okno dialogowe modalne zniknie/pojawi się.

Czy to błąd, czy celowo? Myślę, że to denerwujące, Jak to wyłączyć?

+0

nie widzę tego, co mówisz, gdy próbuję go. Pasek nawigacji nic nie robi, gdy pojawia się modal. – Pointy

+0

Prawdopodobnie jest to spowodowane pojawieniem się/zignorowaniem pionowego paska przewijania głównego okna, gdy modalny się pojawia, jednak nie mogę go odtworzyć na mojej wersji chrome (widzę pasek sortowania flasha) –

+4

Pomocne może być wskazanie używanej przeglądarki. Jeśli jest to IE, prawdopodobnie usunę pytanie i odinstaluj. –

Odpowiedz

7

Aby rozwiązać ten problem po prostu ręcznie dodać

body.modal-open, 
.modal-open .navbar-fixed-top, 
.modal-open .navbar-fixed-bottom 
{ 
    margin-right: 0px; 
} 

do arkusza stylów, który jest stosowany po stylów startowej.

Jeśli chcesz, aby ukryć pasek przewijania, a także można dodać

.modal 
{ 
    overflow-y: auto; 
} 

również.

+1

Dzięki. To działa. – adamsmith

+0

Aby dodatkowo zabezpieczyć zawartość strony przed przemieszczaniem, należy zastosować: body.modal-open {overflow-y: visible; } –

+1

@lilasquared - teraz ta poprawka nie działa = (masz jakiś pomysł? –

1

oprócz tego także upewnić się, że następujące

html { overflow-y:auto; }

w arkuszu stylów go zatrzymać przesuwanie w lewo

3

jest to zgłaszane problem bootstrap: https://github.com/twbs/bootstrap/issues/9855

I to jest moja tymczasowa szybka naprawa i działa przy użyciu fixed top navbar, tylko przy użyciu javascript. Załaduj ten skrypt razem ze swoją stroną.

$(document.body) 
.on('show.bs.modal', function() { 
    if (this.clientHeight <= window.innerHeight) { 
     return; 
    } 
    // Get scrollbar width 
    var scrollbarWidth = getScrollBarWidth() 
    if (scrollbarWidth) { 
     $(document.body).css('padding-right', scrollbarWidth); 
     $('.navbar-fixed-top').css('padding-right', scrollbarWidth);  
    } 
}) 
.on('hidden.bs.modal', function() { 
    $(document.body).css('padding-right', 0); 
    $('.navbar-fixed-top').css('padding-right', 0); 
}); 

function getScrollBarWidth() { 
    var inner = document.createElement('p'); 
    inner.style.width = "100%"; 
    inner.style.height = "200px"; 

    var outer = document.createElement('div'); 
    outer.style.position = "absolute"; 
    outer.style.top = "0px"; 
    outer.style.left = "0px"; 
    outer.style.visibility = "hidden"; 
    outer.style.width = "200px"; 
    outer.style.height = "150px"; 
    outer.style.overflow = "hidden"; 
    outer.appendChild (inner); 

    document.body.appendChild (outer); 
    var w1 = inner.offsetWidth; 
    outer.style.overflow = 'scroll'; 
    var w2 = inner.offsetWidth; 
    if (w1 == w2) w2 = outer.clientWidth; 

    document.body.removeChild (outer); 

    return (w1 - w2); 
}; 

Oto przykład praca: http://jsbin.com/oHiPIJi/64

0

miałem tego problemu, jak również (bootstrap 3.1.1). Otworzyłem modal i na tle brakowało miejsca (gdzie pojawi się pasek przewijania, jeśli modalny jest większy niż wysokość strony), a zawartość strony zmieniła rozmiar i przesunęła się w lewo.

Mój układ wykorzystuje stały pasek nawigacyjny.

dodałem kilka selektorów CSS, który wydaje się uniemożliwić zmianę rozmiaru strony i zapewnienie, że modal-tło wypełnia ekran

html { 
    /* This prevents the page from shifting when a modal is opened e.g. search */ 
    overflow-y: auto; 
} 
.modal,.modal.in,.modal-backdrop.in { 
    /* These are to prevent the blank space for the scroll bar being displayed unless the modal is > page height */ 
    overflow-y: auto; 
} 

nadal uważają, że jest to nieco dziwne, gdzie można mieć dwa paski przewijania, jeżeli strona i zawartość modalna jest większa niż wysokość ekranu, ale mogę z tym żyć.

2

Pamiętaj, aby przetestować zarówno w przypadku, gdy strona pierwotna ma już pasek przewijania i nie ma jeszcze paska przewijania.

To zadziałało dla mnie z v3.1.1.

html, .modal, .modal.in, .modal-backdrop.in { 
    overflow-y: auto; 
} 
0
body, .navbar-fixed-top, .navbar-fixed-bottom { 
    margin-right: 0 !important; 
} 

ten pracował dla mnie

0

margin-right nie działa w moim przypadku, znalazłem padding-right aby rozwiązać ten problem.

body.modal-open { 
    padding-right: 0px; 
} 
0

Próbowałem Agni Pradharma „s poprawki, ale musiał nieco dostosować go, aby to działało.

mam to działa przy użyciu to:

$(document.body) 
    .on('show.bs.modal', function() { 
     if (this.clientHeight <= window.innerHeight) { 
      return; 
     } 
     // Get scrollbar width 
     var scrollbarWidth = getScrollBarWidth() 
     if (scrollbarWidth) { 
      $('.navbar-fixed-top').css('margin-right', scrollbarWidth);  
     } 
    }) 
    .on('hide.bs.modal', function() { 
     $('.navbar-fixed-top').css('margin-right', 0); 
    }); 

    function getScrollBarWidth() { 
     var inner = document.createElement('p'); 
     inner.style.width = "100%"; 
     inner.style.height = "200px"; 

     var outer = document.createElement('div'); 
     outer.style.position = "absolute"; 
     outer.style.top = "0px"; 
     outer.style.left = "0px"; 
     outer.style.visibility = "hidden"; 
     outer.style.width = "200px"; 
     outer.style.height = "150px"; 
     outer.style.overflow = "hidden"; 
     outer.appendChild (inner); 

     document.body.appendChild (outer); 
     var w1 = inner.offsetWidth; 
     outer.style.overflow = 'scroll'; 
     var w2 = inner.offsetWidth; 
     if (w1 == w2) w2 = outer.clientWidth; 

     document.body.removeChild (outer); 

     return (w1 - w2); 
    }; 
5

jest to najlepsze rozwiązanie znalazłem:

body.modal-open, .modal-open .navbar-fixed-top, .modal-open .navbar-fixed-bottom { 
    padding-right: 0px !important; 
    overflow-y: auto; 
} 
Powiązane problemy