Jak uzyskać szerokość ekranu bez paska przewijania (minus)?


103

Mam element i potrzebuję jego szerokości bez (!) Pionowego paska przewijania.

Firebug mówi mi, że szerokość ciała to 1280px.

Każda z tych opcji działa dobrze w przeglądarce Firefox:

console.log($('.element').outerWidth() );
console.log($('.element').outerWidth(true) );

$detour = $('.child-of-element').offsetParent();
console.log( $detour.innerWidth() );

Wszystkie zwracają 1263px , czyli wartość, której szukam.

Jednak wszystkie inne przeglądarki dają mi 1280px .

Czy istnieje sposób na uzyskanie szerokości pełnego ekranu bez (!) Pionowego paska przewijania?


Czy potrzebujesz pionowych pasków przewijania? A może możesz użyć overflow: hidden, a następnie obliczyć szerokość?
Filip

możesz odnieść się do tej witryny, aby zadać swoje pytanie stackoverflow.com/questions/8794338/ ...

możesz spróbowaćwidth: 100%;
www139

czy chcesz, aby element miał całą szerokość ekranu, nie licząc pasków przewijania?
www139,

Odpowiedzi:


161

.prop("clientWidth") i .prop("scrollWidth")

var actualInnerWidth = $("body").prop("clientWidth"); // El. width minus scrollbar width
var actualInnerWidth = $("body").prop("scrollWidth"); // El. width minus scrollbar width

w JavaScript :

var actualInnerWidth = document.body.clientWidth;     // El. width minus scrollbar width
var actualInnerWidth = document.body.scrollWidth;     // El. width minus scrollbar width

PS: Pamiętaj, że aby używać scrollWidthniezawodnie, element nie powinien przepełniać się w poziomie

jsBin demo


Możesz również użyć, .innerWidth()ale to zadziała tylko na bodyelemencie

var innerWidth = $('body').innerWidth(); // Width PX minus scrollbar 

2
To nie zadziała, jeśli z jakiegoś powodu zmienisz szerokość elementu body.
Konstantin Pereiaslov

4
Wygląda na to, że to już nie działa w Chrome, zgłoszona szerokość jest w rzeczywistości o 20 pikseli większa niż samo okno. Próbowałem wielu pomiarów szerokości do tej pory nic.
Sammaye

2
@Sammaye to powoduje, że zapomniałeś (dlaczego?) Ustawić margines: 0; do BODY lub użyj wspólnego kodu resetowania CSS. jsbin.com/homixuqi/2/edit . Tak więc kod działa doskonale .
Roko C. Buljan

2
@NamanGoel Twoim zadaniem jako projektanta stron internetowych jest zapobieganie zaburzeniom związanym z szerokością ciała. To nie jest trudne zadanie. Również wysokość zależy od tego, czy bodyprzepełnia się, czy nie. jeśli się przepełnia, ogranicza go.
Roko C. Buljan

2
@ RokoC.Buljan Nie zgadzam się z tobą tutaj. Oczywiście żaden dobry projektant / programista stron internetowych nie powinien mieszać z szerokością ciała i innymi rzeczami. Chodziło mi o użycie najbardziej niezawodnego dostępnego API. Niektórzy programiści javascript mogą tworzyć wtyczki itp. I mogą nie mieć kontroli nad całą stroną.
Naman Goel

36

Możesz użyć zwykłego javascript, pisząc po prostu:

var width = el.clientWidth;

Możesz również użyć tego, aby uzyskać szerokość dokumentu w następujący sposób:

var docWidth = document.documentElement.clientWidth || document.body.clientWidth;

Źródło: MDN

Możesz również uzyskać szerokość całego okna, w tym paska przewijania, w następujący sposób:

var fullWidth = window.innerWidth;

Jednak nie jest to obsługiwane przez wszystkie przeglądarki, więc jako rozwiązanie zastępcze możesz użyć docWidthpowyższego i dodać szerokość paska przewijania .

Źródło: MDN


Nie bierze się to pod uwagę, jeśli jest pasek przewijania
stycznia

5
document.documentElement.clientWidthpomogło mi najbardziej, ponieważ działa również dla wysokości ( innerHeightmoże być mniejsza, jeśli treść nie wypełnia strony itp.) i pobiera wartość bez paska przewijania.
user4642212

1
Document.documentElement.clientWidth jest prawdziwym zwycięzcą. Document.body.clientWidth jest w porządku, chyba że masz ustawioną minimalną szerokość elementu body, a przeglądarka jest obecnie mniejsza niż ta minimalna szerokość.
Codemonkey

12

Oto kilka przykładów, które zakładają, że $elementjest to jQueryelement:

// Element width including overflow (scrollbar)
$element[0].offsetWidth; // 1280 in your case

// Element width excluding overflow (scrollbar)
$element[0].clientWidth; // 1280 - scrollbarWidth

// Scrollbar width
$element[0].offsetWidth - $element[0].clientWidth; // 0 if no scrollbar

10

Spróbuj tego :

$('body, html').css('overflow', 'hidden');
var screenWidth1 = $(window).width();
$('body, html').css('overflow', 'visible');
var screenWidth2 = $(window).width();
alert(screenWidth1); // Gives the screenwith without scrollbar
alert(screenWidth2); // Gives the screenwith including scrollbar

Możesz uzyskać szerokość ekranu z paskiem przewijania i bez niego, używając tego kodu. Tutaj zmieniłem wartość przepełnienia bodyi otrzymałem szerokość z paskiem przewijania i bez niego.


na tym też musiałem polegać. powyższe odpowiedzi nie działają dla mnie
valerio0999

Zaoszczędziłem mój czas! Wielkie dzięki!
Xonshiz

7

Najbezpieczniejszym miejscem do uzyskania prawidłowej szerokości i wysokości bez pasków przewijania jest element HTML. Spróbuj tego:

var width = document.documentElement.clientWidth
var height = document.documentElement.clientHeight

Obsługa przeglądarek jest całkiem przyzwoita, a IE 9 i nowsze to obsługują. W przypadku STAREGO IE użyj jednego z wielu wymienionych tutaj rozwiązań zastępczych.


0

Doświadczyłem podobnego problemu i width:100%;rozwiązałem go za siebie. Doszedłem do tego rozwiązania po wypróbowaniu odpowiedzi na to pytanie i zdaniu sobie sprawy, że sama natura <iframe>narzędzi pomiarowych javascript będzie niedokładna bez użycia jakiejś złożonej funkcji. Wykonanie 100% to prosty sposób na zadbanie o to w elemencie iframe. Nie wiem o Twoim problemie, ponieważ nie jestem pewien, jakimi elementami HTML manipulujesz.



0

Oto czego używam

function windowSizes(){
    var e = window,
        a = 'inner';
    if (!('innerWidth' in window)) {
        a = 'client';
        e = document.documentElement || document.body;
    }
    return {
        width: e[a + 'Width'],
        height: e[a + 'Height']
    };  
}

$(window).on('resize', function () {
    console.log( windowSizes().width,windowSizes().height );
});
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.