如果用户通过触摸设备访问我们的网站,我想忽略所有:hover CSS声明。因为:hover CSS没有意义,如果平板电脑在点击/点击时触发它,它甚至会令人不安,因为它可能会一直停留到元素失去焦点。说实话,我不知道为什么触屏设备觉得有必要触发:悬停在第一位——但这是现实,所以这个问题也是现实。

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

所以,(如何)我可以删除/忽略所有CSS:悬停声明在一次(而不必知道每一个)有他们声明后触摸设备?


当前回答

在浏览了前面的答案之后,这个方法对我很有效。 这个悬停只适用于有悬停功能的桌面。如果这个类/id有任何其他悬停代码,则删除

@media (hover: hover) {
  .toggle-label:hover {
     background-color: #69c9ff;
     color: #ffffff;
  }
}

其他回答

要使当前的答案也在IE11中工作(如果你仍然支持它的话):

@media (hover: hover) and (pointer: fine), only screen and (-ms-high-对比度:active), (-ms-high-对比度:none) { A:悬停{颜色:红色;} } <a href="#" >Some Link</a>

如果你的问题是当你触摸/点击android和整个div覆盖蓝色透明颜色!然后你只需要改变

光标:指针; 来 游标:default;

使用mediaQuery隐藏在手机/平板电脑。

这对我很有用。

我也遇到过同样的问题(在我使用三星手机浏览器的情况下),因此我偶然发现了这个问题。

感谢Calsal的回答,我发现了一些东西,我相信它将排除所有桌面浏览器,因为我尝试过的移动浏览器似乎都能识别它(参见编译表的截图:CSS指针特征检测表)。

MDN网络文档说明了这一点

指针CSS @media特性可用于应用基于的样式 用户的主要输入机制是否是指向设备,以及 如果是这样,它有多准确

.

我发现指针:coarse对于附件表中的所有桌面浏览器来说都是未知的,但是对于同一个表中的所有移动浏览器来说却是已知的。这似乎是最有效的选择,因为所有其他指针关键字值给出的结果都不一致。

因此,您可以像Calsal描述的那样构造一个媒体查询,但稍加修改。它使用了一种反向逻辑来排除所有的触摸设备。

Sass混合:

@mixin hover-supported {    
    /* 
     * https://developer.mozilla.org/en-US/docs/Web/CSS/@media/pointer 
     * coarse: The primary input mechanism includes a pointing device of limited accuracy.
     */
    @media not all and (pointer: coarse) {
        &:hover {
            @content;
        }
    }
}

a {
    color:green;
    border-color:blue;

    @include hover-supported() {
        color:blue;
        border-color:green;
    }
}

CSS编译:

a {
  color: green;
  border-color: blue;
}
@media not all and (pointer: coarse) {
  a:hover {
    color: blue;
    border-color: green;
  }
}

我在研究这个问题后创建的这个要点中也描述了它。 代码依赖于实证研究。

更新(2018): 在撰写此更新时,2018-08-23,并由@DmitriPavlutin指出,这种技术似乎不再适用于Firefox桌面。

更新(2021): 有人向我指出,它似乎在Firefox 87中工作。

这也是一个可能的解决方案,但你必须通过你的css和添加一个.no-touch类在你的悬停样式。

Javascript:

if (!("ontouchstart" in document.documentElement)) {
document.documentElement.className += " no-touch";
}

CSS例子:

<style>
p span {
    display: none;
}

.no-touch p:hover span {
    display: inline;
}
</style>
<p><a href="/">Tap me</a><span>You tapped!</span></p>

附注:但是我们应该记住,市场上有越来越多的触摸设备,它们同时也支持鼠标输入。

你可以使用Modernizr JS(也见这个StackOverflow的答案),或自定义JS函数:

function is_touch_device() {
 return 'ontouchstart' in window        // works on most browsers 
  || navigator.maxTouchPoints;       // works on IE10/11 and Surface
};

if ( is_touch_device() ) {
  $('html').addClass('touch');
} else {
  $('html').addClass('no-touch');
} 

来检测浏览器对touch事件的支持,然后分配一个常规的CSS属性,用html遍历元素。无接触类,像这样:

html.touch a {
    width: 480px;
}

/* FOR THE DESKTOP, SET THE HOVER STATE */
html.no-touch a:hover {
   width: auto;
   color:blue;
   border-color:green;
}