Javascript媒体查询:如何运行脚本根据屏幕宽度?
Javascript media queries: How to run script according to the screen width?
我目前正在开发一个网站,但我遇到了响应方面的问题。
我已经构建了我的菜单,我希望当屏幕宽度大于 980px
时悬停后显示子菜单。在这个宽度以下,我希望用户在子菜单出现之前点击菜单。
这是我的 HTML 代码
<nav>
<ul class="menulist">
<li class="list-item"><a href="">list-item 1</a></li>
<li class="list-item"><a href="">list-item 2</a></li>
<li class="list-item"><a href="">list-item 3</a>
<a href="#"></a>
<ul class="sub-menu">
<li class="list-item"><a href="">list-item 4</a></li>
<li class="list-item"><a href="">list-item 5</a></li>
</ul>
</li>
</ul>
我试过这样做
if (window.matchMedia("(max-width: 980px)").matches) {
$('.list-item > .sub-menu').parent().click(function() {
var submenu = $(this).children('.sub-menu');
if ( $(submenu).is(':hidden') ) {
$(submenu).slideDown(200);
} else {
$(submenu).slideUp(200);
}
});
} else {
$('.list-item > .sub-menu').parent().hover(function() {
var submenu = $(this).children('.sub-menu');
if ( $(submenu).is(':hidden') ) {
$(submenu).slideDown(200);
} else {
$(submenu).slideUp(200);
}
});
}
也是这样,
if ($(window).width() < 981) {
$('.list-item > .sub-menu').parent().click(function() {
var submenu = $(this).children('.sub-menu');
if ( $(submenu).is(':hidden') ) {
$(submenu).slideDown(200);
} else {
$(submenu).slideUp(200);
}
});
}
else {
$('.list-item > .sub-menu').parent().hover(function() {
var submenu = $(this).children('.sub-menu');
if ( $(submenu).is(':hidden') ) {
$(submenu).slideDown(200);
} else {
$(submenu).slideUp(200);
}
});
}
但是不行。
事实上,当我调整浏览器大小时,行为并没有改变。
当我在移动设备上加载网站时(宽度 < 981),一开始它运行良好。我在子菜单打开之前单击链接。但是当我放大浏览器时,行为并没有改变。在子菜单打开之前,我必须再次单击链接。
宽屏加载也是一样。悬停正常工作。当我缩小屏幕时,它不会让点击起作用,悬停会继续起作用。
有人可以帮助我吗?
谢谢。
你的 "if" 逻辑错了。你的代码是说,"if the width matches, then set up one event handler, otherwise set up a different event handler"。此 "if" 条件只会根据初始 window 大小进行评估。如果您希望它在用户更改 window 大小时正确运行,那么您需要无条件地设置两个事件处理程序,然后将 "if" 条件放入事件处理程序函数中。例如,在 "hover" 事件处理程序中,如果宽度 < 981 则什么都不做,否则显示菜单。
下面是代码的示例(未测试):
$('.list-item > .sub-menu').parent().click(function() {
if (window.matchMedia("(max-width: 980px)").matches) {
var submenu = $(this).children('.sub-menu');
if ( $(submenu).is(':hidden') ) {
$(submenu).slideDown(200);
} else {
$(submenu).slideUp(200);
}
}
});
$('.list-item > .sub-menu').parent().hover(function() {
if (!window.matchMedia("(max-width: 980px)").matches) {
var submenu = $(this).children('.sub-menu');
if ( $(submenu).is(':hidden') ) {
$(submenu).slideDown(200);
} else {
$(submenu).slideUp(200);
}
}
});
我目前正在开发一个网站,但我遇到了响应方面的问题。
我已经构建了我的菜单,我希望当屏幕宽度大于 980px
时悬停后显示子菜单。在这个宽度以下,我希望用户在子菜单出现之前点击菜单。
这是我的 HTML 代码
<nav>
<ul class="menulist">
<li class="list-item"><a href="">list-item 1</a></li>
<li class="list-item"><a href="">list-item 2</a></li>
<li class="list-item"><a href="">list-item 3</a>
<a href="#"></a>
<ul class="sub-menu">
<li class="list-item"><a href="">list-item 4</a></li>
<li class="list-item"><a href="">list-item 5</a></li>
</ul>
</li>
</ul>
我试过这样做
if (window.matchMedia("(max-width: 980px)").matches) {
$('.list-item > .sub-menu').parent().click(function() {
var submenu = $(this).children('.sub-menu');
if ( $(submenu).is(':hidden') ) {
$(submenu).slideDown(200);
} else {
$(submenu).slideUp(200);
}
});
} else {
$('.list-item > .sub-menu').parent().hover(function() {
var submenu = $(this).children('.sub-menu');
if ( $(submenu).is(':hidden') ) {
$(submenu).slideDown(200);
} else {
$(submenu).slideUp(200);
}
});
}
也是这样,
if ($(window).width() < 981) {
$('.list-item > .sub-menu').parent().click(function() {
var submenu = $(this).children('.sub-menu');
if ( $(submenu).is(':hidden') ) {
$(submenu).slideDown(200);
} else {
$(submenu).slideUp(200);
}
});
}
else {
$('.list-item > .sub-menu').parent().hover(function() {
var submenu = $(this).children('.sub-menu');
if ( $(submenu).is(':hidden') ) {
$(submenu).slideDown(200);
} else {
$(submenu).slideUp(200);
}
});
}
但是不行。
事实上,当我调整浏览器大小时,行为并没有改变。 当我在移动设备上加载网站时(宽度 < 981),一开始它运行良好。我在子菜单打开之前单击链接。但是当我放大浏览器时,行为并没有改变。在子菜单打开之前,我必须再次单击链接。
宽屏加载也是一样。悬停正常工作。当我缩小屏幕时,它不会让点击起作用,悬停会继续起作用。
有人可以帮助我吗? 谢谢。
你的 "if" 逻辑错了。你的代码是说,"if the width matches, then set up one event handler, otherwise set up a different event handler"。此 "if" 条件只会根据初始 window 大小进行评估。如果您希望它在用户更改 window 大小时正确运行,那么您需要无条件地设置两个事件处理程序,然后将 "if" 条件放入事件处理程序函数中。例如,在 "hover" 事件处理程序中,如果宽度 < 981 则什么都不做,否则显示菜单。 下面是代码的示例(未测试):
$('.list-item > .sub-menu').parent().click(function() {
if (window.matchMedia("(max-width: 980px)").matches) {
var submenu = $(this).children('.sub-menu');
if ( $(submenu).is(':hidden') ) {
$(submenu).slideDown(200);
} else {
$(submenu).slideUp(200);
}
}
});
$('.list-item > .sub-menu').parent().hover(function() {
if (!window.matchMedia("(max-width: 980px)").matches) {
var submenu = $(this).children('.sub-menu');
if ( $(submenu).is(':hidden') ) {
$(submenu).slideDown(200);
} else {
$(submenu).slideUp(200);
}
}
});