实现 DedeCMS 模板自适应主要有两种核心方法:

- CSS 媒体查询:这是最主流、最推荐的方法,通过 CSS 样式来控制不同屏幕尺寸下的元素显示。
- DedeCMS 条件判断标签:通过 PHP 代码判断用户设备,然后加载不同的模板文件或内容,这种方法更底层,通常作为 CSS 方法的补充。
下面我将详细分解这两种方法,并提供一个完整的实践步骤。
使用 CSS 媒体查询(推荐)
这是实现自适应设计的标准做法,核心思想是:一套 HTML 结构,多套 CSS 样式,HTML 代码保持不变,通过 CSS 的 @media 规则为不同屏幕尺寸定义不同的样式规则。
步骤 1:设置视口
在模板的 <head> 标签内,必须加入 viewport meta 标签,这是告诉浏览器如何控制页面尺寸和缩放的关键。
<meta name="viewport" content="width=device-width, initial-scale=1.0">
width=device-width:设置页面宽度为设备屏幕的宽度。initial-scale=1.0:设置初始缩放比例为 1.0。
步骤 2:使用流式布局
在 CSS 中,避免使用固定的像素值(如 width: 980px;),而是使用相对单位,如百分比()、em、rem 或 vw/vh。

示例:
/* 默认样式(针对桌面端) */
.container {
width: 100%; /* 容器宽度为父元素的100% */
max-width: 1200px; /* 最大宽度,避免在大屏幕上过宽 */
margin: 0 auto; /* 居中 */
padding: 0 15px; /* 左右内边距 */
}
.content {
float: left;
width: 70%; /* 内容区域占70% */
}
.sidebar {
float: right;
width: 28%; /* 侧边栏占28%,留出2%的间隙 */
}
步骤 3:编写媒体查询
媒体查询是响应式设计的核心,它允许你针对特定的屏幕范围应用特定的 CSS 样式,通常我们以 移动优先 的思路来写,即先写小屏幕的样式,然后通过媒体查询逐步增强大屏幕的样式。
示例:
/* 1. 默认样式:移动端(小屏幕) */
/* 这部分 CSS 会作用于所有屏幕尺寸 */
.container, .content, .sidebar {
width: 100%; /* 默认所有元素都是全宽 */
float: none; /* 默认不浮动 */
box-sizing: border-box; /* 盒模型计算,让 padding 不会撑开元素 */
}
/* 2. 平板设备 (min-width: 768px) */
@media (min-width: 768px) {
.container {
max-width: 750px;
}
.content {
width: 65%;
float: left;
}
.sidebar {
width: 33%;
float: right;
}
}
/* 3. 桌面设备 (min-width: 992px) */
@media (min-width: 992px) {
.container {
max-width: 1200px;
}
.content {
width: 70%;
}
.sidebar {
width: 28%;
}
}
说明:

@media (min-width: 768px):表示当浏览器窗口宽度大于或等于 768px 时,应用这些样式。box-sizing: border-box;是一个非常好的实践,它告诉浏览器元素的width和height属性应该包含padding和border,这样设置padding就不会导致元素总宽度超出 100%。
步骤 4:处理图片和媒体
为了让图片和视频也能自适应,需要给它们设置 max-width: 100%;。
img, video {
max-width: 100%;
height: auto; /* 保持宽高比 */
}
步骤 5:处理导航栏
桌面端的水平导航栏在手机上会变得非常拥挤,通常需要将其转换为一个“汉堡包”菜单。
HTML 结构:
<nav>
<div class="menu-toggle">☰</div> <!-- 汉堡包图标 -->
<ul class="main-menu">
<li><a href="#">首页</a></li>
<li><a href="#">关于我们</a></li>
<li><a href="#">产品</a></li>
<li><a href="#">联系我们</a></li>
</ul>
</nav>
CSS 样式:
/* 默认隐藏菜单,只显示汉堡包 */
.main-menu {
display: none; /* 初始隐藏 */
}
.menu-toggle {
display: block; /* 显示汉堡包 */
cursor: pointer;
}
/* 在平板或桌面端,显示菜单,隐藏汉堡包 */
@media (min-width: 768px) {
.menu-toggle {
display: none;
}
.main-menu {
display: block; /* 恢复显示 */
list-style: none;
padding: 0;
}
.main-menu li {
display: inline-block; /* 横向排列 */
}
}
/* 点击汉堡包后显示菜单的交互效果(通常用 JS 实现) */
.main-menu.active {
display: block;
}
使用 DedeCMS 条件判断标签
这种方法的核心是 服务器端判断,PHP 代码在服务器上运行,判断用户的 User-Agent(用户代理)字符串,从而判断是手机还是电脑,然后加载不同的模板文件。
适用场景:
- 需要为移动端和桌面端提供 完全不同 的内容结构。
- 需要针对不同设备加载不同的图片(桌面端加载大图,移动端加载小图以节省流量)。
- 作为 CSS 方法的补充,当 CSS 无法满足复杂布局需求时。
实现步骤:
-
创建模板文件:
- 在
templets/你的模板文件夹/目录下,创建两个模板文件:index_pc.htm:桌面版首页模板。index_mobile.htm:移动版首页模板。
- 在
-
修改首页模板入口文件:
- 打开
templets/你的模板文件夹/index.htm(这个文件通常是主模板入口)。 - 使用 DedeCMS 的
dede:global name='cfg_mobileurl'/标签和条件判断来动态选择加载哪个模板。
示例代码 (
index.htm):{dede:global name='cfg_mobileurl'/} <head> <meta charset="utf-8"> <!-- 根据加载的模板,动态设置 viewport --> {dede:global.name='is_mobile' runphp='yes'} if(@me == 1) { @me = '<meta name="viewport" content="width=device-width, initial-scale=1.0">'; } else { @me = ''; } {/dede:global.name} <title>{dede:global.cfg_webname/}</title> <!-- 加载公共 CSS/JS --> <link rel="stylesheet" href="/static/css/common.css"> </head> <body> <!-- 这里是一个动态加载区域 --> {dede:include filename="~templets/你的模板文件夹/~autoindex.htm"/} </body> </html> - 打开
-
创建自动选择模板的文件 (
~autoindex.htm):- 在
templets/你的模板文件夹/下创建一个名为~autoindex.htm的文件(注意前面的 ,这只是一个约定,防止直接访问)。 - 在这个文件里,使用 PHP 代码进行判断。
示例代码 (
~autoindex.htm):<?php // 获取 User-Agent $user_agent = $_SERVER['HTTP_USER_AGENT']; // 定义移动设备的关键词列表 $mobile_agents = array( 'android', 'iphone', 'ipod', 'ipad', 'mobile', 'blackberry', 'webos', 'windows phone' ); // 初始化是否为移动设备的标志 $is_mobile = false; // 检查 User-Agent 中是否包含移动设备关键词 foreach ($mobile_agents as $device) { if (stripos($user_agent, $device) !== false) { $is_mobile = true; break; } } // 将标志存入全局变量,供 index.htm 使用 $GLOBALS['is_mobile'] = $is_mobile; // 根据标志选择加载的模板文件 if ($is_mobile) { // 加载移动端模板 include 'index_mobile.htm'; } else { // 加载桌面端模板 include 'index_pc.htm'; } ?> - 在
-
在后台设置移动域名:
- 登录 DedeCMS 后台,进入“系统” -> “系统基本参数” -> “核心设置”。
- 找到 “移动网站访问域名” 选项,填写你的移动端域名(
m.yourdomain.com)。 - 这样,当用户通过
m.yourdomain.com访问时,系统会自动导向移动端模板。
总结与最佳实践
| 特性 | CSS 媒体查询 | DedeCMS 条件判断 |
|---|---|---|
| 原理 | 客户端(浏览器)通过 CSS 调整布局 | 服务器端(PHP)判断并加载不同模板 |
| 维护性 | 高,只需维护一套 HTML 和多套 CSS。 | 低,需要维护两套或多套完整的模板文件。 |
| 加载速度 | 快,只需加载一个 HTML 文件,由浏览器处理。 | 稍慢,需要服务器判断,可能加载更大的文件。 |
| SEO | 好,URL 不变,内容也一致,对搜索引擎友好。 | 有风险,如果移动端和桌面端内容差异过大,可能被搜索引擎视为重复内容,需要配置 canonical
|
| 适用场景 | 绝大多数情况,是现代 Web 开发的标准。 | 特殊需求,如内容差异巨大、需要极致优化的移动端体验。 |
推荐的综合方案(最佳实践):
-
以 CSS 媒体查询为主:构建一套响应式的模板,通过 CSS 来处理布局、导航、图片等元素的适配,这是最灵活、最现代且维护成本最低的方式。
-
以 DedeCMS 条件判断为辅:在以下特定情况下使用:
- 图片优化:在移动端模板中,使用
{dede:field name='litpic' function='str_replace("/uploads/", "/uploads/mobile/", @me)'/}这样的方式,调用移动端专用的小尺寸图片,减少移动端流量消耗。 - 复杂模块:如果某个模块在手机端和桌面端的逻辑和结构完全不同,可以考虑为移动端单独写一个模块模板,然后用 PHP 条件判断
{dede:php}...{/dede:php}来引入。
- 图片优化:在移动端模板中,使用
对于绝大多数 DedeCMS 熟练掌握并运用 CSS 媒体查询,已经足够构建一个优秀的自适应网站,只有在遇到 CSS 无法解决的复杂问题时,才考虑引入服务器端模板切换的方案。
