You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现鼠标悬停SVG元素时控制外部HTML段落的显示隐藏

解决方案

问题根因

你当前的写法存在两个核心问题:

  • 通过<embed>加载的外部SVG是独立的DOM文档,和父HTML页面的DOM完全隔离,CSS无法跨两个文档做元素选择
  • 原有CSS选择器.redcircle:hover .item逻辑错误,该写法表示选择.redcircle的后代类名为item的元素,但你要控制的item是和SVG平级的兄弟元素,不存在父子关系

方案1:直接内联SVG(无需JS,最简便)

把外部SVG的内容直接复制到HTML文件里,不要用embed加载,修改后的代码如下:

HTML代码

<!DOCTYPE html>
<html>
<head>
  <link rel="stylesheet" href="styles.css" type="text/css"/>
</head>
<body>
  <svg height="300" width="300">
    <circle class="redcircle" cx="50" cy="50" r="40" stroke="black" stroke-width="3" fill="red" />
    <circle cx="200" cy="200" r="40" stroke="green" stroke-width="3" fill="purple" />
  </svg>
  <p class="item"> this is a hidden text, should only appear when hover over red circle</p> 
</body>
</html>

CSS代码(修改选择器)

.item {
   display:none;
}
/* 兄弟选择器,匹配.redcircle hover后同级的.item元素 */
.redcircle:hover ~ .item{
   display:block;
}

方案2:保留embed加载外部SVG(需要JS实现)

如果必须要单独维护SVG文件,就通过JS跨文档监听事件实现,修改代码如下:

HTML代码

<!DOCTYPE html>
<html>
<body>
  <embed id="svgEmbed" src="graphic.svg" />
  <p class="item"> this is a hidden text, should only appear when hover over red circle</p> 
  <script>
    const svgEmbed = document.getElementById('svgEmbed');
    const targetP = document.querySelector('.item');
    // 等SVG加载完成后绑定事件
    svgEmbed.addEventListener('load', () => {
      const svgDoc = svgEmbed.contentDocument;
      const redCircle = svgDoc.querySelector('.redcircle');
      // 鼠标移入显示
      redCircle.addEventListener('mouseenter', () => {
        targetP.style.display = 'block';
      });
      // 鼠标移出隐藏
      redCircle.addEventListener('mouseleave', () => {
        targetP.style.display = 'none';
      });
    });
  </script>
</body>
</html>

CSS代码

.item {
   display:none;
}

内容的提问来源于stack exchange,提问作者Genutek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:36:07