当前位置: 首页 > 面试题库 >

如何删除/忽略:在触摸设备上悬停CSS样式

左丘边浩
2023-03-14
问题内容

:hover如果用户通过触摸设备访问我们的网站,我想忽略所有CSS声明。因为:hoverCSS没有意义,而且如果平板电脑在单击/点击时触发CSS,则CSS甚至可能会受到干扰,因为它可能会一直停留直到元素失去焦点。老实说,我不知道为什么触摸设备首先感觉到需要触发:hover-但这是现实,所以这个问题也是现实。

a:hover {
   color:blue;
   border-color:green;
   // etc. > ignore all at once for touch devices
}

因此,:hover在声明触摸设备后,如何(如何)可以立即删除/忽略所有CSS 声明(而不必知道每个CSS )?


问题答案:

如果您对为什么或有什么其他选择感兴趣,请继续阅读。

Quick’n’dirty-使用JS删除:hover样式

您可以删除所有包含:hover使用Javascript 的CSS规则。这样做的优点是不必接触CSS,即使与较旧的浏览器也兼容。

function hasTouch() {
  return 'ontouchstart' in document.documentElement
         || navigator.maxTouchPoints > 0
         || navigator.msMaxTouchPoints > 0;
}

if (hasTouch()) { // remove all the :hover stylesheets
  try { // prevent exception on browsers not supporting DOM styleSheets properly
    for (var si in document.styleSheets) {
      var styleSheet = document.styleSheets[si];
      if (!styleSheet.rules) continue;

      for (var ri = styleSheet.rules.length - 1; ri >= 0; ri--) {
        if (!styleSheet.rules[ri].selectorText) continue;

        if (styleSheet.rules[ri].selectorText.match(':hover')) {
          styleSheet.deleteRule(ri);
        }
      }
    }
  } catch (ex) {}
}

限制:样式表必须托管在 同一域中 (这意味着没有CDN)。禁用在Surface和iPad Pro
等混合鼠标和触摸设备上徘徊的功能,这会伤及UX。

仅CSS-使用媒体查询

将所有:hover规则放在一个@media块中:

@media (hover: hover) {
  a:hover { color: blue; }
}

或者,替代所有悬停规则(与旧版浏览器兼容):

a:hover { color: blue; }

@media (hover: none) {
  a:hover { color: inherit; }
}

限制:使用WebView时,仅适用于iOS 9.0 +,Chrome for Android或Android 5.0+。hover: hover打破了旧版浏览器上的悬停效果,hover: none需要覆盖所有先前定义的CSS规则。两者均 与混合的鼠标和触摸设备不兼容

最强大-通过JS检测触摸并添加CSS:hover规则

方法需要在所有悬停规则之前添加body.hasHover。(或您选择的班级名称)

body.hasHover a:hover { color: blue; }

hasHover类可以使用加入hasTouch()从第一个例子:

if (!hasTouch()) document.body.className += ' hasHover'

但是,对于混合触摸设备,这可能会具有与先前示例相同的缺点,这将我们带到了最终解决方案。每当移动鼠标光标时启用悬停效果,每当检测到触摸时禁用悬停效果。

function watchForHover() {
  // lastTouchTime is used for ignoring emulated mousemove events
  let lastTouchTime = 0

  function enableHover() {
    if (new Date() - lastTouchTime < 500) return
    document.body.classList.add('hasHover')
  }

  function disableHover() {
    document.body.classList.remove('hasHover')
  }

  function updateLastTouchTime() {
    lastTouchTime = new Date()
  }

  document.addEventListener('touchstart', updateLastTouchTime, true)
  document.addEventListener('touchstart', disableHover, true)
  document.addEventListener('mousemove', enableHover, true)

  enableHover()
}

watchForHover()

这基本上可以在任何浏览器中工作,并根据需要启用/禁用悬停样式。

//jsfiddle.net/dkz17jc5/19/



 类似资料:
  • 我目前正在研究这个导航菜单的样式 它在浏览器上运行良好。至于手机,有一种奇怪的蓝色onclick效应。我怎样才能删除它 屏幕截图: 单击前https://imgur.com/Ovu5v7P 点击https://imgur.com/lOwpicT 这是我的密码:

  • 问题内容: 我创建了一个带有始终可见的上一个和下一个按钮的轮播。这些按钮处于悬停状态,它们变为蓝色。在诸如iPad的触摸设备上,悬停状态为粘滞状态,因此在点击它后按钮保持蓝色。我不要 我可以为每个按钮添加一个类,并使我的CSS像这样:但这可能会降低性能,并且不能正确处理Chromebook Pixel(具有触摸屏和鼠标)之类的设备。 我可以向中添加一个类,并使CSS像这样:但是,这在同时带有触摸和

  • 本文向大家介绍如何在触摸设备上使用JavaScript拖放?,包括了如何在触摸设备上使用JavaScript拖放?的使用技巧和注意事项,需要的朋友参考一下 对于触摸式设备的JavaScript拖放,可以使用jQuery UI Touch Punch或拖放式Touch。  许多不同的事件可用于成功执行拖放操作, 有许多不同的事件需要附加,以监视整个拖放过程- 拖动开始 拖动 德拉贡特 拖曳 拖曳 下

  • 问题内容: 用这样的HTML: 然后像这样的一些CSS: 如何允许在启用触摸的设备上进行长时间触摸来复制悬停?我可以更改标记/使用JS等,但是想不出一种简单的方法来做到这一点。 问题答案: 好的,我已经解决了!它涉及稍微更改CSS并添加一些JS。 使用jQuery使其变得容易: 用英语:当您开始或结束触摸时,请打开或关闭课程。 然后,在您的HTML中,将类悬停添加到您要与此一起使用的任何内容上。在

  • 问题内容: 我想知道是否有可能用JS触发CSS HOVER效果,而不必使用其他类… 我尝试使用触发效果,但这不会触发CSS悬停效果。 PS:我做了一个功能,可以帮助用户使用在线CMS。帮助功能通过在图像上四处移动来显示操作方法,以显示操作方法。虚拟光标可以单击内容,显示元素等。但是我希望该虚拟光标也可以触发CSS中设置的:hover效果。 问题答案: 我知道您要做什么,但为什么不简单地这样做: 该

  • 我非常喜欢React中的内联CSS模式,并决定使用它。 但是,不能使用和类似的选择器。那么,在使用内联CSS样式时,实现悬停高亮显示的最佳方法是什么? #reactjs的一个建议是使用一个可点击的