如何在没有(减号)滚动条的情况下获取屏幕宽度?


102

我有一个元素,需要它的宽度没有垂直滚动条。

Firebug告诉我机身宽度为1280px。

这些方法在Firefox中都可以正常工作:

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

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

它们都返回1263px,这是我正在寻找的值。

但是所有其他浏览器都给我1280px

有没有跨浏览器的方法来获得没有(!)垂直滚动条的全屏宽度?


您是否需要垂直滚动条?还是可以使用溢出:隐藏然后计算宽度?
Filip

你可以参考这个网站为您的问题 stackoverflow.com/questions/8794338/...

您可以尝试width: 100%;
www139 2015年

您是否要使元素成为屏幕的整个宽度(不包括滚动条)?
www139 2015年

Answers:


161

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

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

JavaScript中

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

PS:请注意,要scrollWidth可靠使用,您的元素不应水平溢出

jsBin演示


您也可以使用,.innerWidth()但这仅适用于body元素

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

2
如果由于某种原因更改了body元素的宽度,则此方法将无效。
康斯坦丁·佩雷阿斯洛夫2013年

4
看来这在Chrome上不再真正有效,报告的宽度实际上比窗口本身大20px,我已经尝试了无数次宽度测量。
2014年

2
@Sammaye导致您忘记(为什么?)设置margin:0;到BODY或使用通用的CSS重置代码。jsbin.com/homixuqi/2/edit同样,代码也可以正常工作
Roko C. Buljan 2014年

2
@NamanGoel作为网站设计师的工作是防止车身宽度混乱。这不是一项艰巨的任务。另外,关于高度,这取决于您是否body溢出。如果溢出而不是限制它。
Roko C. Buljan

2
@ RokoC.Buljan我在这里与您不同意。当然,没有优秀的网页设计师/开发人员应该弄乱身体的宽度和东西。我的观点是关于使用最可靠的API。一些javascript开发人员可能正在构建插件等,并且可能无法控制整个页面。
Naman Goel 2015年

36

您可以通过简单的编写来使用香草javascript:

var width = el.clientWidth;

您还可以使用它来获取文档的宽度,如下所示:

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

资料来源:MDN

您还可以获取整个窗口的宽度,包括滚动条,如下所示:

var fullWidth = window.innerWidth;

但是,并非所有浏览器都支持此功能,因此,作为一种后备方法,您可能希望docWidth按上述方式使用,并增加滚动条的width

资料来源:MDN


如果有滚动条,则不会考虑在内
1

5
document.documentElement.clientWidth对我的帮助最大,因为它也innerHeight可以调节高度(如果主体未填满页面,则可以缩小等),并且无需滚动条即可获取值。
user4642212

1
document.documentElement.clientWidth是真正的赢家。document.body.clientWidth可以,除非您在body元素上设置了最小宽度,并且浏览器当前小于该最小宽度。
Codemonkey

12

以下是一些假定$elementjQuery元素的示例:

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

试试这个 :

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

使用此代码,可以通过使用和不使用滚动条来获取屏幕宽度。在这里,我更改了的溢出值,body并使用和不使用滚动条来获取宽度。


我也必须依靠这个。上面的答案对我不起作用
valerio0999 '16

节省了我的时间!万分感谢!
Xonshiz

7

在没有滚动条的情况下获得正确宽度和高度的最安全的地方是HTML元素。试试这个:

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

浏览器支持相当不错,IE 9及更高版本对此提供了支持。对于OLD IE,请使用此处提到的众多后备版本之一。


0

我遇到了类似的问题,并且width:100%;确实为我解决了。在尝试回答这个问题并意识到的本质<iframe>会导致这些javascript测量工具不使用某些复杂功能而变得不准确之后,我来到了该解决方案。进行100%操作是在iframe中解决此问题的简单方法。我不确定您正在处理哪些HTML元素,因此不知道您的问题。


0

这些解决方案都不适合我,但是我能够通过采用宽度并减去滚动条宽度来修复它。我不确定这与跨浏览器的兼容性如何。


0

这是我用的

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 );
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.