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?

freqüente
fonte
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 
Roko C. Buljan
fonte
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

Joshua Bambrick
fonte
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
Konstantin Dinev
fonte
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.

Mrbengi
fonte
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.

Naman Goel
fonte
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.

www139
fonte
0

Nenhuma dessas soluções funcionou para mim, no entanto, fui capaz de consertar pegando a largura e subtraindo a largura da barra de rolagem . Não tenho certeza de como isso é compatível com vários navegadores.

marca doméstica
fonte
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 );
});
Benn
fonte