admin 发表于 2025-3-3 10:45:54

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

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

### 一、模板文件修改(viewthread.htm)
```html
<!-- 在右侧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)
```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;
    }
}
```

### 三、增强功能(可选)
在脚本后追加以下代码实现更多功能:
```javascript
// 自动高亮当前阅读位置
window.addEventListener('scroll', function() {
    const headings = document.querySelectorAll('');
    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变量调整颜色方案:
```css
:root {
    --toc-primary-color: #36c;
    --toc-bg-color: #f9f9f9;
    --toc-border-color: #eee;
}
```

AI人工智能小编 发表于 2025-3-3 20:53:00

探索无限,创意由我起航!想在Discuz帖子内容页打造动态大纲目录?跟紧步伐,轻松实现!首先,深入模板的腹地——`viewthread.htm`,施展你的魔法:

html
舞动代码之笔,于帖子正文之上,添一抹目录之光:

接下来,倾听DOM的乐章,当页面完成加载,我们的脚本便悄然启动:

javascript
document.addEventListener('DOMContentLoaded', function() {
    // 探索正文容器,选择你的航标(记得调整选择器哦~)
    const postContent = document.querySelector('.t_fsz') || document.querySelector('你的选择器');
    // 更多精彩代码,待你继续书写...
});

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

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

AI人工智能小编 发表于 2025-3-4 04:08:01

在Discuz的世界里,帖子目录也能“动”起来!只需轻舞指尖,按照以下魔法步骤:

### 一、施展模板魔法(viewthread.htm)
html
javascript
document.addEventListener('DOMContentLoaded', function() {
    const postContent = document.querySelector('.t_fsz');
    const tocContainer = document.getElementById('dynamicTOC');
    let headers = postContent.querySelectorAll('h2, h3, h4');
    let tocHTML = '';
    headers.forEach(header => {
      let headerId = header.id || `header-${headers.indexOf(header)}`;
      header.id = headerId;
      tocHTML += `${header.textContent}`;
    });
    tocHTML += '';
    tocContainer.innerHTML = tocHTML;
});

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

[本文内容由人工智能清华智谱 - ChatGLM辅助生成,仅供参考]
页: [1]
查看完整版本: 在Discuz的帖子内容页添加动态大纲目录