【问题标题】:Show image next to element on hover?悬停时在元素旁边显示图像?
【发布时间】:2018-02-16 23:38:32
【问题描述】:

当我将鼠标悬停在 .tags 时,我想在它旁边显示图像 https://mal-stats.glitch.me/tagslegend.png

this page 上进行测试。

我想在不悬停.tags 时看到这个(最后一列中的所有单元格都有tags 类):

当悬停在第一个 .tags 单元格时:

图像应与悬停的单元格对齐。


我知道我会如何使用 javascript 来做到这一点。如果我可以更改 html,我也知道如何做到这一点。

因为它是一个用户样式表,虽然我只能使用 CSS。


如何在纯 CSS 中做到这一点?

我假设我必须以某种方式使用伪元素,但我没有足够的经验甚至不知道从哪里开始。

这基本上就是我所在的位置:

.tags:hover:after {
  background-image: url(https://mal-stats.glitch.me/tagslegend.png);
}

但它不起作用。我见过设置display: block 然后widthheight 的示例,但是来自/tagslegend.png 的图像是动态的。如果这是一个大问题,我可以改变它,但最好是适用于任何宽度和高度的解决方案。


代码需要在 this page 上运行,但 b/c 已在 cmets 中请求,这是一个最小示例:

.tags:hover:after {
  background-image: url(https://mal-stats.glitch.me/tagslegend.png);
}
<table>
  <tr>
    <td>Foo</td>
    <td>Bar</td>
    <td>Baz</td>
    <td class="tags">Hover me</td>
  </tr>
</table>

【问题讨论】:

  • 如果您可以通过在此处包含足够的代码来显示上下文、您尝试过的内容以及出了什么问题,那么您最好创建一个工作示例。见How to create a Minimal, Complete, and Verifiable example
  • 实时页面消失,这使得帖子对未来的读者不太有用。如果您可以在此处制作一个显示问题的小示例,这将很有帮助。它还有助于为人们提供一些他们可以轻松修改的代码。我看到你编辑了——谢谢!
  • @showdev 是的,这是有道理的。这对我来说很棘手 b/c 实际的 html 是如此...凌乱?在这里重新创建我在 html 中工作的环境很棘手。不过,我很确定我可以为上面的 sn-p 重新设计解决方案。

标签: html css


【解决方案1】:

你差不多了,你应该可以这样做:

.tags { 
    position: relative;
}

.tags:hover:after {
    position: absolute;
    right: -200px;
    top: 0;
    width: 200px;
    height: 30px;
    background-image: url(https://mal-stats.glitch.me/tagslegend.png);
}

您必须使用宽度/高度位置来准确地获得您想要的结果。

【讨论】:

  • Idk 图像的宽度和高度将是多少。你能让这个动态吗?
  • 为什么不用left: 100% 而不是right: &lt;hardcodedValue&gt;
  • 好主意!对我来说,这是一天的结束,很多人都比一个人更好:D
【解决方案2】:

由于您使用的是带有背景图像的伪元素,因此您需要包含 content,给它一些宽度/高度,并设置一个允许设置宽度和高度的 display mode

这是一个例子:

.tags:hover:after {
  content: "";
  display: inline-block;
  width: 10px;
  height: 10px;
  background-image: url(//via.placeholder.com/10x10);
}
<table>
  <tr>
    <td>Foo</td>
    <td>Bar</td>
    <td>Baz</td>
    <td class="tags">Hover me</td>
  </tr>
</table>

参考见:
Why do the :before and :after pseudo-elements require a 'content' property?

【讨论】:

  • 可能设置为display:block?很难说没有看到它在行动。哦,我看到图像有点宽。可能不合适?
  • 只是position: absolute 似乎让它与其邻居重叠。我已经出新版本了,请问可以have a quick look at this:你知道为什么不流畅吗?当我将鼠标从一个单元格运行到下一个单元格时,它并不总是切换
  • 哦,我想这是因为鼠标停留在伪元素内。我认为将伪元素向右移动可以解决这个问题。
  • 是的,看起来该元素很大并且覆盖了其他.tags 元素。也许将其设置为图像的确切大小。也可以在伪元素上尝试disabling pointer-elements
  • pointer-events:none 很好。无论如何,我对此表示赞同,并使用您的回答找到了一个对我有用的解决方案,Michal 在我找到它之后就以某种方式发布了该解决方案。由于他的回答就像我为自己编写的代码一样逐字逐句,我认为我应该接受他的?
【解决方案3】:

试试这个:

.tags { 
  position: relative;
}

.tags:hover::after {
  content: '';
  position: absolute;
  left: calc(100% + 30px);
  top: 0;
  width: 1000px;
  height: 1000px;
  background-image: url(https://mal-stats.glitch.me/tagslegend.png);
  background-repeat: no-repeat;
}

【讨论】:

  • 哈哈不开玩笑,这正是我刚刚通过自己的实验得出的结果 xD 几乎就在我即将发布答案的时候。
  • @theonlygusti 在 CSS3 中,语法从 :after 更改为 ::after。请参阅developer.mozilla.org/en-US/docs/Web/CSS/::after#Syntax“CSS3 引入了 ::after 表示法(带有两个冒号)来区分伪类和伪元素。浏览器也接受 :after,在 CSS2 中引入。”
猜你喜欢
  • 2019-06-10
  • 2023-01-12
  • 1970-01-01
  • 2019-11-14
  • 2011-10-02
  • 1970-01-01
  • 2017-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多