3.3 响应式适配与移动端 touch 目录
> 手机版和 PC 版是两套模板,改一套不会带着另一套走。
X5.0 是两套模板,不是一套加个 media query
Discuz! 的手机版不是靠 CSS 响应式把 PC 版缩小。每个套系下都有一个独立的 touch/ 目录,里面是另一整套模板文件:
template/你的标识/
├── common/
│ ├── header.php
│ └── footer.php
├── forum/
│ ├── forumdisplay.php
│ └── viewthread.php
└── touch/
├── common/
│ ├── header.php
│ └── footer.php
├── forum/
│ ├── forumdisplay.php
│ └── viewthread.php
└── ...
系统会判断当前访问来源(UA 判断加后台的站点设置),命中手机版就走 touch 目录,找不到对应文件时回退到 PC 版模板。这意味着你改 PC 模板,手机版不会变,反过来也一样——这是新手最常见的困惑,调试半天发现自己在改错的那一份。
好处也很实在:手机版的布局密度、导航方式、交互控件都可以做得更简单,不必被 PC 版的结构绑住。
PC 与手机版模板对应关系
同名对应是主线索,touch 里的文件名和 PC 版保持一致,个别页面会额外拆出简化版:
| 页面 | PC 版模板 | 手机版模板 | 备注 |
|---|---|---|---|
| 站点首页 | portal/index.php |
touch/portal/index.php |
结构差异最大,DIY 布局独立 |
| 论坛分区列表 | forum/forumdisplay.php |
touch/forum/forumdisplay.php |
主题列表项精简 |
| 帖子阅读页 | forum/viewthread.php |
touch/forum/viewthread.php |
编辑器与楼层结构不同 |
| 主题列表 | forum/forumdisplay.php(筛选态) |
touch/forum/forumdisplay.php |
— |
| 公共头部 | common/header.php |
touch/common/header.php |
返回栏、底部导航在这里 |
| 公共尾部 | common/footer.php |
touch/common/footer.php |
— |
| 登录注册 | member/login.php |
touch/member/login.php |
表单项精简 |
对不上的情况是有的:有些 PC 页面在 touch 下没有同名文件,直接复用 PC 版;也有 touch 下单独存在、PC 版没有的文件(少见)。所以别假设"一对一",改之前先 ls 一下 touch 目录。
手机版 DIY:X5 的新能力
X3 时代手机版是不能做 DIY(页面自由布局)的,X5.0 补上了这块。做法和 PC 版完全一致,在 touch 目录下的模板里加 DIY 区域:
<!--[diy=diy1]--><div id="diy1" class="area"></div><!--[/diy]-->
区域名称(这里 diy1)是 DIY 数据的键名,PC 版和手机版用不同的键名时后台要分别建两套配置。想让两端共用一套内容,就在两个目录下用同名键名,然后在后台给同一条 DIY 记录的移动端展示方式做配置。
后台 → 门户 → DIY 页面里可以分别设置每个区域在 PC 端和移动端的模块列表,这是 X5 才有的独立配置项。
响应式做法:两种路线的取舍
既然内核是双模板,CSS 层面的响应式还要不要做?取决于你的套系形态:
| 路线 | 做法 | 优点 | 代价 | 适合 |
|---|---|---|---|---|
| 双模板 + 各自 CSS | touch 目录模板配独立样式,基本不用媒体查询 |
结构最自由,性能可控 | 两套 HTML 要维护 | 结构差异大的站点 |
| 单模板 + 媒体查询 | 不做 touch 目录,一套模板配响应式 CSS |
改一处全站生效 | 手机端结构受 PC 端牵制 | 结构简单、帖子为主的站 |
| 混合 | 主结构双模板,局部组件用媒体查询 | 折中 | 需要判断哪些属于"局部" | 多数实际项目 |
如果你打算走第二条路,就得注意一个前提:touch 目录下必须能缺省。很多默认套系里 touch 是完整存在的,直接删掉会让系统回退逻辑失效,稳妥做法是保留目录但让模板极简化,或者确认你选的模板套系本来就不带 touch。
媒体查询断点可以这样起步:
/* 移动优先:先按手机写,再用 min-width 往上加 */
.dt-card { width: 100%; padding: 10px; }
@media screen and (min-width: 768px) {
.dt-card { width: 640px; padding: 16px 20px; }
}
@media screen and (min-width: 1024px) {
.dt-card { width: 720px; }
}
移动优先的好处是写出来的 CSS 在小屏上必然干净——大屏只是在小屏基础上放宽,不会出现"先写宽屏再回头修一堆溢出"的局面。Discuz! 后台很多老样式是桌面优先写的,你新写的部分用移动优先,混合起来也读得懂。
touch 目录的 touch 适配要点
手机端不只是"缩小",几件事必须单独做:
| 项目 | PC 端 | 手机版要做的事 |
|---|---|---|
| 点击目标 | 鼠标悬停即可 | 关键元素可点区域不小于 44×44 CSS 像素 |
| hover 效果 | 直接用 | 只在大屏媒体查询里启用,否则触摸后样式黏住 |
| 表单 | 左侧标签右对齐 | 标签在上、输入框撑满,字号不小于 16px 防 iOS 自动放大 |
| 图片 | 原图 | 用缩略图,别直接上原图 |
| 滚动 | 正常 | 固定定位的底部栏要留出安全区 |
touchend 相关的点击延迟在移动端浏览器上是真实存在的,底部导航这种高频点击区域值得单独处理。
五个必踩的坑
- 只改了 PC 模板,手机版没变。 先确认
touch目录下没有同名文件;没有同名文件时它复用的是 PC 版模板,那改动应该生效——如果没生效,问题多半出在手机版 CSS 覆盖了 PC 样式。 - touch 目录文件名写错。 文件名必须和 PC 版一致,写成
viewthread.htm而系统找的是别的后缀,就静默回退了。X5 的default套系默认启用.php后缀模板,你的套系里.htm和.php混着放时尤其容易漏。 - 改了忘了更新缓存。
touch目录同样走编译缓存,改完必须去后台更新缓存。 - DIY 区域在手机端空白。 键名和 PC 版混用了,或者后台没勾选该区域的移动端模块列表。
- PC 端样式泄漏到手机端。
extend_common.css里的规则对两端都生效,宽度写死的地方(width:1200px)会把手机版撑出横向滚动。修的顺序是先修extend_common.css里写死的宽度,再去看touch里的局部覆盖。
验证方法很简单:把浏览器窗口拉窄到手机宽度看 PC 版有没有横向滚动条,再直接用手机访问同一个 URL 看 touch 版效果。两条路都走一遍,能省掉后面很多猜测。
