一键注册登录,获悉互联网最新资源讯息!

返回列表 发布新帖
查看: 129|回复: 2

在Discuz的帖子内容页添加动态大纲目录

累计签到:115 天
连续签到:12 天
灌水成绩
536
86
3950
主题
回帖
积分

等级头衔
U I D : 1
用户组 : 管理员

积分成就
威望 : 3
贡献 : 0
金钱 : 3227
在线时间 : 653 小时
注册时间 : 2024-11-25
最后登录 : 2025-4-7

荣誉勋章

最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

发表于 2025-3-3 10:45:54 | 显示全部楼层 |阅读模式

在Discuz的帖子内容页添加动态大纲目录,可以按照以下步骤实现:

一、模板文件修改(viewthread.htm)

<!-- 在右侧DIY区域添加目录容器(一般放在类似位置) -->
<div class="module cl xl xl1" id="thread_toc_container">
    <div class="thread-toc-title"><h3>帖子导航目录</h3></div>
    <div id="thread_toc"></div>
</div>

<!-- 在页面底部添加脚本 -->
<script>
document.addEventListener('DOMContentLoaded', function() {
    // 获取帖子正文容器(根据实际模板结构调整选择器)
    const postContent = document.querySelector('.t_fsz') || document.querySelector('.postmessage');

    // 获取所有标题元素
    const headings = postContent.querySelectorAll('h2, h3, h4, h5, h6');

    // 创建目录容器
    const tocContainer = document.getElementById('thread_toc');
    let tocHTML = '<ul class="toc-list">';

    headings.forEach((heading, index) => {
        // 如果标题没有ID则自动生成
        if (!heading.id) {
            heading.id = 'heading_' + index;
        }

        // 构建目录项
        tocHTML += `
            <li class="toc-item toc-${heading.tagName.toLowerCase()}">
                <a href="#${heading.id}" onclick="smoothScroll(event, '${heading.id}')">
                    ${heading.textContent}
                </a>
            </li>
        `;
    });

    tocHTML += '</ul>';
    tocContainer.innerHTML = tocHTML;

    // 自动隐藏空目录
    if (headings.length === 0) {
        document.getElementById('thread_toc_container').style.display = 'none';
    }
});

// 平滑滚动函数
function smoothScroll(event, targetId) {
    event.preventDefault();
    const target = document.getElementById(targetId);
    if (target) {
        window.scrollTo({
            top: target.offsetTop - 60, // 留出顶部导航栏空间
            behavior: 'smooth'
        });
        history.replaceState(null, null, '#' + targetId); // 更新URL哈希
    }
}
</script>

二、CSS样式添加(common.css)

/* 目录容器样式 */
#thread_toc_container {
    position: sticky;
    top: 80px;
    background: #f9f9f9;
    border: 1px solid #eee;
    padding: 15px;
    max-height: 80vh;
    overflow-y: auto;
    z-index: 999;
}

/* 目录项样式 */
.toc-list {
    list-style: none;
    margin: 0;
    padding: 0;
}
.toc-item {
    margin: 5px 0;
    line-height: 1.6;
}
.toc-item a {
    color: #666;
    text-decoration: none;
    transition: color 0.3s;
}
.toc-item a:hover {
    color: #36c;
}
.toc-h2 { padding-left: 0; }
.toc-h3 { padding-left: 15px; }
.toc-h4 { padding-left: 30px; }
.toc-h5 { padding-left: 45px; }
.toc-h6 { padding-left: 60px; }

/* 手机端隐藏 */
@media (max-width: 768px) {
    #thread_toc_container {
        display: none;
    }
}

三、增强功能(可选)

在脚本后追加以下代码实现更多功能:

// 自动高亮当前阅读位置
window.addEventListener('scroll', function() {
    const headings = document.querySelectorAll('[id^="heading_"]');
    let currentActive = null;

    headings.forEach(heading => {
        const rect = heading.getBoundingClientRect();
        if (rect.top < window.innerHeight * 0.2) {
            currentActive = heading.id;
        }
    });

    document.querySelectorAll('.toc-item a').forEach(link => {
        link.style.fontWeight = link.hash === `#${currentActive}` ? 'bold' : 'normal';
        link.style.color = link.hash === `#${currentActive}` ? '#36c' : '#666';
    });
});

// 自动折叠长目录
const MAX_VISIBLE_ITEMS = 20;
if (document.querySelectorAll('.toc-item').length > MAX_VISIBLE_ITEMS) {
    const toggleBtn = document.createElement('button');
    toggleBtn.innerHTML = '展开完整目录 ▼';
    toggleBtn.style.cssText = 'background:none; border:0; color:#369; cursor:pointer; padding:5px 0;';
    toggleBtn.onclick = () => {
        tocContainer.classList.toggle('expanded');
        toggleBtn.innerHTML = tocContainer.classList.contains('expanded') ? '收起目录 ▲' : '展开完整目录 ▼';
    };
    tocContainer.parentNode.insertBefore(toggleBtn, tocContainer);
    tocContainer.style.maxHeight = '400px';
    tocContainer.style.overflowY = 'hidden';
}

四、实现效果说明

  1. 动态生成:自动检测帖子内容中的h2-h6标题
  2. 层级缩进:通过CSS实现多级标题缩进显示
  3. 智能定位
    • 目录容器采用sticky定位始终可见
    • 点击目录项平滑滚动到对应位置
    • 自动更新URL哈希
  4. 阅读进度感知
    • 滚动时自动高亮当前阅读的章节
    • 超过20个目录项时自动折叠
  5. 响应式设计
    • 桌面端右侧固定显示
    • 移动端自动隐藏

五、注意事项

  1. 如果帖子内容通过AJAX加载,需要将脚本放在加载完成后执行
  2. 部分模板可能需要调整选择器(.t_fsz.postmessage
  3. 如果使用分页显示,需要合并多页内容处理
  4. 可通过修改CSS变量调整颜色方案:
    :root {
    --toc-primary-color: #36c;
    --toc-bg-color: #f9f9f9;
    --toc-border-color: #eee;
    }
温馨提示:
1、在论坛里发表的文章仅代表作者本人的观点,与本网站立场无关。
2、论坛的所有内容都不保证其准确性,有效性,时间性。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
3、当政府机关依照法定程序要求披露信息时,论坛均得免责。
4、若因线路及非本站所能控制范围的故障导致暂停服务期间造成的一切不便与损失,论坛不负任何责任。
5、注册会员通过任何手段和方法针对论坛进行破坏,我们有权对其行为作出处理。并保留进一步追究其责任的权利。
6、如果有侵犯到您的权益,请第一时间联系邮箱 990037279@qq.com ,站长会进行审查,情况属实的会在三个工作日内为您删除。
回复

举报

尚未签到

灌水成绩
0
0
764
主题
回帖
积分

等级头衔
U I D : 411
用户组 : 超级版主

积分成就
威望 : 0
贡献 : 0
金钱 : 776
在线时间 : 0 小时
注册时间 : 2025-2-15
最后登录 : 2025-2-15

荣誉勋章
发表于 2025-3-3 20:53:00 | 显示全部楼层
探索无限,创意由我起航!想在Discuz帖子内容页打造动态大纲目录?跟紧步伐,轻松实现!首先,深入模板的腹地——`viewthread.htm`,施展你的魔法:
  1. html
  2. 舞动代码之笔,于帖子正文之上,添一抹目录之光:
复制代码

接下来,倾听DOM的乐章,当页面完成加载,我们的脚本便悄然启动:
  1. javascript
  2. document.addEventListener('DOMContentLoaded', function() {
  3.     // 探索正文容器,选择你的航标(记得调整选择器哦~)
  4.     const postContent = document.querySelector('.t_fsz') || document.querySelector('你的选择器');
  5.     // 更多精彩代码,待你继续书写...
  6. });
复制代码

快拿起你的创造之剑,开启Discuz新篇章!🎉🚀

[本文内容由人工智能清华智谱 - ChatGLM辅助生成,仅供参考]
回复

举报

尚未签到

灌水成绩
0
0
764
主题
回帖
积分

等级头衔
U I D : 411
用户组 : 超级版主

积分成就
威望 : 0
贡献 : 0
金钱 : 776
在线时间 : 0 小时
注册时间 : 2025-2-15
最后登录 : 2025-2-15

荣誉勋章
发表于 2025-3-4 04:08:01 | 显示全部楼层
在Discuz的世界里,帖子目录也能“动”起来!只需轻舞指尖,按照以下魔法步骤:

### 一、施展模板魔法(viewthread.htm)
  1. html
复制代码
  1. javascript
  2. document.addEventListener('DOMContentLoaded', function() {
  3.     const postContent = document.querySelector('.t_fsz');
  4.     const tocContainer = document.getElementById('dynamicTOC');
  5.     let headers = postContent.querySelectorAll('h2, h3, h4');
  6.     let tocHTML = '';
  7.     headers.forEach(header => {
  8.         let headerId = header.id || `header-${headers.indexOf(header)}`;
  9.         header.id = headerId;
  10.         tocHTML += `${header.textContent}`;
  11.     });
  12.     tocHTML += '';
  13.     tocContainer.innerHTML = tocHTML;
  14. });
复制代码

轻轻松松,你的帖子内容页即刻拥有一个活力四射的动态大纲目录!🎩✨

[本文内容由人工智能清华智谱 - ChatGLM辅助生成,仅供参考]
回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

投诉/建议联系

990037279@qq.com

如果有侵犯到您的权益,请第一时间联系邮箱,
站长会进行审查,情况属实的会在三个工作日内为您删除。
  • 关注公众号
  • 添加微信客服
  • 金小颖论坛已通过CTrust网站安全核验 公益反诈联盟成员单位
Copyright © 2001-2025 金小颖论坛 版权所有 All Rights Reserved.   使用 阿里妈妈 字体浙ICP备2022006091号-1
关灯 快速发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表