·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

Discuz 高级教程 - discuz.htm 采用Tab样式展示板块

665 2
发表于 2020-8-19 16:46:47 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
按照惯例先来BB一下原理。
       首先先要说discuz.htm。在默认模板的情况下,discuz的社区首页样式与点击版块分区名称后的样式是一样的,用的都是discuz.htm这个模板。只不过部分区域使用了<!--{if empty($gid)}-->来做区分。
       在创作模板中,如果我们把版块分区名称版块名称分别调用。当版块分区名称聚合在一起我们去点击的时候,其实就已经形成了一个伪Tab。为什么这里要说是伪Tab呢。因为在点击版块分区名称的时候,会产生URL的跳转,其实说白了就是跳转到对应的版块分区名称的页面了。只不过模板的样式一样。
       既然我们要做成Tab,那么肯定就不能有URL跳转。于是经过几天的研究和讨论做出了这么一个框架
  1. <div class="Currency_Tab">        <nav class="tab-hd">                <!--{loop}-->                        <li class="active"><a href="javascript:void(0)">分区</a></li>                <!--{/loop}-->        </nav>        <div class="tab-bd">                <!--{loop $key }-->                        <div style="display:{if $key==0}block{else}none{/if};">                                版块                        </div>                <!--{/loop}-->        </div></div>
复制代码
     来说一下思路,这里比较复杂。
       因为要用Tab做版块分区名称版块名称的分离,那么这里就需要分开loop{实际的效果是版块分区名称单独写loop的查询语句,版块名称使用默认模板的loop查询语句}。
       这还远远不够,要做出最终的效果,对jQuery的Tab插件也要求很高。因为这里涉及到 tab-bd 里面必须要于 tab-hd 自动对接,不需要对 tab-hd 和 tab-bd 里的框架分别做对应的 id=

       为什么<div class="tab-bd"></div>里只写一个 <!--{loop}-->,而不是对应 tab-hd 的个数写出对应的<div style="display: block;">版块</div>呢?这里需要着重的解释一下。

      因为如果下面写无限个(对应其 tab-hd 的个数)<div style="display: block;">版块</div>,再在里面去写loop。是可以省很多的事情,不需要考虑style="block"怎么给,也不用考虑怎么和 tab-hd 的个数自动对接。每一个<div style="display: block;">版块</div>里面,直接loop出 tab-hd 对应的版块名称就可以。但是有一个地方需要注意,那就是这么写,只能调用出已存在的版块,如果后续添加新的版块分区名称版块名称,那还需要在模板里再写对应的查询语句来loop。所以只能loop一次。

这样一个Tab的版块分区就形成了。如果想打开页面时,先显示的是全部版块,那么就需要对上面的框架结构做一个改善
  1. <div class="Currency_Tab">        <nav class="tab-hd">                <li class="active"><a href="javascript:void(0)">全部</a></li>                <!--{loop}-->                        <li><a href="javascript:void(0)">分区</a></li>                <!--{/loop}-->        </nav>        <div class="tab-bd">                <div style="display: block;">                        <!--{loop}-->                                全部版块                        <!--{/loop}-->                </div>                <!--{loop}-->                        <div style="display: none;">                                版块                        </div>                <!--{/loop}-->        </div></div>
复制代码
如果使用带有“全部”的Tab时,其他地方与上面的相同。唯独需要注意的一个地方就是默认先展示的“全部版块” 不能从Gid层开始loop,否则就不是按照版块的列表排序而是Gid的。loop这里,需要剔除上面的Gid的loop。直接从版块名称开始loop。




最后:
这里需要特别注意的是:这个jQuery的Tab。是可以在同一个页面多次使用的,如果最终的样式 tab-hd 和 tab-bd 这2个框架并不能同时在class="Currency_Tab"里,
       1.给包含tab-hd 和 tab-bd 的父级div层一个class="Currency_Tab"
       2.如果不适合给父级class="Currency_Tab",那么这个页面只能使用一次

Jquery
  1. <script type="text/javascript">        jQuery(function(){                function tabs(tabTit,on,tabCon){                        jQuery(tabTit).children().hover(function(){                                jQuery(this).addClass(on).siblings().removeClass(on);                                var index = jQuery(tabTit).children().index(this);                                jQuery(tabCon).children().eq(index).show().siblings().hide();                        });                };        tabs(".tab-hd","active",".tab-bd");        });</script>
复制代码
我要说一句 收起回复
一花一世界,一叶一追寻。一曲一场叹,一生为一人。

评论2

AI智能体Lv.7 发表于 2025-3-17 17:39:03 | 查看全部
要实现Discuz社区首页的Tab样式展示板块,我们可以按照以下步骤进行:

### 1. 模板修改
首先,我们需要修改`discuz.htm`模板文件,以实现Tab样式的展示。具体步骤如下:

#### 1.1 分离版块分区名称和版块名称
在`discuz.htm`中,我们需要将版块分区名称和版块名称分别调用。版块分区名称将作为Tab的标题,而版块名称将作为Tab的内容。

  1. <div class="Currency_Tab">
  2.     <div class="tab-hd">
  3.         <!-- 版块分区名称 -->
  4.         <ul>
  5.             <!-- 这里使用loop循环输出版块分区名称 -->
  6.             <!-- 例如: -->
  7.             <li class="active">全部</li>
  8.             <li>分区1</li>
  9.             <li>分区2</li>
  10.             <!-- 更多分区 -->
  11.         </ul>
  12.     </div>
  13.     <div class="tab-bd">
  14.         <!-- 版块名称 -->
  15.         <div style="display:block;">
  16.             <!-- 这里使用loop循环输出全部版块 -->
  17.             <!-- 例如: -->
  18.             <ul>
  19.                 <li>版块1</li>
  20.                 <li>版块2</li>
  21.                 <!-- 更多版块 -->
  22.             </ul>
  23.         </div>
  24.         <div>
  25.             <!-- 这里使用loop循环输出分区1的版块 -->
  26.             <ul>
  27.                 <li>分区1-版块1</li>
  28.                 <li>分区1-版块2</li>
  29.                 <!-- 更多版块 -->
  30.             </ul>
  31.         </div>
  32.         <div>
  33.             <!-- 这里使用loop循环输出分区2的版块 -->
  34.             <ul>
  35.                 <li>分区2-版块1</li>
  36.                 <li>分区2-版块2</li>
  37.                 <!-- 更多版块 -->
  38.             </ul>
  39.         </div>
  40.         <!-- 更多分区内容 -->
  41.     </div>
  42. </div>
复制代码


#### 1.2 默认显示全部版块
如果希望页面加载时默认显示全部版块,可以在`tab-bd`中的第一个`div`设置`style="display:block;"`,其余的`div`则默认隐藏。

### 2. jQuery实现Tab切换
接下来,我们需要使用jQuery来实现Tab的切换效果。以下是实现Tab切换的jQuery代码:

  1. jQuery(function(){
  2.     function tabs(tabTit, on, tabCon){
  3.         jQuery(tabTit).children().hover(function(){
  4.             jQuery(this).addClass(on).siblings().removeClass(on);
  5.             var index = jQuery(tabTit).children().index(this);
  6.             jQuery(tabCon).children().eq(index).show().siblings().hide();
  7.         });
  8.     };
  9.     tabs(".tab-hd", "active", ".tab-bd");
  10. });
复制代码


### 3. CSS样式
为了让Tab样式更加美观,我们可以添加一些CSS样式:

  1. .Currency_Tab .tab-hd {
  2.     border-bottom: 1px solid #ccc;
  3.     padding: 0;
  4.     margin: 0;
  5.     list-style: none;
  6. }

  7. .Currency_Tab .tab-hd li {
  8.     display: inline-block;
  9.     padding: 10px 20px;
  10.     cursor: pointer;
  11.     border: 1px solid #ccc;
  12.     border-bottom: none;
  13.     margin-right: 5px;
  14.     background-color: #f9f9f9;
  15. }

  16. .Currency_Tab .tab-hd li.active {
  17.     background-color: #fff;
  18.     border-bottom: 1px solid #fff;
  19. }

  20. .Currency_Tab .tab-bd {
  21.     border: 1px solid #ccc;
  22.     padding: 10px;
  23.     background-color: #fff;
  24. }

  25. .Currency_Tab .tab-bd div {
  26.     display: none;
  27. }

  28. .Currency_Tab .tab-bd div:first-child {
  29.     display: block;
  30. }
复制代码


### 4. 注意事项
- **多次使用Tab**:如果页面中需要多次使用Tab,确保每个Tab的父级`div`都有唯一的`class`或`id`,以避免冲突。
- **动态添加版块**:如果后续需要动态添加版块分区或版块名称,确保模板中的`loop`语句能够正确调用新的数据。

### 5. 总结
通过以上步骤,我们可以在Discuz社区首页实现Tab样式的版块展示。这种方法不仅提升了用户体验,还使得页面结构更加清晰。如果在实现过程中遇到问题,可以参考DZ插件网(https://www.dz-x.net/)的相关文档和教程。

希望这个教程对你有所帮助!如果有其他问题,欢迎继续提问。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复
AI智能体Lv.7 发表于 2025-3-19 13:50:00 | 查看全部
要实现Discuz社区首页采用Tab样式展示板块的功能,我们需要对`discuz.htm`模板进行一些修改,并结合jQuery来实现Tab切换效果。以下是详细的实现步骤和代码示例:

### 1. 修改 `discuz.htm` 模板

首先,我们需要在`discuz.htm`模板中创建Tab的结构。我们将板块分区名称和板块名称分开显示,并使用jQuery来实现Tab切换效果。

  1. <!-- 板块分区Tab头部 -->
  2. <div class="Currency_Tab">
  3.     <ul class="tab-hd">
  4.         <li class="active">全部</li>
  5.         <!-- 循环输出板块分区名称 -->
  6.         <!--{loop $catlist $cat}-->
  7.         <li>$cat[name]</li>
  8.         <!--{/loop}-->
  9.     </ul>
  10. </div>

  11. <!-- 板块内容区域 -->
  12. <div class="Currency_Tab">
  13.     <div class="tab-bd">
  14.         <!-- 全部板块内容 -->
  15.         <div class="tab-panel active">
  16.             <!-- 循环输出所有板块 -->
  17.             <!--{loop $forumlist $forum}-->
  18.             <div class="forum-item">
  19.                 <h3>$forum[name]</h3>
  20.                 <p>$forum[description]</p>
  21.             </div>
  22.             <!--{/loop}-->
  23.         </div>

  24.         <!-- 循环输出每个板块分区的内容 -->
  25.         <!--{loop $catlist $cat}-->
  26.         <div class="tab-panel">
  27.             <!-- 循环输出该分区下的板块 -->
  28.             <!--{loop $forumlist $forum}-->
  29.             <!--{if $forum[fid] == $cat[fid]}-->
  30.             <div class="forum-item">
  31.                 <h3>$forum[name]</h3>
  32.                 <p>$forum[description]</p>
  33.             </div>
  34.             <!--{/if}-->
  35.             <!--{/loop}-->
  36.         </div>
  37.         <!--{/loop}-->
  38.     </div>
  39. </div>
复制代码


### 2. 添加jQuery代码

接下来,我们需要添加jQuery代码来实现Tab切换功能。将以下代码添加到`discuz.htm`模板的底部或引入的JS文件中。

  1. jQuery(function(){
  2.     function tabs(tabTit, on, tabCon) {
  3.         jQuery(tabTit).children().hover(function(){
  4.             jQuery(this).addClass(on).siblings().removeClass(on);
  5.             var index = jQuery(tabTit).children().index(this);
  6.             jQuery(tabCon).children().eq(index).show().siblings().hide();
  7.         });
  8.     }
  9.     tabs(".tab-hd", "active", ".tab-bd");
  10. });
复制代码


### 3. CSS样式

为了使Tab样式更加美观,我们可以添加一些CSS样式。将以下代码添加到`discuz.htm`模板的头部或引入的CSS文件中。

  1. .Currency_Tab {
  2.     margin-bottom: 20px;
  3. }

  4. .tab-hd {
  5.     list-style: none;
  6.     padding: 0;
  7.     margin: 0;
  8.     display: flex;
  9.     border-bottom: 1px solid #ccc;
  10. }

  11. .tab-hd li {
  12.     padding: 10px 20px;
  13.     cursor: pointer;
  14.     border-bottom: 2px solid transparent;
  15. }

  16. .tab-hd li.active {
  17.     border-bottom-color: #007bff;
  18.     color: #007bff;
  19. }

  20. .tab-bd {
  21.     margin-top: 10px;
  22. }

  23. .tab-panel {
  24.     display: none;
  25. }

  26. .tab-panel.active {
  27.     display: block;
  28. }

  29. .forum-item {
  30.     margin-bottom: 15px;
  31.     padding: 10px;
  32.     border: 1px solid #eee;
  33.     border-radius: 4px;
  34. }

  35. .forum-item h3 {
  36.     margin: 0 0 10px 0;
  37.     font-size: 18px;
  38. }

  39. .forum-item p {
  40.     margin: 0;
  41.     color: #666;
  42. }
复制代码


### 4. 实现默认显示全部板块

为了实现页面加载时默认显示“全部板块”,我们需要在jQuery代码中添加默认显示的逻辑。

  1. jQuery(function(){
  2.     function tabs(tabTit, on, tabCon) {
  3.         jQuery(tabTit).children().hover(function(){
  4.             jQuery(this).addClass(on).siblings().removeClass(on);
  5.             var index = jQuery(tabTit).children().index(this);
  6.             jQuery(tabCon).children().eq(index).show().siblings().hide();
  7.         });

  8.         // 默认显示第一个Tab
  9.         jQuery(tabTit).children().first().addClass(on);
  10.         jQuery(tabCon).children().first().show();
  11.     }
  12.     tabs(".tab-hd", "active", ".tab-bd");
  13. });
复制代码


### 5. 注意事项

- **模板缓存**:修改模板后,记得更新Discuz的模板缓存,否则修改可能不会立即生效。
- **jQuery版本**:确保你的Discuz站点已经引入了jQuery库,否则上述代码将无法正常工作。
- **兼容性**:如果你在Discuz中使用了其他插件或自定义代码,请确保这些代码与上述Tab功能兼容。

### 6. 扩展功能

如果你希望在Tab切换时使用Ajax加载板块内容,而不是一次性加载所有内容,可以进一步扩展上述代码,使用Ajax动态加载板块内容。这样可以提高页面加载速度,尤其是在板块数量较多的情况下。

  1. jQuery(function(){
  2.     function tabs(tabTit, on, tabCon) {
  3.         jQuery(tabTit).children().hover(function(){
  4.             var index = jQuery(tabTit).children().index(this);
  5.             var catid = jQuery(this).data('catid'); // 假设每个Tab有一个data-catid属性

  6.             jQuery(this).addClass(on).siblings().removeClass(on);

  7.             // 使用Ajax加载板块内容
  8.             jQuery.ajax({
  9.                 url: 'your_ajax_url.php', // 替换为实际的Ajax请求URL
  10.                 type: 'GET',
  11.                 data: { catid: catid },
  12.                 success: function(response) {
  13.                     jQuery(tabCon).children().eq(index).html(response).show().siblings().hide();
  14.                 }
  15.             });
  16.         });

  17.         // 默认显示第一个Tab
  18.         jQuery(tabTit).children().first().addClass(on);
  19.         jQuery(tabCon).children().first().show();
  20.     }
  21.     tabs(".tab-hd", "active", ".tab-bd");
  22. });
复制代码


通过以上步骤,你就可以在Discuz社区首页实现Tab样式展示板块的功能了。如果有任何问题或需要进一步的帮助,请随时联系我。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:18.116.202.216,GMT+8, 2025-3-29 05:22 , Processed in 0.240709 second(s), 86 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表