javascript React appendChild to svg

8xiog9wr  于 2023-04-28  发布在  Java
关注(0)|答案(1)|浏览(124)

我是React的新手,目前正在开发一个交互式世界Map。我用的是inline svg。我添加了一些css,所以当我悬停在大陆上时,它们会变换:我意识到后面有一些大陆。当他们在上面盘旋时,他们会缩放,但看起来很奇怪。
在这里你可以看到欧洲、亚洲和非洲没有被盘旋。

当盘旋在亚洲上空时,你可以看到它的规模扩大,但它在非洲的后面

这是因为svg 1的渲染顺序。1
3.3渲染顺序
SVG文档片段中的元素具有隐式的绘制顺序,SVG文档片段中的第一个元素首先被“绘制”。后续图元将绘制在先前绘制的图元之上。
svg 1.% 1不支持z索引。我还没看过svg 2。0(这将支持z索引)据我所知。
所以我红了一些线程,关于如何有可能命令大陆悬停,使悬停的一个是在前面。
我找到了How to Bring svg Elements to the Front
然后开始尝试用React做这个。我在调用handleHover函数的路径上使用onMouseEnter事件,并在事件中传递,在函数内部,我调用currentTarget的parentElement属性,并调用currentTarget的appendChild。

function MapComponent() {

  function handleHover(event) {
    event.currentTarget.parentElement.appendChild(event.currentTarget);
  }

  return (
    <svg version="1.1" id="World" viewBox="0 0 1920 1080">
      <a href="/Australia" title="Australia" className="nav-link">
        <path
          id="Australia"
          onMouseEnter={(event) => handleHover(event)}
          d="..."
        />
      </a>
    </svg>
  );
}

但它并没有像预期的那样工作。当盘旋在路径(大陆)上时,它仍然在后面。
编辑:当用removeChild()交换appendChild()时,大陆在鼠标进入时消失。这说明选择了正确的元素。
我还尝试了完全不同的方法,如here(在第一个示例中)所解释的那样。不幸的是,这也不起作用。

const [isHovered, setHovered] = useState(false);

  return (
    <svg version="1.1" id="World" viewBox="0 0 1920 1080">
      <a href="/Australia" title="Australia" className="nav-link">
        <path
          id="Australia"
          onMouseEnter={() => setHovered(true)}
          onMouseLeave={() => setHovered(false)}
          d="..."
        />
        {isHovered && (
          <path
            id="Australia"
            onMouseEnter={() => isHovered(true)}
            onMouseLeave={() => isHovered(false)}
            d="..."
          />
        )}
f0brbegy

f0brbegy1#

感谢@paulitto和@Robert Longson
我只需要将onMouseEnter事件监听器复制到a元素。
下面是工作代码:

function MapComponent() {

  function handleHover(event) {
    event.currentTarget.parentElement.appendChild(event.currentTarget);
  }

  return (
    <svg version="1.1" id="World" viewBox="0 0 1920 1080">
      <a href="/Australia" title="Australia" className="nav-link" 
       onMouseEnter={(event) => handleHover(event)}>
        <path id="Australia" d="..."/>
      </a>
    </svg>
  );
}

相关问题