¿Cómo obtener el ancho de la pantalla sin la barra de desplazamiento (menos)?

102

Tengo un elemento y necesito su ancho sin (!) Barra de desplazamiento vertical.

Firebug me dice que el ancho del cuerpo es de 1280px.

Cualquiera de estos funciona bien en Firefox:

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

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

Todos devuelven 1263px , que es el valor que estoy buscando.

Sin embargo, todos los demás navegadores me dan 1280px .

¿Existe una forma de varios navegadores para obtener un ancho de pantalla completa sin (!) Barra de desplazamiento vertical?

frecuente
fuente
¿Necesita las barras de desplazamiento verticales? ¿O podría usar overflow: hidden y luego calcular el ancho?
Filip
puede consultar este sitio para su pregunta stackoverflow.com/questions/8794338/…
podría intentarlowidth: 100%;
www139
¿Está intentando que el elemento tenga todo el ancho de la pantalla sin incluir las barras de desplazamiento?
www139

Respuestas:

161

.prop("clientWidth") y .prop("scrollWidth")

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

en JavaScript :

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

PD:scrollWidth tenga en cuenta que para usar de manera confiable su elemento no debe desbordarse horizontalmente

jsBin demo


También puede usar, .innerWidth()pero esto solo funcionará en el bodyelemento

var innerWidth = $('body').innerWidth(); // Width PX minus scrollbar 
Roko C. Buljan
fuente
2
Esto no funcionará si por alguna razón cambiaste el ancho del elemento del cuerpo.
Konstantin Pereiaslov
4
Parece que esto ya no funciona realmente en Chrome, el ancho informado es en realidad 20px más grande que la ventana en sí, he probado numerosas medidas de ancho hasta ahora, nada.
Sammaye
2
@Sammaye eso es porque olvidó (¿por qué?) Establecer el margen: 0; a BODY o use un código de restablecimiento CSS común. jsbin.com/homixuqi/2/edit . Entonces, nuevamente, el código funciona perfectamente bien .
Roko C. Buljan
2
@NamanGoel es su trabajo como diseñador web evitar ruidos molestos con el ancho del cuerpo. No es una tarea difícil. Además, con respecto a la altura, depende de si se bodydesborda o no. si se desborda que lo restrinja.
Roko C. Buljan
2
@ RokoC.Buljan No estoy en desacuerdo contigo aquí. Por supuesto, ningún buen diseñador / desarrollador web debería meterse con el ancho del cuerpo y esas cosas. Mi punto fue sobre el uso de la API más confiable disponible. Algunos desarrolladores de JavaScript pueden crear complementos, etc. y es posible que no tengan el control de toda la página.
Naman Goel
36

Puede usar javascript vanilla simplemente escribiendo:

var width = el.clientWidth;

También puede usar esto para obtener el ancho del documento de la siguiente manera:

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

Fuente: MDN

También puede obtener el ancho de la ventana completa, incluida la barra de desplazamiento, de la siguiente manera:

var fullWidth = window.innerWidth;

Sin embargo, esto no es compatible con todos los navegadores, por lo que, como alternativa, es posible que desee usar docWidthcomo se indicó anteriormente y agregar el ancho de la barra de desplazamiento .

Fuente: MDN

Joshua Bambrick
fuente
Esto no tiene en cuenta si hay una barra de desplazamiento
enero
5
document.documentElement.clientWidthMe ayudó más, porque también funciona para la altura ( innerHeightpuede ser más pequeño si el cuerpo no llena la página, etc.) y obtiene el valor sin la barra de desplazamiento.
user4642212
1
document.documentElement.clientWidth es el verdadero ganador. document.body.clientWidth está bien a menos que tenga un ancho mínimo establecido en su elemento de cuerpo y el navegador sea actualmente más pequeño que ese ancho mínimo.
Codemonkey
12

Aquí hay algunos ejemplos que asumen que $elementes un 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
fuente
10

Prueba esto :

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

Puede obtener el ancho de la pantalla con y sin barra de desplazamiento usando este código. Aquí, he cambiado el valor de desbordamiento de bodyy obtengo el ancho con y sin barra de desplazamiento.

mrbengi
fuente
Tuve que confiar en esto también. las respuestas anteriores no funcionaron para mí
valerio0999
¡Me salvó el tiempo! ¡Gracias una tonelada!
Xonshiz
7

El lugar más seguro para obtener el ancho y alto correctos sin las barras de desplazamiento es desde el elemento HTML. Prueba esto:

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

El soporte del navegador es bastante decente, con IE 9 y versiones posteriores que lo admiten. Para OLD IE, use una de las muchas alternativas mencionadas aquí.

Naman Goel
fuente
0

Experimenté un problema similar y al hacerlo width:100%;me lo resolvió. Llegué a esta solución después de intentar una respuesta en esta pregunta y darme cuenta de que la naturaleza misma de un <iframe>hará que estas herramientas de medición de JavaScript sean inexactas sin usar alguna función compleja. Hacerlo al 100% es una forma sencilla de cuidarlo en un iframe. No sé sobre su problema, ya que no estoy seguro de qué elementos HTML está manipulando.

www139
fuente
0

Ninguna de estas soluciones funcionó para mí, sin embargo, pude solucionarlo tomando el ancho y restando el ancho de la barra de desplazamiento . No estoy seguro de si es compatible con varios navegadores.

homebrand
fuente
0

Esto es lo que 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
fuente