对于响应式模板,我的CSS中有一个媒体查询:
@media screen and (max-width: 960px) {
body{
/* something */
background:red;
}
}
并且,我在调整大小到日志宽度时创建了一个jQuery函数:
$(window).resize(function() {
console.log($(window).width());
console.log($(document).width()); /* same result */
/* something for my js navigation */
}
与CSS检测和JS结果存在差异,我有这个元:
<meta content="user-scalable=no, initial-scale=1.0, maximum-scale=1.0, width=device-width" name="viewport"/>
我想这是由于滚动条(15像素)。我怎样才能更好地做到这一点?
答案 0 :(得分:74)
你对滚动条的看法是正确的,因为CSS使用的是设备宽度,但JS正在使用文档宽度。
您需要做的是在JS代码中测量视口宽度,而不是使用jQuery宽度函数。
此代码来自http://andylangton.co.uk/articles/javascript/get-viewport-size-javascript/
function viewport() {
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' ] };
}
答案 1 :(得分:7)
我在http://www.w3schools.com/js/js_window.asp上找到了以下代码:
var w=window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
实际上它的工作方式与@Michael Bird的答案相同,但它更容易阅读。
编辑:我一直在寻找一种方法来提供与用于css媒体查询完全相同的宽度。但是建议的那个在使用滚动条的Safari上并不完美,对不起。我最终在一个中心函数中使用了modernizr.js,在其余的代码中我只检查显示类型是移动设备,平板电脑还是桌面设备。由于我对宽度不感兴趣,这对我来说很好用:
getDisplayType = function () {
if (Modernizr.mq('(min-width: 768px)')){
return 'desktop';
}
else if (Modernizr.mq('(min-width: 480px)')){
return 'tablet'
}
return 'mobile';
};
答案 2 :(得分:4)
window.innerWidth是你需要的。
if(window.innerWidth&lt; 768)适用于CSS中的768断点
答案 3 :(得分:1)
我的经验是媒体查询宽度跟踪document.body.clientWidth。由于垂直滚动条的来来往往,检查文档,窗口或视口()。宽度可能会导致我的Javascript延迟运行 - 在媒体查询规则更改后,取决于窗口的高度。
检查document.body.clientWidth允许我的脚本代码在媒体查询规则生效的同时一致地执行。
@media(min-width:873px){
//一些规则
}
...
if(document.body.clientWidth&gt; = 873){
//一些代码
}
Andy Langton的代码让我对此表示感谢 - 谢谢!
答案 4 :(得分:1)
您好我使用这个小技巧让JS和CSS在响应式页面上轻松协同工作:
测试CSS @media大小条件下显示或不显示元素的可见性。 使用bootstrap CSS i测试hidden-xs类元素的可见性
var msg = "a message for U";
/* At window load check initial size */
if ( $('#test-xsmall').is(':hidden') ) {
/* This is a CSS Xsmall situation ! */
msg = "@media CSS < 768px. JS width = " + $(window).width() + " red ! ";
$('.redthing-on-xsmall').addClass('redthing').html(msg);
} else {
/* > 768px according to CSS */
msg = "@media CSS > 767px. JS width = " + $(window).width() + " not red ! ";
$('.redthing-on-xsmall').removeClass('redthing').html(msg);
}
/* And again when window resize */
$(window).on('resize', function() {
if ($('#test-xsmall').is(':hidden')) {
msg = "@media CSS < 768px. JS width = " + $(window).width() + " red ! ";
$('.redthing-on-xsmall').addClass('redthing').html(msg);
} else {
msg = "@media CSS > 767px. JS width = " + $(window).width() + " not red ! ";
$('.redthing-on-xsmall').removeClass('redthing').html(msg);
}
});
@media (min-width: 768px) {
.hidden-xs {
display: block !important;
}
}
@media (max-width: 767px) {
.hidden-xs {
display: none !important;
}
}
.redthing-on-xsmall {
/* need a scrollbar to show window width diff between JS and css */
min-height: 1500px;
}
.redthing {
color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!-- the CSS managed Element that is tested by JS -->
<!-- class hidden-xs hides on xsmall screens (bootstrap) -->
<span id="test-xsmall" class="hidden-xs">THIS ELEMENT IS MANAGED BY CSS HIDDEN on @media lower than 767px</span>
<!-- the responsive element managed by Jquery -->
<div class="redthing-on-xsmall">THIS ELEMENT IS MANAGED BY JQUERY RED on @media max width 767px </div>
答案 5 :(得分:1)
始终有效且与CSS媒体查询同步的解决方法。
将div添加到正文
<body>
...
<div class='check-media'></div>
...
</body>
添加样式并通过输入特定媒体查询来更改它们
.check-media{
display:none;
width:0;
}
@media screen and (max-width: 768px) {
.check-media{
width:768px;
}
...
}
然后在JS检查样式中,您将通过进入媒体查询来更改
if($('.check-media').width() == 768){
console.log('You are in (max-width: 768px)');
}else{
console.log('You are out of (max-width: 768px)');
}
因此,通常您可以通过输入特定媒体查询来检查正在更改的任何样式。
答案 6 :(得分:0)
执行此操作的简单而可靠的方法是使用 Media Queries。
为了演示,我想检查一下屏幕宽度是否大于或等于 992px(Bootstrap 的大设备):
function isLargeDevice() {
if (window.matchMedia("(min-width: 992px)").matches) {
return true;
}
return false;
}
如果你用的是Modernizer那就简单一点,这里我想检查一下屏幕是否小于Bootstrap的大屏幕(992px)
function isSmallerThanLargeScreen() {
if (Modernizr.mq('(max-width: 991px)')) {
return true;
}
return false;
}
答案 7 :(得分:-1)
Css媒体查询等于window.innerWidth。 Css Media Queries也会计算滚动条。