我设计的一个网站使用菜单栏,当鼠标悬停时显示子菜单。最初的网站没有使用响应式设计,只针对桌面环境。现在我正在使用响应式设计技术来针对移动设备和平板电脑,其中许多设备是基于触摸而非鼠标操作的。
我面临的主要问题(似乎也是许多其他人面临的问题)是基于悬停的导航菜单:它在鼠标环境中运行得很好,但在触摸设备上,没有可靠的方法来触发悬停,使页面难以使用。
目标如下:
1. 当用鼠标悬停菜单时,显示子菜单。 2. 当用鼠标点击菜单时,打开锚点标签的链接。 3. 第一次触摸菜单时,显示子菜单。 4. 第二次触摸菜单时,打开锚点标签的链接。 5. 无缝切换功能,适用于同时具有鼠标设备的平板电脑。
我的团队不愿在基于鼠标的机器上放弃悬停效果。他们喜欢它,并不想让所有设备都变成点击式菜单。我同意这个想法。
在网上查找后,我没有找到任何解决我的问题的单一解决方案。我将其中一些方法结合起来,并开发出了一个在Android上测试良好,可以完全实现所需功能的东西。您能否提出改进意见或看到此方法存在任何问题?
我面临的主要问题(似乎也是许多其他人面临的问题)是基于悬停的导航菜单:它在鼠标环境中运行得很好,但在触摸设备上,没有可靠的方法来触发悬停,使页面难以使用。
目标如下:
1. 当用鼠标悬停菜单时,显示子菜单。 2. 当用鼠标点击菜单时,打开锚点标签的链接。 3. 第一次触摸菜单时,显示子菜单。 4. 第二次触摸菜单时,打开锚点标签的链接。 5. 无缝切换功能,适用于同时具有鼠标设备的平板电脑。
我的团队不愿在基于鼠标的机器上放弃悬停效果。他们喜欢它,并不想让所有设备都变成点击式菜单。我同意这个想法。
在网上查找后,我没有找到任何解决我的问题的单一解决方案。我将其中一些方法结合起来,并开发出了一个在Android上测试良好,可以完全实现所需功能的东西。您能否提出改进意见或看到此方法存在任何问题?
jQuery(document).ready(function() {
var touched=false;
jQuery(".nav").on('touchstart', 'li .has_children', function (e) { touched=true; });
jQuery("html").on('mousemove', function (e) { touched=false; });
jQuery("html").on('click', updatePreviousTouched );
jQuery(".nav").on('click', 'li .has_children', function (e) {
updatePreviousTouched(e);
if( touched ) {
if (jQuery(this).data('clicked_once')) {
jQuery(this).data('clicked_once', false);
return true;
} else {
e.preventDefault();
jQuery(this).trigger("mouseenter");
jQuery(this).data('clicked_once', true);
}
}
touched=false;
});
var previous_touched;
function updatePreviousTouched(e) {
if( typeof previous_touched != 'undefined' && previous_touched != null && !previous_touched.is( jQuery(e.target) ) ) {
previous_touched.data('clicked_once', false);
}
previous_touched=jQuery(e.target);
}
}
这里有一个 jfiddle 示例: http://jsfiddle.net/5FfCF/1/
如果您有任何改进的建议,请提出。 如果您发现它对您没有用,请告诉我。 我在这里发布它是为了尝试获得任何改进的建议,并公布这个想法,以便其他人可以受益。
到目前为止,我的测试结果如下:
- Windows 7 上的五个主要浏览器:可用。
- Android 平板电脑上的默认浏览器:可用。
- 带有触摸屏的 Windows 7 笔记本电脑,运行 IE 和 Chrome:有点问题。 该设备运行这两个浏览器的桌面版,因此不会触发“touchstart”事件。 在触摸屏和浏览器之间,某些东西将触摸转换为鼠标事件。 但是,由于鼠标是该设备中不可移动的部分,因此我不认为这是失败。 我希望它可以像平板电脑一样工作,但似乎还没有可用的技术。
- iOS iPad:在我编写上述javascript之前,这已经按预期工作了。 看起来iOS在幕后为我们完成一些悬停/单击魔术。 我有一个团队成员正在检查我的javascript是否破坏了iOS功能,我会在得到答案后编辑此帖子。
其他注意事项:
- 这仅适用于桌面和平板电脑站点的菜单。 对于手机大小的设备,有一个不同的基于点击的菜单。 我不建议将此解决方案用于手机。