仅工具提示 CSS:焦点和悬停可防止访问以下按钮

Posted

技术标签:

【中文标题】仅工具提示 CSS:焦点和悬停可防止访问以下按钮【英文标题】:Tooltip CSS ONLY: focus and hover prevents access to following button 【发布时间】:2015-01-22 16:07:50 【问题描述】:

http://codepen.io/anon/pen/wBaGgW

我目前有一个项目列表,然后在右侧有一个按钮:

工具提示必须出现在focus 上,并且工具提示必须出现在hover 上——这可行,但问题是当一个项目被聚焦时(点击它之后)——以下项目不能通过鼠标访问(因为前面的重点是项目!):

当鼠标悬停在工具提示本身上时,工具提示必须消失,但焦点迫使它停留。

测试用例在这里:http://codepen.io/anon/pen/wBaGgW

任何人都可以提供没有任何 javascript 的解决方案吗?此外,html 标记不能更改太多。对 HTML 的最小更改是可以的。只是想防止太多,因为我很可能需要补偿应用程序的其他部分以适应 html 更改。

这里显示了工具提示:

button:hover>.tooltip,
button:focus>.tooltip,
button:active>.tooltip 
    visibility: visible;
    opacity: 1;

我可以通过以下方式隐藏工具提示:

button:focus>.tooltip:hover 
    visibility: hidden;
    opacity: 0;

但是当鼠标在工具提示出现的区域内移动时,这会导致疯狂的闪烁效果。

牢记限制:

没有 JavaScript 与 IE8+ 的兼容性(请注意,工具提示 css 来自我们的全局模块,我无法直接更改它,我正在开发一个单独的模块,我当然可以覆盖它,因为我的 css 加载在全局 css 之后) 工具提示必须出现在下方(很遗憾)

【问题讨论】:

让它悬停在对象的右侧怎么样? @LOTUSMS 我不能这样做,因为它违背了业务需求。它还增加了复杂性(响应式网络、工具提示在屏幕外不可见等) pointer-events css 属性也可以让点击通过工具提示,但 IE8 和 IE9 不支持。 没有充分的理由拒绝我的问题,因为它太具有挑战性或限制性。我提供了 codepen、代码和整个场景。我花了相当长的时间来提出这个问题。 我有一个半修复。如果一个按钮被聚焦,并且用户点击了工具提示,它就会被关闭。如果用户没有任何焦点,它也会在悬停时被解除。 codepen.io/anon/pen/azONYP 【参考方案1】:

由于这些限制,我不知道有什么方法可以完美地解决您的问题。

作为一种解决方法,您可以将工具提示更改为按钮的兄弟,而不是子按钮,并使用 CSS 相邻兄弟选择器。这使得当用户单击工具提示时,它会失去按钮的焦点并且工具提示被隐藏。这将需要您稍微修复工具提示的位置(我使用 margin-top 作为快速修复)。

代码

button:hover + .tooltip,
button:focus + .tooltip,
button:active + .tooltip 
    visibility: visible;
    opacity: 1;
    margin-top:20px;
<ul>
  <li><span>Lorem Ipsum Dlar Set</span>
    <button>X
    </button>
    <span class="tooltip">Hello ToolTip
    </span>
  </li>
  ...
</ul>

现场示例:http://codepen.io/anon/pen/azONYP

【讨论】:

感谢 Marcelo,这真的很接近。我会试一试,看看我能不能让它完美地工作:)【参考方案2】:

基于我的回答:Answer

html &lt;button tooltip="Tooltip text"&gt;Test&lt;/buttoN&gt;

css

[tooltip]:before             
    position : absolute;
    content : attr(tooltip);
    pacity : 0;


[tooltip]:hover:before         
    opacity : 1;
    margin-top:10px;

这里是Fiddle

更新 现在集中注意力。 添加指针事件:无;

IE8 是的

没有 Javascript 是的

必须低于 YEP

【讨论】:

感谢发帖.. 遗憾的是还有很多闪烁,如果您将鼠标缓慢向下移动,可能会出现大量闪烁。鼠标也位于按钮的左侧,闪烁。 我在 firefox 34.0chrome 39 中测试过。 这里没有闪烁。我在 linux 上,所以我无法在 Internet Explorer 上进行测试。你在用什么? chrome 39, windows 7x64 - 可以在我的 Mac 上试用。但无论如何,我们有严格的要求,必须兼容 windows 和 mac、chrome、firefox、safari、ie8-11(argh) 在此解决方案中,工具提示不会出现在焦点上。这就是使这个问题变得困难的原因。 重点更新。当我悬停时,我认为这是给定的。无论如何添加了 poiunter-events: none on the hvoer 所以应该没有闪烁【参考方案3】:

当鼠标离开提示框时,是否需要完全移除? (比如删除“:focus”)...因为如果它允许工具提示在鼠标离开后再次可见,那么您可以使用:

button:focus>.tooltip:hover

  background: none;
  border: none;
  -webkit-box-shadow: none;
  -moz-box-shadow: none;
  box-shadow: none;
  text-indent: -9999px;

codepen:http://codepen.io/anon/pen/OPVNaW

【讨论】:

非常接近!但它并不是 100% 正确的。工具提示也必须重新出现。不过,这似乎很有希望。 它重新出现,你的意思是它不需要重新出现(完全删除)? @Eran 我认为他的意思是,当您专注于一个按钮然后将鼠标悬停在其工具提示上时,它会隐藏并显示下方的按钮,但现在显示的第二个按钮没有在悬停时显示其工具提示。【参考方案4】:

使用&lt;a&gt; 代替按钮并将它们设置为按钮。

/* `border-box`... ALL THE THINGS! */
html 
  box-sizing: border-box;


*,
*:before,
*:after 
  box-sizing: inherit;


body 
  margin: 64px auto;
  text-align: center;
  font-size: 100%;
  max-width: 640px;
  width: 94%;


a:hover 
  text-decoration: none;


header,
.demo,
.demo p 
  margin: 4em 0;
  text-align: center;


/**
 * Tooltip Styles
 */

/* Add this attribute to the element that needs a tooltip */
[data-tooltip] 
  position: relative;
  z-index: 2;
  cursor: pointer;


/* Hide the tooltip content by default */
[data-tooltip]:before,
[data-tooltip]:after 
  visibility: hidden;
  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
  filter: progid: DXImageTransform.Microsoft.Alpha(Opacity=0);
  opacity: 0;
  pointer-events: none;


/* Position tooltip above the element */
[data-tooltip]:before 
  position: absolute;
  top: 150%;
  left: 50%;
  margin-top: 5px;
  margin-left: -80px;
  padding: 7px;
  width: 160px;
  -webkit-border-radius: 3px;
  -moz-border-radius: 3px;
  border-radius: 3px;
  background-color: #000;
  background-color: hsla(0, 0%, 20%, 0.9);
  color: #fff;
  content: attr(data-tooltip);
  text-align: center;
  font-size: 14px;
  line-height: 1.2;


/* Triangle hack to make tooltip look like a speech bubble */
[data-tooltip]:after 
  position: absolute;
  top: 150%;
  left: 50%;
  margin-left: -5px;
  width: 0;
  border-bottom: 5px solid #000;
  border-bottom: 5px solid hsla(0, 0%, 20%, 0.9);
  border-right: 5px solid transparent;
  border-left: 5px solid transparent;
  content: " ";
  font-size: 0;
  line-height: 0;


/* Show tooltip content on hover */
[data-tooltip]:hover:before,
[data-tooltip]:hover:after 
  visibility: visible;
  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
  filter: progid: DXImageTransform.Microsoft.Alpha(Opacity=100);
  opacity: 1;



/* Show tooltip content on focus */
[data-tooltip]:focus:before,
[data-tooltip]:focus:after 
  visibility: visible;
  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
  filter: progid: DXImageTransform.Microsoft.Alpha(Opacity=100);
  opacity: 1;
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>

<h1>CSS Simple Tooltip</h1>


<div class="demo">
  <p><a href="#" class="btn btn-primary" data-tooltip="I’m the tooltip text.">I’m a button with a tooltip</a></p>
</div>

【讨论】:

【参考方案5】:

尝试将您的 CSS 重构为如下内容:

button:hover>.tooltip,
button:active>.tooltip 
    visibility: visible;
    opacity: 1;
      

button:focus>.tooltip 
    visibility: visible;
    opacity: 1;
    outline: none;

【讨论】:

感谢您的尝试!这不起作用(即使在 chrome 中也不行) - 请参阅代码笔:codepen.io/anon/pen/wBaGgW - 我会看看大纲的作用(会检查出来) 你是对的。它适用于 Firefox,但您的问题暗示 IE8+。回到绘图板...

以上是关于仅工具提示 CSS:焦点和悬停可防止访问以下按钮的主要内容,如果未能解决你的问题,请参考以下文章

html 按钮文本换行,修复宽度,悬停工具提示(bootstrap&css)

在 iOS 设备中单击按钮后 CSS 悬停样式仍然存在

仅使用 CSS 在悬停时显示下拉菜单并在单击时关闭

当我使用 CSS 将鼠标悬停在按钮上时,我试图让按钮中的文本改变颜色

Highcharts 可拖动点 - 防止隐藏工具提示

鼠标悬停时的 SVG 地图工具提示,可单击