动态新增锚点(如右侧悬浮导航)

//样式模拟
div > div {
  width: 200px;
  height: 500px;
  border: 1px solid #38c46d;
}
#anchor {
  position: fixed;
  width: 100px;
  height: 200px;
  border: 1px solid #000;
  right: 16px;
  top: calc(50% - 50px);
  padding: 0;
  :deep(li) {
    width: 100%;
    text-align: center;
    list-style: none;
    a {
      color: #000;
    }
  }
}

//元素模拟
    <div id="area">
      <div id="box1">box1</div>
      <div id="box2">box2</div>
      <div id="box3">box3</div>
    </div>
    <div>
      <ul id="anchor"></ul>
    </div>

//js控制动态生成锚点
//思路:遍历某个区域内所有的拥有id的子元素,然后生成锚点集;exclude代表特殊情况,排除某些元素,使其不生成锚点;
//具体样式自己调整,加setTimeout是因为在vue或者react中,为了保证元素节点已生成。
/** * * @param area 统计某个区域的id * @param id 在某个元素上生成锚点集 * @param exclude 排除某个元素锚点 */ const createAnchor = (area: string, id: string, exclude?: Array<string>) => { setTimeout(() => { let areaDoc = document.getElementById(area); let anchorDoc = document.getElementById(id); let str = ""; areaDoc.childNodes.forEach((value: any, index) => { if (value.id) { if (exclude) { if (exclude.indexOf(value.id) < 0) { str += `<li><a href='#${value.id}' title='${value.textContent}'>${value.textContent}</a></li>`; } } else { str += `<li><a href='#${value.id}' title='${value.textContent}'>${value.textContent}</a></li>`; } } }); anchorDoc.innerHTML = str; }, 0); }; createAnchor("area", "anchor");

 

posted @ 2024-09-04 14:55  你风致  阅读(10)  评论(0编辑  收藏  举报