wordpress 实现侧边栏锚链接目录的JS代码

搭配 JS / jquery/3.6.0

实现

<div class="sidebar-hidden" id="sidebar-hidden">
 

<div class="sider-list-1">


 <h3>The Contents</h3> 
 <div id="navDivId"> </div>
 
</div>

 


    <!-- <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script> -->
    <script type="text/javascript">
        $(function() {
            // *************功能一:生成目录******************************
            var eles = ['h1', 'h2' , 'h3' ]
            // 获取文章里 h1 到 h6 的元素 , 'h3', 'h4', 'h5', 'h6'
            var doms = document.querySelector('.entry-content').querySelectorAll(eles.toString())
            if (! doms || ! doms.length) {
                return ;
            }
            // 创建目录盒子
            let $ul = $('<ul class="catalogbox"></ul>')
            // 目录的下标
            let index = 0
            for (let h of doms) {
                let tag = h.nodeName.toLowerCase()
                if (! eles.includes(tag)) {
                    continue ;
                }
                
                // 生成每个目录的id,绑定在 h 标签上
                let id = `catalog_${++index}`
                h.setAttribute('id', id)
                // 获取 h 标签的内容
                let text = h.innerHTML.replace(/<\/?[^>]+>/g, '')
                // 生成 li 元素,需要绑定h 的id,以便于点击目录时可以找到对应的 h 标签
                let level = tag.replace('h', '')   // 获取当前目录级别,需要根据目录级别设置css
                // let $li = `<li  catalog="${id}">${text}</li>`
 
                let $li = `<li style="--level: ${level}" catalog="${id}"" class ="ch${level}">${text}</li>`


                $ul.append($li)

            }

   $('#navDivId').append($ul)

             

             // *************功能二:点击目录滚动到对应区域******************************
            $('li[catalog]').on('click', function() {
                // 获取每个li 上绑定的catalog值,对应着唯一的 h 标签
                let id = $(this).attr('catalog')
                document.querySelector(`#${id}`).scrollIntoView({
                    behavior: 'smooth'
                })
            })

            // *************功能三:目录跟随滚动高亮******************************
            window.addEventListener('scroll', function() {
                // 获取浏览器滚动条距离顶部的高度
                let scroll = document.documentElement.scrollTop || document.body.scrollTop
                
                for (let i = doms.length - 1; i >= 0 ; i--) {
                    // 倒叙遍历所有的 h 标签,如果滚动条的 scrollTop 刚刚大于 h 区域的 offsetTop,
                    // 将此h 标签对应的 目录 设置为高亮
                    if (parseInt(scroll) >= Math.ceil(doms[i].offsetTop) ) {
                        let id = doms[i].getAttribute("id")
                        $('li[catalog]').each(function() {
                            if ($(this).attr('catalog') === id) {
                                $(this).addClass('current-catalog')
                            } else {
                                $(this).removeClass('current-catalog')
                            }
                        })
                        break ;
                    }
                }
            })
            
        })

    </script>




 


</div> 
<!-- sidebar-hidden -->


<!--实现自动隐藏功能 距离底部距离识别 
    var div1 =  document.getElementById("sidebar-hidden");
    var div2 = document.getElementById("footer-bottom"); 
 -->
<script>
  // 获取返回顶部按钮
  const backToTopButton = document.querySelector('.sidebar-hidden');

  // 监听滚动事件
  window.addEventListener('scroll', () => {
    // 如果页面滚动距离大于100px,则显示返回顶部按钮
    if (window.pageYOffset > 180) {
      //backToTopButton.style.display = 'block';
       backToTopButton.style.position = 'fixed';  
    } else {
      // 否则隐藏
      // backToTopButton.style.display = 'none';
          // backToTopButton.style.display = "block";
      backToTopButton.style.position = 'static';
    }
  });

  // 返回顶部函数
  function scrollToTop() {
    window.scrollTo({ top: 0, behavior: 'smooth' });
  }



// window.addEventListener('scroll', function() {
//     var element = document.getElementById("sidebar-hidden"); // 替换为你的元素ID
 
window.addEventListener('scroll', function() {
    var div1 =  document.getElementById("sidebar-hidden");
    var div2 = document.getElementById("footer-bottom"); 

    
    var div1Rect = div1.getBoundingClientRect();
    var div2Rect = div2.getBoundingClientRect();
    
 
    if ( div2Rect.top <=  890) {
  
        div1.style.display = "none";
    } else  {
        // 确保在不满足条件时恢复显示
        //     if (div1.style.display === "block") {
        // return; // 已经隐藏,避免重复操作
        // }
      
        div1.style.display = "block";
    }
});

 

</script>

CSS 控制 实现


.sidebar-hidden {
  display:block; /* 初始时隐藏 */
/*    position: fixed;*/
position:static;  
top: 68px;
padding: 15px 0 20px 18px;
/*  background-color: #333;
    color: white;
    border-radius: 5px; 
     */
cursor: pointer;
transition: all 0.3s ease;
width:inherit;
border-left: 1px solid #F2F2F2; 
}
 

#navDivId  li[catalog] {
  padding-left: calc(var(--level) * 10px) ;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值