【问题标题】:Hover Behavior on Desktop vs iPad桌面与 iPad 上的悬停行为
【发布时间】:2013-03-26 18:45:24
【问题描述】:

我构建了一个菜单,它使用纯 CSS 和 :hover 伪类来显示菜单。 我在 iPad 上测试了这种行为,发现悬停并没有消失——即使点击其他地方也没有。

我已经在互联网上搜索了解决方案,但找不到任何有用的东西。

当我在 iPad 上单击页面上的其他位置时,有没有办法让悬停消失?

【问题讨论】:

  • 当你点击相同的东西让它出现时它会消失吗?

标签: ios ipad css hover


【解决方案1】:

避免依赖 :hover

依靠:hover 限制了移动设备上的选项。 JavaScript 或 jQuery 无法关闭元素的 :hover 状态。

作为替代方案,您可以使用鼠标事件和触摸事件的组合添加和删除.hover 类。如有必要,如果您检测到对触摸事件的支持,请不要添加鼠标事件。

这是一个带有两个悬停菜单的JSFiddle Demo。要在移动设备上运行它,请使用 standalone version of the demo。第一个菜单使用:hover 伪元素,第二个使用.hover 类。

在桌面浏览器上,这两个菜单的行为相同。但是对于触摸设备,@ErwaySoftware 的建议适用于第二个菜单:如果您在触摸设备上再次触摸菜单项,下拉菜单就会消失。当然,这仅适用于菜单项本身不是功能超链接的情况(如果它的唯一目的是打开下拉菜单)。

jQuery

// Mouse events
$('.menu > li').on('mouseover', function(){
    $(this).addClass('hover');
});
$('.menu > li').on('mouseout', function(){
    $(this).removeClass('hover');
});

// Touch events
$('.menu > li > a').on('touchend', function(){
    $(this).parent().toggleClass('hover');
});

在继续使用任何解决方案之前,请务必在 Android 上进行测试。

移动优先

最简洁和最简单的方法可能是在支持移动设备时避免依赖悬停状态,而是依赖点击/触摸来使菜单出现和消失。换句话说,首先为移动设备构建,然后弄清楚如何让它在桌面浏览器上运行(而不是相反)。

【讨论】:

  • 在我正在进行的项目中,移动设备并不重要,因为它们最初应该有自己的设计。但这可能需要更长的时间,因为项目所有者无法决定他们想要拥有什么。他们说它必须起作用,而且永远不会少。
  • @ChrisWest:好的,所以它是一个特定于桌面的网站,应该至少可以在移动设备上最低限度地使用。如果当前的行为不可接受,看起来唯一的选择是不使用:hover。 JavaScript 或 jQuery 无法关闭元素的 :hover 状态。
  • 非常感谢。我们选择前往一个基于 jquery mobile 的特殊页面。这应该可以解决 :hover 的问题。
【解决方案2】:

我知道另一种方法(但我不认为它更好)。

要启用 css .hover 效果,您应该向元素添加空的 onclick:

<div class="hoverable" onclick="">...</div>

悬停效果在您触摸元素时会起作用,但在您按住它时不起作用。而且我没有在安卓设备上测试它。但它适用于 ipad(移动 chrome 和 safari)。

附:另外我建议您在下面为所有元素添加 css 样式,用户可以触摸或按住:

-webkit-user-select: none;

此选项关闭带有元素的剪切/复制/粘贴对话框。并且不要将它用于所有文档。

【讨论】:

    【解决方案3】:

    这是我在下面的工作。我正在添加“clicked”类,它具有按钮原始类的样式,但也附加了 !important...(见下文)。

    $('#your_button').click(function()
    {
        // Removing the old class if there was one
        $(this).removeClass('clicked');
        // Adding clicked class
        $(this).addClass('clicked');
        // DO THE REST OF YOUR BUTTON CODE HERE
        return false;
    });
    
    #your_button{ background: #ff0000; color:#fff } 
    #your_button:hover{ background: #88888; color:#fff } 
    #your_button.clicked{ background: #ff0000 !important; color:#fff !important; } 
    

    【讨论】:

    • 应该是stopPropagation() 而不是return false;
    猜你喜欢
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 2022-11-30
    相关资源
    最近更新 更多