Como obter a largura da tela sem (menos) barra de rolagem?


102

Eu tenho um elemento e preciso de sua largura sem (!) Barra de rolagem vertical.

O Firebug me diz que a largura do corpo é 1280 px.

Qualquer um deles funciona bem no Firefox:

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

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

Todos eles retornam 1263 px , que é o valor que procuro.

No entanto, todos os outros navegadores me dão 1280 px .

Existe uma maneira de cross-browser para obter uma largura de tela inteira sem (!) Barra de rolagem vertical?


Você precisa das barras de rolagem verticais? Ou você poderia usar o overflow: hidden e então calcular a largura?
Filip

você pode consultar este site para a sua pergunta stackoverflow.com/questions/8794338/…

você pode tentarwidth: 100%;
www139

você está tentando fazer com que o elemento tenha toda a largura da tela, sem incluir as barras de rolagem?
www139

Respostas:


161

.prop("clientWidth") e .prop("scrollWidth")

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

em JavaScript :

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

PS: Observe que, para usar de scrollWidthforma confiável, seu elemento não deve transbordar horizontalmente

jsBin demo


Você também pode usar, .innerWidth()mas isso funcionará apenas no bodyelemento

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

2
Isso não funcionará se, por algum motivo, você alterar a largura do elemento do corpo.
Konstantin Pereiaslov

4
Parece que isso não funciona mais no Chrome, a largura relatada é na verdade 20px maior do que a janela em si, tentei várias medições de largura até agora, nada.
Sammaye

2
@Sammaye isso é porque você esqueceu (por quê?) De definir a margem: 0; para BODY ou use um código de redefinição CSS comum. jsbin.com/homixuqi/2/edit . Novamente, o código funciona perfeitamente bem .
Roko C. Buljan

2
@NamanGoel é o seu trabalho como web designer evitar problemas com a largura do corpo. Não é uma tarefa difícil. Além disso, em relação à altura, depende se o seu bodyestouro ou não. se transbordar, restrinja-o.
Roko C. Buljan

2
@ RokoC.Buljan Não estou discordando de você aqui. É claro que nenhum bom web designer / desenvolvedor deve mexer com a largura do corpo e outras coisas. Meu ponto era sobre como usar a API mais confiável disponível. Alguns desenvolvedores de javascript podem estar criando plug-ins etc. e podem não ter controle de toda a página.
Naman Goel

36

Você pode usar o vanilla javascript simplesmente escrevendo:

var width = el.clientWidth;

Você também pode usar isso para obter a largura do documento da seguinte maneira:

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

Fonte: MDN

Você também pode obter a largura da janela inteira, incluindo a barra de rolagem, da seguinte maneira:

var fullWidth = window.innerWidth;

No entanto, isso não é compatível com todos os navegadores, portanto, como alternativa, você pode usar docWidthcomo descrito acima e adicionar a largura da barra de rolagem .

Fonte: MDN


Isso não leva em consideração se houver uma barra de rolagem
janeiro

5
document.documentElement.clientWidthme ajudou muito, pois funciona para altura também ( innerHeightpode ser menor se o corpo não preencher a página, etc.) e obtém o valor sem a barra de rolagem.
user4642212

1
document.documentElement.clientWidth é o verdadeiro vencedor. document.body.clientWidth está ok, a menos que você tenha uma largura mínima definida em seu elemento de corpo e o navegador atualmente seja menor do que a largura mínima.
Codemonkey de

12

Aqui estão alguns exemplos que presumem $elementser um jQueryelemento:

// 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

Experimente isto:

$('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

Você pode obter a largura da tela com e sem a barra de rolagem usando este código. Aqui, alterei o valor de estouro de bodye obtive a largura com e sem barra de rolagem.


eu tive que confiar nisso também. as respostas acima não funcionaram para mim
valerio0999 01 de

Economizei meu tempo! Muito obrigado!
Xonshiz

7

O lugar mais seguro para obter a largura e altura corretas sem as barras de rolagem é no elemento HTML. Experimente isto:

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

O suporte do navegador é bastante decente, com o IE 9 e superior suportando isso. Para OLD IE, use um dos muitos substitutos mencionados aqui.


0

Eu experimentei um problema semelhante e isso width:100%;resolveu para mim. Cheguei a essa solução depois de tentar uma resposta a essa pergunta e perceber que a própria natureza de um <iframe>tornará essas ferramentas de medição javascript imprecisas sem usar alguma função complexa. Fazer 100% é uma maneira simples de cuidar disso em um iframe. Não sei sobre o seu problema, pois não tenho certeza de quais elementos HTML você está manipulando.



0

Aqui está o que eu uso

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 );
});
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.