文章内容页根据H标签自动生成目录,使用js,解决的问题是cms内容管理器 内容一般都是一个字段,测试过xunruicms和eyoucms

获取文章所有的h标签,生成目录,增加跳转js

点击 当前页内跳转

自动识别当前位置 进行赋值active

个人比较菜,扣了半天才搞出来,拿去参考,有不足之处大家帮忙指正

右侧目录代码 主要是id

<div class="col-lg-3 col-md-12 col-12">
      <div class="header">
  <h6 class="title title-1">目录</h6>
   </div>
    <div id="groupfile">
                               
    </div>
</div>

左侧文章代码

<div class="entry-wrapper">
         <div class="entry-content u-text-format u-clearfix" id="content">
              {$content}    
     </div>    
     </div>

js代码

// 首先根据id获取id下所有H标签
var content=document.getElementById("content"); 
var headList = [...content.querySelectorAll('h1,h2,h3,h4,h5,h6')];
  // 将获取的H标签构造成树
  var root = {
      children: []
  };
  var h = {
      node: headList[0],
      children: [],
      parent: root
  };
  root.children.push(h);
  headList.reduce(function (pre, cur) {
      var n = {
          node: cur,
          children: []
      }
      while (h.node.localName[1] - n.node.localName[1] !== -1) {
          h = h.parent;
          if (h === root) {
              break;
          }
      }
      n.parent = h;
      h.children.push(n);
      h = n;
      return h;
  });
  // 给H标签加id
  var index = 0;
  function createList(list) {
      var text = list.reduce(function (pre, cur) {
           cur.node.id = 'header' + index++;
          var childText // 判断该H标签有没有子层H标签
          if (cur.children.length) {
              childText = createList(cur.children)
          } else {
              childText = ''
          }
         
          pre += ` 
                  <li class="groupfile-list">
                 <a class="catalog-tag" href="#${cur.node.id}">
                   ${cur.node[xss_clean]}
                   </a>
                 ${childText}
                </li>
               
                `
                //目录的列表
          return pre;
      }, '');
      var text = ` <ul class=""> ${text}  </ul>`
      return text;
  }
//循环出目录
  var content = createList(root.children);
  document.getElementById('groupfile')[xss_clean] = content;
  
 var left_div_top = 100; //左侧边栏距离顶部高度
    var right_nav_top = 150;     //右侧标题距离浏览器窗口顶部距离(距离顶部多少就切换左侧标题高亮)
    var groupfile_list = $("#groupfile .groupfile-list>a"); // 获取左侧标题列表dome
    var groupfile_list1 = $("#groupfile .groupfile-list"); // 获取左侧标题列表dome,用来给li加active
        //滚动条事件
        $(window).scroll(function () {
            var windouWidth = $(this).width();//获取浏览器自身宽度
            var windouHeight = $(this).height();//获取浏览器自身高度
            //获取滚动条的滑动距离
            var scroH = $(this).scrollTop();
            // 滚动js
            if ($(".main").offset()) {
                // js判断标题高亮
                $(headList).each(function (index, element) {
                    if ($("#header" + (index)).offset().top + windouHeight - right_nav_top < scroH + windouHeight) {
                        $(groupfile_list1[index-1]).removeClass("active"),
                        $(groupfile_list1[index]).addClass("active")
                    } else {
                        $(groupfile_list1[index]).removeClass("active")
                    }
                });
                
             
            }
        });
        // 目录跳转js
        groupfile_list.click(function (e) {
            e.preventDefault();
            var annname = $(this).attr("href");
            $('html, body').animate({ scrollTop: $(annname).offset().top - left_div_top }, 100)
        });  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值