在javascript中获取设备宽度

IT技术 javascript css media-queries
2021-02-06 17:32:11

有没有办法使用javascript获取用户设备宽度,而不是视口宽度?

CSS 媒体查询提供了这一点,正如我所说

@media screen and (max-width:640px) {
    /* ... */
}

@media screen and (max-device-width:960px) {
    /* ... */
}

如果我的目标是横向的智能手机,这很有用。例如,在 iOS 上,声明 max-width:640px将同时针对横向和纵向模式,即使在 iPhone 4 上也是如此。据我所知,Android 并非如此,因此在此实例中使用 device-width 成功地针对两个方向,不针对桌面设备。

但是,如果我根据设备宽度调用 javascript 绑定,我似乎仅限于测试视口宽度,这意味着额外的测试如下,

if ($(window).width() <= 960 && $(window).height <= 640) { /* ... */ }

考虑到设备宽度可用于 css 的提示,这对我来说似乎并不优雅。

6个回答

您可以通过该screen.width属性获取设备屏幕宽度有时,window.innerWidth在处理窗口大小通常小于设备屏幕大小的桌面浏览器时,使用(通常在移动设备上不常见)代替屏幕宽度也很有用

通常,在处理移动设备和桌面浏览器时,我使用以下内容:

 var width = (window.innerWidth > 0) ? window.innerWidth : screen.width;
怎么会有这么多赞?var width = (window.innerWidth > 0) ? window.innerWidth : screen.width;在 iphone 6 和 6 Plus 上返回 667。此解决方案无法正常工作。
2021-03-15 17:32:11
window.innerWidth 在 Iphone (Chrome/Safari) 上返回 980。那个怎么样?<meta name="viewport" content="width=device-width" /> 没有区别。
2021-03-18 17:32:11
我注意到这在 Android 2.2 本机浏览器上无法正常工作。如果我不是 1:1 的比例,它可以报告更宽的宽度(与页面一样宽),这有点令人沮丧。
2021-03-22 17:32:11
@Alex 这些是浏览器的默认视口宽度。如果您使用视口元标记,width=device-width您应该获得实际值。
2021-03-26 17:32:11
这在 Android 上的 Chrome Beta 上返回 980,在 HTC vivid 上的 Android 浏览器上返回 1024。
2021-03-30 17:32:11

Bryan Rieger 的有用答案的一个问题是,在高密度显示器上,Apple 设备以倾角报告 screen.width,而 Android 设备以物理像素报告它。(参见http://www.quirksmode.org/blog/archives/2012/07/more_about_devi.html。)我建议if (window.matchMedia('(max-device-width: 960px)').matches) {}在支持 matchMedia 的浏览器上使用

这是正确的用法吗? if (window.matchMedia('(max-device-width: 960px)').matches) { var winW = (window.innerWidth > 0) ? window.innerWidth : screen.width; } else { var winW = screen.width; }
2021-03-14 17:32:11
根据caniuse.com,几乎所有浏览器,包括手机,都支持 window.matchMedia()
2021-03-15 17:32:11
我不确定这是否会在没有将缩放比例设置为 1:1 作为基础的情况下工作...... var isMobile = window.matchMedia && window.matchMedia('(max-device-width: 960px)').matches || screen.width <= 960;
2021-03-30 17:32:11
对于不支持的浏览器,matchMedia()有一个polyfillgithub.com/paulirish/matchMedia.js
2021-04-06 17:32:11
这似乎是一个更好的解决方案,实际上使用了 CSS 媒体查询。我想知道跨移动平台的浏览器支持是什么?
2021-04-11 17:32:11

我刚刚有了这个想法,所以也许它是短视的,但它似乎运作良好,并且可能是您的 CSS 和 JS 之间最一致的。

在您的 CSS 中,您可以根据 @media 屏幕值设置 html 的 max-width 值:

@media screen and (max-width: 480px) and (orientation: portrait){

    html { 
        max-width: 480px;
    }

    ... more styles for max-width 480px screens go here

}

然后,使用 JS(可能通过 JQuery 之类的框架),您只需检查 html 标签的 max-width 值:

maxwidth = $('html').css('max-width');

现在您可以使用此值进行条件更改:

If (maxwidth == '480px') { do something }

如果在 html 标签上放置 max-width 值看起来很可怕,那么也许您可以放置​​一个不同的标签,一个仅用于此目的的标签。出于我的目的,html 标签工作正常,不会影响我的标记。


如果您使用 Sass 等,则很有用:要返回更抽象的值,例如断点名称,而不是 px 值,您可以执行以下操作:

  1. 创建一个将存储断点名称的元素,例如 <div id="breakpoint-indicator" />
  2. 使用 css 媒体查询更改此元素的内容属性,例如“大”或“移动”等(与上述基本媒体查询方法相同,但设置 css 'content' 属性而不是 'max-width')。
  3. 使用 js 或 jquery(例如 jquery $('#breakpoint-indicator').css('content');获取 css 内容属性值,根据媒体查询设置的内容属性,返回“大”或“移动”等。
  4. 根据当前值操作。

现在您可以像在 sass 中一样处理相同的断点名称,例如 sass:@include respond-to(xs)和 js if ($breakpoint = "xs) {}

我特别喜欢这一点的是,我可以在 css 和一个地方(可能是变量 scss 文档)中定义我的断点名称,并且我的 js 可以独立地对它们进行操作。

你应该使用

document.documentElement.clientWidth

算是跨浏览器兼容,和jQuery(window).width();方法一样。用途。

有关详细信息,查看:https : //ryanve.com/lab/dimensions/

核实

const mq = window.matchMedia( "(min-width: 500px)" );

if (mq.matches) {
  // window width is at least 500px
} else {
  // window width is less than 500px
}

https://developer.mozilla.org/en-US/docs/Web/API/Window/matchMedia