【发布时间】:2016-10-23 01:58:21
【问题描述】:
我有一个菜单,我希望当窗口宽度 >= 767 像素时可以通过悬停访问它的下拉菜单,并且当窗口宽度为
只有当我刷新页面时它才起作用,否则只有悬停事件起作用。
JQUERY
(function ($) {
'use strict';
function getWindowWidth() {
var windowWidth = 0;
if (typeof(window.innerWidth) === 'number') {
windowWidth = window.innerWidth;
}
else {
if (document.documentElement && document.documentElement.clientWidth) {
windowWidth = document.documentElement.clientWidth;
}
else {
if (document.body && document.body.clientWidth) {
windowWidth = document.body.clientWidth;
}
}
}
console.log(windowWidth);
return windowWidth;
}
function widthStatement() {
if (getWindowWidth() >= 767) {
$('.menu > ul > li').on({
mouseenter: function () {
$(this).children('ul').stop(true, false).show();
},
mouseleave: function () {
$(this).children('ul').stop(true, false).hide();
}
});
} else if (getWindowWidth() < 767) {
$('.menu > ul > li').click(function () {
$(this).children('ul').stop(true, false).toggle();
});
}
}
$(document).ready(getWindowWidth, widthStatement);
$(window).on('resize', widthStatement);
}($));
CSS
.menu {
margin: 0 auto;
width: 80%;
background: #e9e9e9;
}
.menu:before, .menu:after {
display: table;
content: ' ';
}
.menu:after {
clear: both;
}
.menu ul {
position: relative;
margin: 0;
padding: 0;
list-style: none;
}
.menu ul > li {
float: left;
margin: 0;
padding: 0;
}
.menu ul > li:hover {
background: #f0f0f0;
}
.menu ul > li > a {
display: block;
padding: 1.5em 2.5em;
color: #444;
}
.menu ul > li > ul {
position: absolute;
left: 0;
display: none;
width: 100%;
background: #f0f0f0;
}
.menu ul > li > ul > li {
padding: 1.5em;
width: 25%;
}
.menu ul > li > ul > li > a {
padding: 0;
border-bottom: 1px solid #ccc;
color: #444;
}
.menu ul > li > ul > li > ul {
position: relative;
display: block;
padding-top: 1em;
}
.menu ul > li > ul > li > ul > li {
padding: 0;
width: 100%;
}
.menu ul > li > ul > li > ul > li > a {
padding: .5em 0;
border: 0;
font-size: .9em;
}
HTML
<div class="menu">
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a>
<ul>
<li><a href="#">School</a>
<ul>
<li><a href="#">Lidership</a></li>
<li><a href="#">History</a></li>
<li><a href="#">Locations</a></li>
<li><a href="#">Careers</a></li>
</ul>
</li>
<li><a href="#">Study</a>
<ul>
<li><a href="#">Undergraduate</a></li>
<li><a href="#">Masters</a></li>
<li><a href="#">International</a></li>
<li><a href="#">Online</a></li>
</ul>
</li>
<li><a href="#">Research</a>
<ul>
<li><a href="#">Undergraduate research</a></li>
<li><a href="#">Masters research</a></li>
<li><a href="#">Funding</a></li>
</ul>
</li>
<li><a href="#">Something</a>
<ul>
<li><a href="#">Sub something</a></li>
<li><a href="#">Sub something</a></li>
<li><a href="#">Sub something</a></li>
<li><a href="#">Sub something</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#">News</a>
<ul>
<li><a href="#">Today</a></li>
<li><a href="#">Calendar</a></li>
<li><a href="#">Sport</a></li>
</ul>
</li>
<li><a href="#">Contact</a>
<ul>
<li><a href="#">School</a>
<ul>
<li><a href="#">Lidership</a></li>
<li><a href="#">History</a></li>
<li><a href="#">Locations</a></li>
<li><a href="#">Careers</a></li>
</ul>
</li>
<li><a href="#">Study</a>
<ul>
<li><a href="#">Undergraduate</a></li>
<li><a href="#">Masters</a></li>
<li><a href="#">International</a></li>
<li><a href="#">Online</a></li>
</ul>
</li>
<li><a href="#">Study</a>
<ul>
<li><a href="#">Undergraduate</a></li>
<li><a href="#">Masters</a></li>
<li><a href="#">International</a></li>
<li><a href="#">Online</a></li>
</ul>
</li>
<li><a href="#">Empty sub</a></li>
</ul>
</li>
</ul>
</div>
【问题讨论】:
-
为什么不使用 css 媒体查询来定位两个不同宽度的目标?
-
在我看来,您需要在 .on 之前使用 .off() ,以便删除先前附加的事件处理程序。我认为这会让你走上正确的道路,但你仍然有一个问题,当你点击一个链接的菜单项时,你会转到该链接,所以菜单上的“点击”事件可能并不理想。
-
$('.menu > ul > li').off().on({ mouseenter: function () { $(this).children('ul').stop(true, false ).show(); }, mouseleave: function () { $(this).children('ul').stop(true, false).hide(); } });
-
你必须对两个附加的事件处理程序都这样做。
-
您将多个事件处理程序附加到同一个项目。这只是清理了之前的内容,并允许您在任何给定时间仅附加一个事件处理程序。这解决了您的问题,但我会阅读它,因为可能有更好的方法来做到这一点。感谢您的赞赏。
标签: javascript jquery html css