鼠标悬停事件_【CSS】鼠标悬停tips的实现

本文围绕前端鼠标悬停tips的实现展开,介绍了实现案例,还分享了一些技巧,如用自定义属性传入提示信息、利用border实现三角形、通过绝对定位布局、用em适配字体变化等,同时提及解决鼠标事件响应、延迟出现tips和添加focus等问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前端校招互助第三次群内讨论议题:鼠标悬停tips的实现

讨论的题目

实现一个鼠标悬停出现工具提示的效果1431b9ee919413da13098f6e01006355.png
讨论区地址:https://www.yuque.com/kuwu/vgfxx6/mcuso8

实现的案例

https://jsbin.com/nevujitewi/1/edit?html,css,output
https://codepen.io/litstronger/pen/GRjpzayc57a970ea0cc0aab34adfd9e342e53f8.png

一些技巧

可使用自定义属性来传入简单的提示信息

自定义数据属性 它赋予我们在所有 HTML 元素上嵌入自定义数据属性的能力,并可以通过脚本在 HTML 与 DOM 表现之间进行专有数据的交换。
用法很简单, data-* ,以掘金网的文章为例,想要存储一些不需要显示在浏览器上的额外信息的时候就使用了自定义属性。 article 标签上有 data-entry-id 和 data=draft-id ,这两个就是自定义属性,猜测是文章发布后的id和草稿态的id。a1cf936e1c2a7eb597557b3600b63ff1.png
在CSS中可以通过 attr 属性访问到自定义属性,使用方式如下:

<a href="#" class="tips" data-title="工具提示" data-dir="top">向上a>
.tips::before {
  content: attr(data-title);
  padding: 0.3em;
  border-radius: 5%;
  color: #fff;
  background: #000;
}

在JavaScript中可以通过 getAttribute() 方法来获取自定义属性的值,也可以通过 dataset 访问。

<a href="#" class="tips" data-title="工具提示" data-dir="top">向上a>
var a = document.querySelector('a.tips')
a.dataset.title = '修改title'

ec5b37c4ebb5a51ed633a232e2589a72.png
所以在简单场景下的tips提示可以通过自定义属性去实现,而且方便通过js去修改提示信息。

padding margin border 的颜色

4453b4d73586a74f27e6aaf25e956074.png85c516424b4be95e654dc6a81389e1d5.png

  • padding 颜色和content颜色一致
  • border可以有自己的颜色,默认是黑色
  • margin为无色

使用border实现一个简单的三角形

5a414d2d0cd3fb91dd8a137f13336028.png648ceb4147e3c29d0239bd29fc314003.png
将 width 和 height 设置为0,然后设置 border 的 size 和 color 来控制三角形的大小和颜色,当只需要下方的三角形的时候,可以设置其他三个三角形为透明,然后只保留 border-bottom 的颜色来实现,以此类推。716993351d92da84309601ea3115dd62.png82ecb39dade48f80a74540a5888a731c.png

通过绝对定位实现布局

子绝父相 ,父元素相对定位,子元素绝对定位。 ::after 和 ::before 可以看成是对应 html 标签的子元素。通过 left top right bottom 来控制子元素相对于父元素的绝对定位。让tips出现在父元素的正上方。left=50% 让左边界到中心位置, bottom=100% 距离下边界100%的位置就是 content 的上方,让 before 的下方紧贴 content 的上边界。布局好了之后,通过 transform 调整 before 的偏移 transform: translateX(-50%)

.tips[data-dir="top"]::before {
  position: absolute;
  left: 50%;
  bottom: 100%;
  transform: translateX(-50%);
  white-space: nowrap;
  opacity: 0;
  visibility: hidden;
}

使用em来适配字体的变化

1em 等于当前的字体尺寸。
2em 等于当前字体尺寸的两倍。
例如,如果某元素以 12pt 显示,那么 2em 是24pt。
在 CSS 中,em 是非常有用的单位,因为它可以自动适应用户所使用的字体。

.tips[data-dir="top"]::after {
  margin-bottom: -1em;
  border: 0.6em solid transparent;
  border-top-color: currentColor;
}

不相应鼠标事件

在使用 hover 的时候会出现这样的场景,当鼠标悬停出现 tips 的时候会遮挡住其他的操作符,而且同时 tips 响应鼠标悬停的时候会出现无法直接定位到操作符,带来体验上的不佳。

鼠标悬停在向左的 a 标签的时候,出现的 tips 遮住了向下的 a 标签

6198130ec85095b0c5462d09450b4fec.pngea6635e5fa11de71943b04aea548e8ee.png
可以使用 pointer-events 属性来取消鼠标事件的响应

pointer-events:none

延迟出现tips

当鼠标移动较快的时候会出现下面的效果,虽然很流畅的出现了提示信息,但是体感很混乱,当复杂场景的时候可能就会有渲染的成本。可以通过设置动画延时来避免鼠标快速移动带来的影响14ea96addd725149f060465770f54034.gif
使用 transition: 0.15s 0.15s 来实现 transition

添加focus

有时候使用者会通过 tab 键来切换工具,这时候如果想要有提示效果,不仅要在 hover 的时候设置样式,同样要在 focus 的时候设置样式。

讨论群

欢迎大家加群讨论,访问我们的讨论区:https://www.yuque.com/kuwu/vgfxx6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值