有没有一种方法可以使用javascript获取用户设备的宽度,而不是视口的宽度?
我可以说CSS媒体查询提供了这一点
1 2 3
| @media screen and (max-width:640px) {
/* ... */
} |
和
1 2 3
| @media screen and (max-device-width:960px) {
/* ... */
} |
如果我将智能手机定位为横向模式,这将很有用。 例如,在iOS上,即使在iPhone 4上,max-width:640px声明也将同时针对横向和纵向模式。据我所知,对于Android而言并非如此,因此在这种情况下使用device-width成功定位 两种方向,但不定位桌面设备。
但是,如果我基于设备宽度调用javascript绑定,则似乎只能测试视口宽度,这意味着需要进行以下额外测试,
1
| if ($(window).width() <= 960 && $(window).height <= 640) { /* ... */ } |
考虑到设备宽度可供CSS使用的提示,这对我来说似乎并不优雅。
-
请尝试访问此网站以了解设备的正确尺寸。 responsejs.com/labs/dimensions
-
Modernizr可以帮助您"干净而通用"地进行操作:stackoverflow.com/questions/25935686/。 关于第一条评论:您可能想用Google搜索" Modernizr vs 媒体查询",以找出最适合您的用例的方法
您可以通过screen.width属性获取设备的屏幕宽度。
有时,在处理窗口大小通常小于设备屏幕大小的台式机浏览器时,使用window.innerWidth(通常在移动设备上找不到)也很有用。
通常,在处理移动设备和桌面浏览器时,我使用以下方法:
1
| var width = (window.innerWidth > 0) ? window.innerWidth : screen.width; |
-
Ive注意到这在Android 2.2本机浏览器上无法正常工作。如果我的比例不是1:1,它可以报告的宽度要宽得多(与页面一样宽),这有点令人沮丧。
-
这会在Android的Chrome Beta上返回980,在HTC生动的Android浏览器上返回1024。
-
@Alex这些是浏览器的默认视口宽度。如果将视口元标记与width=device-width一起使用,则应获取实际值。
-
@Brian我最终发现了这一点。感谢您抽出宝贵时间发表评论并放心。
-
window.innerWidth在Iphone(Chrome / Safari)上返回980。那个怎么样? 没有区别。
-
在视网膜iPhone上,设备宽度(通过meta标签应用)与screen.width(320px)匹配,但是在具有双像素比率的Android设备上,设备宽度为screen.width的一半(例如360px / 720px)。我正在寻找一种检测缩放的设备宽度的方法(即640px宽度的双像素比例设备上为320px),该方法在两个iOS Android上均适用。下面的布雷登斯答案似乎可以解决这个问题。
-
这怎么有这么多投票? var width = (window.innerWidth > 0) ? window.innerWidth : screen.width;在iPhone 6和6 Plus上返回667。此解决方案无法正常工作。
-
这是行不通的。假设您有一个分辨率为1920x1080的桌面,但窗口大小已调整为600x400。这将返回600。
-
@lan S没有意义,但是,我在这里发布了一个更可靠的解决方案stackoverflow.com/a/58713246/2118665
布莱恩·里格(Bryan Rieger)有用的回答的一个问题是,在高密度显示器上,苹果设备报告的screen.width是倾斜,而安卓设备报告的是物理像素。 (请参阅http://www.quirksmode.org/blog/archives/2012/07/more_about_devi.html。)我建议在支持matchMedia的浏览器中使用if (window.matchMedia('(max-device-width: 960px)').matches) {}。
-
这似乎是一个更好的解决方案,并且实际上使用CSS媒体查询。我想知道跨移动平台对此的浏览器支持是什么?
-
@CarlZulauf,我已经在六台设备上进行了测试,并获得了出色的结果。如果是window.matchMedia,则使用上面的,否则测试screen.width。
-
这将是正确的用法吗? if (window.matchMedia((max-device-width: 960px)).matches) { var winW = (window.innerWidth > 0) ? window.innerWidth : screen.width; } else { var winW = screen.width; }
-
不幸的是,norsewulf,matchMedia只能给您布尔值。 var isMobile; if (window.matchMedia) {isMobile = window.matchMedia((max-device-width: 960px)).matches;} else {isMobile = screen.width <= 960;}
-
我不确定如果没有将缩放比例设置为1:1的基础是否可以正常工作... var isMobile = window.matchMedia && window.matchMedia((max-device-width: 960px)).matches || screen.width <= 960;
-
对于不支持matchMedia()的浏览器,有一个polyfill:github.com/paulirish/matchMedia.js
-
根据caniuse.com,几乎所有浏览器(包括移动设备)都支持window.matchMedia()
-
似乎浏览器支持在2018年得到了全面改善。
我只是有这个主意,所以也许它是短视的,但它似乎运作良好,并且可能是CSS和JS之间最一致的。
在CSS中,根据@media屏幕值设置html的最大宽度值:
1 2 3 4 5 6 7 8 9
| @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标签的最大宽度值即可:
1
| maxwidth = $('html').css('max-width'); |
现在,您可以使用此值进行条件更改:
1
| If (maxwidth == '480px') { do something } |
如果将max-width值放在html标记上似乎很吓人,那么也许您可以放置??另一个标记,该标记仅用于此目的。出于我的目的,html标记可以正常工作,并且不会影响我的标记。
如果您使用的是Sass等,则非常有用:要返回更抽象的值(例如断点名称)而不是px值,您可以执行以下操作:
创建一个将存储断点名称的元素,例如
使用CSS媒体查询可更改此元素的content属性,例如。 G。"大"或"移动"等(与上述基本媒体查询方法相同,但设置CSS的"内容"属性而非"最大宽度")。
使用js或jquery(例如$('#breakpoint-indicator').css('content');的jQuery)获取css内容属性值,这些值将返回"大"或"移动"等,具体取决于媒体查询将内容属性设置为什么。
根据当前值进行操作。
现在,您可以像在sass中一样对相同的断点名称进行操作,例如sass:@include respond-to(xs)和js if ($breakpoint ="xs) {}。
我对此特别喜欢的是,我可以在css和一个位置(可能是变量scss文档)中全部定义断点名称,而我的js可以独立地对其执行操作。
var width = Math.max(window.screen.width, window.innerWidth);
这应该可以处理大多数情况。
我认为使用window.devicePixelRatio比window.matchMedia解决方案更优雅:
1 2 3 4
| if (window.innerWidth*window.devicePixelRatio <= 960
&& window.innerHeight*window.devicePixelRatio <= 640) {
...
} |
您可以轻松使用
document.documentElement.clientWidth
-
通常,如果答案包括对代码意图的解释,以及为什么不引入其他代码就能解决问题的原因,则答案会更有帮助。
核实
1 2 3 4 5 6 7
| 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/zh-CN/docs/Web/API/Window/matchMedia
Lumia手机的屏幕宽度错误(至少在模拟器上)。
那么Math.min(window.innerWidth || Infinity, screen.width)可能适用于所有设备吗?
或更疯狂的东西:
1 2
| for (var i = 100; !window.matchMedia('(max-device-width: ' + i + 'px)').matches; i++) {}
var deviceWidth = i; |
-
谢谢!我将尝试使用此方法Math.min(window.innerWidth || Infinity,screen.width)
你应该用
1
| document.documentElement.clientWidth |
它被视为跨浏览器兼容性,并且与jQuery(window).width();相同。用途。
有关详细信息,请参见:https://ryanve.com/lab/dimensions/
与FYI一样,有一个名为Breakpoints的库,它可以检测CSS中设置的最大宽度,并允许您在,> =和==符号使用它。我发现它非常有用。有效负载大小小于3 KB。
是的,您可以使用document.documentElement.clientWidth来获取客户端的设备宽度,并通过放置在setInterval上来跟踪设备宽度
就像
1 2 3 4
| setInterval(function(){
width = document.documentElement.clientWidth;
console.log(width);
}, 1000); |