reactjs < mark>React < li>中具有悬停行为的跨元素文本

piv4azn7  于 2023-02-18  发布在  React
关注(0)|答案(1)|浏览(107)

假设我有这样的HTML / JSX:

<ul>
  <li>First bullet point</li>
  <li>Second bullet point</li>
</ul>

我想突出显示“连续”“跨越”多个列表元素的范围:

<ul>
  <li>First bullet <mark>point</mark></li>
  <li><mark>Second bullet</mark> point</li>
</ul>

最后,我想添加一些行为,比如鼠标悬停在第一个<mark>标签上会触发第二个<mark>标签,反之亦然。从用户的Angular 来看,它看起来和感觉上应该像一个<mark>标签。
这可以用CSS / Tailwind单独实现吗?根据我目前所看到的,兄弟~组合子can only be used on earlier elements影响后面的元素。Tailwind中的peer类似乎也是如此。
如果需要使用Javascript,有人能给我指出正确的方向吗?FWIW,这是一个React项目,所以直接操作DOM可能会有一些警告。

nbysray5

nbysray51#

如果任何标记被突出显示,并且它们都需要被突出显示,这是一个简单的has()调用。

ul:has(mark:hover) mark {
  background-color: red;
}
<ul>
  <li><span>First bullet </span><mark>point</mark></li>
  <li><mark>Second bullet</mark><span> point</span></li>
  <li><span>Third bullet </span><mark>point</mark></li>
  <li><mark>Fourth bullet</mark><span> point</span></li>
  <li><span>The </span><mark>Fifth bullet</mark><span> point</span></li>
</ul>

如果它适用的话,它只是围绕它的 Package 有点复杂
一个二个一个一个
仅仅使用JavaScript

const ul = document.querySelector("ul");

const removeActive = function (evt) {
  const active = evt.currentTarget.querySelector("mark.active");
  if (active) active.classList.remove("active");
}

ul.addEventListener("mouseover", function (evt) {
  removeActive(evt);
  let elem = null;

  const mark = evt.target.closest("mark");
  if (!mark) return;
  
  const li = mark.closest("li");
  
  if (!mark.previousSibling) {
    const prevLi = li.previousElementSibling;
    elem = prevLi && prevLi.lastChild;
  } else if (!mark.nextSibling) {
    const nextLi = li.nextElementSibling;
    elem = nextLi && nextLi.firstChild;
  }
  
  if (elem && elem.nodeName == "MARK") {
    elem.classList.add("active");
  }
});

ul.addEventListener("mouseleave", removeActive);
li mark:hover,
li mark.active {
  background-color: red;
}
<ul>
  <li>First bullet <mark>point</mark></li>
  <li><mark>Second bullet</mark> point</li>
  <li>Third bullet <mark>point</mark></li>
  <li><mark>Fourth bullet</mark> point</li>
  <li>The </span><mark>Fifth bullet</mark><span> point</li>
</ul>

相关问题