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

使用JS实现鼠标悬停时匹配不同父元素下同ID的<li>元素

需求实现:鼠标悬停同步高亮对应元素

问题说明

当鼠标悬停在.first容器内的<li>元素上时,需要为.second容器内具有相同ID的<li>元素添加.active类(例如悬停.first li#one时,给.second li#one添加.active类)。注意:ID为动态生成,无法提前获知。

对应的HTML结构:

<div class="first">
  <ul>
    <li id="one">Lorem</li>
    <li id="two">Ipsum</li>
    <li id="three">Dolor</li>
  </ul>
</div>

<div class="second">
  <ul>
    <li id="one">Lorem</li>
    <li id="two">Ipsum</li>
    <li id="three">Dolor</li>
  </ul>
</div>

纯CSS方案说明

不存在纯CSS解决方案。CSS选择器无法实现基于动态ID跨容器的元素关联匹配,无法完成这类交互逻辑,必须借助JavaScript。

JavaScript解决方案

基于ID的实现思路

通过监听鼠标的mouseover和mouseout事件,获取当前悬停<li>的ID,再定位到.second容器中对应ID的元素,完成类的添加与移除:

// 遍历.first下的所有li元素
document.querySelectorAll('.first li').forEach(li => {
  // 鼠标悬停时添加active类
  li.addEventListener('mouseover', () => {
    const targetLi = document.querySelector(`.second li#${li.id}`);
    if (targetLi) targetLi.classList.add('active');
  });

  // 鼠标离开时移除active类
  li.addEventListener('mouseout', () => {
    const targetLi = document.querySelector(`.second li#${li.id}`);
    if (targetLi) targetLi.classList.remove('active');
  });
});

基于类的替代实现

(注:HTML规范中ID需唯一,重复ID属于不规范写法,推荐用类来关联配对元素)

document.querySelectorAll('.first li').forEach(li => {
  li.addEventListener('mouseover', e => {
    // 取第一个类名作为关联标识(需确保配对元素类名一致)
    const relateClass = e.target.classList.item(0);
    const targetLi = document.querySelector(`.second li.${relateClass}`);
    if (targetLi) targetLi.classList.add('active');
  });

  li.addEventListener('mouseout', e => {
    const relateClass = e.target.classList.item(0);
    const targetLi = document.querySelector(`.second li.${relateClass}`);
    if (targetLi) targetLi.classList.remove('active');
  });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 08:06:19