jQuery Mobile 列表视图(Listview)详解
列表视图(Listview) 是 jQuery Mobile 的 核心组件,用于展示 导航、联系人、设置、搜索结果 等,支持 图标、分隔线、计数器、缩略图、过滤、自动分隔 等强大功能,触控优化,响应式。
是 jQM 中 使用频率最高 的组件之一!
1. 基本结构
<ul data-role="listview">
<li><a href="#">列表项 1</a></li>
<li><a href="#">列表项 2</a></li>
<li><a href="#">列表项 3</a></li>
</ul>
必须:
<ul>或<ol>data-role="listview"
2. 常用属性
| 属性 | 值 | 说明 |
|---|---|---|
data-inset="true" | true/false | 圆角内嵌(推荐) |
data-filter="true" | true | 搜索框过滤 |
data-filter-placeholder="搜索..." | 文字 | 搜索框提示 |
data-divider-theme="a" | a/b | 分隔线主题 |
data-autodividers="true" | true | 自动按首字母分组 |
data-count-theme="b" | a/b | 计数器主题 |
3. 列表类型一览
| 类型 | 写法 | 场景 |
|---|---|---|
| 基础链接列表 | <li><a href="#"> | 导航 |
| 不可点击项 | <li><h3>标题</h3></li> | 信息展示 |
| 带图标 | ui-icon-home | 菜单 |
| 带缩略图 | <img src=""> | 联系人 |
| 带计数器 | <span class="ui-li-count">5</span> | 未读消息 |
| 分隔线 | data-role="list-divider" | 分组 |
| 嵌套列表 | <ul> 内再套 <ul> | 树形菜单 |
4. 完整示例(可直接运行)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>jQM 列表视图大全</title>
<link rel="stylesheet" href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css">
<script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
<script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
</head>
<body>
<div data-role="page">
<div data-role="header" data-position="fixed">
<h1>列表视图</h1>
</div>
<div data-role="main" class="ui-content">
<!-- 1. 基础内嵌列表 + 搜索 -->
<h3>联系人(带搜索)</h3>
<ul data-role="listview" data-inset="true" data-filter="true" data-filter-placeholder="搜索联系人...">
<li><a href="#" class="ui-btn ui-icon-user ui-btn-icon-left">张三</a></li>
<li><a href="#" class="ui-btn ui-icon-user ui-btn-icon-left">李四</a></li>
<li><a href="#" class="ui-btn ui-icon-user ui-btn-icon-left">王五</a></li>
<li><a href="#" class="ui-btn ui-icon-user ui-btn-icon-left">赵六</a></li>
</ul>
<!-- 2. 带缩略图 + 描述 -->
<h3>应用列表</h3>
<ul data-role="listview" data-inset="true">
<li>
<a href="#">
<img src="https://picsum.photos/80/80?random=1" class="ui-li-thumb">
<h2>微信</h2>
<p>社交应用,连接你我</p>
<span class="ui-li-count">99+</span>
</a>
</li>
<li>
<a href="#">
<img src="https://picsum.photos/80/80?random=2" class="ui-li-thumb">
<h2>支付宝</h2>
<p>安全支付,生活更便捷</p>
<span class="ui-li-count">3</span>
</a>
</li>
</ul>
<!-- 3. 自动分组(autodividers) -->
<h3>城市列表(自动分组)</h3>
<ul data-role="listview" data-inset="true" data-autodividers="true">
<li><a href="#">Amsterdam</a></li>
<li><a href="#">Beijing</a></li>
<li><a href="#">Brussels</a></li>
<li><a href="#">Cairo</a></li>
<li><a href="#">Copenhagen</a></li>
</ul>
<!-- 4. 手动分隔线 + 计数器 -->
<h3>消息中心</h3>
<ul data-role="listview" data-inset="true" data-divider-theme="a">
<li data-role="list-divider">今天</li>
<li>
<a href="#">
<h2>系统通知</h2>
<p>您的账户已登录新设备</p>
<span class="ui-li-count">1</span>
</a>
</li>
<li data-role="list-divider">昨天</li>
<li>
<a href="#">
<h2>订单更新</h2>
<p>您的包裹已发出</p>
<span class="ui-li-count">2</span>
</a>
</li>
</ul>
<!-- 5. 嵌套列表(树形菜单) -->
<h3>设置</h3>
<ul data-role="listview" data-inset="true">
<li>
<a href="#">
<h2>账户与安全</h2>
<p>密码、隐私、登录设备</p>
</a>
</li>
<li>
<a href="#submenu" data-transition="slide">
<h2>更多设置</h2>
<p>语言、主题、关于</p>
</a>
<ul id="submenu" data-role="listview">
<li><a href="#">语言</a></li>
<li><a href="#">夜间模式</a></li>
<li><a href="#">版本:v1.0.0</a></li>
</ul>
</li>
</ul>
<!-- 6. 当前信息 -->
<h3>用户信息</h3>
<ul data-role="listview" data-inset="true">
<li data-role="list-divider">个人资料</li>
<li>
<h2>国家</h2>
<p>比利时 (BE)</p>
</li>
<li>
<h2>当前时间</h2>
<p>2025年11月17日 03:05(CET)</p>
</li>
</ul>
</div>
<div data-role="footer" data-position="fixed">
<h4>比利时 © 2025</h4>
</div>
</div>
</body>
</html>
5. 列表项结构详解
<li>
<a href="#">
<img src="avatar.jpg" class="ui-li-thumb"> <!-- 缩略图 -->
<h2>主标题</h2> <!-- 大字 -->
<p>副标题描述文字</p> <!-- 小字 -->
<span class="ui-li-count">99</span> <!-- 计数器 -->
</a>
</li>
6. JavaScript 控制
<script>
$(document).on("pagecreate", function() {
// 刷新列表(动态添加后)
$("#myList").listview("refresh");
// 过滤
$("#myList").listview("option", "filter", true);
// 添加项
$("#myList").append('<li><a href="#">新项</a></li>').listview("refresh");
});
</script>
7. 最佳实践
| 建议 | 说明 |
|---|---|
始终加 data-inset="true" | 美观圆角 |
带搜索加 data-filter="true" | 用户体验佳 |
分组用 data-role="list-divider" | 清晰 |
未读用 ui-li-count | 醒目 |
| 避免放太多图片 | 影响加载速度 |
8. 常见问题
| 问题 | 解决方案 |
|---|---|
| 搜索框不显示 | 必须 data-filter="true" |
| 动态添加不显示 | 调用 .listview("refresh") |
| 自动分组不工作 | 必须 data-autodividers="true" |
| 图标错位 | 确保 ui-btn-icon-left |
9. 推荐模板
<!-- 带搜索 + 内嵌 -->
<ul data-role="listview" data-inset="true" data-filter="true">
<li><a href="#">项</a></li>
</ul>
<!-- 带缩略图 + 计数 -->
<li>
<a href="#">
<img src="img.jpg" class="ui-li-thumb">
<h2>标题</h2>
<p>描述</p>
<span class="ui-li-count">5</span>
</a>
</li>
总结:属性速查
| 属性 | 常用值 |
|---|---|
data-role | listview |
data-inset | true(圆角) |
data-filter | true(搜索) |
data-autodividers | true(自动分组) |
data-count-theme | b(计数器深色) |
需要我为你生成:
- 动态 AJAX 加载联系人列表?
- 无限滚动列表?
- 可多选 + 删除功能?
随时告诉我!