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

Posted

技术标签:

【中文标题】如何在没有(减号)滚动条的情况下获得屏幕宽度?【英文标题】:How to get screen width without (minus) scrollbar? 【发布时间】:2012-01-10 11:33:51 【问题描述】:

我有一个元素,需要它的宽度而不需要(!)垂直滚动条。

Firebug 告诉我正文宽度是 1280 像素。

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

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

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

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

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

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

【问题讨论】:

你需要垂直滚动条吗?或者你可以使用溢出:隐藏然后计算宽度? 您的问题可以参考本站***.com/questions/8794338/… 你可以试试width: 100%; 您是否要让元素占据整个屏幕宽度,不包括滚动条? 使用 CSS:width: calc(100vw - (100vw - 100%)); 来自 ***.com/a/34884924/1066234 【参考方案1】:

.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 demo


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

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

【讨论】:

如果由于某种原因您更改了 body 元素的宽度,这将不起作用。 这似乎不再适用于 Chrome,报告的宽度实际上比窗口本身大 20px,我已经尝试了很多宽度测量到目前为止没有。 @Sammaye 那是因为你忘记了(为什么?)设置 margin:0;到 BODY 或使用常见的 CSS 重置代码。 jsbin.com/homixuqi/2/edit 。 同样,代码运行良好 @NamanGoel 作为网页设计师,你的工作是防止身体宽度出现混乱。这不是一项艰巨的任务。此外,关于高度,它取决于您的body 是否溢出。如果它溢出而不是约束它。 @RokoC.Buljan 我在这里并不反对你。当然,没有一个好的网页设计师/开发人员会弄乱正文宽度和其他东西。我的观点是关于使用最可靠的 API。一些 javascript 开发人员可能正在构建插件等,并且可能无法控制整个页面。【参考方案2】:

您可以通过简单地编写来使用 vanilla javascript:

var width = el.clientWidth;

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

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

来源:MDN

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

var fullWidth = window.innerWidth;

但并非所有浏览器都支持此功能,因此作为后备方案,您可能希望使用上述docWidth,并添加scrollbar width。

来源:MDN

【讨论】:

这里不考虑是否有滚动条 document.documentElement.clientWidth 对我帮助最大,因为它也适用于高度(如果正文没有填满页面等,innerHeight 可以更小)并且在没有滚动条的情况下获取值. document.documentElement.clientWidth 是真正的赢家。 document.body.clientWidth 是可以的,除非您在 body 元素上设置了 min-width 并且浏览器当前小于该最小宽度。【参考方案3】:

以下是一些假设$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

【讨论】:

【参考方案4】:

试试这个:

$('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的溢出值,得到了有无滚动条的宽度。

【讨论】:

我也不得不依赖这个。上面的答案对我不起作用 节省了我的时间!非常感谢!【参考方案5】:

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

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

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

【讨论】:

【参考方案6】:

我遇到了类似的问题,width:100%; 为我解决了这个问题。在尝试了这个问题的答案并意识到<iframe> 的本质将使这些 javascript 测量工具在不使用一些复杂功能的情况下变得不准确后,我来到了这个解决方案。做 100% 是在 iframe 中处理它的简单方法。我不知道您的问题,因为我不确定您正在处理哪些 HTML 元素。

【讨论】:

【参考方案7】:

这些解决方案都不适合我,但是我能够通过获取宽度并减去 width of the scroll bar 来解决它。我不确定它的跨浏览器兼容性如何。

【讨论】:

【参考方案8】:

这是我用的

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 );
);

【讨论】:

以上是关于如何在没有(减号)滚动条的情况下获得屏幕宽度?的主要内容,如果未能解决你的问题,请参考以下文章

如何能快速知道当前网页滚动条的高度?有工具吗?

如何在没有垂直滚动的情况下指定屏幕的全高?

如何使用滚动条可靠地获取屏幕宽度

VC中怎么滚动条宽度怎么解决

滚动条挤占内容宽度,影响布局

如何在没有滚动条的 Tailwind 中创建可滚动元素