CSS媒体查询和JavaScript窗口宽度不匹配
对于响应模板,我的CSS中有一个媒体查询:CSS媒体查询和JavaScript窗口宽度不匹配,javascript,jquery,media-queries,Javascript,Jquery,Media Queries,对于响应模板,我的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 */
@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像素)。我怎样才能做得更好呢?你对滚动条的看法是正确的,因为CSS使用的是设备宽度,而JS使用的是文档宽度 您需要做的是在JS代码中测量视口宽度,而不是使用jQuery width函数 此代码来自
我的经验是,媒体查询宽度跟踪document.body.clientWidth。由于垂直滚动条来回移动,检查document、window或viewport().width可能会导致我的Javascript运行延迟——在媒体查询规则更改后,具体取决于窗口的高度 选中document.body.clientWidth允许脚本代码在媒体查询规则生效的同时一致执行 @媒体(最小宽度:873px)
{
//一些规则
}
如果(document.body.clientWidth>=873)
{
//一些代码
} 安迪·兰顿的密码让我明白了——谢谢 我在上找到了以下代码: 实际上,它的工作方式与@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';
};
嗨,我用这个小技巧让JS和CSS在响应页面上轻松协作: 测试CSS@media size条件下显示或不显示的元素的可见性。 使用引导CSS,我测试了隐藏xs类元素的可见性
var msg=“U的消息”;
/*在窗口加载时检查初始尺寸*/
if($('#test xsmall')。是(':hidden')){
/*这是一个很小的情况*/
msg=“@media CSS<768px.JS width=“+$(窗口).width()+”红色!”;
$('.redthing on xsmall').addClass('redthing').html(msg);
}否则{
/*根据CSS,大于768px*/
msg=“@media CSS>767px.JS width=“+$(窗口).width()+”非红色!”;
$('.redthing on xsmall').removeClass('redthing').html(msg);
}
/*再次调整窗口大小时*/
$(窗口).on('resize',function()){
if($('#test xsmall')。是(':hidden')){
msg=“@media CSS<768px.JS width=“+$(窗口).width()+”红色!”;
$('.redthing on xsmall').addClass('redthing').html(msg);
}否则{
msg=“@media CSS>767px.JS width=“+$(窗口).width()+”非红色!”;
$('.redthing on xsmall').removeClass('redthing').html(msg);
}
});代码>
@介质(最小宽度:768px){
.隐藏的X{
显示:块!重要;
}
}
@介质(最大宽度:767px){
.隐藏的X{
显示:无!重要;
}
}
.xsmall上的redthing{
/*需要一个滚动条来显示JS和css之间的窗口宽度差异*/
最小高度:1500px;
}
红东西先生{
颜色:红色;
}
此元素由隐藏在低于767px的@media上的CSS管理
此元素由JQUERY RED在@media max width 767px上管理,该解决方案始终有效,并与CSS媒体查询同步
在正文中添加一个div
<body>
...
<div class='check-media'></div>
...
</body>
然后在JS中通过进入媒体查询来检查您正在更改的样式
.check-media{
display:none;
width:0;
}
@media screen and (max-width: 768px) {
.check-media{
width:768px;
}
...
}
if($('.check-media').width() == 768){
console.log('You are in (max-width: 768px)');
}else{
console.log('You are out of (max-width: 768px)');
}
因此,一般来说,您可以通过输入特定的媒体查询来检查正在更改的任何样式。window.innerWidth是您所需要的
如果(window.innerWidth<768)适用于CSS中的768断点,则CSS媒体查询等于window.innerWidth。Css媒体查询也会计算滚动条。简单可靠的方法是使用
为了演示,我想检查屏幕宽度是否大于或等于992px(Bootstrap的大型设备):
函数isLargeDevice(){
if(window.matchMedia(“(最小宽度:992px)”).matches){
返回true;
}
返回false;
}
如果您正在使用,那么它会更容易一些,在这里我想检查屏幕是否比Bootstrap的大屏幕(992px)小
函数IsSmallerHandlargescreen(){
if(modernizer.mq(‘(最大宽度:991px)’){
返回true;
}
返回false;
}
如果document.documentElement
不存在,此脚本将失败。不要信任w3schools,请看@ausi:you't not trust w3schools’(不要信任w3schools,请您对w3schools友好一点,详细一点)好吗?到目前为止我还看不出这个问题。另请参见“确定”,似乎没有没有没有document.documentElement
的浏览器。我不知道。如果机身比屏幕宽,这就不行了。我看到一些解决方案,其中一个不可见的div是固定的,它的宽度设置为100%。使用它的clientwidt应该是有效的。比$(document).width()好得多;matchMedia()可能更好,但如果窗口有滚动条,并且您的媒体查询正在检查最大宽度(至少在Chrome中),那么它的IE10+似乎不起作用。不过,在您知道由特定媒体查询设置的元素上检查一些css似乎是可行的。@mhenry1384您在说什么?为什么这不是最佳答案?它非常短,没有jQuery也可以工作。伟大的在Safari中,当媒体查询触发768px时,window.innerWidth返回783(不是768)
.check-media{
display:none;
width:0;
}
@media screen and (max-width: 768px) {
.check-media{
width:768px;
}
...
}
if($('.check-media').width() == 768){
console.log('You are in (max-width: 768px)');
}else{
console.log('You are out of (max-width: 768px)');
}