首先,我们通过HTML结构布局元素:
html
<div class="container">
<p id="text" title="">这是一段可能会超出容器范围的文字...</p>
</div>
<style scoped>
.container {
width: 200px; /* 假设这里的宽度有限 */
border:1px solid #ccc;
}
#text{
white-space: nowrap;
overflow:hidden;
text-overflow:ellipsis;
}
.tooltip {
position:absolute;
background-color:#fff;
padding:5px;
box-shadow: 0 0 3px rgba(0,0,0,.4);
display:none;
}
</style>
上述代码中的`<p>`标签设置了固定宽度且内容超过部分会用省略号代替(`text-overflow: ellipsis`)。同时为其添加了默认不显现的`.tooltip`样式类用于后续创建浮动框。
接下来是核心的JavaScript逻辑:
javascript
window.onload = function() {
var container = document.querySelector('.container');
var txtNode = document.getElementById('text');
// 判断是否需要 tooltip
if (txtNode.offsetWidth < txtNode.scrollWidth) {
// 创建并设置 tooltip 的 HTML 结构
let toolTipText = document.createElement("span");
toolTipText.classList.add('tooltip');
toolTipText.textContent = txtNode.innerText;
// 将 tooltip 添加到 DOM 中,并定位它相对于 'text' 元素的位置
container.appendChild(toolTipText);
const showTooltip = () => {
let rect = txtNode.getBoundingClientRect();
toolTipText.style.display = "block";
toolTipText.style.left = `${rect.right}px`;
toolTipText.style.top = `${rect.bottom + window.pageYOffset - parseInt(getComputedStyle(txtNode).fontSize)}px`;
};
const hideTooltip = () => {
toolTipText.style.display = "none";
};
// 鼠标 Hover 上去和离开事件绑定处理函数
txtNode.addEventListener('mouseover',showTooltip,false);
txtNode.addEventListener('mouseout',hideTooltip,false);
}
};
这段JS脚本的主要作用在于:加载页面完成后检查文本节点的实际宽度与滚动宽度的区别,如果实际宽度小于滚动宽度则表示存在溢出情况;然后动态生成一个包含全部原始文本内容的 Tooltip 节点插入DOM树中,并在其位置上进行精确计算及调整以便于跟随目标文本块展现出来。最后监听 `mouseover` 和 `mouseout` 事件切换Tooltip的显隐状态从而达到预期的效果。
总结来说,借助 JavaScript 可灵活判断文本长度并与 CSS 相结合完美实现了文本溢出时呈现hover气泡的功能,既保持界面整洁又提升了用户的阅读体验。