<div title="惊喜就是我,惊不惊喜">鼠标移到我身上有惊喜</div>
title属性的悬浮文字提示在不同的浏览器,悬浮等待的时间和悬浮文字的样式都可能会不一样,例如chrome上显示是白底灰字,firefox上就可能是黄底黑字,时长可能是3s或者1s,
如果为了确保不同浏览器的用户体验的效果趋于一致的话,那么我们就需要禁用默认的title属性,改用js手动实现悬浮文字的提示。
最重要的是悬浮时间太久才显示,要个3秒就很难受了
实现原理步骤
首先我们得知道页面上dom加载完成
也得知道动态渲染的dom加载完成 (使用MutationObserver 接口提供了监视对DOM树所做更改的能力)
获取有title属性的所有元素
监听对应元素的mouseenter事件
写样式替换原生的title悬浮效果
具体实现代码如下:
let titleTools = {
init(time) {
time = parseInt(time)
if (!isNaN(time) && time >= 0) {
this.timeout = time
} else {
console.warn(`param ${time} is not a number or out of range! using default timeout setting`)
let eles = document.querySelectorAll('*[title]')
for (let i = 0; i < eles.length; i++) {
if (eles[i].title) {
eles[i].dataset.title = eles[i].title
eles[i].title = ''
eles[i].timeoutms = this.timeout
eles[i].addEventListener('mousemove', this.title)
eles[i].addEventListener('mouseleave', this.clear)
eles[i].leaveAction = this.clear
timeout: 500,
title(e) {
clearTimeout(this.timer)
const that = this
that.removeEventListener('mousemove', this.leaveAction)
this.timer = setTimeout(() => {
let div = document.createElement('div')
div.innerHTML = that.dataset.title
div.style.cssText = `display:inline-block;
border-radius: 2px;
padding: 0 5px;
line-height:1.3;
color:#000;
background:#fff;
font-size:13px;
box-shadow: 0 0 6px #ccc;
position:fixed;
left:${e.clientX}px;
top:${e.clientY}px;
z-index:999`
document.body.appendChild(div)
that.titleElement = div
that.addEventListener('mousemove', that.leaveAction)
}, this.timeoutms)
clear(e) {
clearTimeout(this.timer)
let div = this.titleElement
if (div && div.parentNode) {
div.parentNode.removeChild(div)
const targetNode = document.getElementById('root')
const config = {
childList: true,
attributes: true,
subtree: true
const callback = function(mutationsList, observer) {
titleTools.init(500)
const observer = new MutationObserver(callback)
observer.observe(targetNode, config)
实际效果如下图:
参考文章: 使用原生js来替换title属性的悬浮文字提示-可自定义样式和出现时间-简单实现