Menu

  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay
  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • Algorithm
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay

Framework7学习笔记(二):组件

21
Jan
2016

Framework7学习笔记(二):组件

By Alex
/ in HTML,JavaScript,Mobile
/ tags F7, 学习笔记
1 Comment
导航栏和工具栏

为F7应用添加导航栏和工具栏之前,需要决定使用何种导航/工具栏布局。F7支持三种导航/工具栏布局。

导航/工具栏的布局类型
“静态”布局

这是最少使用的一种布局,使用该布局时,导航/工具栏随着页面滚动,它们仅仅是页面的一部分,每个页面拥有自己的导航/工具栏:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!-- 这是一个页面 -->
<div data-page="index" class="page">
    <div class="page-content">
        <!-- 顶部导航栏开始 -->
        <div class="navbar">
            <div class="navbar-inner">
                <div class="center">Awesome App</div>
            </div>
        </div>
        <!-- 导航栏结束-->
        <p>页面主体内容</p>
        <!-- 底部工具栏开始 -->
        <div class="toolbar">
            <div class="toolbar-inner">Hello</div>
        </div>
        <!-- 底部工具栏结束-->
    </div>
</div>
“固定”布局

与静态布局类似,每个页面拥有自己的导航/工具栏,但是导航/工具栏不随页面滚动,它们分别固定在顶部/底部,始终可见。启用固定布局很简单,只需要在页面元素上添加样式类:

XHTML
1
<div data-page="index" class="page navbar-fixed toolbar-fixed">
“贯穿”布局

这是最常使用的一种方式,一个视图中的所有页面共享导航/工具栏。该布局支持动态导航栏(Dynamic Navbar):

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
<div class="view view-main">
    <!-- 视图唯一的导航栏 -->
    <div class="navbar"><div class="navbar-inner"></div></div>
    <!-- 导航栏结束-->
    <!-- 页面容器(pages)元素需要额外的"navbar-through"、"toolbar-through"样式类,分别表示启用贯穿导航栏、工具栏 -->
    <div class="pages navbar-through toolbar-through">
        <!-- 页面 -->
        <div data-page="index" class="page"><div class="page-content"></div></div>
    </div>
    <!-- 视图唯一的工具栏 -->
    <div class="toolbar"></div>
    <!--工具栏结束-->
</div>
混合布局

F7支持在一个视图内混合使用多种布局方式。例如你可以使用贯穿的导航栏 + 固定的工具栏:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
<div class="view view-main">
    <!-- 视图唯一的贯穿导航栏 -->
    <div class="navbar"><div class="navbar-inner"><div class="center"></div></div></div>
    <!-- 为所有页面声明:使用贯穿导航栏、固定工具栏 -->
    <div class="pages navbar-through toolbar-fixed">
        <!-- 一个页面定义  -->
        <div data-page="index" class="page">
            <div class="page-content"></div>
            <!-- 固定工具栏,因此每个页面都需要定义自己的 -->
            <div class="toolbar"><div class="toolbar-inner">Hello</div></div>
        </div>
    </div>
</div>
不使用导航/工具栏

你也可以不使用导航栏和(或)工具栏,只要不声明它们、同时不在page/pages/view元素上添加冲突的样式类:navbar-fixed、navbar-through、toolbar-fixed、 toolbar-through即可。

导航栏

所谓导航栏,是位于屏幕顶部的,包含页面标题、导航元素的一个区域。导航栏分为三个部分(左、中、右),这三个部分都可以包含任意HTML,但是F7建议这样使用导航栏: 

  1. 左侧部分:用于放置返回链接,可以是图标或者文本
  2. 中间部分:显示页面标题
  3. 右侧部分:类似于左侧,放置按钮或链接
导航栏内部布局

导航栏内部的结构很简单且自描述:

XHTML
1
2
3
4
5
6
7
8
9
<div class="navbar">
    <div class="navbar-inner">
        <div class="left">Left</div>
        <!-- 注意,center具有最低的宽度优先级,当空间不够时,center的内容自动被省略,确保左右正常显示 -->
        <!-- 如果center中存放文本,无法显示的内容使用省略号代替,如果放置了自定义元素,则需要小心处理 -->
        <div class="center">Center</div>
        <div class="right">Right</div>
    </div>
</div>
导航栏与链接

可以在导航栏中添加多种链接:

链接类型 说明与示例
文本链接
XHTML
1
2
3
4
5
6
7
8
<div class="navbar">
    <div class="navbar-inner">
        <!-- 要在左右侧添加链接,仅需要为a元素添加link类 -->
        <div class="left"><a href="#" class="link">左侧文本链接</a></div>
        <div class="center">Center</div>
        <div class="right"><a href="#" class="link">右侧文本链接</a></div>
    </div>
</div>  
多个链接
XHTML
1
2
3
4
5
<!-- 每个区域都可以包含多个链接 -->
<div class="left">
    <a href="#" class="link">左侧文本链接1</a>
    <a href="#" class="link">左侧文本链接2</a>
</div>
图标+文本链接
XHTML
1
2
3
4
5
6
7
8
<div class="left">
    <a href="#" class="link">
        <!-- 用样式类icon标注图标,该样式类定义了背景图片 -->
        <i class="icon icon-back"></i>
        <!-- 使用图标+文本链接时,必须把文本包装在span元素内 -->
        <span>Back</span>
    </a>
</div>
图标链接
XHTML
1
2
3
4
5
6
<div class="left">
    <!-- 对于只有图标的链接,需要添加icon-only类,该类确保链接占据44x44像素 -->
    <a href="#" class="link icon-only">
        <i class="icon icon-back"></i>
    </a>
</div>
与导航栏相关的方法

对于已初始化的视图,我们可以用JavaScript API操控其导航栏:

方法 说明
app.hideNavbar(navbar) 隐藏或显示指定的导航栏。navbar为代表目标导航栏的HTMLElement或者CSS选择器(字符串)
app.showNavbar(navbar)
view.hideNavbar() 隐藏或显示视图view的导航栏。示例:
JavaScript
1
2
3
4
5
6
7
8
9
var app = new Framework7();
var $ = Framework7.$;
var mainView = app.addView('.view-main');
$('.hide-navbar').on('click', function () {
    mainView.hideNavbar();
});
$('.show-navbar').on('click', function () {
    mainView.showNavbar();
});
view.showNavbar()
view.sizeNavbars(viewContainer) 仅iOS主题。重新计算导航栏的位置。示例: app.sizeNavbars('.view-main') 
自动隐藏导航栏

使用贯穿布局时,F7允许对某些Ajax页面自动隐藏/显示导航栏:

XHTML
1
2
3
4
5
6
<!-- 为此页面声明一个空白导航栏 -->
<div class="navbar"><div class="navbar-inner"></div></div>
<!-- 同时为页面添加"no-navbar"样式类 -->
<div data-page="about" class="page no-navbar">
    <div class="page-content"></div>
</div>
动态导航栏

注意动态导航栏仅适用于iOS主题 + 贯穿布局。所谓动态导航栏,在页面切换时,其内容具有滑动和淡入淡出效果。

动态导航栏布局

动态导航栏的内部布局和普通导航栏没太大区别,只是你可以为导航栏的左中右三个部分添加额外的样式类。默认的,F7为这三个部分添加淡入淡出效果,如果要启用滑动效果,你可以添加样式类:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- 每个页面可以指定自己的动态导航栏,默认具有淡入淡出切换效果 -->
<!-- 动态导航栏声明在页面外部(从其它html加载为页面、或者创建动态页面时) -->
<div class="navbar">
    <div class="navbar-inner">
        <div class="left">
            <a href="#" class="link">Left</a>
        </div>
        <!-- 为中间部分添加滑动效果,注意整个应用的风格应当统一 -->
        <div class="center sliding">Home</div>
        <div class="right">
            <a href="#" class="link">Right</a>
        </div>
    </div>
</div>
<div class="page" data-page="about">页面内容</div>
给Back Icon添加动画

设置应用初始化参数 animateNavBackIcon: true 可以为后退按钮添加更多的动画效果,从而更像iOS 7的风格。

动态导航栏事件

F7为动态导航栏添加了几种事件,这些事件的源(Target) 都是 <div class="navbar-inner"> :

事件 说明
navbarBeforeInit 插入一个新的导航栏到DOM时,触发该事件
navbarInit 初始化一个导航栏后,触发该事件
navbarReinit 当缓存的导航栏变得再次可见时,触发该事件
navbarBeforeRemove 当导航栏即将从DOM中移除时,触发该事件

下面的代码演示了该事件的使用:

JavaScript
1
2
3
4
5
6
7
$$(document).on('navbarInit', function (e) {
    var navbar = e.detail.navbar;
    // 可以访问导航栏对象的以下属性:
    // navbarContainer 链接到导航栏容器元素
    // navbarInnerContainer 链接到导航栏内部容器元素
    var page = e.detail.page
});
子导航栏(Sub Navbar) 

当你需要在导航栏添加额外的元素时,可以使用子导航栏。当导航栏隐藏时,子导航栏仍然保持可见。 

在线演示:http://framework7.taobao.org/docs-demos/subnavbar.html

子导航栏布局
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div class="navbar-inner">
    <div class="left"></div>
    <div class="center"></div>
    <div class="right"></div>
    <!-- 子导航栏 -->
    <div class="subnavbar">
        <!-- 子导航栏内容,这里存放了三个按钮    -->
        <div class="buttons-row">
            <a href="#tab1" class="button active">Tab 1</a>
            <a href="#tab2" class="button">Tab 2</a>
            <a href="#tab3" class="button">Tab 3</a>
        </div>
    </div>
</div>  
工具栏

工具栏是屏幕上的一个固定区域,可以包含导航元素。不像导航栏,工具栏不包含任何部分,内部可以直接是若干链接。

工具栏布局
XHTML
1
2
3
4
5
6
7
<div class="toolbar">
    <div class="toolbar-inner">
        <a href="#" class="link">Link 1</a>
        <a href="#" class="link">Link 2</a>
        <a href="#" class="link">Link 3</a>
    </div>
</div>

默认的,工具栏内的元素均匀的分布在工具栏中。 

与工具栏相关的方法

以下方法可用于操控已初始化视图中的工具栏:

方法 说明
app.hideToolbar(toolbar) 隐藏或者显示指定的工具栏。
toolbar:目标工具栏对应的HTMLElement或者String(CSS选择器)
app.showToolbar(toolbar)
view.hideToolbar() 隐藏或者显示当前视图的工具栏
view.showToolbar()
自动隐藏工具栏

如果某个Ajax页面不需要显示工具栏,可以在页面上添加样式类:

XHTML
1
2
<!-- no-toolbar表示为该页面隐藏工具栏 -->
<div data-page="about" class="page no-toolbar">
底部工具栏

仅用于Material主题,对于iOS主题工具栏默认就在底部。

Material主题常常把工具栏/页签栏置于屏幕上面,导航栏下面。如果要改变此行为,可以为工具栏添加额外的样式类:

XHTML
1
2
3
4
<!--  toolbar-bottom导致Material主题的工具栏放置于屏幕底部 -->
<div class="toolbar toolbar-bottom">
    <div class="toolbar-inner"></div>
</div>
页签栏

页签栏只是工具栏的特例,它包含图标(或者图标+文本),而不仅仅是文本。 

页签栏布局

与工具栏类似,只是多一个样式类声明:

XHTML
1
2
3
4
5
6
7
8
9
10
11
<!-- 比工具栏多一个tabbar的样式类 -->
<div class="toolbar tabbar">
    <div class="toolbar-inner">
        <a href="#tab1" class="tab-link active">
            <i class="icon demo-icon-1"></i>
        </a>
        <a href="#tab2" class="tab-link">
            <i class="icon demo-icon-2"></i>
        </a>
    </div>
</div>

默认的,页签栏内的元素(链接)均匀的分布在页签栏中。但是要注意以下两点:

  1. 在iPhone中,每个元素的大小一致,为屏幕宽度/元素个数
  2. 在iPad中,所有元素的被居中显示,元素最小宽度105px
为图标添加角标
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<div class="toolbar tabbar">
    <div class="toolbar-inner">
        <a href="#tab2" class="tab-link">
            <i class="icon demo-icon-2">
                <!-- 只需要图标元素内放置一个span元素,并添加badge样式,即可增加角标 -->
                <span class="badge bg-red">5</span><!-- 红色背景角标,数字5 -->
            </i>
        </a>
        <a href="#tab4" class="tab-link">
            <i class="icon demo-icon-4">
                <span class="badge bg-green">15</span><!-- 绿色背景角标,数字15 -->
            </i>
        </a>
    </div>
</div>
图标+文本标签

类似的,为图标添加一个兄弟元素,可以显示文本标签:

XHTML
1
2
3
4
5
<a href="#tab1" class="tab-link active">
    <i class="icon demo-icon-1"></i>
    <!-- 文本标签,默认位于图标下方 -->
    <span class="tabbar-label">Label 1</span>
</a>
可滚动页签栏

当页签栏中的元素非常多,屏幕宽度不足以显示时,应该使用可滚动页签栏,当手指划过页签栏时,会自动滚动以显示不可见元素:

XHTML
1
2
<!-- 只需要添加tabbar-scrollable样式类即可 -->
<div class="toolbar tabbar tabbar-scrollable"></div>
与页签栏相关的方法
方法 说明
app.hideToolbar(toolbar) 这两个方法同样适用于页签栏
app.showToolbar(toolbar)
自动隐藏页签栏

如果某个Ajax页面不需要显示页签栏,可以在页面上添加样式类:

XHTML
1
2
<!-- no-tabbar表示为该页面隐藏页签栏 -->
<div data-page="about" class="page no-tabbar">
滚动时隐藏导航/工具栏 

F7支持当页面向下滚动时,自动隐藏导航/工具栏。

要全局性的启用该功能,可以配置以下应用初始化参数:

  1. hideNavbarOnPageScroll:滚动时隐藏导航栏
  2. hideToolbarOnPageScroll:滚动时隐藏工具栏
  3. hideTabbarOnPageScroll:滚动时隐藏页签栏
  4. showBarsOnPageScrollEnd :滚动到页面底部时显示所有栏

要针对某些特定页面启用该功能,可以在 <div class="page-content"> 元素上添加以下样式类:

  1. hide-bars-on-scroll
  2.  hide-navbar-on-scroll 
  3. hide-toolbar-on-scroll 
  4. hide-tabbar-on-scroll 

在全局启用时,可以使用下面的样式类,针对特定页面禁用此功能:

  1. keep-bars-on-scroll
  2. keep-navbar-on-scroll
  3. keep-toolbar-on-scroll
  4. keep-tabbar-on-scroll 
搜索栏

搜索栏可以对列表视图(List View)执行搜索,或者作为自定义搜索实现的视觉元素。

在线演示:http://framework7.taobao.org/docs-demos/searchbar.html

搜索栏布局

搜索栏应该放置在 .page 和 .page-content 元素之间:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!-- 页面 -->
<div class="page">
    <!-- 搜索栏 -->
    <form class="searchbar"><!-- 搜索栏容器元素,推荐使用form -->
        <div class="searchbar-input">
            <input type="search" placeholder="Search"><!-- 搜索栏 -->
            <a href="#" class="searchbar-clear"></a><!-- 可选元素,用于清空输入值的按钮,可选 -->
        </div>
        <a href="#" class="searchbar-cancel">Cancel</a><!-- 取消搜索,隐藏搜索栏,清空结果过滤,可选 -->
    </form>
    <!-- 搜索栏overlay,深色的、覆盖在页面内容上面的一层内容,可选 -->
    <div class="searchbar-overlay"></div>
    
    <!-- 页面内容部分 -->
    <div class="page-content">
        <!-- searchbar-not-found:如果找不到匹配的元素,显示此div -->
        <div class="content-block searchbar-not-found">Nothing found</div>
        <!-- list-block-search:被搜索的列表块 -->
        <!-- searchbar-found:如果找到匹配的元素,显示此div -->
        <div class="list-block list-block-search searchbar-found"></div>
    </div>
</div>
通过JS初始化搜索栏

除了搜索栏布局,我们还需要调用API初始化它:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* 初始化一个搜索栏
* @param searchbarContainer 搜索栏容器元素,HTMLElement或者CSS选择器
* @param parameters 搜索栏初始化参数
* @return 已初始化的搜索栏实例
*/
app.searchbar(searchbarContainer, parameters);
 
//示例:
var mySearchbar = app.searchbar( '.searchbar', {
    searchList : '.list-block-search',
    searchIn : '.item-title'
} );
通过HTML初始化搜索栏

你也可以通过HTML初始化搜索栏:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<div class="page">
    <!-- 为搜索栏添加searchbar-ini属性,则F7自动初始化之 -->
    <!-- data-*属性提供初始化参数,连字符小写风格 -->
    <form class="searchbar searchbar-init"
        data-search-list=".list-block-search"
        data-search-in=".item-title"
        data-found=".searchbar-found"
        data-not-found=".searchbar-not-found">
        <div class="searchbar-input">
            <input type="search" placeholder="Search">
            <a href="#" class="searchbar-clear"></a>
        </div>
        <a href="#" class="searchbar-cancel">Cancel</a>
    </form>
    <div class="searchbar-overlay"></div>
    <div class="page-content">
        <div class="content-block searchbar-not-found"></div>
        <div class="list-block list-block-search searchbar-found"></div>
    </div>
</div>

通过下面的方式可以获得DOM关联的搜索栏实例:

JavaScript
1
2
var searchbar = $$('.searchbar')[0].f7Searchbar; //通过该属性访问
searchbar.search('Hello world');
搜索栏初始化参数
参数 类型和默认值 说明
searchList string / HTMLElement 被搜索的列表块(list block),HTMLElement或者CSS选择器
searchIn string = '.item-title' CSS选择器,指定列表视图元素的字段,搜索在该字段上进行,通常我们通过元素的标题搜索(.item-title)
found string / HTMLElement 搜索结果可用时显示的元素的CSS选择器或者DOM,如果不指定,默认使用页面内的.searchbar-found元素
notFound string / HTMLElement 类似上面,搜索结果不可用时显示的元素,默认使用页面内的.searchbar-not-found元素
overlay string / HTMLElement 搜索栏overlay元素,默认使用页面内的.searchbar-overlay元素
ignore string = '.searchbar-ignore' CSS选择器,哪些元素被搜索栏忽略,总是显示在搜索结果中
customSearch boolean = false 如果设置为true,则搜索栏不去搜索searchList指定的列表块。你可以定制自己的搜索逻辑,并手工处理数据展示
hideDividers boolean = true 如果列表分隔器没有匹配的条目,则隐藏分隔器
hideGroups boolean = true 如果组内没有匹配的条目,则隐藏组标题
onSearch function (s) 搜索时(输入值改变)触发此回调
onEnable function (s) 当搜索栏被启用时,触发此回调
onDisable function (s) 当搜索栏被禁用(例如点击取消按钮、或者触碰searchbar-overlay元素)时,触发此回调
onClear function (s) 当用户点击了搜索栏的clear元素时触发此回调
搜索栏方法、属性与事件
方法/属性/事件 说明
params 搜索栏的所有初始化参数
query 当前搜索条件,即输入框的内容
searchList 搜索列表块对应的DOM元素
container 搜索栏容器DOM元素
input 搜索输入框DOM元素
active boolean,当前搜索框是否处于激活状态
search(query) 依据入参条件执行搜索
enable() 启用搜索栏
disable() 禁用搜索栏
clear() 清空查询条件并更新搜素结果
destroy() 销毁该搜索栏实例
⚡search 这些事件的target都是搜索栏关联的 <div class="list-block"> 元素。分别在以下时机触发:
  1. 搜索框的值改变时
  2. 点击搜索栏的clear元素,清空搜索框时
  3. 搜索栏被激活时
  4. 搜索栏去激活时
⚡clearSearch
⚡enableSearch
⚡disableSearch
状态栏

 状态栏是指设备屏幕顶端的一个窄条,包含信标、电量、时间等信息。F7框架中和状态栏相关的主题是状态栏overlay。

状态栏overlay

iOS7+系统允许你创建全屏应用程序,但是状态栏可能覆盖应用程序的内容。F7能够处理该问题,当应用程序处于全屏状态时,F7会自动检测到并添加 with-statusbar-overlay 样式类到 <html> 元素上,当应用程序退出全屏时,则去掉该样式类。

该样式类自动在应用程序顶端添加20像素的补白,从而防止状态栏覆盖掉用程序内容。

改变状态栏背景色

你可以控制全屏应用状态栏的背景色:

XHTML
1
2
3
4
5
6
7
8
9
<style>
    /*修改状态栏背景色*/
    .statusbar-overlay {
        background: pink;
    }
</style>
<body>
  <div class="statusbar-overlay"></div>
</div>

.statusbar-overlay 这个div总是固定在屏幕顶部,默认隐藏。当应用程序进入全屏状态、且 <html> 元素上具有 with-statusbar-overlay 样式时自动显示。

注意:

  1. Home界面中的Web应用,其状态栏总是白色,无法改变
  2. Apache Cordova 应用的状态栏默认总是黑色,F7无法修改。你可以使用Cordova插件 cordova-plugin-statusbar 来定制状态栏颜色
侧边栏

侧边栏是从左侧或者右侧滑动进入屏幕,并且覆盖在页面主体内容上方的组件。

侧边栏布局
XHTML
1
2
3
4
5
6
7
8
<body>
    <!-- 需要增加此元素,以便侧面板能够覆盖在应用主体内容上方(z-index) -->
    <div class="panel-overlay"></div>
    <!-- 左侧面板,打开时特效:移动应用主体内容 -->
    <div class="panel panel-left panel-reveal"></div>
    <!-- 右侧面板,打开时特效:覆盖应用主体内容  -->
    <div class="panel panel-right panel-cover"></div>
</body>
打开/关闭面板
通过HTML
XHTML
1
2
3
4
5
6
7
8
9
10
11
<body>
    <div class="panel-overlay"></div>
    <div class="panel panel-left panel-reveal">
        <div class="content-block">
            <!--  close-panel类用于关闭面板 -->
            <p><a href="#" class="close-panel">关闭当前面板</a></p>
            <!--  open-panel类用于打开面板,data-panel用于指定操作目标 -->
            <p><a href="#" data-panel="right" class="open-panel">打开右侧面板</a></p>
        </div>
    </div>
</body>
通过JavaScript 
JavaScript
1
2
3
4
5
6
7
8
9
/**
* 打开面板
* @param position 打开哪一侧面板,"left" 或 "right"
*/
app.openPanel(position);
/**
* 关闭当前打开的面板
*/
app.closePanel();
面板相关事件
事件 说明
⚡open 这些事件的target都是 <div class="panel"> 元素。分别在以下时机触发:
  1. 面板打开动画开始时
  2. 面板打开动画完成时
  3. 面板关闭动画开始时
  4. 面板关闭动画完成时
⚡opened
⚡close
⚡closed
通过滑动手势打开面板

F7支持通过滑动手势打开面板,但是只有左侧或者右侧面板中的一个可以启用该手势:

JavaScript
1
2
3
var app = new Framework7( {
    swipePanel : 'left' //让左侧面板支持滑动手势
} );

其它与面板相关的应用初始化参数包括:swipePanelCloseOpposite、 swipePanelOnlyClose、swipePanelActiveArea、swipePanelNoFollow、swipePanelThreshold。

判断面板是否打开

当面板处于打开状态时,F7会给 <body> 元素添加额外的样式类: with-panel-[position]-[effect] :

  1. position区分左右面板,取值left或right
  2. effect表示面板打开效果,取值reveal或cover

下面的代码测试当前是否以覆盖方式打开了左侧面板:

JavaScript
1
2
3
if ($$('body').hasClass('with-panel-left-cover')) {
    console.log('左侧面板处于打开状态')
}
内容块

内容块主要用于为文本内容添加额外的格式或边距: 

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<div class="page-content">
    <p>页面中普通的,位于内容块之外的文本</p>
 
    <!-- 内容块 -->
    <div class="content-block">
        <p>内容块中的文本颜色改变,且和四周有额外的边距</p>
    </div>
 
    <!-- 内容块 + inner容器 -->
    <div class="content-block">
        <div class="content-block-inner">内容块背景颜色改变</div>
    </div>
 
    <div class="content-block-title">为内容块添加标题</div>
    <div class="content-block"><p></p></div>
 
    <!-- 带有内凹效果的内容块,在iOS主题中表现为圆角边框、额外的边距-->
    <div class="content-block inset">
        <div class="content-block-inner"><p></p></div>
    </div>
    <!-- 仅在面板电脑中有内凹效果的内容块 -->
    <div class="content-block tablet-inset">
        <div class="content-block-inner"><p></p></div>
    </div>
</div>
 布局网格(Layout Grid)

使用 F7的布局网格,我们可以灵活的在页面中定位自己的组件。

网格布局
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
<!-- 布局表格以行包装列的形式出现 -->
<div class="row"><!-- 包含两列的一行 -->
    <!-- 每个单元格被添加样式类col-*,*表示占据的宽度百分比 -->
    <div class="col-50">50%</div>
    <div class="col-50">50%</div>
</div>
<!-- 默认的,单元格之间有15像素的空隙,添加no-gutter则无空隙 -->
<div class="row no-gutter"><!-- 包含三列的一行 -->
    <div class="col-33">33%</div>
    <div class="col-33">33%</div>
    <div class="col-33">33%</div>
</div>
单元格样式类

用于指定网格的单元格的宽度的样式类包括:

  1. col-* :其中*为5/10/15...90/95.100,数字代表占据的相对宽度。设置样式类为col-auto的单元格,平均分配剩余的宽度
  2. tablet-* :与上面类似,用于平板类型(窗口宽度大于768像素时)
为单元格统一添加样式

默认情况下,F7没有给单元格添加任何样式,可以参考如下的CSS语法统一添加:

CSS
1
2
3
4
5
6
7
8
9
10
div[class*="col-"] {
  background: #fff;
  text-align: center;
  color: #000;
  border: 1px solid #ddd;
  padding: 5px;
}
.row {
  margin-bottom: 15px;
}
覆盖类组件(Overlays)

 这一大类的F7组件都在z-index方向覆盖在应用主体内容之上,它们都属于临时视图(Temporary Views)的一部分。

模态组件(Modal)

模态是一系列包含了简短内容的小面板,类似于居中于屏幕的弹出窗口。模态通常用于向用户提问,或者给用户发出通知。

预定义模态组件

F7预定义了一些常用的模态组件,例如警告框、确认框等。这些模态组件的标题、按钮文本的默认值可以通过modalTitle、modalPreloaderTitle 、modalButtonOk、modalButtonCancel 等应用初始化参数修改。

组件 说明
信息框(Alert) 类似于window.alert(),可以具有标题、文本、点击后的回调。函数签名:
JavaScript
1
2
3
4
5
6
7
/**
* @param text 信息内容
* @param title 可选的标题
* @param callbackOk 点击OK按钮后执行的回调函数
* @return 动态创建的模态HTML元素
*/
app.alert(text, [title, callbackOk]);
确认框(Confirm) 与信息框类似,但是具有确定、取消两个按钮,点击后可以执行不同的回调。函数签名:
JavaScript
1
2
3
4
5
6
7
/**
* @param text 提示内容
* @param title 提示标题
* @param callbackOk 点击OK按钮时执行的回调
* @param callbackCancel 点击Cancel按钮时执行的回调
*/
app.confirm(text, [title, callbackOk, callbackCancel]);
提示框(Prompt) 与确认框类似,但是还让用户输入一些文本。函数签名:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
/**
* @param text 提示内容
* @param title 提示标题
* @param callbackOk 点击OK按钮时执行的回调
* @param callbackCancel 点击Cancel按钮时执行的回调
*/
app.prompt(text, [title, callbackOk, callbackCancel]);
/**
* 上面两个回调函数的签名
* @param value 用户在文本框输入的值
*/
function callback(value);
登录和密码框 可以进行用户身份验证的模态窗口。函数签名:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
* @param text 登录框内容
* @param title 登录框标题
* @param callbackOk 点击OK按钮时执行的回调
* @param callbackCancel 点击Cancel按钮时执行的回调
*/
app.modalLogin( text, [ title, callbackOk, callbackCancel ] );
/**
* 上述两个回调函数的签名
* @param username 用户输入的用户名
* @param password 用户输入的密码
*/
function callback(username, password);
 
/**
* @param text 密码框内容
* @param title 密码框标题
* @param callbackOk 点击OK按钮时执行的回调
* @param callbackCancel 点击Cancel按钮时执行的回调
*/
app.modalPassword( text, [ title, callbackOk, callbackCancel ] );
/**
* 上述两个回调函数的签名
* @param password 用户输入的密码
*/
function callback(password);
预加载器(Preloader) 用于提示用户:由于某些后台操作(例如XHR)正在执行,应用需要阻塞用户操作。
iOS主题下的默认UI效果是:旋转菊花 + 文本。
F7提供了两个函数来操控预加载器:
JavaScript
1
2
3
4
5
6
7
8
9
/**
* 显示预加载器
* @param title 预加载标题,默认从应用初始化参数modalPreloaderTitle中获得
*/
app.showPreloader([title]);
/**
* 隐藏预加载器
*/
app.hidePreloader();
指示器(Indicator) 和预加载类似,但是UI只有一个旋转菊花图标,没有文本。F7提供两个函数来操控指示器:
JavaScript
1
2
app.showIndicator();// 显示指示器
app.hideIndicator();// 隐藏指示器
扩展模态组件

上表中所有预定义模态组件,实际上都属于“快捷方式”,它们最终都是调用下面的函数实现功能的: 

JavaScript
1
2
3
4
5
6
/**
* 新建一个模态组件
* @param parameters 初始化参数
* @return 动态创建的代表了模态组件的HTMLElement
*/
app.modal(parameters);

定制的模块组件的内容可以相当丰富,下面是两个例子:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
var modal = app.modal( {
    title : '照片墙',
    text : '你觉得我的照片怎么样',
    //文本后的内容被替换为Swiper Slider组件
    afterText :
        '<div class="swiper-container" style="width: auto; margin:5px -15px -15px">' +
            '<div class="swiper-pagination"></div>' +
            '<div class="swiper-wrapper">' +
                '<div class="swiper-slide"><img src="..." height="150" style="display:block"></div>' +
                '<div class="swiper-slide"><img src="..." height="150" style="display:block"></div>' +
            '</div>' +
        '</div>',
    buttons : [ {
            text : '一般般'
        }, {
            text : '太好了',
            bold : true,
            onClick : function() {
                app.alert( '谢谢!' );
            }
        }
    ]
} );
app.swiper( $$( modal ).find( '.swiper-container' ), {
    pagination : '.swiper-pagination'
} );
 
/**
* 该模态组件显示两个页签
*/
app.modal( {
    //标题被设置为切换页签的按钮
    title : '<div class="buttons-row">' +
                '<a href="#tab1" class="button active tab-link">页签一</a>' +
                '<a href="#tab2" class="button tab-link">页签二</a>' +
             '</div>',
    //文本被设置为两个页签
    text : '<div class="tabs">' +
               '<div class="tab active" id="tab1">页签一的内容</div>' +
               '<div class="tab" id="tab2">页签二的内容</div>' +
           '</div>',
    buttons : [ {
        text : '确定',
        bold : true
    } ]
} );
模态初始化参数
参数 类型与默认值 说明
title string 可选的模态组件标题,可以是HTML片段
text string 可选的模态组件文本,可以是HTML片段
afterText string 可选的,在text之后展示的额外文本,可以是HTML片段
buttons Button[] 模态按钮的数组,每个元素均是如下格式的对象:
JavaScript
1
2
3
4
5
6
7
8
9
10
{
    //按钮的文本,可以是HTML
    string text;
    //是否用粗体显示按钮文本
    boolean bold = false;
    //点击该按钮后,模态组件是否自动关闭
    boolean close = true;
    //点击该按钮时执行的回调
    function onClick();
}
verticalButtons boolean = false 是否纵向排列模态按钮
onClick function(modelEl, index)

用户点击 任何模态按钮后执行的函数:

  1. modelEl 模态窗口对应的HTMLElement
  2. index 被点击按钮的索引
关闭模态组件
JavaScript
1
2
3
4
5
/**
* 关闭一个模态窗口
* @param modal 代表模态组件的CSS选择器或者HTMLElement
*/
app.closeModal(modal);
模态相关的事件
方法/事件 说明
⚡open

这些事件的target均为 <div class="modal"> 元素,分别在以下时机触发:

  1. 模态打开动画开始时
  2. 模态打开动画结束时
  3. 模态关闭动画开始时
  4. 模态关闭动画结束时
⚡opened
⚡close
⚡closed
模态模板

通过传递应用初始化参数 modalTemplate ,可以为模态组件定制HTML模板, 该参数必须是Template7模板,下面是一个例子:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<div class="modal {{#unless buttons}}modal-no-buttons{{/unless}}"><!-- 如果定义了按钮 -->
  <div class="modal-inner">
    <!--  如果定义了标题 -->
    {{#if title}}
      <div class="modal-title">{{title}}</div>
    {{/if}}
    <!--  如果定义了文本 -->
    {{#if text}}
       <div class="modal-text">{{text}}</div>
    {{/if}}
    <!--  如果定义了文本后内容 -->
    {{#if afterText}}
      {{afterText}}
    {{/if}}
  </div>
  {{#if buttons}}
    <div class="modal-buttons">
      <!-- 遍历所有按钮 -->
      {{#each buttons}}
        <span class="modal-button {{#if bold}}modal-button-bold{{/if}}">{{text}}</span>
      {{/each}}
    </div>
  {{/if}}
</div>  
Popup弹窗

这类弹窗覆盖F7应用的主体内容上面,默认从屏幕底部滑动进入。在手机上具有全屏效果,在平板上默认630像素宽高。

Popup布局
XHTML
1
2
3
4
<body>
  <!-- 额外的样式类tablet-fullscreen让Popup在平板上也全屏 -->
  <div class="popup tablet-fullscreen"></div>
</body>  
通过HTML打开/关闭Popup
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<body>
    <div class="page-content">
        <div class="content-block">
            <!-- 样式类open-popup用于打开Popup弹窗(可用于任何HTML元素,不仅仅是a),data-popup指定Popup的CSS选择器 -->
            <p><a href="#" data-popup=".popup-about" class="open-popup">Open About Popup </a></p>
        </div>
    </div>
    <!-- 额外的样式类popup-about相当于该弹窗的标识符 -->
    <div class="popup popup-about">
        <div class="content-block">
            <!-- 样式类close-popup用于关闭当前打开的弹窗 -->
            <p><a href="#" class="close-popup">Close popup</a></p>
        </div>
    </div>
</body>
通过JavaScript打开/关闭Popup
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
/**
* 打开Popup弹窗
* @param popup HTMLElement或者String(CSS选择器)
*/
app.popup(popup);
/**
* 关闭Popup弹窗
* @param popup
*     HTMLElement或者String(CSS选择器)
*     如果省略该参数,则关闭任何打开的Popup或其它模态组件
*/
app.closeModal(popup);
Popup弹窗相关的事件
方法/事件 说明
⚡open

这些事件的target均为 <div class="popup"> 元素,分别在以下时机触发:

  1. Popup弹窗打开动画开始时
  2. Popup弹窗打开动画结束时
  3. Popup弹窗关闭动画开始时
  4. Popup弹窗关闭动画结束时
⚡opened
⚡close
⚡closed
动态Popup弹窗

F7提供了一个动态创建、打开Popup弹窗的函数:

JavaScript
1
2
3
4
5
6
/**
* 动态打开一个Popup弹窗
* @param popupHTML Popup的HTML内容
* @param removeOnClose 默认true,是否在关闭时移除Popup的DOM
*/
app.popup(popupHTML, removeOnClose);

下面是一个例子:

JavaScript
1
2
3
4
5
6
7
8
9
10
$$('.create-popup').on('click', function () {
  var popupHTML =
     '<div class="popup">'+
       '<div class="content-block">'+
         '<p>Popup created dynamically.</p>'+
         '<p><a href="#" class="close-popup">关闭</a></p>'+
       '</div>'+
     '</div>';
  app.popup(popupHTML);
});
Popover弹窗

Popover类似于ExtJS的Tips,是一个展示临时信息的较小的弹出窗口。当用户触碰空白处时,Popover自动关闭。Popover默认宽度是320px。

在小屏幕上,不建议使用Popover,最好使用操作列表(Action Sheet)代替。

Popover的布局
XHTML
1
2
3
4
5
6
7
8
9
10
<body>
    <div class="popover">
        <!-- Popover的小箭头 -->
        <div class="popover-angle"></div>
        <!-- Popover的内容 -->
        <div class="popover-inner">
            <!-- 这里面可以包含任何HTML内容 -->
        </div>
    </div>
</body>
通过HTML打开/关闭Popover
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<body>
    <div class="page-content">
        <div class="content-block">
            <!-- open-popover用于打开Popover弹窗 -->
            <p><a href="#" data-popover=".popover-about" class="open-popover">打开</a></p>
        </div>
    </div>
    <div class="popover popover-about">
        <div class="popover-angle"></div>
        <div class="popover-inner">
            <!-- close-popover用于关闭目前打开的Popover弹窗 -->
            <div class="content-block"><a href="#" class="close-popover">关闭</a></div>
        </div>
    </div>
</body>

通过HTML打开的Popover,其显示位置会自动计算(在打开Popover的元素的周围),以确保正确显示。

通过JavaScript打开/关闭Popover
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* 打开一个Popover弹窗
* @param popover 目标弹窗的HTMLElement或者CSS选择器
* @param target 针对的元素,弹窗会在此元素的周围定位
*/
app.popover(popover, target);
/**
* 关闭一个Popover弹窗
* @param popover
*     目标弹窗的HTMLElement或者CSS选择器
*     如果忽略此参数,则任何打开的Popover都被关闭
*/
app.closeModal(popover);
动态Popover弹窗

和Popover类似,Popover也可以动态创建和展示: 

JavaScript
1
2
3
4
5
6
7
8
9
10
11
/**
* 动态创建并打开一个Popover弹窗
*
* @param popover
*          Popover的HTML内容
* @param target
*          针对的元素,弹窗会在此元素的周围定位
* @param removeOnClose
*          默认true,是否在关闭时移除Popover的DOM
*/
app.popover( popoverHTML, target, removeOnClose );
Popover弹窗相关的事件

与Popup类似,事件的Target是 <div class="popover"> 元素。

操作列表(Action Sheet)

操作列表通常表现为从屏幕底部滑动进入的、包含若干纵向排列按钮的弹窗。操作列表可以把按钮分成若干组。可以通过操作列表,让用户确认潜在危险的操作。

不建议在大屏幕(平板)上使用操作列表,最好用Popover代替。

创建和打开操作列表

操作列表属于动态组件,只能通过JavaScript创建和打开:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
/**
* 创建并打开由若干按钮组构成的操作列表
* @param groups 相当于button[][],按钮组的数组,每个按钮组则是button的数组
* @return 动态创建的、代表操作列表的HTMLElement
*/
app.actions( groups );
/**
* 创建并打开由若干按钮构成的操作列表(单个组)
* @param buttons 按钮的数组
* @return 动态创建的、代表操作列表的HTMLElement
*/
app.actions( buttons );
按钮初始化参数

上述groups、buttons的最内层元素是按钮的配置对象: 

参数 类型和默认值 说明
text string 按钮的文本,可以是HTML
bold boolean = false 可选,设置按钮文本为粗体
color string 可选,按钮的文字颜色,可以是10种内置颜色的英文名称
bg string 可选,按钮的北京颜色 ,可以是10种内置颜色的英文名称
label boolean = true 如果设置为true,则当前项作为按钮组的标题,而不是按钮
disabled boolean = false 设置为true则按钮被标记为禁用
onClick function() 点击按钮后,执行的回调
把操作列表转换为Popover

由于屏幕大小的原因,F7不建议:在手机上使用Popover;或者在平板上使用Action Sheet。为了让单份代码能够同时适用手机和平板,F7提供了操作列表到Popover的转换机制:

JavaScript
1
2
3
4
5
6
7
8
/**
* 这两个函数,在手机上创建的是操作列表,而在平板上创建的则是Popover
* @target HTMLElement或者CSS选择器,当作为Popover时,在哪个元素周围弹出
* @groups 操作列表/Popover包含的按钮组的数组
* @buttons 操作列表/Popover包含的按钮的数组
*/
app.actions(target, groups);
app.actions(target, buttons);
关闭操作列表

默认的,操作列表在以下情况下自动关闭:

  1. 当其中某个按钮被点击时
  2. 当触碰操作列表外部的屏幕空间时(可通过应用初始化参数modalActionsCloseByOutside定制) 

 如果要手工关闭操作列表,可以调用: app.closeModal(actionSheet) ,该方法前面的章节已有说明。

操作列表相关事件

与Popup、Popover类似,操作列表具有4个相关事件,这些事件的Target均为 <div class="actions-modal"> 元素。

操作列表模板

通过传递应用初始化参数 modalActionsTemplate ,可以为操作列表定制HTML模板, 该参数必须是Template7模板,下面的模板展现了操作列表的默认布局:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<div class="actions-modal">
  <!-- this表示单个组 -->
  {{#each this}}
    <div class="actions-modal-group">
      <!-- this表示单个按钮 -->
      {{#each this}}
          {{#if label}}
            <span class="actions-modal-label">{{text}}</span><!-- 作为标题 -->
          {{else}}
            <div class="actions-modal-button {{#if color}}color-{{color}}{{/if}} {{#if bold}}actions-modal-button-bold{{/if}}">{{text}}</div>
          {{/if}}
      {{/each}}
    </div>
  {{/each}}
</div>  

如果你使用操作列表到Popover的转换,则还可以传递应用初始化参数 modalActionsToPopoverTemplate  ,从而定制目标Popover的HTML模板,下面是默认的模板:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<div class="popover actions-popover">
  <div class="popover-inner">
    <!-- 每个按钮组转换为一个列表块 -->
    {{#each this}}
    <div class="list-block">
      <ul>
        <!-- 每个按钮转换为一个列表条目 -->
        {{#each this}}
        {{#if label}}
        <li class="actions-popover-label {{#if color}}color-{{color}}{{/if}} {{#if bold}}actions-popover-bold{{/if}}">{{text}}</li>
        {{else}}
        <li><a href="#" class="item-link list-button {{#if color}}color-{{color}}{{/if}} {{#if bg}}bg-{{bg}}{{/if}} {{#if bold}}actions-popover-bold{{/if}} {{#if disabled}}disabled{{/if}}">{{text}}</a></li>
        {{/if}}
        {{/each}}
      </ul>
    </div>
    {{/each}}
  </div>
</div>  
登录屏幕

大部分应用程序都有登录功能, 因此F7内置了登录屏幕组件。

登录屏幕的布局
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<body>
  <!-- 登录屏幕应当是body的直接子元素 -->
  <div class="login-screen">
      <!-- 所有子元素都是可选的 -->
      <!-- 默认的视图-页面布局 -->
      <div class="view">
        <div class="page">
          <!-- 页面内容包含额外的login-screen-content类 -->
          <div class="page-content login-screen-content">
            <div class="login-screen-title">登录屏幕标题</div>
            <!-- 登录表单 -->
            <form>
              <div class="list-block">
                <ul>
                  <li class="item-content">
                    <div class="item-inner">
                      <div class="item-title label">用户名</div>
                      <div class="item-input">
                        <input type="text" name="username" placeholder="用户名">
                      </div>
                    </div>
                  </li>
                  <li class="item-content">
                    <div class="item-inner">
                      <div class="item-title label">密码</div>
                      <div class="item-input">
                        <input type="password" name="password" placeholder="密码">
                      </div>
                    </div>
                  </li>
                </ul>
              </div>
              <div class="list-block">
                <ul>
                  <li>
                    <a href="#" class="item-link list-button">登录</a>
                  </li>
                </ul>
                <div class="list-block-labe">与登录相关的提示信息</div>
              </div>
            </form>
          </div>
        </div>
      </div>
  </div>
</body>
打开/关闭登录屏幕

HTML方式:

XHTML
1
2
<a href="#" class="open-login-screen">打开登录屏幕</a>
<a href="#" class="close-login-screen">关闭登录屏幕</a>

JavaScript方式:

Java
1
2
3
4
5
6
7
8
9
/**
* 打开登录屏幕
*/
app.loginScreen();
/**
* 关闭登录屏幕
* @param loginScreen 登录屏幕的TMLElement或者CSS选择器
*/
app.closeModal(loginScreen);
登录屏幕相关事件

与Popup、Popover、ActionSheet类似,登录屏幕具有4个相关事件,这些事件的Target均为 <div class="login-screen"> 元素。 

从登录屏幕启动应用

某些应用要求先登录后使用,我们可以为登录屏幕添加 modal-in 类,这样F7应用加载后,立即显示登录屏幕:

XHTML
1
2
3
<body>
    <div class="login-screen modal-in"></div>
</body>
模态选取器(Picker Modal)

这是一种特殊的Overlay组件,可以用于实现定制的选取器。其内容不受限制,UI默认表现为从屏幕底部滑入的弹窗,右上侧有一个关闭按钮,类似于手机虚拟键盘。

模态选取器布局
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<body>
    <!-- 模态选取器容器元素 -->
    <div class="picker-modal">
        <!-- 可选的工具栏 -->
        <div class="toolbar">
            <div class="toolbar-inner">
                <div class="left"></div>
                <div class="right">
                    <a href="#" class="link close-picker">完成</a>
                </div>
            </div>
        </div>
        <!-- 选取器内部元素 -->
        <div class="picker-modal-inner">
            <!-- 选取器内容,任意自定义HTML -->
            <div class="content-block">
            </div>
        </div>
    </div>
</body>
打开/关闭选取器

HTML方式:

XHTML
1
2
3
<a href="#" data-picker=".picker-1" class="link open-picker">打开选取器</a>
<a href="#" data-picker=".picker-1" class="close-picker">关闭选取器</a>
<div class="picker-modal picker-1">选取器实例</div>

JavaScript方式: 

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 打开选取器
*
* @param picker
*            选取器的HTMLElement或者CSS选择器
*/
app.pickerModal( picker );
/**
* 关闭选取器
*
* @param picker
*            选取器的HTMLElement或者CSS选择器
*            如果不指定则关闭任何打开的模态窗口
*/
app.closeModal( picker );
动态创建选取器
JavaScript
1
2
3
4
5
6
/**
* 动态创建并打开选取器
* @param pickerHTML 选取器的HTML
* @param removeOnClose 是否在关闭选取器时将其从DOM中移除
*/
app.pickerModal(pickerHTML, removeOnClose);
模态选取器相关事件

与Popup、Popover、ActionSheet、登录屏幕类似,模态选取器具有4个相关事件,这些事件的Target均为 <div class="picker-modal"> 元素。 

预加载指示器(Preloader Indicator)

F7自带了基于SVG和CSS动画的的预加载提示器,可以随意的放大缩小,其UI效果是旋转菊花。预加载指示器具有两个版本,分别用于浅色、深色背景。

以模态方式使用预加载指示器,可以通过上一章提到的“预加载器”、“指示器”。

XHTML
1
2
3
4
5
<!-- 默认预加载器  -->
<span class="preloader"></span>
<!-- 白色版本的预加载器,用于深色背景 -->
<span class="preloader preloader-white"></span>
<!-- 指定大小 -->
 进度条(Progress Bar)

除了预加载指示器以外,F7还提供另外一种用于提示“正在处理”活动的组件——进度条。进度条分为确定的(Determinate,显示实际进度)、无限的(Infinite)两种。

进度条布局
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- 确定的进度条,20%完成进度 -->
<div class="progressbar" data-progress="20">
    <span></span>
</div>
<!-- 也可以用span元素 -->
<span class="progressbar" data-progress="50">
    <span></span>
</span>
 
<!-- 无限的进度条 -->
<div class="progressbar-infinite"></div>
<span class="progressbar-infinite"></span>
<!-- 多彩效果 -->
<div class="progressbar-infinite color-multi"></div>
进度条JavaScript API
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* 设置确定进度条的进度
* @param container 进度条的容器的HTMLElement或者CSS选择器,默认body
* @param progress 目标进度,0-100
* @param speed 到达目标进度的动画耗时,单位ms
* @return 返回进度条容器元素
*/
app.setProgressbar(container, progress, speed);
/**
* 隐藏进度条
* @param container 进度条的容器的HTMLElement或者CSS选择器,默认body
*/
app.hideProgressbar(container);
/**
* 创建或显示(如果已经创建)进度条
* @param container 进度条的容器的HTMLElement或者CSS选择器,默认body
* @param progress 目标进度,0-100
* @param color 进度条颜色名称
* @return 返回进度条容器元素
*/
app.showProgressbar(container, progress, color);
 
//外加两个快捷方法
//在指定容器内打开(显示)某种颜色的无限进度条
app.showProgressbar(container, color);
//在body内打开(显示)color颜色的进度条,当前进度progress
app.showProgressbar(progress, color);
列表视图(List View,Table View)

列表视图是多用途、强大的UI组件,在iOS应用中经常可以看到。列表视图在一个可滚动的区域内显示多行数据,可选的,它讲数据分为若干组/段。我们可以用列表视图来:

  1. 在层次型数据结构(树形)内进行导航
  2. 展现列表中的数据、选项
  3. 显示详细信息
列表视图的布局
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!-- 列表块(List block):列表块元素是列表视图的包装(wrapper)元素 -->
<!-- 注意不要把list-block放在content-block内 -->
<div class="list-block">
    <!-- ul内是列表视图的全部元素 -->
    <ul>
        <!-- li代表列表视图的元素(条目),其内容相当复杂而灵活 -->
        <li>
            <!-- item-content为必需,作为item-media、item-inner的包装器-->
            <div class="item-content">
                <!-- item-media为可选,用于图标、图片等媒体元素 -->
                <div class="item-media">
                    <i class="icon my-icon"></i>
                </div>
                <!-- item-inner为必需,作为item-title、item-after的包装器 -->
                <div class="item-inner">
                    <!-- 必需,单行的元素标题 -->
                    <div class="item-title">列表元素的标题</div>
                    <!-- 可选,标题后内容,可以是标记(badge)、开关、按钮等任意HTML,默认右侧对齐 -->
                    <div class="item-after">列表元素的标签</div>
                </div>
            </div>
        </li>
    </ul>
    <!-- 可以在列表块的结尾处,添加一个列表块标签 -->
    <div class="list-block-label">列表块标签</div>
</div>

 如果li元素内没有其它内容,你可以把item-content类标注到li元素上,少写一个div:

XHTML
1
2
3
4
5
6
7
8
<li class="item-content">
    <div class="item-media">
        <i class="icon my-icon"></i>
    </div>
    <div class="item-inner">
        <div class="item-title"></div>
    </div>
</li>
链接元素

很多时候需要在点击列表条目后,链接到其它页面,这时需要为 <div class="item-content"> 添加额外的包装元素:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<li>
    <!-- 额外的包装元素 -->
    <a href="#" class="item-link"> <!-- 导致列表右侧出现额外的箭头(链接)标记 -->
        <div class="item-content">
            <div class="item-media"></div>
            <div class="item-inner"></div>
        </div>
    </a>
</li>
<li>
    <!-- 如果li下没有其它元素,则可以把a、div合并 -->
    <a href="#" class="item-link item-content">
        <div class="item-media">...</div>
        <div class="item-inner">...</div>
    </a>
</li> 
列表分隔器

可以插入类似下面的li元素,将列表分为两个部分:

XHTML
1
<li class="item-divider">Divider title here</li>
分组的列表

可以将不同的列表元素进行分组:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<div class="list-block">
  <!-- 第一个分组 -->
  <div class="list-group">
    <ul>
      <!--  分组的标题 -->
      <li class="list-group-title"></li>
      <li class="item-content"></li>
    </ul>
  </div>
  <!-- 第二个分组-->
  <div class="list-group">
    <ul>
      <li class="list-group-title"></li>
      <li class="item-content">
      </li>
    </ul>
  </div>
</div>
Inset效果的列表块

列表块可以是Inset(非全宽度、圆角矩形边框)的:

XHTML
1
2
3
4
5
6
7
<div class="list-block inset">
  <ul></ul>
</div>
<!-- 仅在平板电脑上启用Inset效果 -->
<div class="list-block tablet-inset">
  <ul></ul>
</div>
联系人列表

该组件是分组列表的特例,用于显示联系人的列表,其布局如下:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<!-- page-content元素必须有额外的contacts-content类 -->
<div class="page-content contacts-content">
    <!-- list-block元素必须有额外的contacts-block类 -->
    <div class="list-block contacts-block">
        <div class="list-group">
            <ul>
                <li class="list-group-title">汪</li>
                <li>
                    <div class="item-content">
                        <div class="item-inner">
                            <div class="item-title">汪震</div>
                        </div>
                    </div>
                </li>
                <li>
                    <div class="item-content">
                        <div class="item-inner">
                            <div class="item-title">汪静好</div>
                        </div>
                    </div>
                </li>
            </ul>
        </div>
        <div class="list-group">
            <ul>
                <li class="list-group-title">李</li>
                <li>
                    <div class="item-content">
                        <div class="item-inner">
                            <div class="item-title">李晓蒙</div>
                        </div>
                    </div>
                </li>
            </ul>
        </div>
    </div>
</div>
媒体列表视图

该组件是列表视图的扩展,用于显示更复杂的数据,其布局如下:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!-- 媒体列表有额外的media-list元素 -->
<div class="list-block media-list">
    <ul>
        <li>
            <!-- 必需的item-content,和列表视图一样,作为item-media、item-inner的包装器 -->
            <div class="item-content">
                <!-- 可选的item-media -->
                <div class="item-media">
                    <img src="path/to/img.jpg">
                </div>
                <div class="item-inner"><!-- 必须 -->
                    <div class="item-title-row"><!-- 类似与列表视图 -->
                        <div class="item-title">元素标题</div>
                        <div class="item-after">元素标签</div>
                    </div>
                    <!--子标题,单行文本 -->
                    <div class="item-subtitle">子标题</div>
                    <!--占两行的额外文本 -->
                    <div class="item-text">额外文本内容</div>
                </div>
            </div>
        </li>
    </ul>
</div>
可滑动(Swipeable )列表 

该组件是列表视图的扩展,支持滑动手势(例如滑动以删除, swipe-to-delete),滑动后可以显示针对列表元素的隐藏按钮。 可滑动列表的布局如下:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<div class="list-block">
    <ul>
        <!-- li元素上需要额外的swipeout类 -->
        <li class="swipeout">
            <!-- swipeout-content、swipeout-actions-left/right必须是直接子元素 -->
            <!-- 元素内容元素外部通常包裹swipeout-content元素 -->
            <div class="swipeout-content">
                <!-- 如果只有item-content这一个子元素,那么它可以和父元素合并 -->
                <div class="item-content">
                    <div class="item-media"></div>
                    <div class="item-inner"></div>
                </div>
            </div>
            <!-- 左侧操作集,手指向右滑动时的显示 -->
            <div class="swipeout-actions-left">
                <!-- 这里可以是按钮、链接-->
                <a href="#">操作1</a>
                <a href="#">操作2</a>
            </div>
            <!-- 右侧操作集,手指向左滑动时的显示 -->
            <div class="swipeout-actions-right">
                <a href="#">操作3</a>
                <!--  swipeout-close,点击后关闭(隐藏)操作集 -->
                <a class="swipeout-close" href="#">操作4</a>
            </div>
        </li>
    </ul>
</div>
滑动以删除(Swipe To Delete) 

F7对滑动删除这一经常使用的特性内置了支持,你只需要在操作集中增加 <a class="swipeout-delete"> 按钮即可。

XHTML
1
2
3
4
5
6
7
<!-- 添加data-confirm,则在删除前会提示用户确认 -->
<!-- 设置data-close-on-cancel为true,当用户点击确认框的取消按钮时,自动关闭当前列表元素的操作集 -->
<a href="#"
   class="swipeout-delete"
   data-confirm="真的要删除吗"
   data-confirm-title="请确认"
   data-close-on-cancel="true" >删除</a>
长滑(Overswipe)时直接执行操作

F7支持当滑动距离过长时,自动执行:

  1. 向左长滑时,自动执行右侧操作集的最后一个按钮上的动作
  2. 向右长滑时,自动执行左侧操作集的第一个按钮上的动作

启用长滑时,F7通过脚本触发相应按钮的click事件。在长滑执行期间,目标按钮会添加额外的 swipeout-overswipe-active 样式类。

启用长滑的示例代码如下:

XHTML
1
2
3
4
5
6
7
8
9
10
<div class="swipeout-actions-left">
    <!-- 左侧的第一个按钮,可以添加swipeout-overswipe以启用长滑 -->
    <a href="#" class="swipeout-overswipe bg-green reply">回复</a>
    <a href="#" class="bg-blue forward">转发</a>
</div>
<div class="swipeout-actions-right">
    <a href="#" class="mark bg-orange">标记</a>
    <!-- 右侧的最后一个按钮,可以添加swipeout-overswipe以启用长滑 -->
    <a href="#" class="swipeout-delete swipeout-overswipe">删除</a>
</div>
滑动列表相关的方法、属性和事件
方法/属性/事件 说明
app.swipeoutOpen()
JavaScript
1
2
3
4
5
6
7
/**
* 打开(滑动动画)并显示目标列表条目的操作集
* @param el 列表条目的HTMLElement(li)或CSS选择器
* @param direction 显示左侧还是右侧的操作集,left/right
* @param callback 滑动动画执行完毕时执行的回调
*/
function swipeoutOpen( el, direction, callback );
app.swipeoutClose()
JavaScript
1
2
3
4
5
6
/**
* 关闭(滑动动画)目标列表条目并隐藏操作集
* @param el 列表条目的HTMLElement(li)或CSS选择器
* @param callback 滑动动画执行完毕时执行的回调
*/
function swipeoutClose( el, callback );
app.swipeoutDelete()
JavaScript
1
2
3
4
5
6
/**
* 滑动并删除目标列表条目
* @param el 列表条目的HTMLElement(li)或CSS选择器
* @param callback 动画执行完毕,即将把li元素从DOM中移除前执行的回调
*/
function swipeoutDelete( el, callback );
app.swipeoutOpenedEl 该属性指向当前处于打开状态的列表条目的HTMLElement
⚡swipeout

这些事件的Target都是 <li class="swipeout"> 元素

  1. swipeout:手指滑动列表条目的过程时触发, event.detail.progress 属性存放当前滑动进度的百分比值
  2. open:打开条目时,滑动动画开始时触发
  3. opened:打开条目时,滑动动画结束时触发
  4. close:关闭条目时,滑动动画开始时触发
  5. closed:关闭条目时,滑动动画结束时触发
  6. deleted:删除条目时,滑动动画结束后,即将从DOM中删除li元素前触发
⚡open
⚡opened
⚡close
⚡closed
⚡delete
⚡deleted
可排序列表

该组件是列表视图的扩展,支持调整条目的顺序,其布局如下:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- 列表块元素上需要额外的sortable样式类 -->
<div class="list-block sortable">
    <ul>
        <li>
            <div class="item-content">
                <div class="item-media"></div>
                <div class="item-inner"></div>
            </div>
            <!-- 一个可拖拽的小图标,用来调整条目的顺序,默认隐藏 -->
            <div class="sortable-handler"></div>
        </li>
    </ul>
</div>
启用/禁用排序

通过HTML:

XHTML
1
2
3
4
<!-- data-sortable指定目标可排序列表的CSS选择器  -->
<a href="#" data-sortable=".sortable" class="open-sortable">启用排序</a>
<a href="#" data-sortable=".sortable" class="close-sortable">禁用排序</a>
<a href="#" data-sortable=".sortable" class="toggle-sortable">切换启禁用状态</a>

通过JavaScript:

JavaScript
1
2
3
4
5
6
7
8
/**
* @param sortableContainer
*            可排序列表(<div class="list-block sortable">)的HTMLElement或者CSS选择器
*            如果不指定,F7尝试寻找第一个可排序列表
*/
app.sortableOpen( sortableContainer ); // 启用
app.sortableClose( sortableContainer ); // 禁用
app.sortableToggle( sortableContainer ); // 切换
可排序列表相关事件
事件 说明
⚡open 这两个事件的Target均为 <div class="list-block sortable"> 元素。分别在启用、禁用可排序功能时触发
⚡close
⚡sort 该事件的Target为 <li> ,当用户释放拖拽小图标时触发
虚列表(Virtual List)

使用虚列表,我们可以在不影响性能的前提下展现具有大量元素的列表。虚列表和搜索栏、无限滚动、下拉刷新、滑动删除等F7组件完全兼容 。

虚列表布局
XHTML
1
2
3
4
<!-- 额外的virtual-list样式类 -->
<div class="list-block virtual-list">
    <!-- 内部保持空白 -->
</div>
虚列表的初始化

需要调用JavaScript API来初始化虚列表的内容:

JavaScript
1
2
3
4
5
6
7
/**
* 初始化一个虚列表
* @param listBlockContainer 列表块(list-block)的HTMLElement或者CSS选择器
* @param parameters 虚列表初始化参数
* @return 已初始化的初始化实例
*/
app.virtualList( listBlockContainer, parameters );

注意列表块元素在此时必须已经存在于DOM中,如果当前不是首页,你应当在pageInit事件内初始化虚列表。 

虚列表初始化参数
参数 类型和默认值 说明
items array 列表条目的数组。不使用模板时,其元素是HTML片段;使用模板时,其元素一般是纯数据(JSON对象)
rowsBefore number 在当前屏幕滚动位置之前(即屏幕底部)渲染的条目的数量,默认是单屏可容纳行数的2倍
rowsAfter number 在当前屏幕滚动位置之后渲染的条目的数量,默认是单屏可容纳行数的1倍
cols number = 1 每行显示的条目数量,当使用动态高度(height参数为函数)的虚列表时,此选项不兼容
height number = 44 /
function(item) 
每个条目的高度,如果指定函数,则高度为函数的返回值
注意,该参数并不会设置条目的高度样式
template string / function Template7字符串模板或者Template已编译模板(函数形式),用来渲染单个条目。该目标必须包含条目的完整布局,包括li元素
renderItem function(index, item) 该函数可以代替template来渲染每个条目
dynamicHeightBufferSize number = 1 用于动态高度列表,控制缓冲大小(buffer size)
cache boolean = true 是否启用已渲染条目的DOM缓存。如果列表条目中包含用户交互元素(按钮、表单元素等)或者列表条目可能被修改,可以启用
updatableScroll boolean 在滚动时,设备是否更新、处理滚动事件。默认对于所有iOS 8-为fasle
showFilteredItemsOnly boolean = false 是否仅显示 filter() 过滤后的元素
searchByItem function(query, index, item) 搜索栏使用的搜索判断函数,入参包括查询条件、待判断条目及其索引。如果条目匹配搜索,则该函数应当返回true
searchAll function(query, items) 搜索栏使用的搜索函数,你必须遍历items,并返回匹配的item数组
onItemBeforeInsert function(list, item) 回调,条目被插入到虚拟文档片段(virtual document fragment)中时调用
文档片段相当于包含了本次待渲染的列表条目的临时DOM,下同
onBeforeClear function(list, fragment) 回调,当前DOM列表将被移除前调用
onItemsBeforeInsert function(list, fragment) 回调,当前DOM列表将被移除后,新的文档片段被插入前调研与
onItemsAfterInsert function(list, fragment) 回调,新的文档片段被插入后调用
虚列表的方法和属性
方法/属性 说明
items 虚列表包含的条目
filteredItems 过滤后的条目 
domCache 条目的DOM缓存 
params 所有初始化参数 
listBlock list-block的Dom7元素实例 
pageContent page-content的Dom7元素实例 
currentFromIndex 当前正在渲染的第一个条目的索引 
currentToIndex 当前正在渲染的最后一个条目的索引
reachEnd 如果当前已经渲染了最后一个条目,则为true 
filterItems(indexes) 仅显示indexes数组中包含的条目 
resetFilter() 禁用过滤器,显示全部条目 
appendItem(item) 添加条目到虚列表的尾部  
appendItems(items)
prependItem(item) 添加条目到虚列表的头部
prependItems(items)
replaceItem(index, items) 从指定索引开始替换条目
replaceAllItems(items) 替换全部条目 
moveItem(oldIdx, newIdx) 将虚拟条目从oldIndex移动到newIdx 
insertItemBefore(index, item) 在指定索引前面插入元素
deleteItem(index) 删除指定索引上的元素  
deleteItems(indexes)
deleteAllItems() 删除全部元素
clearCache() 清空DOM缓存 
destroy() 销毁虚列表的实例,解除所有事件注册 
update() 更新虚列表,重新计算列表的size、重新渲染虚列表 
scrollToItem(index) 滚动虚拟列表到指定的索引 

 注意,上述添加、删除、改变列表元素的方法,其操作结果会立即反应到视图上。

 手风琴与可折叠(Accordion / Collapsible)
手风琴布局

通用的手风琴布局如下:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- 手风琴条目列表 -->
<div class="accordion-list">
    <!-- 手风琴条目 -->
    <div class="accordion-item">
        <!-- 触碰后展开/折叠条目内容,必需 -->
        <div class="accordion-item-toggle"></div>
        <!-- 默认隐藏的条目内容,必需 -->
        <div class="accordion-item-content"></div>
    </div>
    <!-- 处于展开状态的手风琴条目,只能有一个 -->
    <div class="accordion-item accordion-item-expanded">
        <div class="accordion-item-toggle"></div>
        <div class="accordion-item-content"></div>
    </div>
</div>
可折叠布局

手风琴布局实质上是多个联动的可折叠条目的集合 ,可收折叠的手风琴条目可以脱离 accordion-list 单独使用:

XHTML
1
2
3
4
<div class="accordion-item">
    <div class="accordion-item-toggle"></div>
    <div class="accordion-item-content"></div>
</div>
手风琴列表视图

可以把手风琴布局和列表视图结合起来使用:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
<div class="list-block accordion-list">
    <ul>
        <li class="accordion-item"><!-- 使用li代替通用手风琴布局中的div -->
            <a href="" class="item-link item-content"><!-- 使用item-link代替accordion-item-toggle -->
                <div class="item-inner">
                    <div class="item-title">条目标题</div>
                </div>
            </a>
            <div class="accordion-item-content">条目内容</div>
        </li>
    </ul>
</div>
定制手风琴

 可以通过如下方式修改手风琴条目展开、折叠时的样式:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<div class="content-block accordion-list custom-accordion">
    <div class="accordion-item">
        <div class="accordion-item-toggle">
            <!--  折叠时的图标,显示一个+号 -->
            <i class="icon icon-plus">+</i>
            <!-- 展开时的图标,显示一个-号 -->
            <i class="icon icon-minus">-</i>
            <span>条目标题</span>
        </div>
        <div class="accordion-item-content">
            <p>条目内容</p>
        </div>
    </div>
</div>
<style>
/* 设置折叠、展开图标的边框为圆形  */
.custom-accordion .icon-plus, .custom-accordion .icon-minus {
    display: inline-block;
    width: 22px;
    height: 22px;
    border: 1px solid #000;
    border-radius: 100%;
    line-height: 20px;
    text-align: center;
}
</style>
手风琴相关方法
JavaScript
1
2
3
4
5
6
7
/**
* @param item
*            手风琴条目(accordion-item)的HTMLElement或CSS选择器
*/
app.accordionOpen( item ); // 展开手风琴条目
app.accordionClose( item ); // 折叠手风琴条目
app.accordionToggle( item );// 切换手风琴条目的展开/折叠状态
手风琴相关事件 

以下4个事件的Target均为 <div class="accordion-item"> 。触发时机分别为:

  1. open 条目打开动画开始时
  2. opened 条目打开动画结束时
  3. close 条目关闭动画开始时
  4. closed 条目关闭动画结束时
卡片(Cards)

类似于列表视图,卡片也是包含和组织相关信息的常用方式。单张卡片常常包含一些相关的图片、文字、连接信息,作为更详细信息的入口,本站的首页就是卡片布局典型的例子。F7完整的支持卡片布局。

卡片的布局
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
<!-- 卡片容器 -->
<div class="card">
    <!-- 卡片头部,常常显示卡片标题,可选 -->
    <div class="card-header">Header</div>
    <!-- 卡片主体部分,必需 -->
    <div class="card-content">
        <!-- 可选的内部包装元素,添加额外的补白 -->
        <div class="card-content-inner">Card content</div>
    </div>
    <!-- 卡片脚注,包含一些附加信息,链接/动作按钮等,可选 -->
    <div class="card-footer">Footer</div>
</div>

注意,卡片头、脚使用flexbox布局(display:flex),在垂直方向默认居中对齐。如果你需要顶部/底部对齐,可以:

XHTML
1
2
<div class="card-header" valgin="top">
<div class="card-footer" valgin="bottom">
作为列表条目的卡片
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!-- 需要为列表块添加额外的样式类cards-list -->
<div class="list-block cards-list">
    <ul>
        <li class="card"><!-- 条目元素需要添加card类 -->
            <div class="card-header">Card Header</div>
            <div class="card-content">
                <div class="card-content-inner">Card content</div>
            </div>
            <div class="card-footer">Card footer</div>
        </li>
        <li class="card">
            <div class="card-header">Card Header</div>
            <div class="card-content">
                <div class="card-content-inner">Card content</div>
            </div>
            <div class="card-footer">Card footer</div>
        </li>
    </ul>
</div>
Chips

 该组件只适用于Material主题。

Chips在一个很小的内联块中显示复杂的信息,其中可以包含照片、小标题、文本。在视觉效果上,Chip表现为圆角小矩形:

chips

Chips的布局 
XHTML
1
2
3
4
5
6
7
8
9
10
11
<!-- 容器元素 -->
<div class="chip">
    <!-- 媒体元素,指定一个图片/头像等,可选 -->
    <div class="chip-media">
        <img src="avator/alex.png">
    </div>
    <!-- 文本标签 -->
    <div class="chip-label">Alex Wong</div>
    <!-- 删除按钮,可选 -->
    <a href="#" class="chip-delete"></a>
</div>
按钮

F7框架包含了大量开箱即用的按钮组件,只需要把合适的样式类添加到链接/按钮/提交input元素上即可。

F7中的按钮默认均为 display:block ,且占据父容器100%宽度。

iOS主题按钮

普通按钮,默认具有蓝色边框和蓝色文字样式:

XHTML
1
2
<p><a href="#" class="button">Button</a></p>
<p><a href="#" class="button">Button</a></p>  

激活态按钮,默认具有蓝色背景和白色文字样式:

XHTML
1
<a href="#" class="button active">Active Button</a>

圆角按钮,具有更加圆润的边框:

XHTML
1
<p><a href="#" class="button button-round">Round Button</a></p>

大按钮,比普通按钮更高:

XHTML
1
<a href="#" class="button button-big">Big Button </a>

按钮行,其中每个按钮具有相同的宽度,没有边距:

XHTML
1
2
3
4
5
<p class="buttons-row">
    <a href="#" class="button">Button 1</a>
    <a href="#" class="button">Button 2</a>
    <a href="#" class="button">Button 3</a>
</p>

填充按钮,看上去和激活态按钮类似,但是点击/触碰时有额外的样式效果:

XHTML
1
<a href="#" class="button button-fill">Fill Button </a>

彩色按钮:

XHTML
1
2
3
4
5
6
7
8
<!-- 彩色按钮,在按钮行上指定主题 -->
<p class="buttons-row theme-pink">
    <a href="#" class="button active">Button 1</a>
    <a href="#" class="button">Button 2</a>
    <a href="#" class="button">Button 3</a>
</p>
<!-- 彩色按钮,指定单个按钮的颜色类 -->
<a href="#" class="button button-fill color-green">Green</a>

由按钮组成的列表视图:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div class="content-block-title">Inset list block buttons</div>
<div class="list-block inset">
    <ul>
        <li>
            <a href="#" class="item-link list-button">List Button 1</a>
        </li>
        <li>
            <a href="#" class="item-link list-button">List Button 2</a>
        </li>
        <li>
            <a href="#" class="item-link list-button">List Button 3</a>
        </li>
    </ul>
</div>

使用网格布局对按钮进行排版,这样可以让按钮之间有边距: 

XHTML
1
2
3
4
5
6
7
8
<div class="row">
    <div class="col-50">
        <a href="#" class="button button-big button-red">Cancel</a>
    </div>
    <div class="col-50">
        <a href="#" class="button button-big button-green">Submit</a>
    </div>
</div>
Material主题按钮

普通按钮,与iOS主题类似,但是没有边框:

XHTML
1
<p><a href="#" class="button">Button</a></p>

按钮行,与iOS主题类似,但是没有边框:

XHTML
1
2
3
4
<p class="buttons-row">
  <a href="#" class="button">Button</a>
  <a href="#" class="button">Button</a>
</p>    

浮雕效果按钮(Raised Buttons) ,具有阴影效果:

XHTML
1
<a href="#" class="button button-raised">Button</a>

填充按钮,默认具有蓝色背景和白色文字:

XHTML
1
<a href="#" class="button button-fill button-raised">Button</a>

为Material波纹效果(从触碰点向周围扩散的动画)指定颜色:

XHTML
1
<a href="#" class="button color-green ripple-pink">Button</a>

大按钮、列表块按钮、彩色按钮与iOS主题类似。 

浮动动作按钮

浮动动作按钮(FAB)仅适用于Material主题,在视觉效果上,它表现为浮动的(不随页面滚动,通常位于屏幕右下角)、圆形的的按钮 。触碰后,FAB可能会:

  1. 变形:转换为一个Popover 
  2. 快速拨号:弹出一组相关的按钮
浮动按钮的布局
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- 当前页面 -->
<div class="page navbar-fixed">
    <!-- 导航栏-->
    <div class="navbar">
        <div class="navbar-inner">
            <div class="center"></div>
        </div>
    </div>
    <!-- 浮动动作按钮 -->
    <a href="#" class="floating-button color-pink">
        <i class="icon icon-plus"></i><!-- 按钮图标 -->
    </a>
    <!-- 可滚动的页面内容 -->
    <div class="page-content">
        <div class="content-block"></div>
    </div>
</div>
变形为Popover

如果你需要在触碰FAB后显示一个Popover,可以:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<div class="page navbar-fixed">
    <!-- open-popover 用于打开一个Popover -->
    <!-- floating-button-to-popover 在打开Popover时显示变形动画 -->
    <!-- data-popover指定目标Popover的CSS选择器 -->
    <a href="#" data-popover=".demo-popver" class="floating-button floating-button-to-popover open-popover color-purple">
        <i class="icon icon-plus"></i>
    </a>
</div>
<!-- Popover -->
<div class="popover demo-popover">
    <div class="popover-inner">
        <div class="list-block">
            <ul>
                <li>
                    <a href="#" class="item-content item-link">
                        <div class="item-inner">
                            <div class="item-title">Link</div>
                        </div>
                    </a>
                </li>
            </ul>
        </div>
    </div>
</div>
快速拨号(弹出一组按钮) 

可以在触碰FAB后,向上动画弹出一组按钮。再次触碰FAB,则按相反的动画隐藏这些按钮。你应当保证按钮组元素的数量在3-6之间:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<div class="page navbar-fixed">
    <div class="navbar">
        <div class="navbar-inner">
            <div class="center"></div>
        </div>
    </div>
    <!-- 快速拨号包装元素 -->
    <div class="speed-dial">
        <a href="#" class="floating-button">
            <!-- 第一个按钮:快速拨号按钮组处于关闭状态时显示 -->
            <i class="icon icon-plus"></i>
            <!-- 第二个按钮:快速拨号按钮组处于打开状态时显示 -->
            <i class="icon icon-close"></i>
        </a>
        <!-- 快速拨号按钮组 -->
        <div class="speed-dial-buttons">
            <!-- 第一个按钮(最下面) -->
            <a href="#">
                <i class="icon demo-icon-email"></i>
            </a>
            <!-- 第二个按钮 -->
            <a href="#">
                <i class="icon demo-icon-calendar"></i>
            </a>
            <!-- 第三个按钮 -->
            <a href="#">
                <i class="icon demo-icon-upload"></i>
            </a>
        </div>
    </div>
    <div class="page-content"></div>
</div>
表单

F7支持大量的表单元素类型,表单元素通常在列表视图中组织。

表单布局
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!-- 表单中的元素(字段)往往放置到一个列表视图中 -->
<form id="formx" class="list-block"> <!-- 有时也使用div元素 -->
    <ul>
        <li>
            <div class="item-content">
                <!-- 图标为可选元素 -->
                <div class="item-media">字段图标</div>
                <div class="item-inner">
                    <!-- 标签为可选元素 -->
                    <div class="item-title label">字段标签</div>
                    <!-- 表单元素的包装元素 -->
                    <div class="item-input">
                        <!-- 各类型字段的HTML标记存放在这里 -->
                    </div>
                </div>
            </div>
        </li>
    </ul>
</form>
支持的基本表单元素类型 

可以放在 <div class="item-input"> 内部的表单元素如下表:

元素类型 说明
各种文本元素 支持text、password、email、url、tel、date、number、datetime-local等类型:
XHTML
1
2
3
<div class="item-input">
    <input type="text">
</div>
选择菜单
XHTML
1
2
3
<div class="item-input">
    <select></select>
</div>
多行文本
XHTML
1
2
3
<div class="item-input">
    <textarea></textarea>
</div>

 注意,作为列表条目时,需要额外的对齐属性:

XHTML
1
2
3
4
5
6
7
8
9
10
<li class="align-top"><!-- 必须顶部对齐 -->
    <div class="item-content">
        <div class="item-inner">
            <div class="item-title label"></div>
            <div class="item-input">
                <textarea></textarea>
            </div>
        </div>
    </div>
</li>
可缩放多行文本 文本框的大小会随着其内容自动缩放:
XHTML
1
2
3
<div class="item-input">
    <textarea class="resizable"></textarea>
</div>
开关 需要额外的包装元素:
XHTML
1
2
3
4
5
6
<div class="item-input">
    <label class="label-switch"><!-- 额外的包装 -->
        <input type="checkbox">
        <div class="checkbox"></div>
    </label>
</div>
滑块 可以选择一个范围的值,需要额外的包装元素:
XHTML
1
2
3
4
5
<div class="item-input">
    <div class="range-slider"><!-- 额外的包装 -->
        <input type="range" min="0" max="100" step="0.1">
    </div>
</div>
基本表单元素完整示例

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
<form id="formx" class="list-block">
    <ul>
        <!-- 文本输入 -->
        <li>
            <div class="item-content">
                <div class="item-media">
                    <i class="icon icon-form-name"></i>
                </div>
                <div class="item-inner">
                    <div class="item-title label">Name</div>
                    <!-- 普通文本框 -->
                    <div class="item-input">
                        <input type="text" placeholder="Your name">
                    </div>
                </div>
            </div>
        </li>
        <li>
            <div class="item-content">
                <div class="item-media">
                    <i class="icon icon-form-email"></i>
                </div>
                <div class="item-inner">
                    <div class="item-title label">E-mail</div>
                    <div class="item-input">
                        <!-- 电子邮件 -->
                        <input type="email" placeholder="E-mail">
                    </div>
                </div>
            </div>
        </li>
        <!-- 下拉选择菜单 -->
        <li>
            <div class="item-content">
                <div class="item-media">
                    <i class="icon icon-form-gender"></i>
                </div>
                <div class="item-inner">
                    <div class="item-title label">Gender</div>
                    <div class="item-input">
                        <select>
                            <option>Male</option>
                            <option>Female</option>
                        </select>
                    </div>
                </div>
            </div>
        </li>
        <!-- 日期控件 -->
        <li>
            <div class="item-content">
                <div class="item-media">
                    <i class="icon icon-form-calendar"></i>
                </div>
                <div class="item-inner">
                    <div class="item-title label">Birth date</div>
                    <div class="item-input">
                        <input type="date" placeholder="Birth day" value="2014-04-30">
                    </div>
                </div>
            </div>
        </li>
        <!-- 开关 -->
        <li>
            <div class="item-content">
                <div class="item-media">
                    <i class="icon icon-form-toggle"></i>
                </div>
                <div class="item-inner">
                    <div class="item-title label">Switch</div>
                    <div class="item-input">
                        <label class="label-switch">
                            <input type="checkbox">
                            <div class="checkbox"></div>
                        </label>
                    </div>
                </div>
            </div>
        </li>
        <!-- 滑块 -->
        <li>
            <div class="item-content">
                <div class="item-media">
                    <i class="icon icon-form-settings"></i>
                </div>
                <div class="item-inner">
                    <div class="item-title label">Slider</div>
                    <div class="item-input">
                        <div class="range-slider">
                            <input type="range" min="0" max="100" value="50" step="0.1">
                        </div>
                    </div>
                </div>
            </div>
        </li>
        <!-- 多行文本 -->
        <li class="align-top">
            <div class="item-content">
                <div class="item-media">
                    <i class="icon icon-form-comment"></i>
                </div>
                <div class="item-inner">
                    <div class="item-title label">Textarea</div>
                    <div class="item-input">
                        <textarea></textarea>
                    </div>
                </div>
            </div>
        </li>
    </ul>
</form>
复选框组/单选框组

这是一个列表视图的扩展,可用于创建复选框/单选框的分组。

复选框组
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<div class="list-block">
    <ul>
        <!-- 第一个复选框 -->
        <li>
            <!-- 列表条目的内容必须是label元素,且添加样式类label-checkbox -->
            <label class="label-checkbox item-content">
                <!-- input必须是第一个元素 -->
                <input type="checkbox" name="my-checkbox" value="Books" checked="checked"><!-- 默认选中 -->
                <!-- 图标 -->
                <div class="item-media">
                    <i class="icon icon-form-checkbox"></i>
                </div>
                <!-- 文本 -->
                <div class="item-inner">
                    <div class="item-title">Books</div>
                </div>
            </label>
        </li>
        <!-- 第二个复选框 -->
        <li>
            <label class="label-checkbox item-content">
                <input type="checkbox" name="my-checkbox" value="Movies">
                <div class="item-media">
                    <i class="icon icon-form-checkbox"></i>
                </div>
                <div class="item-inner">
                    <div class="item-title">Movies</div>
                </div>
            </label>
        </li>
    </ul>
</div>
单选框组

Material主题支持额外的图标,iOS主题则不支持图标:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<div class="list-block">
    <ul>
        <!-- 第一个单选框 -->
        <li>
            <!-- 列表条目的内容必须是label元素,且添加样式类label-radio -->
            <label class="label-radio item-content">
                <!-- input必须是第一个元素 -->
                <input type="radio" name="my-radio" value="Books" checked="checked"><!-- 默认选中 -->
                <!-- 图标,仅Material主题支持 -->
                <div class="item-media">
                    <i class="icon icon-form-radio"></i>
                </div>
                <div class="item-inner">
                    <div class="item-title">Books</div>
                </div>
            </label>
        </li>
        <!-- 第二个单选框 -->
        <li>
            <label class="label-radio item-content">
                <input type="radio" name="my-radio" value="Movies">
                <div class="item-inner">
                    <div class="item-title">Movies</div>
                </div>
            </label>
        </li>
    </ul>
</div>
与媒体列表视图联用

复选框组、单选框组可以和媒体列表视图一起工作,展现更丰富的内容。下面是一个示例:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<div class="content-block-title">你最喜爱的歌曲是?</div>
<div class="list-block media-list">
    <ul>
        <li>
            <label class="label-radio item-content">
                <input type="radio" name="my-radio" checked>
                <div class="item-media">
                    <img src="..." width="80">
                </div>
                <div class="item-inner">
                    <div class="item-title-row">
                        <div class="item-title">黄色潜水艇</div>
                        <div class="item-after">$15</div>
                    </div>
                    <div class="item-subtitle">披头士</div>
                    <div class="item-text">披头士乐队60年代的一首著名歌曲</div>
                </div>
            </label>
        </li>
    </ul>
</div>
智能选择(Smart Select)

使用智能选择,并结合复选框组/单选框组,你可以轻易的把常规的下拉菜单(select) 转换为动态页面。在Native的iOS应用中,经常可以看到类似的UI特性。

智能选择的基本布局
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<form class="list-block">
    <ul>
        <!-- 第一个智能选择组件 -->
        <li>
            <!-- 需要额外的 "smart-select" 样式类 -->
            <a href="#" class="item-link smart-select">
                <select name="fruits">
                    <option value="apple" selected>苹果</option>
                    <option value="pineapple">橘子</option>
                </select>
                <!-- 在列表视图中显示的内容 -->
                <div class="item-content">
                    <div class="item-inner">
                        <!-- 文本 -->
                        <div class="item-title">水果</div>
                        <!-- 哪个菜单选项处于选中状态 -->
                        <div class="item-after">苹果</div>
                    </div>
                </div>
            </a>
        </li>
        <!-- 第二个智能选择组件 -->
    </ul>
</form>

注意智能选择只能在已初始化的视图中使用。 

单搜索栏的智能选择
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div class="list-block">
    <ul>
        <!--
            带搜索栏的智能选择条目
            data-searchbar 为此智能选择启用搜索栏
            data-searchbar-placeholder 搜索框的占位符文本
            data-searchbar-cancel 取消按钮的文本
        -->
        <li>
            <a href="#" class="item-link smart-select" data-searchbar="true" data-searchbar-placeholder="Search fruits">
            </a>
        </li>
    </ul>
</div>
定制子页面的标题和返回链接 

默认的,智能选择子页面的标题与父页面一致,返回按钮的文本默认则由应用初始化参数 smartSelectBackText  指定。这些文本都可以定制:

XHTML
1
2
3
4
5
6
7
8
9
10
11
<div class="list-block">
    <ul>
        <!--
            data-page-title 子页面标题
            data-back-text 子页面返回按钮文本
        -->
        <li>
            <a href="#" class="item-link smart-select" data-page-title="美味的水果" data-back-text="返回"></a>
        </li>
    </ul>
</div>
在Popup中打开子页面

F7支持以Popup的方式打开智能选择组件,设置应用初始化参数 smartSelectOpenIn:'popup'  则默认所有智能选择均以Popup的方式打开。下面演示如何指定单个智能选择以Popup方式打开:

XHTML
1
2
3
4
5
6
7
8
<div class="list-block">
    <ul>
        <li>
            <!-- data-open-in设置为popup,则以弹窗方式打开智能选择 -->
            <a href="#" class="item-link smart-select" data-open-in="popup"> </a>
        </li>
    </ul>
</div>
以选取器(Picker)的方式打开子页面

F7还支持在选取器模态窗口,而不是页面中打开智能选择组件,设置应用初始化参数 smartSelectOpenIn:'picker'  则默认所有智能选择均以Picker的方式打开。下面演示如何指定单个智能选择以Picker方式打开:

XHTML
1
2
3
4
5
6
7
8
9
10
11
<div class="list-block">
    <ul>
        <li>
            <!--
                data-open-in设置为picker,则以选取器方式打开智能选择
                data-picker-height 指定选取器的高度
            -->
            <a href="#" class="item-link smart-select" data-open-in="picker" data-picker-height="200px"></a>
        </li>
    </ul>
</div>
为选项指定图标
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<a href="#" class="item-link smart-select">
    <!-- 在select元素上添加data-option-image、data-option-icon,为所有选项指定默认图标 -->
    <select name="fruits" data-option-image="">
        <!-- data-option-image 指定图标 -->
        <option value="apple" selected data-option-image="">苹果</option>
        <option value="pineapple" data-option-image="">菠萝</option>
        <!-- data-option-color 指定文本颜色 -->
        <option value="pear" data-option-color="orange" data-option-image>梨</option>
    </select>
    <div class="item-content">
        <div class="item-inner">
            <div class="item-title">水果</div>
        </div>
    </div>
</a>
多选和选项分组
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<div class="list-block">
    <ul>
        <li>
            <a href="#" class="item-link smart-select">
                <!-- multiple :表示支持多选 -->
                <!-- maxlength:指定最多选中的选项个数 -->
                <select name="car" multiple maxlength="3">
                    <!-- 使用optgroup,可以将选项分组,组名由label指定 -->
                    <optgroup label="日产">
                        <option value="honda" selected>本田</option>
                        <option value="lexus">雷克萨斯</option>
                        <option value="mazda">马自达</option>
                        <option value="nissan">尼桑</option>
                        <option value="toyota">丰田</option>
                    </optgroup>
                    <optgroup label="德产">
                        <option value="audi">奥迪</option>
                        <option value="bmw">宝马</option>
                        <option value="mercedes">奔驰</option>
                        <option value="volvo">沃尔沃</option>
                    </optgroup>
                </select>
                <div class="item-content">
                    <div class="item-inner">
                        <div class="item-title">汽车品牌</div>
                    </div>
                </div>
            </a>
        </li>
    </ul>
</div>
选择后自动关闭智能选择
XHTML
1
2
3
4
5
6
7
8
9
10
11
<div class="list-block">
    <ul>
        <li>
        <!-- 设置data-back-on-select="true" 则智能选择可以自动关闭 -->
            <a href="#" class="item-link smart-select" data-back-on-select="true">
                <select></select>
                <div class="item-content"></div>
            </a>
        </li>
    </ul>
</div>
与虚列表联用

如果选项特别多(例如1000个),则可以使用虚列表:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<div class="list-block">
    <ul>
        <li>
            <!--
                data-virtual-list="true" 使用虚列表
                data-virtual-list-height="55"设置虚列表单条目的高度为55px
            -->
            <a href="#" class="item-link smart-select" data-virtual-list="true" data-virtual-list-height="55">
                <select name="numbers">
                    <option value="1">1</option>
                    <option value="2">2</option>
                    ...
                    <option value="100000">100000</option>
                </select>
                <div class="item-content"></div>
            </a>
        </li>
    </ul>
</div>
为智能选择设置色彩主题

可以为智能选择页面、Popup设置主题:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
<div class="list-block">
    <ul>
        <li>
            <!-- data-navbar-theme="red" 设置导航栏为红色主题 -->
            <!-- data-form-theme="green" 设置表单为绿色主题 -->
            <a href="#" class="item-link smart-select" data-navbar-theme="red" data-form-theme="green">
                <select name="car"></select>
                <div class="item-content"></div>
            </a>
        </li>
    </ul>
</div>
设置selected的选项
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<div class="list-block">
    <ul>
        <li>
            <a href="#" class="item-link smart-select">
                <select name="fruits">
                    <option value="apple">Apple</option><!-- 被选中 -->
                    <option value="pineapple">Pineapple</option>
                </select>
                <div class="item-content">
                    <div class="item-inner">
                        <div class="item-title">Fruit</div>
                        <!-- 在item-after元素上设置smart-select-value,则其文本对应的选项自动选中 -->
                        <div class="item-after smart-select-value">Apple</div>
                    </div>
                </div>
            </a>
        </li>
    </ul>
</div>
与智能选择相关的JavaScript API 
方法 说明
app.smartSelectOpen()
JavaScript
1
2
3
4
5
/**
* 打开一个智能选择页面/弹窗/选取器
* @param smartSelect 目标.smart-select元素对应的HTMLElement或者CSS选择器
*/
function smartSelectOpen(smartSelect);
app.smartSelectAddOption()
JavaScript
1
2
3
4
5
6
7
/**
* 动态的为智能选择添加选项
* @param select HTML或者CSS选择器,对应select或者optgroup元素
* @param optionHTML 被插入的选项的完整HTML
* @param index 新选项插入的索引,如果不指定则插入到最后
*/
function smartSelectAddOption(select, optionHTML, index)
禁用表单元素

F7支持为任何元素添加“禁用”样式:

  1. disabled样式类:可以为任何元素添加禁用样式
  2. disabled属性:可以为表单元素添加禁用样式

被禁用的元素具有较低的不透明度,而且不接受任何touch/click事件。

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<div class="list-block">
    <ul>
        <!-- 此列表条目被禁用 -->
        <li class="item-content disabled">
            <div class="item-inner">
                <div class="item-title"></div>
            </div>
        </li>
        <!-- 此条目的表单元素被禁用 -->
        <li class="item-content">
            <div class="item-inner">
                <div class="item-input">
                    <!-- 禁用的元素 -->
                    <input type="text" name="name" disabled>
                </div>
            </div>
        </li>
    </ul>
</div>
表单数据读取/载入

F7提供了一些便利的方法,用来收集表单数据为JSON,或者读取JSON并设置表单元素的值。

方法 说明
app.formToJSON()
JavaScript
1
2
3
4
5
6
/**
* 收集表单字段的值,并组成一个JSON对象
* @param form 表单元素的HTMLElement或者CSS选择器
* @returns 返回JSON对象
*/
function formToJSON( form );

 注意:

  1. 只有具有name属性的input/select/textarea等元素,其值才会包含在结果JSON。name属性作为JSON字段的名称
  2. 复选框checkbox和多选的select,其值存储为数组
app.formFromJSON()
JavaScript
1
2
3
4
5
6
/**
* 使用JSON填充表单
* @param form 目标表单的HTMLElement或者CSS选择器
* @param formData 用来填充的JSON
*/
function formFromJSON(form, formData);
表单数据的本地存储

F7支持自动存储/加载表单数据,即使是Ajax页面也支持。要启用本地存储,只需要:

  1. 为表单添加额外的样式类:store-data
  2. 为表单设置id属性
  3. 为所有表单字段设置name属性,不设置的字段将被忽略

 JavaScript API不需要直接调用。下面是一个样例:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- 设置表单的id,添加store-data样式类 -->
<form id="my-form" class="list-block store-data">
    <ul>
        <li>
            <div class="item-content">
                <div class="item-inner">
                    <div class="item-title label">姓名</div>
                    <div class="item-input">
                        <!-- 确保表单元素具有name属性 -->
                        <input type="text" name="name" placeholder="请输入你的姓名">
                    </div>
                </div>
            </div>
        </li>
        <li>
    </ul>
</form>
本地存储如何工作
  1. 在监听到 pageInit 事件后,F7会调用 formFromJSON 函数,从HTML5的本地存储(Local Storage)中加载数据
  2. 在监听到表单元素的 change 事件后,F7会调用 formToJSON() 函数,存储最新的表单元素值到本地存储中

任何一个表单都具有自己的本地存储键,键命名规则为 localStorage.f7form-[formID] ,其中formID就是表单的id属性。本地存储的值是串行化后的JSON对象。

本地存储相关方法和事件

F7提供了一些API,可以用来管理表单的本地存储:

方法/事件 说明
app.formGetData(formId) 获得特定表单的本地存储,返回JSON对象
app.formDeleteData(formId) 删除特地表单的本地存储
formStoreData(formId, formJSON) 以formJSON替换特定表单的本地存储
⚡formFromJSON formFromJSON()方法被调用后触发
⚡formToJSON formToJSON()方法被调用后触发
基于XHR的表单提交

F7支持基于Ajax的自动表单提交,自动提交有两种方式

  1. 当用户点击submit按钮时,或者表单的submit事件被手工触发时
  2. 当用户修改表单字段值时,或者表单/表单元素的change事件被手工触发时
基于submit事件的自动提交
XHTML
1
2
3
4
5
6
7
<!--
添加ajax-submit样式类,则表单支持submit事件时自动提交
action 存放接受请求的地址
method 使用的HTTP方法
enctype HTML的内容类型(Content type)
-->
<form action="/save" method="GET" class="ajax-submit" enctype="application/x-www-form-urlencoded"></form>
基于change事件的自动提交 

与上面类似:

XHTML
1
<form action="/save" method="GET" class="ajax-submit-onchange"></form>
与XHR表单提交相关的事件
事件 说明
⚡submitted

这些事件的Target均为 <form class="ajax-submit"> 元素。分别在:

  1. 成功处理XHR请求后
  2. 在发送XHR请求前
  3. XHR请求处理失败后

触发。示例:

JavaScript
1
2
3
4
$$( 'form.ajax-submit' ).on( 'submitted', function( e ) {
    var xhr = e.detail.xhr; // 浏览器的XMLHttpRequest对象
    var data = e.detail.data; // Ajax响应的内容
} );
⚡beforeSubmit
⚡submitError
 页签(Tabs)

 使用页签,可以方便的在不同内容直接切换。

页签的布局
XHTML
1
2
3
4
5
6
7
<!-- 页签包装元素 -->
<div class="tabs">
    <!-- 页签,必须具有tab类,唯一的id,激活的(可见)页签添加active类 -->
    <div class="tab active" id="tab1">页签一的内容</div>
    <div class="tab" id="tab2">页签二的内容</div>
    <div class="tab" id="tab3">页签三的内容</div>
</div>
在页签之间切换
XHTML
1
2
3
4
5
6
<!-- 为链接添加tab-link类,则它可以用来打开页签  -->
<!-- href指定页签的id -->
<!-- active指定此链接的样式为激活的 -->
<a href="#tab1" class="tab-link active">页签一</a>
<a href="#tab2" class="tab-link">页签二</a>
<a href="#tab3" class="tab-link">页签三</a>
按钮组+页签的典型示例
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<div class="page-content">
    <div class="content-block">
        <!-- 按钮组,用于控制页签 -->
        <div class="buttons-row">
            <a href="#tab1" class="tab-link active button">Tab1</a>
            <a href="#tab2" class="tab-link button">Tab2</a>
            <a href="#tab3" class="tab-link button">Tab3</a>
        </div>
    </div>
    <!-- 页签-->
    <div class="tabs">
        <div id="tab1" class="tab active">
            <div class="content-block"></div>
        </div>
        <div id="tab2" class="tab">
            <div class="content-block"></div>
        </div>
        <div id="tab3" class="tab">
            <div class="content-block"></div>
        </div>
    </div>
</div>
一个链接打开多个页签

有时需要在点击链接时,打开(属于不同页签的)多个标签页,这时可以使用data-tab属性而不是href:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- 顶部页签 -->
<div class="tabs tabs-top">
    <div class="tab tab1 active">...</div>
    <div class="tab tab2">...</div>
</div>
<!-- 底部页签 -->
<div class="tabs tabs-bottom">
    <div class="tab tab1 active">...</div>
    <div class="tab tab2">...</div>
</div>
<div class="tab-links">
    <!-- data-tab指定需要显示的标签页的选择器,.tab1导致顶部、底部页签的第一个标签页同时显示 -->
    <a href="#" class="tab-link" data-tab=".tab1">Tab 1</a>
    <a href="#" class="tab-link" data-tab=".tab2">Tab 2</a>
</div>
启用页签动画

需要额外的包装元素:

XHTML
1
2
3
<div class="tabs-animated-wrap">
    <div class="tabs"></div>
</div>
通过滑动手势(Swipe)切换标签页 
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<div class="pages navbar-fixed">
    <div data-page="home" class="page with-subnavbar">
        <div class="navbar">
            <div class="navbar-inner">
                <div class="subnavbar">
                    <!-- 该例子把按钮组放在子导航栏中 -->
                    <div class="buttons-row">
                        <a href="#tab1" class="button active tab-link">Tab1</a>
                        <a href="#tab2" class="button tab-link">Tab2</a>
                    </div>
                </div>
            </div>
        </div>
        <!-- tabs-swipeable-wrap包装用于启用滑动手势 -->
        <div class="tabs-swipeable-wrap">
            <div class="tabs">
                <!-- 使用 page-content类,以便保持每个标签页的滚动位置 -->
                <div id="tab1" class="page-content tab active">
                    <div class="content-block"></div>
                </div>
                <div id="tab2" class="page-content tab">
                    <div class="content-block"></div>
                </div>
            </div>
        </div>
    </div>
</div>
页签相关方法和事件
方法/事件 说明
app.showTab(tab) 激活一个标签页,tab为标签页的HTMLElement或者CSS选择器
⚡show 该事件的Target为 <div class="tab"> ,当页签变得可见时触发,示例:
JavaScript
1
2
3
$$('#tab1').on('show', function () {
    app.alert('页签一已激活');
});
 Swiper Slider(幻灯片组件)

F7的幻灯片组件Swiper非常强大,支持灵活的配置。该组件已经发展为独立组件,可以不依赖于F7框架使用,并且用在桌面浏览器上也非常合适。

Swiper支持多种特性:

  1. 分页:默认显示一组小圆点,类似于iOS主屏幕下部的bullet,指示当前是第几张幻灯片
  2. 水平或者垂直方向切换,分页也相应的显示在底部/右侧
  3. 嵌套的幻灯片
  4. 同时显示多列幻灯片
  5. 同时显示多行幻灯片
  6. 显示左右侧的导航按钮
  7. 循环显示幻灯片
  8. 各种切换效果:淡入淡出、3D立方体、3D封面流、3D翻转效果
  9. 显示幻灯缩略图
  10. 键盘导航、鼠标中键导航
  11. 动态增减幻灯片数量
  12. 视差效果
  13. 以分数(1/10)、进度条等方式显示分页信息
  14. 支持图片延迟加载
幻灯片组件的HTML布局
简单幻灯片组件
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
<!-- 主容器,包含幻灯片、分页 -->
<div class="swiper-container">
    <!-- 幻灯片条目的额外包装元素 -->
    <div class="swiper-wrapper">
        <!-- 幻灯片条目,可以包含任意HTML -->
        <div class="swiper-slide">Slide 1</div>
        <div class="swiper-slide">Slide 2</div>
        <div class="swiper-slide">Slide 3</div>
    </div>
    <!-- 包含自动创建的分页小圆点,可选元素 -->
    <div class="swiper-pagination"></div>
</div>
哈希导航
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
<div class="swiper-container">
    <div class="swiper-wrapper">
        <!-- 通过data-hash设置幻灯片的哈希值 -->
        <div class="swiper-slide" data-hash="slide1">Slide 1</div>
        <div class="swiper-slide" data-hash="slide2">Slide 2</div>
    </div>
</div>
<script type="text/javascript">
var swiper = new Swiper('.swiper-container', {
    hashnav: true
})
</script>
图片和延迟加载 
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<div class="swiper-container">
    <div class="swiper-wrapper">
        <!-- 延迟加载的图片 -->
        <div class="swiper-slide">
            <img data-src="path/to/picture-1.jpg" class="swiper-lazy">
            <div class="swiper-lazy-preloader"></div>
        </div>
        <!-- 延迟加载的图片,可以使用data-srcset属性(视网膜屏,4x表示4个物理像素组成1个显示像素) -->
        <div class="swiper-slide">
            <img data-src="path/to/logo-small.png" data-srcset="path/logo/logo-large.png 2x" class="swiper-lazy">
            <div class="swiper-lazy-preloader"></div>
        </div>
        <!-- 延迟加载的背景图片 -->
        <div class="swiper-slide">
            <div data-background="path/to/picture-2.jpg" class="swiper-lazy">
                <div class="swiper-lazy-preloader"></div>
            </div>
        </div>
        <!-- 延迟加载的背景图片,设置在幻灯片元素上 -->
        <div data-background="path/to/picture-3.jpg" class="swiper-slide swiper-lazy">
            <div class="swiper-lazy-preloader"></div>
        </div>
    </div>
</div>
<script type="text/javascript">
var swiper = new Swiper('.swiper-container', {
    preloadImages: false,
    lazyLoading: true
});  
</script>
初始化幻灯片组件
通过HTML
XHTML
1
2
3
4
5
6
7
8
<!--
    只需为容器添加swiper-init类,即可通过HTML初始化幻灯片
    data-***用于指定初始化参数,必须把驼峰式大小写改为短横线小写风格
    亦可通过data-swiper,传递一个JSON字符串,以指定所有初始化参数
-->
<div class="swiper-container swiper-init" data-speed="400" data-space-between="40" data-pagination=".swiper-pagination">
    <div class="swiper-wrapper"></div>
</div>

下面的代码获得通过HTML初始化的幻灯片组件实例:

JavaScript
1
2
var swiper = $$('.swiper-container')[0].swiper;
swiper.slideNext(); //调用方法
通过JavaScript

初始化幻灯片,需要容器元素的DOM已经存在,因此需要在pageInit事件/回调中调用初始化函数:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* @param swiperContainer swiper-container元素的HTMLElement或者CSS选择器
* @param parameters 幻灯片初始化参数
* @return 已经初始化的幻灯片对象实例
*/
app.swiper(swiperContainer, parameters);
//另外一种方式
var swiper = new Swiper(swiperContainer, parameters);
//应用举例:
var mySwiper = app.swiper('.swiper-container', {
    speed: 400,
    spaceBetween: 100
});
幻灯片组件的初始化参数
参数 类型和默认值 说明
initialSlide number = 0 最初显示的幻灯片的索引
direction string = 'horizontal' 幻灯片的切换方向,还可以取值“vertical”
如果设置为vertical,则分页bullet显示在右侧而不是底部
speed number = 300 幻灯切换动画持续的毫秒数
width number 设置组件的宽高,这些选项会导致幻灯片组件失去响应式(Responsive)特性
height number
autoHeight boolean = false 如果设置为true,那么组件包装元素的高度将自动与当前幻灯片的高度一致
roundLengths boolean = false 如果设置为true,则自动舍入幻灯片的宽高为整数,避免某些屏幕上文本显示模糊
nested boolean = false 仅在嵌套的、且与父组件direction相同的幻灯组件上设置为true,以修正touch事件拦截
自动播放
autoplay number 自动播放间隔ms,如果不设置该参数,则禁用自动播放
autoplayStopOnLast boolean = false 是否在到达最后一张幻灯时停止播放,对循环模式无效
autoplayDisableOnInteraction boolean = true 是否在用户与组件交互时,停止自动播放
在交互结束后,自动播放会重新开始
CSS特效
effect string = 'slide' 幻灯片切换CSS特效,可以是:
  1. slide: 滑动
  2. fade: 淡入淡出
  3. cube: 3D立方体
  4. coverflow: 3D封面流
  5. flip: 3D翻转
fade object = 
JavaScript
1
2
3
{
    crossFade: false
}
淡入淡出特效的参数
cube object = 
JavaScript
1
2
3
4
5
6
{
  slideShadows: true,
  shadow: true,
  shadowOffset: 20,
  shadowScale: 0.94
}

3D立方体特效的参数,禁用阴影可以获得更好的性能

coverflow object = 
JavaScript
1
2
3
4
5
6
7
{
  rotate: 50,
  stretch: 0,
  depth: 100,
  modifier: 1,
  slideShadows : true
}
3D封面流特效的参数,禁用阴影可以获得更好的性能
flip object = 
JavaScript
1
2
3
4
{
  slideShadows : true
  limitRotation: true
}
3D翻转特效的参数,
视差效果
parallax boolean = false 如果启用,则可以在幻灯元素内使用parallaxed元素
幻灯片网格
spaceBetween number = 0 两张幻灯片之间的举例
slidesPerView number = 1
string = 'auto'
每个视图包含的幻灯片数量,即同时能够显示的幻灯片数量
设置为auto,并且loop: true,则同时需要设置loopedSlides参数
设置为auto,则与多行模式(slidesPerColumn 大于1)不兼容
slidesPerColumn number = 1 每一列显示幻灯片的数量,多行布局
slidesPerColumnFill string = 'column' 可选值column/row,指定幻灯片如何填充行
slidesPerGroup number = 1 指定几张幻灯片分为一组
centeredSlides boolean = false 如果设置为true,则当前幻灯片被居中显示
slidesOffsetBefore number = 0 在容器的开始处(所有幻灯片之前)添加额外的偏移量
slidesOffsetAfter number = 0 在容器的结束处(所有幻灯片之后)添加额外的偏移量
鼠标指针
grabCursor boolean = false 悬停在幻灯片上时,显示手状鼠标指针
触碰
touchEventsTarget string = 'container' 在哪个元素上(Target)监听touch事件,可以是:
  1. container:在.swiper-container元素上
  2. wrapper:在.swiper-wrapper元素上
touchAngle number = 45 可以触发移动操作的滑动操作的角度限制
simulateTouch boolean = true 设置为true,则支持鼠标拖拽模拟触碰滑动操作
shortSwipes boolean = true 是否启用短滑
longSwipes boolean = true 是否启用长滑
followFinger boolean = true 手指滑动时,幻灯片是否也跟着移动
onlyExternal boolean = false 如果设置为true,则只能通过API调用来切换幻灯片
threshold number = 0 触发幻灯片移动的最小滑动距离,单位px
touchMoveStopPropagation boolean = true 是否禁止touchmove事件的传播(propagation)
点击
preventClicks boolean = true 在滑动时,避免在链接上意外触发click事件
preventClicksPropagation boolean = true 在滑动时,禁止点击事件的传播
slideToClickedSlide boolean = false 如果设置为true,在某种幻灯片上点击,则切换至该幻灯片
滑动手势
allowSwipeToPrev boolean = true 是否允许向前(左/上)滑动
allowSwipeToNext boolean = true 是否允许向后(右/下)滑动
分页
pagination string / HTMLElement 分页内容的容器元素或者其CSS选择器
paginationType string = 'bullets'

分页显示方式:

  1. bullets 一排小圆点
  2. fraction 类似于1/10这样的数字
  3. progress 进度条
  4. custom 自定义
paginationHide boolean = true 是否允许通过点击分页容器,来切换分页的可见性
paginationClickable boolean = false 是否允许通过点击小圆点来切换到相应幻灯片,仅用于bullet
paginationElement string = 'span' 单个小圆点在什么HTML标记内显示,仅用于bullet
paginationBulletRender function(index, className) bullet类型的分页的渲染函数,示例:
JavaScript
1
2
3
4
5
function( index, className ) {
    return '<span class="' + className + '">' +
               ( index + 1 ) +
           '</span>';
}
paginationFractionRender function(swiper, currentClassName, totalClassName) fraction类型的分页的渲染函数,示例:
JavaScript
1
2
3
4
5
function ( swiper, currentClassName, totalClassName ) {
    return
    '<span class="' + currentClassName + '"></span>' +
    ' of ' + '<span class="' + totalClassName + '"></span>';
};
paginationProgressRender function(swiper, progressbarClass) progress类型的分页的渲染函数,示例:
JavaScript
1
2
3
function (swiper, progressbarClass) {
    return '<span class="' + progressbarClass + '"></span>';
}
paginationCustomRender function (swiper, current, total) custom类型的分页的渲染函数,示例:
JavaScript
1
2
3
function (swiper, current, total) {
    return current + ' of ' + total;
}
滚动条
scrollbar string / HTMLElement 滚动条的容器元素
scrollbarHide boolean = true 在结束用户交互后,是否自动隐藏滚动条
scrollbarDraggable boolean = false 是否允许拖拽滚动条
scrollbarSnapOnRelease boolean = false 是否滚动条后,是否立即确定幻灯片位置
键盘/滚轮
keyboardControl boolean = false 是否启用键盘导航,如果设置为true,那么可以用上下左右方向键进行幻灯片切换
mousewheelControl boolean = false 是否启用滚轮导航
mousewheelReleaseOnEdges boolean = false 如果设置为true,到达第一/最后一张幻灯片后,继续滚动滚轮时,允许页面滚动
mousewheelInvert boolean = false 是否翻转鼠标滚轮方向
mousewheelSensitivity number = 1 滚轮滚动速度的倍率
哈希导航
hashnav boolean = false 设置为true,则允许对幻灯片组件进行哈希导航
图片
preloadImages boolean = true 如果启用,那么组件会强制预加载所有图片
updateOnImagesReady boolean = true 如果设置为true,那么所有图片预加载完毕后,组件会重新初始化,需要preloadImages:true
lazyLoading boolean = false 设置为true则启用延迟加载,需要preloadImages:false
lazyLoadingInPrevNext boolean = false 设置相邻图片的延迟加载规则
第二个参数指定多远的相邻图片会被预加载,不得小于slidesPerView
lazyLoadingInPrevNextAmount number = 1
lazyLoadingOnTransitionStart boolean = false 默认的,组件会在切换动画结束后开始延迟的加载,设置为true,则动画开始时就加载
循环模式
loop boolean = false 设置为true,则循环播放幻灯片
loopAdditionalSlides number = 0 启用循环模式后,多少幻灯片被克隆显示
loopedSlides number = null 在循环模式中,如果同时指定了slidesPerView:'auto',则需要设置该参数
回调函数
runCallbacksOnInit boolean = true 是否在幻灯片组件初始化时执行onTransitionStart/End、onSlideChangeStart/End回调
onInit

function(swiper)

其中:

  1. swiper 幻灯片组件对象
组件初始化后立即执行
onSlideChangeStart 切换到其它幻灯片的动画开始时执行
onSlideChangeEnd 切换到其它幻灯片的动画结束后执行
onSlideNextStart 与前面类似,但是仅适用于向前切换时
onSlideNextEnd
onSlidePrevStart 与前面类似,但是仅适用于向后切换时
onSlidePrevEnd
onTransitionStart 在转换开始时执行
onTransitionEnd 在转换结束后执行
onTouchStart function(swiper, event) 用户触碰幻灯片时触发
onTouchMove 用户触碰幻灯片,并滑动手指时触发
onTouchMoveOpposite 用户触碰幻灯片,并以对立方向滑动手指时触发
所谓对立方向是指,如果组件direction是水平的,而手指滑动方向是垂直的
onSliderMove 用户触碰幻灯片,并滑动手指导致幻灯片移动时触发
onTouchEnd 用户放开手指后触发
onClick 用户点击幻灯片后触发,要求手指触碰屏幕至少300ms
onTap 用户轻点幻灯片后触发
onDoubleTap 用户连续两次轻点幻灯片后触发
onImagesReady function(swiper) 所有图片都加载完毕后触发
onProgress function(swiper, progress) 幻灯片显示进度变化时触发,progress是0-1之间的数字
onReachBeginning function(swiper) 幻灯片切换到起始位置(initial position)时触发
onReachEnd function(swiper) 幻灯片切换到起最后一张时触发
onDestroy function(swiper) 组件被销毁时触发
onAutoplay function(swiper) 类似于onSlideChangeStart,但是由自动播放触发
onAutoplayStart function(swiper) 自动播放开始时触发
onAutoplayStop function(swiper) 自动部分停止后触发
onLazyImageLoad function (swiper, slide, image) 开始延迟加载图片时触发
onLazyImageReady function (swiper, slide, image) 延迟加载的图片加载完毕后触发
CSS名字空间 
slideClass string = 'swiper-slide' 幻灯片的样式类名
slideActiveClass string = 'swiper-slide-active' 当前幻灯片的样式类名
slideVisibleClass string = 'swiper-slide-visible' 可见的幻灯片的样式类名
slideDuplicateClass string = 'swiper-slide-duplicate' 复制的幻灯片的样式类名
slideNextClass string = 'swiper-slide-next' 下一个幻灯片的样式类名
slidePrevClass string = 'swiper-slide-prev' 上一个幻灯片的样式类名
wrapperClass string = 'swiper-wrapper' 组件包装元素的样式类名
bulletClass string = 'swiper-pagination-bullet' bullet分页小圆点的类名
bulletActiveClass string = 'swiper-pagination-bullet-active' bullet分页当前小圆点的类名
paginationHiddenClass string = 'swiper-pagination-hidden' 隐藏分页区的类名
paginationCurrentClass string = 'swiper-pagination-current' 当前分页数值的类名
paginationTotalClass string = 'swiper-pagination-total' 总计分页数值的类名
paginationProgressbarClass string = 'swiper-pagination-progressbar' 分页进度条的类名
buttonDisabledClass string = 'swiper-button-disabled' 禁用按钮的类名
幻灯片组件的属性和方法
属性/方法 说明
array params 组件初始化参数对象
array container Dom7/jQuery元素集,container[0]为组件的容器元素
array wrapper Dom7/jQuery元素集,wrapper[0]为组件的Wrapper元素
array slides Dom7/jQuery元素集,所有幻灯片元素的集合
array bullets Dom7/jQuery元素集,所有小圆点的集合
number width 容器的宽度
number height 容器的高度
translate wrapper的当前translate值
number progress 当前播放进度,0-1之间
number activeIndex 当前活动幻灯片的索引
number previousIndex 前一个幻灯片的索引
boolean isBeginning 如果当前是第一张幻灯片,则为true
boolean  isEnd 如果当前是最后一张幻灯片,则为true
boolean autoplaying 如果当前处于自动播放模式,则为true
boolean animatingru 如果当前正在执行转换动画,则为true
object touches 包含触碰事件若干参数:startX、startY、currentX、currentY、diff
clickedIndex 最后一次被点击的幻灯片的索引
clickedSlide 最后一次被点击的幻灯片
slideNext(runCallbacks, speed)

执行转换动画,并切换到下一张、上一张、指定的幻灯片

  1. runCallbacks 是否执行回调
  2. speed 转换动画执行时间,ms
slidePrev(runCallbacks, speed)
slideTo(index, speed, runCallbacks)
update(updateTranslate)

更新布局和渲染,实际上是调用以下函数:

  1. updateContainerSize() 重新计算容器尺寸
  2. updateSlidesSize() 重新计算幻灯片数量及其偏移量
  3. updateProgress() 重新计算播放进度
  4. updatePagination() 重新计算分页布局并重渲染小圆点
  5. updateClasses() 更新幻灯片和小圆点的active/prev/next样式类

在手工添加/删除幻灯片后、隐藏/显示组件后、对组件进行DOM操作后应该调用此方法

onResize() 改变浏览器大小后该方法被调用
detachEvents() 移除所有事件监听器
attachEvents() 重新添加所有监听器
startAutoplay() 开始自动播放
stopAutoplay() 停止自动播放
destroy(deleteInstance, cleanupStyles) 销毁组件实例,移除所有监听器
deleteInstance  是否删除组件实例,默认true
cleanupStyles  是否清除自定义样式,默认false
appendSlide(slides) 附加新的幻灯片到组件的尾部、头部。示例:
JavaScript
1
2
3
4
5
swiper.appendSlide('<div class="swiper-slide">Slide 10"</div>')
swiper.appendSlide([
   '<div class="swiper-slide">Slide 10"</div>',
   '<div class="swiper-slide">Slide 11"</div>'
]);
prependSlide(slides)
removeSlide(slideIndex) 移除指定索引对应的幻灯片
removeAllSlides() 移除全部幻灯片
setWrapperTranslate(translate) 为Wrapper元素设置CSS转换的translate值
getWrapperTranslate() 获得Wrapper元素的CSS转换的translate值
on(callback, handler) 添加回调函数/事件监听器。示例:
JavaScript
1
2
3
swiper.on('slideChangeStart', function () {
    console.log('slide change start');
});
once(callback, handler) 添加一次性回调函数/事件监听器
off(callback) 移除指定回调/事件的全部处理函数
lockSwipeToNext() 禁止向前切换幻灯片
unlockSwipeToNext() 禁止向后切换幻灯片
lockSwipes() 禁止幻灯片切换
unlockSwipes() 允许幻灯片切换
disableMousewheelControl() 禁止滚轮控制
enableMousewheelControl() 启用滚轮控制
disableKeyboardControl() 禁止键盘控制
enableKeyboardControl() 启用键盘控制
照片浏览器(Photo Browser)

该组件模拟iOS系统照片浏览器的行为,用于展示图片/照片,支持缩放和平移操作。 

创建照片浏览器实例

 仅支持通过JavaScript API创建:

JavaScript
1
2
3
4
5
/**
* @param parameters 照片浏览器初始化参数
* @reutrn 已初始化的照片浏览器实例
*/
app.photoBrowser( parameters );
照片浏览器初始化参数
参数 类型和默认值 说明
photos array = [] 一个数组,元素可以是:
  1. URL字符串
  2. 对象,具有url(或者html)、caption属性
initialSlide number = 0 以幻灯片显示照片(photo slide)时,第一张显示的照片的索引
spaceBetween number = 20 幻灯片的间距
speed number = 300 幻灯片切换动画的时间,ms
zoom boolean = true 是否支持Zoom/Pan操作
maxZoom number = 3 最大缩放倍数
minZoom number = 1 最小缩放倍数
exposition boolean = true 是否在点击照片浏览器后,启用展览模式(exposition mode)
expositionHideCaptions boolean = false 在展览模式时是否隐藏标题
swipeToClose boolean = true 如果启用,上下滑动手指可以关闭照片浏览器
view View 如果使用page类型的照片浏览器,该参数指定页面所在的已初始化的视图
type string = 'standalone'

定义照片浏览器的打开方式:

  1. standalone 打开为overlay,以特定的转换效果
  2. popup 打开为popup
  3. page 插入新页面到视图,并加载此页面,在其中打开浏览器
loop boolean = false 是否循环播放幻灯片
theme string = 'light' 照片浏览器主题,可以设置为dark,深色
captionsTheme string 标题的主题,可以设置为dark或light,默认和theme一致
navbar boolean = true 是否显示照片浏览器的导航栏
toolbar boolean = true 是否显示照片浏览器的工具栏
backLinkText string = 'Close' 返回链接的文字
ofText string = 'of' 可以设置of的替换文本
延迟加载
lazyLoading boolean = false 是否启用照片延迟加载
lazyLoadingInPrevNext boolean = false 设置为true,则启用临近(左/右)照片的延迟加载
lazyLoadingOnTransitionStart boolean = false 是否在切换动画开始时即加载照片
模板
template string 照片浏览器的Template7模板
navbarTemplate string 导航栏的Template7模板
toolbarTemplate string 工具栏的Template7模板
photoTemplate string 单个照片元素的Template7模板
photoLazyTemplate string 单个延迟加载照片的Template7模板
objectTemplate string 单个object元素的Template7模板
captionTemplate string 单个标题元素的Template7模板
回调
onOpen function(photobrowser) 照片浏览器打开时执行
onClose function(photobrowser) 照片浏览器关闭时执行
onSwipeToClose function(photobrowser) 用户通过滑动手势关闭照片浏览器时执行
onSlideChangeStart function(swiper) 在动画开始前/结束后执行
onSlideChangeEnd function(swiper)
onTransitionStart function(swiper) 在转换开始前/结束后执行
onTransitionEnd function(swiper)
onClick function(swiper, event) 点击/触碰照片超过300ms后触发
onTap function(swiper, event) 轻触照片后触发
onDoubleTap function(swiper, event) 连续两次轻触照片后触发
onLazyImageLoad function(swiper, slide, image) 开始照片延迟加载前触发
onLazyImageReady function(swiper, slide, image) 照片延迟加载完毕后触发
照片浏览器属性和方法 
属性/方法 说明
swiper 包含已经初始化的幻灯片组件的(Swiper)实例
container 容器元素的Dom7元素
exposed 是否处于展览模式
activeSlideIndex 当前照片索引
params 所有初始化参数
open(index) 打开照片浏览器并切换到指定索引的照片,如果不指定index,则显示上一次打开的照片
close() 关闭照片浏览器
toggleZoom() 启用/禁用当前照片的缩放
toggleExposition() 启用/禁用展览模式
enableExposition() 启用展览模式
disableExposition() 禁用展览模式
照片浏览器模板

照片浏览器组件允许通过模板定制其UI

主模板(template)

其它模板都会嵌入到该模板中。

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<div class="photo-browser photo-browser-{{theme}}">
    <div class="view navbar-fixed toolbar-fixed">
        {{#unless material}}{{#if navbar}}
        navbarTemplate
        {{/if}}{{/unless}}
        <div class="page no-toolbar {{#unless navbar}}no-navbar{{/unless}} toolbar-fixed navbar-fixed" data-page="photo-browser-slides">
            {{#if material}}{{#if navbar}}
            navbarTemplate
            {{/if}}{{/if}}
            {{#if toolbar}}
            toolbarTemplate
            {{/if}}
            <div class="photo-browser-captions photo-browser-captions-{{js "this.captionsTheme || this.theme"}}">
                {{#each photos}}{{#if caption}}
                captionTemplate
                {{/if}}{{/each}}
            </div>
            <div class="photo-browser-swiper-container swiper-container">
                <div class="photo-browser-swiper-wrapper swiper-wrapper">
                    {{#each photos}}
                    {{#js_compare "this.html || ((typeof this === \'string\' || this instanceof String) && (this.indexOf(\'<\') >= 0 || this.indexOf(\'>\') >= 0))"}}
                        objectTemplate
                    {{else}}
                        {{#if @root.lazyLoading}}
                        photoLazyTemplate
                        {{else}}
                        photoTemplate
                        {{/if}}
                    {{/js_compare}}
                    {{/each}}
                </div>
            </div>
        </div>
    </div>
</div>        
导航栏模板(navbarTemplate)
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<div class="navbar">
    <div class="navbar-inner">
        <div class="left sliding">
            <!-- photo-browser-close-link 点击后会关闭照片浏览器,并且解除事件监听器 -->
            <a href="#" class="link close-popup photo-browser-close-link {{#unless backLinkText}}icon-only{{/unless}} {{js "this.type === \'page\' ? \'back\' : \'\'"}}">
                <i class="icon icon-back {{iconsColorClass}}"></i>
                {{#if backLinkText}}<span>{{backLinkText}}</span>{{/if}}
            </a>
        </div>
        <div class="center sliding">
            <!-- photo-browser-current 当前照片的索引 -->
            <span class="photo-browser-current"></span>
            <span class="photo-browser-of">{{ofText}}</span>  
            <!-- photo-browser-current 照片总数 -->
            <span class="photo-browser-total"></span>
        </div>
        <div class="right"></div>
    </div>
</div>  
工具栏模板(toolbarTemplate)
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
<div class="toolbar tabbar">
    <div class="toolbar-inner">
        <!-- 切换到前一张照片的按钮 -->
        <a href="#" class="link photo-browser-prev">
            <i class="icon icon-prev {{iconsColorClass}}"></i>
        </a>
        <!-- 切换到后一张照片的按钮 -->
        <a href="#" class="link photo-browser-next">
            <i class="icon icon-next {{iconsColorClass}}"></i>
        </a>
    </div>
</div>
照片模板(photoTemplate)
XHTML
1
2
3
4
5
<div class="photo-browser-slide swiper-slide">
    <span class="photo-browser-zoom-container">
        <img src="{{js "this.url || this"}}">
    </span>
</div>
延迟加载照片模板(photoLazyTemplate) 
XHTML
1
2
3
4
5
6
<div class="photo-browser-slide photo-browser-slide-lazy swiper-slide">
    <div class="preloader {{@root.preloaderColorClass}}">{{#if @root.material}}{{@root.materialPreloaderSvg}}{{/if}}</div>
    <span class="photo-browser-zoom-container">
        <img data-src="{{js " this.url || this"}}" class="swiper-lazy">
    </span>
</div>
对象元素模板(objectTemplate)
XHTML
1
<div class="photo-browser-slide photo-browser-object-slide swiper-slide">{{js "this.html || this"}}</div>
标题模板(captionTemplate) 
XHTML
1
2
3
<div class="photo-browser-caption" data-caption-index="{{@index}}">
    {{caption}}
</div>
自动完成(Autocomplete)

 F7提供了一个移动设备友好、为触碰操作优化的自动完成组件。

创建自动完成组件实例

只能通过JavaScript API创建:

JavaScript
1
2
3
4
5
/**
* @param parameters 初始化参数
* @return 已初始化的自动完成组件的实例
*/
app.autocomplete(parameters);
自动完成组件的初始化参数
参数 类型和默认值 说明
openIn string = 'page'

组件如何打开:

  1. page 页面
  2. popup 弹窗
  3. dropdown 下拉列表
source function
(autocomplete, query, render)

该函数执行搜索:

  1. autocomplete 组件实例
  2. query 查询文本
  3. render 渲染回调,必须传递匹配条目的数组给此回调

示例:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var allItems = [];
function source( autocomplete, query, render ) {
    var results = [];
    if ( query.length === 0 ) {
        // 无查询条件
        render( results );
        return;
    }
    //根据查询条件过滤数据
    for ( var i = 0; i < fruits.length; i++ ) {
        if ( allItems.indexOf( query ) >= 0 ) {
            results.push( fruits[i] );
        }
    }
    //调用渲染函数
    render( results );
}
limit number 自动完成显示条目的最大数量
preloader boolean = false 设置为true,则在自动完成的布局中添加预加载指示器(Preloader)
preloaderColor string 预加载指示器的颜色,可以是white/black
valueProperty string = 'id' 匹配条目的什么属性作为值(Value)使用
textProperty string = 'text' 匹配条目的什么属性作为显示值(Display value)使用
专用于Standalone模式(以page或popup打开组件)的参数
opener string/HTMLElement 链接的HTMLElement或CSS选择器,点击此链接后打开自动完成页面或者Popup
popupCloseText string = 'Close' Popup关闭文本
backText string = 'Back' 页面的后退文本
pageTitle string 页面的标题
searchbarPlaceholderText string = 'Search...' 搜索栏占位符文本
searchbarCancelText string = 'Cancel' 搜索栏取消按钮文本
notFoundText string = 'Nothing found' 无匹配条目条目时显示的文本
multiple boolean = false 是否允许选择多个条目
backOnSelect boolean = false 选中一个条目后立即关闭自动完成组件,仅用于单选模式
navbarTheme string 导航栏主题颜色
formTheme string 表单主题颜色
专用于下拉菜单模式的参数
input string/HTMLElement 与此自动完成组件相关的文本输入框
dropdownPlaceholderText string 下拉列表占位符文本
updateInputValueOnSelect boolean = true 选中一个条目后,自动更新文本输入框
expandInput boolean = false 如果设置为true,则列表视图中的item-input元素的宽度扩展为屏幕宽度
回调
onChange function (autocomplete, value) 自动完成值改变后,执行此回调:
  1. autocomplete 组件实例
  2. value 选中的条目
onOpen function (autocomplete) 自动完成组件打开时执行此回调
onClose function (autocomplete) 自动完成组件关闭时执行此回调
模板
navbarTemplate string Standalone模式导航栏模板
itemTemplate string Standalone模式表单条目(radio/checkbox)模板
dropdownTemplate string 下拉列表模板
dropdownItemTemplate string 下拉列表条目的模板
dropdownPlaceholderTemplate string 下拉列表占位符的模板
自动完成组件的方法和属性
方法/属性 说明
params 组件的初始化参数
value  选中条目的数组 
opened 组件是否处于打开状态 
dropdown 下拉列表的Dom7实例 
popup Popup(如果打开)的Dom7实例 
open()  打开组件 
close() 关闭组件 
showPreloader() 显示预加载提示符 
hidePreloader() 隐藏预加载提示符 
destroy() 销毁组件,解除所有事件监听器
自动完成组件的默认模板 

本节列出F7为自动完成组件提供的缺省模板,定制这些模板可以改变组件的外观。

navbarTemplate

导航栏模板:该模板用于Standalone模式。

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<div class="navbar {{#if navbarTheme}}theme-{{navbarTheme}}{{/if}}"><!-- 设置主题 -->
    <div class="navbar-inner">
        <div class="left sliding"><!-- 左侧,依据iOS/Material设置不同的按钮 -->
            {{#if material}}
            <a href="#" class="link {{#if inPopup}}close-popup{{else}}back{{/if}} icon-only">
              <i class="icon icon-back"></i>
            </a>
            {{else}}
            <a href="#" class="link {{#if inPopup}}close-popup{{else}}back{{/if}}">
                <i class="icon icon-back"></i>
                {{#if inPopup}}
                <span>{{popupCloseText}}</span>
                {{else}}
                <span>{{backText}}</span>
                {{/if}}
            </a>
            {{/if}}
        </div>
        <div class="center sliding">{{pageTitle}}</div><!-- 中间,显示页面标题 -->
        {{#if preloader}}
        <div class="right"><!-- 右侧,显示预加载提示符 -->
            <div class="autocomplete-preloader preloader {{#if preloaderColor}}preloader-{{preloaderColor}}{{/if}}"></div>
        </div>
        {{/if}}
    </div>
</div>
itemTemplate

列表条目模板:每个备选条目(列表视图的元素)使用的模板。

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<li>
    <label class="label-{{inputType}} item-content">
        <!-- 单/复选框,隐藏 -->
        <input type="{{inputType}}" name="{{inputName}}" value="{{value}}" {{#if selected}}checked{{/if}}>
        <!-- 图标和文本的布局,依主题而不同 -->
        {{#if material}}
            <div class="item-media">
                <i class="icon icon-form-{{inputType}}"></i>
            </div>
            <div class="item-inner">
                <div class="item-title">{{text}}</div>
            </div>
        {{else}}
            {{#if checkbox}}
            <div class="item-media">
                <i class="icon icon-form-checkbox"></i>
            </div>
            {{/if}}
            <div class="item-inner">
                <div class="item-title">{{text}}</div>
            </div>
        {{/if}}
    </label>
</li>
dropdownTemplate

下拉菜单外框使用的模板。

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div class="autocomplete-dropdown">
    <div class="autocomplete-dropdown-inner">
        <!-- 列表视图放在这里 -->
        <div class="list-block">
            <ul></ul>
        </div>
    </div>
    <!-- 预加载指示器 -->
    {{#if preloader}}
    <div class="autocomplete-preloader preloader {{#if preloaderColor}}preloader-{{preloaderColor}}{{/if}}">
      {{#if material}}{{materialPreloaderHtml}}{{/if}}
    </div>
    {{/if}}
</div>
dropdownItemTemplate

下拉菜单模式下,每个备选条目使用的模板。

XHTML
1
2
3
4
5
6
7
<li>
    <label class="{{#unless placeholder}}label-radio{{/unless}} item-content" data-value="{{value}}">
        <div class="item-inner">
            <div class="item-title">{{text}}</div>
        </div>
    </label>
</li>
dropdownPlaceholderTemplate

下拉菜单模式下,占位符文本使用的模板。

XHTML
1
2
3
4
5
6
7
<li class="autocomplete-dropdown-placeholder">
    <div class="item-content">
        <div class="item-inner">
            <div class="item-title">{{text}}</div>
        </div>
    </label>
</li>
应用举例
下拉菜单模式+Ajax
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<div class="list-block">
    <ul>
        <li class="item-content">
            <div class="item-title label">显示语言</div>
            <div class="item-input">
                <input type="text" placeholder="Language" id="autocomplete-dropdown-ajax">
            </div>
        </li>
    </ul>
</div>
<script type="text/javascript">
var autocompleteDropdownAjax = app.autocomplete( {
    input : '#autocomplete-dropdown-ajax',
    openIn : 'dropdown',
    preloader : true, // 异步获取数据,一般都显示预加载指示器
    valueProperty : 'id', // 对象的值属性
    textProperty : 'name', // 对象的显示值属性
    limit : 20, // 最多显示20条数据于下拉列表
    dropdownPlaceholderText : '请输入语言名称',
    expandInput : true, // 扩展输入框为100%宽度,Label隐藏
    source : function( autocomplete, query, render ) {
        var results = [];
        if ( query.length === 0 ) {
            render( results );
            return;
        }
        // 加载数据前,显示指示器
        autocomplete.showPreloader();
        // 执行异步请求
        $$.ajax( {
            url : 'autocomplete-languages.json',
            method : 'GET',
            dataType : 'json',
            data : {
                query : query
            },
            //获取服务器数据后的回调
            success : function( data ) {
                for ( var i = 0; i < data.length; i++ ) {
                    if ( data[i].name.toLowerCase().indexOf( query.toLowerCase() ) >= 0 ) results.push( data[i] );
                }
                // 隐藏指示器
                autocomplete.hidePreloader();
                // 异步的执行渲染函数
                render( results );
            }
        } );
    }
} );
</script>
选取器(Picker)

Picker提供了一些基础功能,利用这些功能,你可以很方便的定制UI风格与iOS类似的选取器。

Picker可以用作内联组件( inline component),也可以用作Overlay。在平板电脑上,Overlay的选取器自动被转换为Popover。

创建和访问选取器实例 

只能通过JavaScript API创建:

JavaScript
1
2
3
4
5
/**
* @param parameters 选取器初始化参数
* @return 已实例化的选取器实例
*/
app.picker(parameters);
获得内联选取器实例

对于通过内联(inline)方式创建的选取器,可以通过其HTML容器的属性获得选取器实例:

JavaScript
1
var picker = $$('.picker-inline')[0].f7Picker;
选取器(列)初始化参数
选取器初始化参数
参数 类型和默认值 说明
container HTMLElement/string 仅用于内联(inline)选取器,存放生成的选取器对象的容器的HTMLElement或者CSS选择器
input HTMLElement/string 与此选取器相关的input元素的HTMLElement或者CSS选择器
scrollToInput boolean = true 当打开选取器时,滚动视口(Viewport,即page-content)到input元素
inputReadOnly boolean = true 如果设置为true,则input元素被设置readonly属性
convertToPopover boolean = true 在大屏幕上(Pad)把模态选取器转换为Popover
onlyOnPopover boolean = false 如果设置为true,则选取器总是在Popover中打开
cssClass string 在模态选取器上设置的额外CSS类
closeByOutsideClick boolean = true 是否在点击外部区域后,自动关闭选取器
toolbar boolean = true 启用模态选取器工具栏
toolbarCloseText string = 'Done' 选取器工具栏上关闭按钮的文本
toolbarTemplate string = 
XHTML
1
2
3
4
5
6
7
8
9
10
<div class="toolbar">
  <div class="toolbar-inner">
    <div class="left"></div>
    <div class="right">
      <a href="#" class="link close-picker">
        {{closeText}}
      </a>
    </div>
  </div>
</div>
工具栏的Template7模板
rotateEffect boolean = false 是否启用3D滚动效果
momentumRatio boolean = false 对选取器进行触碰并滑动操作后,更大的值是否产生更多的momentum
updateValuesOnMomentum boolean = false 在momentum期间是否更新选取器和input的值
updateValuesOnTouchmove boolean = true 在触碰并滑动时,是否更新选取器和input的值
value array 初始值的数组,每个元素对应了选取器单个列的值
formatValue function (p, values, displayValues) 用于格式化input的值的函数,values/displayValues为两个数组,其索引为idx的元素,分别为当前选取器值第idx列的值/显示值
cols array 选取器的数据定义,为一个数组,其每个元素定义了选取器的单个列,元素格式为PO,符合“列参数”规定
onChange function (p, values, displayValues) 当选取器的值改变时该函数被调用。values/displayValues为两个数组,其索引为idx的元素,分别为当前选取器值第idx列的值/显示值
onOpen function (p) 选取器打开时,执行该回调
onClose function (p) 选取器关闭时,执行该回调
选取器列初始化参数
参数 类型和默认值 说明
values array 该列的值数组
displayValues array 该列的显示值数组
cssClass string 在列HTML容器上设置的额外CSS样式类
textAlign string 列文本的对齐方式,可以是left/center/right
width number 列宽度,单位px
divider boolean = false 作为分隔字符的列,不需要values/displays,例如用来隔开时间的冒号
content string 分隔字符(串)的内容
onChange function (p, value, displayValue) 列的值发生变化时调用此回调
选取器(列)属性和方法 
选取器属性和方法
属性/方法 说明
params 初始化参数
value 数组,选取器当前每列的值
displayValue 数组,选取器当前每列的显示值
opened 此选取器当前是否处于打开状态
inline 此选取器是否为内联的
cols 列对象的数组,每个元素都有自己的属性和方法(参见下表)。下面示例如何获得第一个列对象:
JavaScript
1
2
// 获取第一个列对象
var col = picker.cols[0];
container 选取器的HML容器的Dom7对象
setValue(values, duration)

设置选取器的值:

  1. values:数组,对应每个列的值
  2. duration:动画持续时间
open() 打开选取器
close() 关闭选取器
destroy() 销毁选取器实例,移除所有监听器
选取器列属性和方法 
属性/方法 说明
container 列HTML元素的Dom7对象
items 列条目HTML元素的Dom7对象
value 列的当前值
displayValue 列的当前显示值
activeIndex 列当前值在值列表中的索引
setValue(value, duration) 设置此列的当前值
replaceValues(values, displayValues) 替换此列的值/显示值列表
应用举例
双列联动选取器 

所谓联动,是指第一列的值改变后,第二列的值列表自动被替换: 

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<div class="content-block-title">联动示例</div>
<div class="list-block">
    <ul>
        <li>
            <div class="item-content">
                <div class="item-inner">
                    <div class="item-input">
                        <input type="text" placeholder="你的车型" readonly id="picker-dependent">
                    </div>
                </div>
            </div>
        </li>
    </ul>
</div>
<script type="text/javascript">
    var carVendors = {
        '日产' : [ '本田', '雷克萨斯', ',马自达', '尼桑', '丰田' ],
        '德产' : [ '奥迪', '宝马', '梅赛德斯', '沃尔沃' ],
        '美产' : [ '林肯', '富特', '别克', '凯迪拉克' ]
    };
    var pickerDependent = app.picker( {
        input : '#picker-dependent', // 关联的输入元素
        rotateEffect : true, // 3D转轮效果
        formatValue : function( picker, values ) {
            return values[1]; // 第二列的值,即汽车品牌为输出到input的值
        },
        cols : [ {
            // 第一列,汽车按生产国分类
            textAlign : 'left',
            values : [ '日产', '德产', '美产' ],
            // 在第一列值改变时,自动设置第二列的值列表,这是联动的关键
            onChange : function( picker, country ) {
                if ( picker.cols[1].replaceValues ) {
                    // 替换值列表
                    picker.cols[1].replaceValues( carVendors[country] );
                }
            }
        }, {
            values : carVendors['日产'],
            width : 160,
        }, ]
    } );
</script>
时间选取器

这是一个多列、内联的选取器实例:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<div class="content-block-title">内联选取器:日期-时间</div>
<div class="content-block">
<div style="padding:0; margin-right:-15px; width:auto" class="content-block-inner">
   <div style="margin:0" class="list-block">
     <ul style="border-top:none">
       <li>
         <div class="item-content">
           <div class="item-inner">
             <div class="item-input">
               <input type="text" placeholder="选取日期/时间" readonly id="picker-date">
             </div>
           </div>
         </div>
       </li>
     </ul>
   </div>
   <div id="picker-date-container"></div>
</div>
</div>
<script type="text/javascript">
    var today = new Date();
    var pickerInline = app.picker( {
        input : '#picker-date', //管理的input元素
        container : '#picker-date-container', //内联选取器的容器元素
        toolbar : false,
        rotateEffect : true,
        //默认值设置为今天
        value : [ today.getMonth(), today.getDate(), today.getFullYear(), today.getHours(), ( today.getMinutes() < 10 ? '0' + today.getMinutes() : today.getMinutes() ) ],
        onChange : function( picker, values, displayValues ) {
            //第二列,日期,需要依据月份的不同设置值列表
            var daysInMonth = new Date( picker.value[2], picker.value[0] * 1 + 1, 0 ).getDate();
            if ( values[1] > daysInMonth ) {
                picker.cols[1].setValue( daysInMonth );
            }
        },
        //格式化
        formatValue : function( p, values, displayValues ) {
            return displayValues[0] + ' ' + values[1] + ', ' + values[2] + ' ' + values[3] + ':' + values[4];
        },
    
        cols : [
        // 月份
        {
            values : ( '0 1 2 3 4 5 6 7 8 9 10 11' ).split( ' ' ),
            displayValues : ( 'January February March April May June July August September October November December' ).split( ' ' ),
            textAlign : 'left'
        },
        // 日期
        { values : [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 ] },
        // 年度
        {
            values : ( function() {
                var arr = [];
                for ( var i = 1950; i <= 2030; i++ ) { arr.push( i ); }
                return arr;
            } )(),
        },
        // 日期 时间的分隔符列,空格
        { divider : true,  content : '  ' },
        // 小时
        {
            values : ( function() {
                var arr = [];
                for ( var i = 0; i <= 23; i++ ) { arr.push( i ); }
                return arr;
            } )(),
        },
        // 小时:分钟的分隔符列,冒号
        { divider : true, content : ':' },
        // 分钟
        {
            values : ( function() {
                var arr = [];
                for ( var i = 0; i <= 59; i++ ) { arr.push( i < 10 ? '0' + i : i ); }
                return arr;
            } )(),
        } ]
    } );
</script>
日历(日期选取器)

F7提供的日历(Calendar)组件为触碰操作优化,可以方便的处理日期字段。与一般的选取类似,日历支持内联、overlay展示方式。

创建和访问日历实例

只能通过JavaScript API创建日历实例:

JavaScript
1
2
3
4
5
6
7
8
/**
* @param parameters 日历初始化参数
* @return 已初始化的日历对象实例
*/
app.calendar(parameters);
 
// 访问内联日历组件的实例
var calendar = $$('.calenadr-inline')[0].f7Calendar;
日历初始化参数
参数 类型和默认值 说明
container HTMLElement/string 同普通选取器组件
input HTMLElement/string
scrollToInput boolean = true
inputReadOnly boolean = true
convertToPopover boolean = true
onlyOnPopover boolean = false
cssClass string
closeByOutsideClick boolean = true
toolbar boolean = true
toolbarCloseText string = 'Done'
toolbarTemplate string = 
XHTML
1
2
3
4
5
6
<div class="toolbar">
  <div class="toolbar-inner">
    {{monthPicker}}
    {{yearPicker}}
  </div>
</div>
value array 初始被选中的日期的数组,每个元素为选中的日期(Date)对象
disabled DateRange,用于表示日期的范围,可以用数组、函数、对象三种形式表示:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//数组方式,指定起止日期
var range = [
    new Date(2015, 10, 10),
    new Date(2015, 10, 11)
];
 
//函数方式,对任意日期返回true/false
//true则包含在Range内
function range( date ) {
    if ( date.getFullYear() === 2015
         && date.getMonth() === 10 ) {
        return true;
    }
    else {
        return false;
    }
}
 
//对象方式
range = {
    from: new Date(2015, 9, 1),
    to: new Date(2015, 11, 31)
}
额外的被禁用的日期范围
events 具有事件的日期范围,这些日期数字的下面具有额外的小圆点标记
rangesClasses array 用于为日期范围添加额外的样式。为一数组,每个元素均为:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
{cssClass:string, range: DateRange}
 
//举例:
var calendar = app.calendar( {
    rangesClasses : [ {
        cssClass : 'day-holiday',
        range : {
            from : new Date( 2016, 0, 1 ),
            to : new Date( 2016, 0, 10 )
        }
    } ]
} );
formatValue function (p, values) 格式化日期,输出到input元素。函数的返回值必须是一个string,values为Date对象的数组
monthNames array = 
['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August' , 'September' , 'October', 'November', 'December']
所有月份的名称
monthNamesShort array = 
['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
所有月份的简称
dayNames array = 
['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
所有DOW的名称
dayNamesShort array = 
['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
所有DOW的检查
updateValuesOnTouchmove boolean  = true 在触碰被移动后,更新选取器和input的值
firstDay number = 1 一周的第一天,默认1即星期一
weekendDays array = [0, 6] 周末是那几天,默认周六、日
dateFormat string = 'yyyy-mm-dd' 日期格式:
  1. yyyy 四位年份
  2. yy 二位年份
  3. mm 二位月份
  4. m 月份
  5. MM 完整月份名称
  6. M 月份短名称
  7. dd 二位日期
  8. d 日期
  9. DD 完整DOW名称
  10. D  DOW简称
multiple boolean = false 允许选择多个日期值
rangePicker boolean = false 允许范围选择,与multiple不兼容
direction string = 'horizontal' 月份布局方向,可以是vertical/horizontal
minDate Date = null 允许的最小日期
maxDate Date = null 允许的最大日期
touchmove boolean = true 触碰并滑动时是否切换日历月份
animate boolean = true 启用动画效果
closeOnSelect boolean = false 选择后是否立即关闭日历
weekHeader boolean = true 是否显示DOW头,以DOW简称
monthPicker boolean = true 是否在工具栏显示月份选择器
monthPickerTemplate string = 
XHTML
1
2
3
4
5
6
7
8
9
<div class="picker-calendar-month-picker">
    <a href="#" class="link icon-only picker-calendar-prev-month">
        <i class="icon icon-prev"></i>
    </a>
    <span class="current-month-value"></span>
    <a href="#" class="link icon-only picker-calendar-next-month">
        <i class="icon icon-next"></i>
    </a>
</div>  
月份选择器的Template7模板
yearPicker boolean = true 是否在工具栏显示年度选择器
yearPickerTemplate string = 
XHTML
1
2
3
4
5
6
7
8
9
<div class="picker-calendar-year-picker">
    <a href="#" class="link icon-only picker-calendar-prev-year">
        <i class="icon icon-prev"></i>
    </a>
    <span class="current-year-value"></span>
    <a href="#" class="link icon-only picker-calendar-next-year">
        <i class="icon icon-next"></i>
    </a>
</div>
年度选择器的Template7模板
onChange function (p, values, displayValues) 选取器的值改变后,执行该回调
onMonthAdd function (p, monthContainer) 新的月份对应的HTML加入到DOM后执行
onDayClick function (p, dayContainer, year, month, day) 用户点击/选择任意日期后执行
onMonthYearChangeStart function (p, year, month) 在动画切换月份开始时执行
onMonthYearChangeEnd function (p, year, month) 在动画切换月份结束时执行
onOpen function (p) 在打开日历时执行
onClose function (p) 在关闭日历时执行
日历属性与方法
属性/方法 说明
params 日历的初始化参数
value 数组,包含当前选中的日期对象
opened 如果日历当前处于打开状态,则为true
inline 如果当前日历是内联的,则为true
container 日历组件的HTML容器,Dom7对象
setValue(values) 设置新的,被选择的日期,支持入参数组
nextMonth(duration) 在duration毫秒后,动画至下一月
prevMonth(duration) 在duration毫秒后,动画至上一月
nextYear() 动画至下一年
prevYear() 动画至上一年
setYearMonth(year, month, duration) 在duration毫秒后,动画至year年month月
open() 打开日历
close() 关闭日历
destroy() 销毁日历实例并移除事件监听器
下拉以刷新

下拉刷新是很多移动应用使用的组件, 用于触发页面内容更新。

下拉刷新布局

可以集成下拉刷新功能到页面中:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
<div class="page">
    <!-- page-content元素需要添加额外的pull-to-refresh-content类 -->
    <!-- data-ptr-distance为触发刷新动作的下拉距离,单位像素,默认44 -->
    <div class="page-content pull-to-refresh-content" data-ptr-distance="55">
        <!-- 隐藏的下拉刷新层,包含一个预加载提示符和一个箭头图标 -->
        <div class="pull-to-refresh-layer">
            <div class="preloader"></div>
            <div class="pull-to-refresh-arrow"></div>
        </div>
        <!-- 常规页面内容 -->
        <div class="list-block"></div>
    </div>
</div>
下拉刷新组件的事件序列
  1. 当用户下拉pull-to-refresh-content元素时,该元素获得额外样式类:pull-down
  2. 当用户下拉pull-to-refresh-content元素超过data-ptr-distance后,该元素获得额外样式类:pull-up。默认的,箭头图标的方向将反转,提示用户可以释放并刷新
  3. 当处于pull-up状态时,用户释放下拉手势,pull-to-refresh-layer元素获得额外样式类:refreshing。默认的箭头图标隐藏,预加载提示符显示
下拉刷新相关事件
事件 说明
⚡pullstart

这些事件的Target均为 <div class="pull-to-refresh-content"> 元素,触发时机分别为:

  1. 开始下拉pull-to-refresh-content元素时
  2. 在移动pull-to-refresh-content元素的过程中
  3. 释放pull-to-refresh-content元素时
  4. 组件进入刷新(refreshing)状态时
  5. 刷新完毕后,组件返回初始状态时,该事件在 pullToRefreshDone() 被调用后触发
⚡pullmove
⚡pullend
⚡refresh
⚡refreshdone
下拉刷新相关方法
方法 说明
app.pullToRefreshDone(ptrContent)

ptrContent为pull-to-refresh-content元素对应的HTMLElement或者CSS选择器,下同

当刷新动作完成后,调用此方法可以重置组件,用户可以再次下拉刷新

app.pullToRefreshTrigger(ptrContent)  手工触发下拉刷新操作
app.destroyPullToRefresh(ptrContent) 禁用页面上的下拉刷新组件
app.initPullToRefresh(ptrContent) 启用页面上的下拉刷新组件
无限滚动

 当页面滚动到接近底部时,利用无限滚动组件可以加载额外的内容或者触发特定的动作。

无限滚动布局

可以在任何可滚动容器上添加额外样式类,来启用无限滚动组件。例如:

XHTML
1
2
3
4
5
6
7
<div class="page">
    <!--
        infinite-scroll 启用无限滚动功能的样式类
        data-distance 离底部多远时,触发无限滚动事件,单位像素,默认50px
    -->
    <div class="page-content infinite-scroll" data-distance="100"></div>
</div>
在顶部进行无限滚动

默认的,页面滚动到底部时触发无限滚动,如果要在滚动到顶部时触发无限滚动,可以:

XHTML
1
2
3
4
<div class="page">
    <!-- 添加额外的样式类infinite-scroll-top -->
    <div class="page-content infinite-scroll infinite-scroll-top"></div>
</div>
无限滚动相关方法和事件
方法/事件 说明
⚡infinite 该事件的Target为 <div class="page-content infinite-scroll"> 元素。当页面滚动到里底部还有data-distance时触发
app.attachInfiniteScroll(container) 添加/移除无限滚动事件监听器到infinite-scroll元素对应的HTMLElement或者CSS选择器
app.detachInfiniteScroll(container)
 通知(Notifications)

使用通知组件,可以实现类似于iOS消息推送(Push)的效果。

通知的布局

通知仅仅是媒体列表视图的特例,通常不需要手工处理其布局(JavaScript API会自动创建)。当你创建了通知组件后,F7会自动添加notifications元素到body中:

XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<body>
    <!-- 随通知组件自动添加的新元素,为一个媒体列表视图 -->
    <div class="notifications list-block media-list">
        <ul>
            <!-- 每一行对应一个通知条目 -->
            <li class="notification-item">
                <div class="item-content">
                    <div class="item-media">
                        <!-- 通知媒体内容 -->
                    </div>
                    <div class="item-inner">
                        <div class="item-title-row">
                            <div class="item-title">
                                <!-- 通知标题 -->
                            </div>
                            <div class="item-after">
                                <!-- 通知关闭图标 -->
                                <a href="#" class="close-notification"></a>
                            </div>
                        </div>
                        <div class="item-subtitle">
                            <!-- 通知子标题 -->
                        </div>
                        <div class="item-text">
                            <!-- 通知消息文本 -->
                        </div>
                    </div>
                </div>
            </li>
 
        </ul>
    </div>
</body>
通知相关方法 
方法 说明
app.addNotification(parameters) 以初始化参数parameters添加/显示一个通知
app.closeNotification(notificationElement)  关闭一个通知,notificationElement为对应的HTMLElement或者CSS选择器
通知初始化参数 
参数 类型和默认值 说明
title string 仅iOS主题。通知的标题,默认值为应用初始化参数notificationTitle
subtitle string 仅iOS主题。通知子标题,默认值为应用初始化参数notificationSubtitle
media string 仅iOS主题。媒体元素,指定图标/图片的HTML字符串,默认值为应用初始化参数notificationMedia
hold number 在多少ms后自动关闭通知,默认值为应用初始化参数notificationHold
closeIcon boolean = true 仅iOS主题。是否显示关闭图标
button object

Material通知按钮,支持三个属性:

  1. text 按钮文本
  2. color 按钮颜色名称
  3. close 点击后是否关闭通知
closeOnClick boolean = false 是否在点击后自动关闭通知
additionalClass string 在通知元素上添加的额外样式类,用于外观定制
custom string 用于定制通知的HTML布局
onClick function 通知被点击后执行的回调
onClose function 通知被关闭后执行的回调
 图片延迟加载(Lazy Load)

该组件用于推迟页面中图片的加载,仅当页面滚动到图片所在位置时,才触发加载动作。该功能可以提升页面加载速度、滚动性能,并降低流量消耗。

要延迟加载的图片必须位于可滚动的页面( <div class="page-content"> )内。

用法
普通图片
XHTML
1
2
3
4
<div class="page-content">
    <!-- 使用data-src代替src,并且添加lazy样式类 -->
    <img data-src="path/to/image.jpg" class="lazy">
</div>
背景图片
XHTML
1
2
3
4
<div class="page-content">
    <!-- data-background使用指定背景图片 -->
    <div data-background="path/to/image.jpg" class="lazy"></div>
</div>
淡入效果

 当延迟加载的图片成功加载后,可以淡入的显示:

XHTML
1
2
3
4
<div class="page-content">
    <img data-src="path/to/image.jpg" class="lazy lazy-fadein">
    <div data-background="path/to/image.jpg" class="lazy lazy-fadein"></div>
</div>
手工触发加载 

手工触发lazy事件,即可立即加载目标图片:

JavaScript
1
2
$$('img.lazy').trigger('lazy');
$$('div.lazy').trigger('lazy');
← CLion知识集锦
IntelliJ IDEA知识集锦 →
1 Comment On This Topic
  1. 回复
    wuweitiandian
    2016/05/30

    赞!!!

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Related Posts

  • Framework7知识集锦
  • 基于AngularJS开发Web应用
  • HTTP知识集锦
  • HTML5视频监控技术预研
  • 基于Eclipse的Node.js开发

Recent Posts

  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
  • A Comprehensive Study of Kotlin for Java Developers
  • 背诵营笔记
  • 利用LangChain和语言模型交互
  • 享学营笔记
ABOUT ME

汪震 | Alex Wong

江苏淮安人,现居北京。目前供职于腾讯云,专注容器方向。

GitHub:gmemcc

Git:git.gmem.cc

Email:gmemjunk@gmem.cc@me.com

ABOUT GMEM

绿色记忆是我的个人网站,域名gmem.cc中G是Green的简写,MEM是Memory的简写,CC则是我的小天使彩彩名字的简写。

我在这里记录自己的工作与生活,同时和大家分享一些编程方面的知识。

GMEM HISTORY
v2.00:微风
v1.03:单车旅行
v1.02:夏日版
v1.01:未完成
v0.10:彩虹天堂
v0.01:阳光海岸
MIRROR INFO
Meta
  • Log in
  • Entries RSS
  • Comments RSS
  • WordPress.org
Recent Posts
  • Investigating and Solving the Issue of Failed Certificate Request with ZeroSSL and Cert-Manager
    In this blog post, I will walk ...
  • A Comprehensive Study of Kotlin for Java Developers
    Introduction Purpose of the Study Understanding the Mo ...
  • 背诵营笔记
    Day 1 Find Your Greatness 原文 Greatness. It’s just ...
  • 利用LangChain和语言模型交互
    LangChain是什么 从名字上可以看出来,LangChain可以用来构建自然语言处理能力的链条。它是一个库 ...
  • 享学营笔记
    Unit 1 At home Lesson 1 In the ...
  • K8S集群跨云迁移
    要将K8S集群从一个云服务商迁移到另外一个,需要解决以下问题: 各种K8S资源的迁移 工作负载所挂载的数 ...
  • Terraform快速参考
    简介 Terraform用于实现基础设施即代码(infrastructure as code)—— 通过代码( ...
  • 草缸2021
    经过四个多月的努力,我的小小荷兰景到达极致了状态。

  • 编写Kubernetes风格的APIServer
    背景 前段时间接到一个需求做一个工具,工具将在K8S中运行。需求很适合用控制器模式实现,很自然的就基于kube ...
  • 记录一次KeyDB缓慢的定位过程
    环境说明 运行环境 这个问题出现在一套搭建在虚拟机上的Kubernetes 1.18集群上。集群有三个节点: ...
  • eBPF学习笔记
    简介 BPF,即Berkeley Packet Filter,是一个古老的网络封包过滤机制。它允许从用户空间注 ...
  • IPVS模式下ClusterIP泄露宿主机端口的问题
    问题 在一个启用了IPVS模式kube-proxy的K8S集群中,运行着一个Docker Registry服务 ...
  • 念爷爷
      今天是爷爷的头七,十二月七日、阴历十月廿三中午,老人家与世长辞。   九月初,回家看望刚动完手术的爸爸,发

  • 6 杨梅坑

  • liuhuashan
    深圳人才公园的网红景点 —— 流花山

  • 1 2020年10月拈花湾

  • 内核缺陷触发的NodePort服务63秒延迟问题
    现象 我们有一个新创建的TKE 1.3.0集群,使用基于Galaxy + Flannel(VXLAN模式)的容 ...
  • Galaxy学习笔记
    简介 Galaxy是TKEStack的一个网络组件,支持为TKE集群提供Overlay/Underlay容器网 ...
TOPLINKS
  • Zitahli's blue 91 people like this
  • 梦中的婚礼 64 people like this
  • 汪静好 61 people like this
  • 那年我一岁 36 people like this
  • 为了爱 28 people like this
  • 小绿彩 26 people like this
  • 彩虹姐姐的笑脸 24 people like this
  • 杨梅坑 6 people like this
  • 亚龙湾之旅 1 people like this
  • 汪昌博 people like this
  • 2013年11月香山 10 people like this
  • 2013年7月秦皇岛 6 people like this
  • 2013年6月蓟县盘山 5 people like this
  • 2013年2月梅花山 2 people like this
  • 2013年淮阴自贡迎春灯会 3 people like this
  • 2012年镇江金山游 1 people like this
  • 2012年徽杭古道 9 people like this
  • 2011年清明节后扬州行 1 people like this
  • 2008年十一云龙公园 5 people like this
  • 2008年之秋忆 7 people like this
  • 老照片 13 people like this
  • 火一样的六月 16 people like this
  • 发黄的相片 3 people like this
  • Cesium学习笔记 90 people like this
  • IntelliJ IDEA知识集锦 59 people like this
  • 基于Kurento搭建WebRTC服务器 38 people like this
  • Bazel学习笔记 37 people like this
  • PhoneGap学习笔记 32 people like this
  • NaCl学习笔记 32 people like this
  • 使用Oracle Java Mission Control监控JVM运行状态 29 people like this
  • Ceph学习笔记 27 people like this
  • 基于Calico的CNI 27 people like this
Tag Cloud
ActiveMQ AspectJ CDT Ceph Chrome CNI Command Cordova Coroutine CXF Cygwin DNS Docker eBPF Eclipse ExtJS F7 FAQ Groovy Hibernate HTTP IntelliJ IO编程 IPVS JacksonJSON JMS JSON JVM K8S kernel LB libvirt Linux知识 Linux编程 LOG Maven MinGW Mock Monitoring Multimedia MVC MySQL netfs Netty Nginx NIO Node.js NoSQL Oracle PDT PHP Redis RPC Scheduler ServiceMesh SNMP Spring SSL svn Tomcat TSDB Ubuntu WebGL WebRTC WebService WebSocket wxWidgets XDebug XML XPath XRM ZooKeeper 亚龙湾 单元测试 学习笔记 实时处理 并发编程 彩姐 性能剖析 性能调优 文本处理 新特性 架构模式 系统编程 网络编程 视频监控 设计模式 远程调试 配置文件 齐塔莉
Recent Comments
  • qg on Istio中的透明代理问题
  • heao on 基于本地gRPC的Go插件系统
  • 黄豆豆 on Ginkgo学习笔记
  • cloud on OpenStack学习笔记
  • 5dragoncon on Cilium学习笔记
  • Archeb on 重温iptables
  • C/C++编程:WebSocketpp(Linux + Clion + boostAsio) – 源码巴士 on 基于C/C++的WebSocket库
  • jerbin on eBPF学习笔记
  • point on Istio中的透明代理问题
  • G on Istio中的透明代理问题
  • 绿色记忆:Go语言单元测试和仿冒 on Ginkgo学习笔记
  • point on Istio中的透明代理问题
  • 【Maven】maven插件开发实战 – IT汇 on Maven插件开发
  • chenlx on eBPF学习笔记
  • Alex on eBPF学习笔记
  • CFC4N on eBPF学习笔记
  • 李运田 on 念爷爷
  • yongman on 记录一次KeyDB缓慢的定位过程
  • Alex on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • will on Istio中的透明代理问题
  • haolipeng on 基于本地gRPC的Go插件系统
  • 吴杰 on 基于C/C++的WebSocket库
©2005-2025 Gmem.cc | Powered by WordPress | 京ICP备18007345号-2