2013-04-12 13 views
6

jQuery's .width() metoda nie wydaje się uwzględniać paski przewijania. Jest to dla mnie problematyczne, ponieważ chciałbym ustawić szerokość niektórych dzieci równą szerokości ich rodzica. Kiedyś jQuery podobny do następującego:Radzenie sobie z paskami przewijania i jquery .width() metoda

$('#contentDiv').width($('#containerDiv').width()) 

W tym przykładzie #contentDiv jest elementem Chciałbym wielkość i chcę, aby ustawić go mieć szerokość #containerDiv, który jest jego elementem dominującym. Moim problemem jest to, że odcina stronie #contentDiv, jak widać na this fiddle.

W moim rzeczywisty kod, mam kilka elementów, które ja zaklejające z jQuery, które wszyscy musimy zmieścić się w przewijanej div, więc po prostu ustawienie css od #contentDiv do 100% nie jest opcją. Jaki jest najlepszy sposób radzenia sobie z szerokościami paska przewijania elementów div w jQuery?

+0

Jest to spowodowane tym, że różne przeglądarki inaczej implementują paski przewijania.IE umieszcza pasek przewijania poza obszarem div (co jest rzeczywiście poprawne zgodnie z dokumentacją standardów), podczas gdy wszystkie inne przeglądarki faktycznie mają pasek przewijania wewnątrz tego obszaru. Po prostu warto o tym pamiętać podczas badania tego obszaru. – krillgar

+1

możliwy duplikat [jquery - jak uzyskać szerokość ekranu bez paska przewijania?] (Http://stackoverflow.com/questions/8339377/jquery-how-to-get-screen-width-without-scrollbar) (użyj 'innerWidth () ')? – fcalderan

+0

jest to trudny temat, ponieważ nie jest spójny we wszystkich przeglądarkach. Niektóre dadzą ci innerwidth, niektóre dadzą ci szerokość za pomocą pasków przewijania. Myślę, że być może będziesz musiał wymyślić rozwiązanie, które jest specyficzne dla każdej przeglądarki, którą planujesz wesprzeć –

Odpowiedz

1

Najlepszym rozwiązaniem znalazłem podczas pracy wokół tego rozwiązania to:

http://chris-spittles.co.uk/?p=531

jQuery jest wszechmocny i wszystko, ale czasami mała kreska rodzimej JS jest wszystko, czego potrzeba do renderowania pikseli doskonałych stron. .. Mam nadzieję, że to rozwiązanie okaże się pomocne!

0

AKTUALIZACJA:

Żadna z metod szerokości rozpoznawczej jQuery stanowią paska przewijania. W moim oryginalnym przykładzie użycie LOOKS wygląda tak, jakby działało, ale tylko dlatego, że zwraca i obiekt, co powoduje niepowodzenie width, a rozmiar wewnętrznej zawartości zmieści się w dostępnej przestrzeni, ponieważ przykład nie był zbyt dobry. Jednak możliwe jest napisanie funkcji obliczającej dostępne miejsce w div z paskiem przewijania w nim, który następnie może być użyty do ustawienia zawartości, jak chcesz.

Aby napisać tę funkcję, skorzystałem z faktu, że gdy element div jest dołączony do elementu div z paskiem przewijania w nim, przyjmuje on pełną dostępną szerokość (tj. Wewnętrzną szerokość elementu nadrzędnego minus szerokość paska przewijania).

Funkcja wygląda następująco:

function noScrollWidth(div){ 
    var measureDiv = $('<div id="measureDiv">'); 

    div.append(measureDiv); 

    var width = measureDiv.outerWidth(); 

    measureDiv.remove(); 

    return width 
}; 

I wtedy wykorzystać do wielkości moje treści Div:

$('#contentDiv').width(noScrollWidth($('#containerDiv'))); 

Working fiddle.

+0

Przekazywanie parametru do innerWidth * ustawia * wewnętrzną szerokość elementu. "true" nie jest poprawnym argumentem, ale nadal oznacza, że ​​zwróci element, a nie szerokość. –

+0

Dobra pułapka, wygląda na to, że mój przykład w rzeczywistości nie działa poprawnie, gdy użyłem 'innerWidth (true)'. Zamiast tego dodałem inne rozwiązanie. Daj mi znać, czy to działa dla Ciebie! – ckersch

+0

Dzięki za zredagowanie - usunąłem moje poparcie. Problem, który próbowałem rozwiązać, polegał na znalezieniu szerokości elementów, wyłączając pasek przewijania, a '$ (myElementSpec) [0] .clientWidth' wydawało się być najlepszym rozwiązaniem. Ta odpowiedź pomogła mi tam dotrzeć: http://stackoverflow.com/questions/21064101/interstanding-offsetwidth-clientwidth-scrollwidth-and-height-respectively –

0

Spróbuj:

$('#contentDiv').width($('#containerDiv')[0].clientWidth) 

Dla mor e informacje na temat tego rozwiązania, patrz: this StackOverflow answer.

0

Innym podejściem, które chciałbym spróbować, jest ustawienie obu elementów 'box-sizing property na' border-box 'i sprawdzenie, czy ustawienie wartości contentDiv na 100% działa tak, jak chcesz.

Teraz, gdy mniej projektów martwi się o stare, stare przeglądarki, "skrzynka" może ułatwić pracę. Pamiętaj jednak o testowaniu wielu przeglądarek na wielu platformach, ponieważ nie jestem pewien, czy wszystkie obsługują paski przewijania w ten sam sposób.

Powiązane problemy