<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>绿色记忆 &#187; F7</title>
	<atom:link href="https://blog.gmem.cc/tag/f7/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.gmem.cc</link>
	<description></description>
	<lastBuildDate>Mon, 06 Apr 2026 12:46:48 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.14</generator>
	<item>
		<title>Framework7知识集锦</title>
		<link>https://blog.gmem.cc/framework7-faq</link>
		<comments>https://blog.gmem.cc/framework7-faq#comments</comments>
		<pubDate>Fri, 19 Feb 2016 08:39:12 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[F7]]></category>
		<category><![CDATA[FAQ]]></category>

		<guid isPermaLink="false">https://blog.gmem.cc/?p=11067</guid>
		<description><![CDATA[<p>常见问题 注意点 从页面A导航到B，导航后，A的DOM保留；回退后，B的DOM默认移除 页面回调、事件中均可以访问页面数据，这意味着页面已经解析完毕，如果使用Template7模板，此时模板已经转换为目标HTML。因此尝试在页面回调、事件中为Template7模板提供上下文，均是不可取的 在preprocess回调中，不能进行路由，会导致错误 通过data-context指定页面上下文无效 导航到子页面时报错：Uncaught SyntaxError: Unexpected token 原因：F7要求规范化的JSON格式，所有对象属性必须用双引号包围。</p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/framework7-faq">Framework7知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h1"><span class="graybg">常见问题</span></div>
<div class="blog_h3"><span class="graybg">注意点</span></div>
<ol>
<li>从页面A导航到B，导航后，A的DOM保留；回退后，B的DOM默认移除</li>
<li>页面回调、事件中均可以访问页面数据，这意味着页面已经解析完毕，如果使用Template7模板，此时模板已经转换为目标HTML。因此尝试在页面回调、事件中为Template7模板提供上下文，均是不可取的</li>
<li>在preprocess回调中，不能进行路由，会导致错误</li>
</ol>
<div class="blog_h3"><span class="graybg">通过data-context指定页面上下文无效</span></div>
<p>导航到子页面时报错：Uncaught SyntaxError: Unexpected token</p>
<p>原因：F7要求规范化的JSON格式，所有对象属性必须用双引号包围。</p>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/framework7-faq">Framework7知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/framework7-faq/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Framework7学习笔记（三）：高级</title>
		<link>https://blog.gmem.cc/framework7-study-note-3</link>
		<comments>https://blog.gmem.cc/framework7-study-note-3#comments</comments>
		<pubDate>Tue, 16 Feb 2016 07:51:54 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[F7]]></category>
		<category><![CDATA[学习笔记]]></category>

		<guid isPermaLink="false">https://blog.gmem.cc/?p=10972</guid>
		<description><![CDATA[<p>Template7 Template7是一个移动优先（mobile-first）的模板引擎，其使用Handlebars风格的语法。 T7非常轻量，速度很快。F7已经内置T7，无需包含额外的JS文件。T7也可以单独使用。 使用T7时，性能瓶颈会出现在编译阶段——把字符串编译为纯粹的JavaScript函数时，亦即调用[crayon-69d6607b41948675635853-i/] 时。因此，不要编译同一个模板多次。 语法 变量 [crayon-69d6607b41950655800496-i/]  输出当前上下文中title变量的值 [crayon-69d6607b41952129641385-i/] 输出父上下文中title变量的值 [crayon-69d6607b41954512667328-i/] 输出父父上下文中title变量的值 [crayon-69d6607b41956251407964-i/] 输出当前上下文对象 [crayon-69d6607b41958820972143-i/]  输出当前上下文中person变量name属性的值 [crayon-69d6607b4195a304713109-i/] 输出父上下文中person变量name属性的值 [crayon-69d6607b4195c069987308-i/] 访问额外数据变量，这些数据变量可以在助手中访问 块表达式 [crayon-69d6607b4195f060365584-i/] 块表达式开始 [crayon-69d6607b41961641594902-i/] 块表达式结束 [crayon-69d6607b41963632929003-i/] 反转块表达式开始 [crayon-69d6607b41964696953685-i/] 块表达式开始，提供一个哈希参数（Hash argument），此参数的名/值分别为name/value 助手 <a class="read-more" href="https://blog.gmem.cc/framework7-study-note-3">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/framework7-study-note-3">Framework7学习笔记（三）：高级</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h1"><span class="graybg">Template7</span></div>
<p>Template7是一个移动优先（mobile-first）的模板引擎，其使用<a href="http://handlebarsjs.com/">Handlebars</a>风格的语法。</p>
<p>T7非常轻量，速度很快。F7已经内置T7，无需包含额外的JS文件。T7也可以单独使用。</p>
<p>使用T7时，<span style="background-color: #c0c0c0;">性能瓶颈</span>会出现在编译阶段——把字符串编译为纯粹的JavaScript函数时，亦即调用<pre class="crayon-plain-tag">Template7.compile()</pre> 时。因此，<span style="background-color: #c0c0c0;">不要编译同一个模板多次</span>。</p>
<div class="blog_h2"><span class="graybg">语法</span></div>
<div class="blog_h3"><span class="graybg">变量</span></div>
<ol>
<li><pre class="crayon-plain-tag">{{title}}</pre>  输出当前上下文中title变量的值</li>
<li><pre class="crayon-plain-tag">{{../title}}</pre> 输出父上下文中title变量的值</li>
<li><pre class="crayon-plain-tag">{{../../title}}</pre> 输出父父上下文中title变量的值</li>
<li><pre class="crayon-plain-tag">{{this}}</pre> 输出当前上下文对象</li>
<li><pre class="crayon-plain-tag">{{person.name}}</pre>  输出当前上下文中person变量name属性的值</li>
<li><pre class="crayon-plain-tag">{{../person.name}}</pre> 输出父上下文中person变量name属性的值</li>
<li><pre class="crayon-plain-tag">{{@index}}</pre> 访问额外数据变量，这些数据变量可以在助手中访问</li>
</ol>
<div class="blog_h3"><span class="graybg">块表达式</span></div>
<ol>
<li><pre class="crayon-plain-tag">{{#helperName}}</pre> 块表达式开始</li>
<li><pre class="crayon-plain-tag">{{/helperName}}</pre> 块表达式结束</li>
<li><pre class="crayon-plain-tag">{{else}}</pre> 反转块表达式开始</li>
<li><pre class="crayon-plain-tag">{{#helperName name="value"}}</pre> 块表达式开始，提供一个哈希参数（Hash argument），此参数的名/值分别为name/value</li>
</ol>
<div class="blog_h3"><span class="graybg">助手</span></div>
<p>举例：<pre class="crayon-plain-tag">{{join myArray delimiter=", "}} </pre> 表示知晓join助手，传递上下文变量myArray以及哈希参数<span style="color: #000000;">delimiter。</span></p>
<div class="blog_h2"><span class="graybg">内置助手</span></div>
<div class="blog_h3"><span class="graybg">{{#each}}...{{else}}...{{/each}}</span></div>
<p>用于遍历传入的数组的元素/对象的属性。在此助手内部，可以访问额外变量：</p>
<ol>
<li> <pre class="crayon-plain-tag">@index</pre> 仅在遍历数组时有效，当前迭代的索引</li>
<li><pre class="crayon-plain-tag">@first</pre> 仅在遍历数组时有效，当前是否第一个元素</li>
<li><pre class="crayon-plain-tag">@last</pre> 仅在遍历数组时有效，当前是否最后一个元素</li>
<li><pre class="crayon-plain-tag">@key</pre> 仅在遍历对象时有效，当前属性的名称</li>
</ol>
<p>遍历数组的例子：</p>
<pre class="crayon-plain-tag">&lt;script type="text/template7" id="example"&gt;
    &lt;p&gt;People list: &lt;/p&gt;
    &lt;ul&gt;
        {{#each people}}
        &lt;li&gt;{{firstName}} {{lastName}}&lt;/li&gt;
        {{else}}
        &lt;li&gt;No people&lt;/li&gt;   
        {{/each}} 
    &lt;/ul&gt;
&lt;/script&gt;

&lt;script type="text/javascript"&gt;
    app.templates.example( {
        people : [ {
            firstName : 'Alex',
            lastName : 'Wong'
        }, {
            firstName : 'Meng',
            lastName : 'Lee'
        }, ]
    } );
&lt;/script&gt;
&lt;!-- 输出如下： --&gt;
&lt;p&gt;People list: &lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Alex Wong&lt;/li&gt;
  &lt;li&gt;Meng Lee&lt;/li&gt;
&lt;/ul&gt;   

&lt;script type="text/javascript"&gt;
    app.templates.example( {} );
&lt;/script&gt;
&lt;!-- 输出如下： --&gt;
&lt;p&gt;People list: &lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;No people&lt;/li&gt;
&lt;/ul&gt;</pre>
<p>遍历对象的例子：</p>
<pre class="crayon-plain-tag">&lt;script type="text/template7" id="example"&gt;
    &lt;p&gt;People list: &lt;/p&gt;
    &lt;ul&gt;
        {{#each alex}}
        &lt;li&gt;{{@key}}: {{this}}&lt;/li&gt;
        {{/each}} 
    &lt;/ul&gt;
&lt;/script&gt;

&lt;script type="text/javascript"&gt;
    app.templates.example( {
        alex : {
            firstName : 'Alex'
            lastName : 'Wong'
        }
    } );
&lt;/script&gt;
&lt;!-- 输出如下： --&gt;
&lt;p&gt;People list:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;firstName: Alex&lt;/li&gt;
    &lt;li&gt;lastName: Wong&lt;/li&gt;
&lt;/ul&gt;</pre>
<div class="blog_h3"><span class="graybg">{{#if}}...{{else}}...{{/if}}</span></div>
<p> 用于进行分支判断，只有传入的上下文变量<span style="background-color: #c0c0c0;">不是false</span>时，才会渲染if分支中的内容。下面是一个例子：</p>
<pre class="crayon-plain-tag">&lt;script type="text/template7" id="example"&gt;
    &lt;a href="#" {{#if active}}class="active"{{/if}}&gt;{{title}}&lt;/a&gt;
&lt;/script&gt;

&lt;script type="text/javascript"&gt;
    app.templates.example( {
        active : true,
        title : 'Link'
    } );
&lt;/script&gt;
&lt;!-- 输出如下： --&gt;
&lt;a href="#" class="active"&gt;Link&lt;/a&gt;</pre>
<div class="blog_h3"><span class="graybg">{{#unless}}...{{else}}...{{/unless}} </span></div>
<p>与上一个助手类似，但是在传入的上下文变量<span style="background-color: #c0c0c0;">是false时</span>，渲染unless分支的内容。 </p>
<div class="blog_h3"><span class="graybg">{{#with}}...{{/with}}</span></div>
<p>用于修改上下文对象。下面是一个例子：</p>
<pre class="crayon-plain-tag">&lt;script type="text/template7" id="example"&gt;
    {{#with a}}
    &lt;a href="#" {{#if active}}class="active"{{/if}}&gt;{{title}}&lt;/a&gt;
    {{/with}}
&lt;/script&gt;

&lt;script type="text/javascript"&gt;
    app.templates.example( {
        a : {
            active : true,
            title : 'Link'
        }
    } );
&lt;/script&gt;
&lt;!-- 输出如下： --&gt;
&lt;a href="#" class="active"&gt;Link&lt;/a&gt;</pre>
<div class="blog_h3"><span class="graybg">{{#variableName}}...{{/variableName}}</span></div>
<p>如果块表达式中的助手名称是上下文中的变量，则效果与<pre class="crayon-plain-tag">{{#each variableName}}</pre> 一致。</p>
<div class="blog_h3"><span class="graybg">{{join delimiter=""}}</span></div>
<p>基于分隔符把数组元素连接为字符串。</p>
<div class="blog_h3"><span class="graybg">{{escape}} </span></div>
<p>返回转移后的HTML字符串，HTML特殊字符被转写为<pre class="crayon-plain-tag">&amp;**;</pre> 形式。</p>
<div class="blog_h3"><span class="graybg">{{js "expression"}}</span></div>
<p>立即执行一个JavaScript表达式，并把返回值输出。</p>
<p>要访问当前上下文对象，必须使用<pre class="crayon-plain-tag">this</pre> 。</p>
<div class="blog_h2"><span class="graybg">定制新助手</span></div>
<p>T7允许通过下面的方法注册新的助手：</p>
<pre class="crayon-plain-tag">/**
 * @param name 助手的名称
 * @param helper 助手函数，用于处理上下文
 */
Template7.registerHelper(name, helper);
/**
 * 助手函数规格，在此函数中，this指向表达式的执行上下文
 * @param condition 包含传递进来的上下文或条件，例如{{#if true}}中condition为true
 * @param options 包含若干属性和方法：
 *      hash 传递给助手的哈希参数对象
 *      fn 调用此方法，把块表达式的内容传递给编译器处理
 *      inverse 调用此方法，把反转块表达式（{{else}}）的内容传递给编译器处理
 *      data 包含额外的表达式数据，例如@index
 * @return 可选，助手输出的内容
 */
function helper(condition, options) {}</pre>
<p>若要解除注册，可以调用：<pre class="crayon-plain-tag">Template7.unregisterHelper(name)</pre> 。</p>
<div class="blog_h3"><span class="graybg">示例</span></div>
<pre class="crayon-plain-tag">/* 简单的join助手 */
Template7.registerHelper( 'join', function( arr, options ) {
    if ( typeof arr === 'function' ) arr = arr.call( this );
    //返回值直接输出到助手在模板中的位置
    return arr.join( options.hash.delimiter );
} );

/* ifeq助手：{{#ifeq var1 var2}}..{{else}}..{{/if}} */
Template7.registerHelper( 'ifeq', function( var1, var2, options ) {
    if ( var1 == var2 ) {
        return options.fn( this, options.data );
    }
    else {
        return options.inverse( this, options.data );
    }
} );</pre>
<div class="blog_h2"><span class="graybg">全局上下文</span></div>
<p>全局上下文可以在任何地方访问，使用<pre class="crayon-plain-tag">Template7.global</pre> 可以指定全局上下文，例如：</p>
<pre class="crayon-plain-tag">Template7.global = {
    os : 'iOS',
    browser : 'Chrome',
    username : 'Alex'
};</pre>
<p>访问全局上下文，必须使用前缀<pre class="crayon-plain-tag">{{@global.}}</pre> 。</p>
<div class="blog_h2"><span class="graybg">根上下文</span></div>
<p>某些时候需要访问传递给模板的根上下文对象，此时可以使用<pre class="crayon-plain-tag">{{@root}}</pre> 变量。例如：</p>
<pre class="crayon-plain-tag">&lt;script type="text/template7" id="example"&gt;
{{#each persons}}
    &lt;h2&gt;{{name}}&lt;/h2&gt;
    {{#if @root.showHobby}}
        &lt;h3&gt;Hobby:&lt;/h3&gt;
        &lt;ul&gt;
            {{#each hobby}}
                &lt;li&gt;{{this}}&lt;/li&gt;
            {{/each}}
        &lt;/ul&gt;
    {{/if}}
{{/each}} 
&lt;/script&gt;

&lt;script type="text/javascript"&gt;
    app.templates.example( {
        persons : [ {
            name : 'Alex',
            hobby : [ 'Clectronics', 'Biology' ]
        }, {
            name : 'Meng',
            hobby : [ 'Accountancy' ]
        },

        ],
        showHobby : true
    } );
&lt;/script&gt;</pre>
<div class="blog_h2"><span class="graybg">自动编译</span></div>
<p>在特殊标签中定义的模板，可以被F7自动编译：</p>
<pre class="crayon-plain-tag">&lt;!-- 
    type="text/template7" 告诉F7这是一个T7模板，可以被自动编译
    id="myTemplate" 指定模板的标识符，后续可以依据此标识符访问
--&gt;
&lt;script type="text/template7" id="iTemplate"&gt;
    &lt;p&gt;Hello, my name is {{name}} and i am {{age}} years old&lt;/p&gt;
&lt;/script&gt;</pre>
<p>需要在应用初始化参数中启用自动编译功能：</p>
<pre class="crayon-plain-tag">var app = new Framework7( {
    // 在初始化阶段自动编译模板
    precompileTemplates : true,
} );</pre>
<div class="blog_h3"><span class="graybg">访问预编译模板</span></div>
<p>所有编译好的模板会存放到对象<pre class="crayon-plain-tag">Template7.templates</pre> 中，<pre class="crayon-plain-tag">app.templates</pre> 是此对象的别名。在应用初始化后，可以这样使用模板：</p>
<pre class="crayon-plain-tag">var iHTML = Template7.templates.iTemplate( {
    name : 'Alex Wong',
    age : 30
} );</pre>
<div class="blog_h2"><span class="graybg">片段（Partials）</span></div>
<p>片段就是普通模板，只是它们供其它模板调用。通过片段，可以实现模板重用。通过下面的方法可以注册/解除注册片段：</p>
<pre class="crayon-plain-tag">/**
 * 注册片段
 * 
 * @param name 片段的名称
 * @param template 片段的内容，字符串
 */
Template7.registerPartial( name, template );
/**
 * 解除注册片段
 * 
 * @param name 片段的名称
 */
Template7.unregisterPartial( name );</pre>
<p>通过特殊的助手：<pre class="crayon-plain-tag">{{&gt; "partialName"}}</pre> 可以调用既有的片段。 </p>
<div class="blog_h3"><span class="graybg">递归片段</span></div>
<p>T7片段的一个强大特性是，<span style="background-color: #c0c0c0;">片段可以调用自身</span>。下面是一个嵌套评论（针对评论的回复）的例子：</p>
<pre class="crayon-plain-tag">/* 此模板只包含一个对片段的调用 */
var template = '{{&gt; "comments"}}';
/* 注册片段  */
Template7.registerPartial(
    'comments', 
    '&lt;ul&gt;' + 
        '{{#each comments}}' +
            '&lt;li&gt;' +
            '&lt;h2&gt;{{author}}&lt;/h2&gt;' +
            '&lt;p&gt;{{text}}&lt;/p&gt;' +
            '{{#if comments}}{{&gt; "comments"}}{{/if}}' + //如果有针对评论的评论，则递归调用 
            '&lt;/li&gt;' +
        '{{/each}}' +
    '&lt;/ul&gt;'
);
// 编译模板
var compiledTemplate = Template7.compile( template );

// 渲染模板
var output = compiledTemplate( {
    comments : [ {
        author : 'Meng Lee',
        text : 'Good article!',
        comments : [ {
            author : 'Alex Wong',
            text : 'Thanks!'
        }, {
            author : 'CaiCai Wong',
            text : 'Very funny.'
        } ]
    }, {
        author : 'WenJun Wong',
        text : 'Not good!'
    } ]
} );</pre>
<p>输出结果如下： </p>
<pre class="crayon-plain-tag">&lt;ul class="comments"&gt;
    &lt;li&gt;
        &lt;h2&gt;Meng Lee&lt;/h2&gt;
        &lt;p&gt;Good article!&lt;/p&gt;
        &lt;ul class="comments"&gt;
            &lt;li&gt;
                &lt;h2&gt;Alex Wong&lt;/h2&gt;
                &lt;p&gt;Thanks!&lt;/p&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;h2&gt;CaiCai Wong&lt;/h2&gt;
                &lt;p&gt;Very funny.&lt;/p&gt;
            &lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;h2&gt;WenJun Wong&lt;/h2&gt;
        &lt;p&gt;Not good!&lt;/p&gt;
    &lt;/li&gt;
&lt;/ul&gt;</pre>
<div class="blog_h2"><span class="graybg"><a id="template7-pages"></a>Template7页面</span></div>
<p>在<a href="/framework7-study-note-1#navigation">Framework7学习笔记（一）</a>中我们提到过F7处理页面的4种方式，最后一种Template7页面在这里讲解。</p>
<p>F7允许把新的Ajax页面、Dynamic页面<span style="background-color: #c0c0c0;">作为Template7模板来解析</span>，要启用此功能，需要提供应用初始化参数：</p>
<pre class="crayon-plain-tag">var myApp = new Framework7({
    template7Pages: true
});</pre>
<div class="blog_h3"><span class="graybg">模板上下文</span></div>
<p>要解析模板，必须提供必要的上下文（数据）对象。可以通过应用初始化参数template7Data设置全局的上下文：</p>
<pre class="crayon-plain-tag">var myApp = new Framework7({
    template7Pages: true,
    //指定上下文对象
    template7Data: {
        // 下面这个上下文专用于URL为about.html的页面（模板）
        'url:about.html': {
            name: 'John Doe',
            age: 38,
            company: 'Apple',
            position: 'Developer'
        },
        // 下面这个上下文专用于名称为contacts（data-page="contacts"）的页面（模板）
        'page:contacts': {
            tel: '(999)-111-22-33',
            email: 'contact@john.doe'
        },
 
        // 简单数据对象（Plain data object）
        'languages': {
            'frontend': [
                { name:'JavaScript', desc: 'Most commonly used as part of web browsers' },
                { name:'CSS' ,desc: 'Style sheet language used for describing the look and formatting of a document'},
            ],
            'backend': [
                { name: 'PHP', desc: 'Server-side scripting language designed for web development' },
                { name: 'Ruby', desc: 'Dynamic, reflective, object-oriented, general-purpose programming language'}
            ]
        }
    }
});</pre>
<p>可以看到，上下文对象分为三种：</p>
<ol>
<li>url:*，用于特定URL的页面（模板）的上下文</li>
<li>page:*，用于特定名称页面（模板）的上下文</li>
<li>简单数据对象：用于提供可供不同页面（模板）重用的、定制化的上下文</li>
</ol>
<p>在<span style="background-color: #c0c0c0;">任何时候你都可以修改</span>模板上下文对象，你可以通过全局对象<pre class="crayon-plain-tag">Templates.data</pre> 或者其别名<pre class="crayon-plain-tag">app.template7Data</pre> 修改之。</p>
<div class="blog_h3"><span class="graybg">简单数据对象</span></div>
<p>template7Data中提供的简单数据对象，用于提供复杂的、定制化的上下文。利用普通链接和<pre class="crayon-plain-tag">data-context-name</pre> 属性，你可以指定该链接要加载的页面（模板）所使用的上下文对象，此对象可以是一个简单数据对象，或者其<span style="background-color: #c0c0c0;">点号导航的子属性</span>（[]语法不支持）。</p>
<p>下面的代码示意了如何使用简单数据对象作为模板上下文：</p>
<pre class="crayon-plain-tag">&lt;!-- 模板languages.html将使用上下文app.template7Data.languages来渲染  --&gt;
&lt;a href="languages.html" class="item-link item-content" data-context-name="languages"&gt;
    &lt;div class="item-inner"&gt;
        &lt;div class="item-title"&gt;Languages&lt;/div&gt;
    &lt;/div&gt;
&lt;/a&gt;</pre><br />
<pre class="crayon-plain-tag">&lt;div class="page" data-page="languages"&gt;
  &lt;div class="page-content"&gt;
    &lt;div class="content-block-title"&gt;Frontend&lt;/div&gt;
    &lt;div class="list-block"&gt;
      &lt;ul&gt;
        &lt;!-- 遍历app.template7Data.languages.frontend --&gt;
        {{#each this.frontend}}
        &lt;li&gt;
          &lt;!-- 嵌套的模板，支持基于点号导航（languages.frontend.1是合法的）来访问子对象 --&gt;
          &lt;a href="language-details.html" class="item-link item-content" data-context-name="languages.frontend.{{@index}}"&gt;
              &lt;div class="item-inner"&gt;
                &lt;div class="item-title"&gt;{{this.name}}&lt;/div&gt;
              &lt;/div&gt;
          &lt;/a&gt;
        &lt;/li&gt;
        {{/each}}
      &lt;/ul&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</pre><br />
<pre class="crayon-plain-tag">&lt;div class="page" data-page="language-details"&gt;
  &lt;div class="page-content"&gt;
    &lt;div class="content-block-title"&gt;{{name}}&lt;/div&gt;
    &lt;div class="content-block"&gt;
      &lt;p&gt;{{desc}}&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</pre>
<p>你也可以通过导航/路由 API来指定上下文对象：</p>
<pre class="crayon-plain-tag">mainView.router.load({
    url: 'language-details.html',
    contextName: 'languages.frontend.0'
})</pre>
<div class="blog_h3"><span class="graybg">定制的上下文</span></div>
<p>除了通过template7Data指定的全局上下文以外，你还可以使用即时指定的定制上下文。HTML方式：</p>
<pre class="crayon-plain-tag">&lt;!-- 赋值串行化的JSON对象给data-context属性 --&gt;
&lt;a href='contacts.html' data-context='{"tel": "(999)-111-22-33", "email": "contact@john.doe"}'&gt;Contacts&lt;/a&gt;</pre>
<p>JavaScript方式：</p>
<pre class="crayon-plain-tag">mainView.router.load( {
    url : 'contacts.html',
    context : {
        tel : '(999)-111-22-33',
        email : 'contact@john.doe'
    }
} );</pre>
<div class="blog_h3"><span class="graybg">直接加载模板</span></div>
<p>F7会自动编译<pre class="crayon-plain-tag">&lt;script id="templateName" type="text/template7"&gt;</pre> 声明的模板。要将其作为Template7页面使用，可以通过HTML方式：</p>
<pre class="crayon-plain-tag">&lt;a href="#" data-template="templateName"&gt;&lt;/a&gt;
&lt;a href="#" data-template="templateName" data-context='{"name": "value"}'&gt;&lt;/a&gt;</pre>
<p>或者JavaScript方式：</p>
<pre class="crayon-plain-tag">mainView.router.load( {
    template : Template7.templates.templateName,
    context : {
        name : 'value'
    }
} );</pre>
<div class="blog_h3"><span class="graybg">传递URL参数 </span></div>
<p>特殊的上下文属性<pre class="crayon-plain-tag">url_query</pre> 用于访问URL上的GET参数：</p>
<pre class="crayon-plain-tag">&lt;a href="person.html?firstname=Alex&amp;lastname=Wong&amp;age=30"&gt;Alex&lt;/a&gt;</pre><br />
<pre class="crayon-plain-tag">&amp;nbsp;&lt;div class="page" data-page="person"&gt;
    &lt;div class="page-content"&gt;
        &lt;p&gt;Hello, my name is {{url_query.firstname}} {{url_query.lastname}}. I am {{url_query.age}} years old.&lt;/p&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h1"><span class="graybg">插件API</span></div>
<p> Framework7提供了简单易用的插件API，利用这些API你可以扩展自己的F7插件。</p>
<div class="blog_h2"><span class="graybg">注册新插件</span></div>
<p>只需要为<pre class="crayon-plain-tag">Framework7.prototype.plugins</pre> 添加一个属性，即可注册新插件。例如：</p>
<pre class="crayon-plain-tag">/**
 * myPlugin 新插件的名字
 * app 已初始化的F7应用对象
 * params 可选的插件参数
 */
Framework7.prototype.plugins.myPlugin = function( app, params ) {
    //插件代码
};</pre>
<p>要引用新插件，只需要将其JS文件包含到HTML中，位于F7主JS文件之后：</p>
<pre class="crayon-plain-tag">&lt;script src="path/to/framework7.js"&gt;&lt;/script&gt;
&lt;script src="path/to/framework7.myplugin.js"&gt;&lt;/script&gt;</pre>
<div class="blog_h2"><span class="graybg">向插件传递参数</span></div>
<p>在F7应用初始化的时候，可以向插件传递参数：</p>
<pre class="crayon-plain-tag">var myApp = new Framework7( {
    pushState : true,
    /*
     * 为myPlugin传递参数
     */
    myPlugin : {
        foo : 'bar'
    }
} );</pre>
<div class="blog_h2"><span class="graybg">编写插件代码</span></div>
<p>F7插件系统包含三种扩展机制：</p>
<ol>
<li>hooks：与通常的回调类似，由F7在框架的很多核心部分调用。可以在特定时刻/场景执行插件代码、处理数据</li>
<li>prevents：用于阻止F7默认行为，例如阻止默认页面动画而使用自己的</li>
<li>processes：类似于预处理器，每个处理方法可以接收被处理数据</li>
</ol>
<p>插件函数的返回值必须是一个对象，其包括hooks、prevents和processes属性。例如：</p>
<pre class="crayon-plain-tag">return {
    hooks : {
        appInit : function(){}
    }
};</pre>
<div class="blog_h3"><span class="graybg">Hooks</span></div>
<p>可用的钩子包括：</p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 35%; text-align: center;">钩子</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>appInit</td>
<td>当应用完全初始化后调用</td>
</tr>
<tr>
<td>navbarInit (navbar, pageData)</td>
<td>和navbarInit事件一样</td>
</tr>
<tr>
<td>pageInit (pageData)</td>
<td>和navbarInit事件/回调一样</td>
</tr>
<tr>
<td>pageBeforeInit (pageData)</td>
<td>和pageBeforeInit事件/回调一样</td>
</tr>
<tr>
<td>pageBeforeAnimation (pageData)</td>
<td>和pageBeforeAnimation事件/回调一样</td>
</tr>
<tr>
<td>pageAfterAnimation (pageData)</td>
<td>和pageAfterAnimation事件/回调一样</td>
</tr>
<tr>
<td>pageBeforeRemove (pageData)</td>
<td>和pageBeforeRemove事件/回调一样</td>
</tr>
<tr>
<td>addView (view)</td>
<td>当用户通过app.addView()添加新的视图时触发，入参是已实例化的视图对象</td>
</tr>
<tr>
<td>loadPage (view, url, content)</td>
<td>在新页面开始被加载时调用，此时页面尚未加入到DOM中</td>
</tr>
<tr>
<td>goBack (view, url, preloadOnly)</td>
<td>在返回操作开始前调用 </td>
</tr>
<tr>
<td>swipePanelSetTransform (views, panel, percentage)</td>
<td>侧面板滑出/滑入的过程中调用 </td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/framework7-study-note-3">Framework7学习笔记（三）：高级</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/framework7-study-note-3/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Framework7学习笔记（二）：组件</title>
		<link>https://blog.gmem.cc/framework7-study-note-2</link>
		<comments>https://blog.gmem.cc/framework7-study-note-2#comments</comments>
		<pubDate>Thu, 21 Jan 2016 14:12:05 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[F7]]></category>
		<category><![CDATA[学习笔记]]></category>

		<guid isPermaLink="false">https://blog.gmem.cc/?p=10767</guid>
		<description><![CDATA[<p>导航栏和工具栏 为F7应用添加导航栏和工具栏之前，需要决定使用何种导航/工具栏布局。F7支持三种导航/工具栏布局。 导航/工具栏的布局类型 “静态”布局 这是最少使用的一种布局，使用该布局时，导航/工具栏随着页面滚动，它们仅仅是页面的一部分，每个页面拥有自己的导航/工具栏： [crayon-69d6607b436ef107472677/] “固定”布局 与静态布局类似，每个页面拥有自己的导航/工具栏，但是导航/工具栏不随页面滚动，它们分别固定在顶部/底部，始终可见。启用固定布局很简单，只需要在页面元素上添加样式类： [crayon-69d6607b436f5325907824/] “贯穿”布局 这是最常使用的一种方式，一个视图中的所有页面共享导航/工具栏。该布局支持动态导航栏（Dynamic Navbar）： [crayon-69d6607b436f8118159233/] 混合布局 F7支持在一个视图内混合使用多种布局方式。例如你可以使用贯穿的导航栏 + 固定的工具栏： [crayon-69d6607b436fa831515610/] 不使用导航/工具栏 你也可以不使用导航栏和（或）工具栏，只要不声明它们、同时不在page/pages/view元素上添加冲突的样式类：navbar-fixed、navbar-through、toolbar-fixed、 toolbar-through即可。 导航栏 <a class="read-more" href="https://blog.gmem.cc/framework7-study-note-2">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/framework7-study-note-2">Framework7学习笔记（二）：组件</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h1"><span class="graybg">导航栏和工具栏</span></div>
<p>为F7应用添加导航栏和工具栏之前，需要决定使用何种导航/工具栏布局。F7支持三种导航/工具栏布局。</p>
<div class="blog_h2"><span class="graybg">导航/工具栏的布局类型</span></div>
<div class="blog_h3"><span class="graybg">“静态”布局</span></div>
<p>这是最少使用的一种布局，使用该布局时，导航/工具栏<span style="background-color: #c0c0c0;">随着页面滚动</span>，它们仅仅是页面的一部分，每个页面拥有自己的导航/工具栏：</p>
<pre class="crayon-plain-tag">&lt;!-- 这是一个页面 --&gt;
&lt;div data-page="index" class="page"&gt;
    &lt;div class="page-content"&gt;
        &lt;!-- 顶部导航栏开始 --&gt;
        &lt;div class="navbar"&gt;
            &lt;div class="navbar-inner"&gt;
                &lt;div class="center"&gt;Awesome App&lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;!-- 导航栏结束--&gt;
        &lt;p&gt;页面主体内容&lt;/p&gt;
        &lt;!-- 底部工具栏开始 --&gt;
        &lt;div class="toolbar"&gt;
            &lt;div class="toolbar-inner"&gt;Hello&lt;/div&gt;
        &lt;/div&gt;
        &lt;!-- 底部工具栏结束--&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">“固定”布局</span></div>
<p>与静态布局类似，每个页面拥有自己的导航/工具栏，但是导航/工具栏不随页面滚动，它们分别固定在顶部/底部，始终可见。启用固定布局很简单，只需要在页面元素上添加样式类：</p>
<pre class="crayon-plain-tag">&lt;div data-page="index" class="page navbar-fixed toolbar-fixed"&gt;</pre>
<div class="blog_h3"><span class="graybg">“贯穿”布局</span></div>
<p>这是最常使用的一种方式，一个视图中的<span style="background-color: #c0c0c0;">所有页面共享</span>导航/工具栏。该布局支持动态导航栏（Dynamic Navbar）：</p>
<pre class="crayon-plain-tag">&lt;div class="view view-main"&gt;
    &lt;!-- 视图唯一的导航栏 --&gt;
    &lt;div class="navbar"&gt;&lt;div class="navbar-inner"&gt;&lt;/div&gt;&lt;/div&gt;
    &lt;!-- 导航栏结束--&gt;
    &lt;!-- 页面容器（pages）元素需要额外的"navbar-through"、"toolbar-through"样式类，分别表示启用贯穿导航栏、工具栏 --&gt;
    &lt;div class="pages navbar-through toolbar-through"&gt;
        &lt;!-- 页面 --&gt;
        &lt;div data-page="index" class="page"&gt;&lt;div class="page-content"&gt;&lt;/div&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;!-- 视图唯一的工具栏 --&gt;
    &lt;div class="toolbar"&gt;&lt;/div&gt;
    &lt;!--工具栏结束--&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">混合布局</span></div>
<p>F7支持在一个视图内混合使用多种布局方式。例如你可以使用贯穿的导航栏 + 固定的工具栏：</p>
<pre class="crayon-plain-tag">&lt;div class="view view-main"&gt;
    &lt;!-- 视图唯一的贯穿导航栏 --&gt;
    &lt;div class="navbar"&gt;&lt;div class="navbar-inner"&gt;&lt;div class="center"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
    &lt;!-- 为所有页面声明：使用贯穿导航栏、固定工具栏 --&gt;
    &lt;div class="pages navbar-through toolbar-fixed"&gt;
        &lt;!-- 一个页面定义  --&gt;
        &lt;div data-page="index" class="page"&gt;
            &lt;div class="page-content"&gt;&lt;/div&gt;
            &lt;!-- 固定工具栏，因此每个页面都需要定义自己的 --&gt;
            &lt;div class="toolbar"&gt;&lt;div class="toolbar-inner"&gt;Hello&lt;/div&gt;&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">不使用导航/工具栏</span></div>
<p>你也可以不使用导航栏和（或）工具栏，只要<span style="background-color: #c0c0c0;">不声明它们、同时不在</span>page/pages/view元素上添加冲突的样式类：navbar-fixed、navbar-through、toolbar-fixed、 toolbar-through即可。</p>
<div class="blog_h2"><span class="graybg">导航栏</span></div>
<p>所谓导航栏，是位于屏幕顶部的，包含页面标题、导航元素的一个区域。<span style="background-color: #c0c0c0;">导航栏分为三个部分（左、中、右）</span>，这三个部分都可以包含任意HTML，但是F7建议这样使用导航栏： </p>
<ol>
<li>左侧部分：用于放置返回链接，可以是图标或者文本</li>
<li>中间部分：显示页面标题</li>
<li>右侧部分：类似于左侧，放置按钮或链接</li>
</ol>
<div class="blog_h3"><span class="graybg">导航栏内部布局</span></div>
<p>导航栏内部的结构很简单且自描述：</p>
<pre class="crayon-plain-tag">&lt;div class="navbar"&gt;
    &lt;div class="navbar-inner"&gt;
        &lt;div class="left"&gt;Left&lt;/div&gt;
        &lt;!-- 注意，center具有最低的宽度优先级，当空间不够时，center的内容自动被省略，确保左右正常显示 --&gt;
        &lt;!-- 如果center中存放文本，无法显示的内容使用省略号代替，如果放置了自定义元素，则需要小心处理 --&gt;
        &lt;div class="center"&gt;Center&lt;/div&gt;
        &lt;div class="right"&gt;Right&lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">导航栏与链接</span></div>
<p>可以在导航栏中添加多种链接：</p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 20%; text-align: center;">链接类型</td>
<td style="text-align: center;">说明与示例</td>
</tr>
</thead>
<tbody>
<tr>
<td>文本链接</td>
<td>
<pre class="crayon-plain-tag">&lt;div class="navbar"&gt;
    &lt;div class="navbar-inner"&gt;
        &lt;!-- 要在左右侧添加链接，仅需要为a元素添加link类 --&gt;
        &lt;div class="left"&gt;&lt;a href="#" class="link"&gt;左侧文本链接&lt;/a&gt;&lt;/div&gt;
        &lt;div class="center"&gt;Center&lt;/div&gt;
        &lt;div class="right"&gt;&lt;a href="#" class="link"&gt;右侧文本链接&lt;/a&gt;&lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
</td>
</tr>
<tr>
<td>多个链接</td>
<td>
<pre class="crayon-plain-tag">&lt;!-- 每个区域都可以包含多个链接 --&gt;
&lt;div class="left"&gt;
    &lt;a href="#" class="link"&gt;左侧文本链接1&lt;/a&gt;
    &lt;a href="#" class="link"&gt;左侧文本链接2&lt;/a&gt;
&lt;/div&gt;</pre>
</td>
</tr>
<tr>
<td>图标+文本链接</td>
<td>
<pre class="crayon-plain-tag">&lt;div class="left"&gt;
    &lt;a href="#" class="link"&gt; 
        &lt;!-- 用样式类icon标注图标，该样式类定义了背景图片 --&gt;
        &lt;i class="icon icon-back"&gt;&lt;/i&gt; 
        &lt;!-- 使用图标+文本链接时，必须把文本包装在span元素内 --&gt;
        &lt;span&gt;Back&lt;/span&gt;
    &lt;/a&gt;
&lt;/div&gt;</pre>
</td>
</tr>
<tr>
<td>图标链接</td>
<td>
<pre class="crayon-plain-tag">&lt;div class="left"&gt;
    &lt;!-- 对于只有图标的链接，需要添加icon-only类，该类确保链接占据44x44像素 --&gt;
    &lt;a href="#" class="link icon-only"&gt;
        &lt;i class="icon icon-back"&gt;&lt;/i&gt;
    &lt;/a&gt;
&lt;/div&gt;</pre>
</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">与导航栏相关的方法</span></div>
<p>对于已初始化的视图，我们可以用JavaScript API操控其导航栏：</p>
<table class=" fixed-word-wrap full-width">
<thead>
<tr>
<td style="width: 30%; text-align: center;">方法</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>app.hideNavbar(navbar)</td>
<td rowspan="2">隐藏或显示指定的导航栏。navbar为代表目标导航栏的HTMLElement或者CSS选择器（字符串）</td>
</tr>
<tr>
<td>app.showNavbar(navbar)</td>
</tr>
<tr>
<td>view.hideNavbar()</td>
<td rowspan="2">隐藏或显示视图view的导航栏。示例：<br />
<pre class="crayon-plain-tag">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();
});</pre>
</td>
</tr>
<tr>
<td>view.showNavbar()</td>
</tr>
<tr>
<td>view.sizeNavbars(viewContainer)</td>
<td>仅iOS主题。重新计算导航栏的位置。示例：<pre class="crayon-plain-tag">app.sizeNavbars('.view-main')</pre> </td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">自动隐藏导航栏</span></div>
<p>使用贯穿布局时，F7允许对某些Ajax页面自动隐藏/显示导航栏：</p>
<pre class="crayon-plain-tag">&lt;!-- 为此页面声明一个空白导航栏 --&gt;
&lt;div class="navbar"&gt;&lt;div class="navbar-inner"&gt;&lt;/div&gt;&lt;/div&gt;
&lt;!-- 同时为页面添加"no-navbar"样式类 --&gt;
&lt;div data-page="about" class="page no-navbar"&gt;
    &lt;div class="page-content"&gt;&lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">动态导航栏</span></div>
<p>注意动态导航栏仅适用于iOS主题 + 贯穿布局。所谓动态导航栏，在页面切换时，其内容具有<span style="background-color: #c0c0c0;">滑动和淡入淡出效果</span>。</p>
<div class="blog_h3"><span class="graybg">动态导航栏布局</span></div>
<p>动态导航栏的内部布局和普通导航栏没太大区别，只是你可以为导航栏的左中右三个部分添加额外的样式类。默认的，F7为这三个部分添加淡入淡出效果，如果要启用滑动效果，你可以添加样式类：</p>
<pre class="crayon-plain-tag">&lt;!-- 每个页面可以指定自己的动态导航栏，默认具有淡入淡出切换效果 --&gt;
&lt;!-- 动态导航栏声明在页面外部（从其它html加载为页面、或者创建动态页面时） --&gt;
&lt;div class="navbar"&gt;
    &lt;div class="navbar-inner"&gt;
        &lt;div class="left"&gt;
            &lt;a href="#" class="link"&gt;Left&lt;/a&gt;
        &lt;/div&gt;
        &lt;!-- 为中间部分添加滑动效果，注意整个应用的风格应当统一 --&gt;
        &lt;div class="center sliding"&gt;Home&lt;/div&gt;
        &lt;div class="right"&gt;
            &lt;a href="#" class="link"&gt;Right&lt;/a&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;div class="page" data-page="about"&gt;页面内容&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">给Back Icon添加动画</span></div>
<p>设置应用初始化参数<pre class="crayon-plain-tag">animateNavBackIcon: true</pre> 可以为后退按钮添加更多的动画效果，从而更像iOS 7的风格。</p>
<div class="blog_h3"><span class="graybg">动态导航栏事件</span></div>
<p>F7为动态导航栏添加了几种事件，这些事件的源（Target） 都是<pre class="crayon-plain-tag">&lt;div class="navbar-inner"&gt;</pre> ：</p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">事件</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>navbarBeforeInit</td>
<td>插入一个新的导航栏到DOM时，触发该事件</td>
</tr>
<tr>
<td>navbarInit</td>
<td>初始化一个导航栏后，触发该事件</td>
</tr>
<tr>
<td>navbarReinit</td>
<td>当缓存的导航栏变得再次可见时，触发该事件</td>
</tr>
<tr>
<td>navbarBeforeRemove</td>
<td>当导航栏即将从DOM中移除时，触发该事件</td>
</tr>
</tbody>
</table>
<p>下面的代码演示了该事件的使用：</p>
<pre class="crayon-plain-tag">$$(document).on('navbarInit', function (e) {
    var navbar = e.detail.navbar;
    // 可以访问导航栏对象的以下属性：
    // navbarContainer 链接到导航栏容器元素
    // navbarInnerContainer 链接到导航栏内部容器元素
    var page = e.detail.page
});</pre>
<div class="blog_h2"><span class="graybg">子导航栏（Sub Navbar） </span></div>
<p>当你需要在导航栏添加额外的元素时，可以使用子导航栏。当导航栏隐藏时，子导航栏仍然<span style="background-color: #c0c0c0;">保持可见</span>。 </p>
<p>在线演示：<a href="http://framework7.taobao.org/docs-demos/subnavbar.html">http://framework7.taobao.org/docs-demos/subnavbar.html</a></p>
<div class="blog_h3"><span class="graybg">子导航栏布局</span></div>
<pre class="crayon-plain-tag">&lt;div class="navbar-inner"&gt;
    &lt;div class="left"&gt;&lt;/div&gt;
    &lt;div class="center"&gt;&lt;/div&gt;
    &lt;div class="right"&gt;&lt;/div&gt;
    &lt;!-- 子导航栏 --&gt;
    &lt;div class="subnavbar"&gt;
        &lt;!-- 子导航栏内容，这里存放了三个按钮    --&gt;
        &lt;div class="buttons-row"&gt;
            &lt;a href="#tab1" class="button active"&gt;Tab 1&lt;/a&gt;
            &lt;a href="#tab2" class="button"&gt;Tab 2&lt;/a&gt;
            &lt;a href="#tab3" class="button"&gt;Tab 3&lt;/a&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">工具栏</span></div>
<p>工具栏是屏幕上的一个固定区域，可以包含导航元素。不像导航栏，工具栏不包含任何部分，内部可以直接是若干链接。</p>
<div class="blog_h3"><span class="graybg">工具栏布局</span></div>
<pre class="crayon-plain-tag">&lt;div class="toolbar"&gt;
    &lt;div class="toolbar-inner"&gt;
        &lt;a href="#" class="link"&gt;Link 1&lt;/a&gt;
        &lt;a href="#" class="link"&gt;Link 2&lt;/a&gt;
        &lt;a href="#" class="link"&gt;Link 3&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<p>默认的，工具栏内的元素<span style="background-color: #c0c0c0;">均匀的分布</span>在工具栏中。 </p>
<div class="blog_h3"><span class="graybg">与工具栏相关的方法</span></div>
<p>以下方法可用于操控已初始化视图中的工具栏：</p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 28%; text-align: center;">方法</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>app.hideToolbar(toolbar)</td>
<td rowspan="2">隐藏或者显示指定的工具栏。<br />toolbar：目标工具栏对应的HTMLElement或者String（CSS选择器）</td>
</tr>
<tr>
<td>app.showToolbar(toolbar)</td>
</tr>
<tr>
<td>view.hideToolbar()</td>
<td rowspan="2">隐藏或者显示当前视图的工具栏</td>
</tr>
<tr>
<td>view.showToolbar()</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">自动隐藏工具栏</span></div>
<p>如果某个Ajax页面不需要显示工具栏，可以在页面上添加样式类：</p>
<pre class="crayon-plain-tag">&lt;!-- no-toolbar表示为该页面隐藏工具栏 --&gt;
&lt;div data-page="about" class="page no-toolbar"&gt;</pre>
<div class="blog_h3"><span class="graybg">底部工具栏</span></div>
<p>仅用于Material主题，对于iOS主题工具栏默认就在底部。</p>
<p>Material主题常常把工具栏/页签栏置于屏幕上面<span style="background-color: #c0c0c0;">，导航栏下面</span>。如果要改变此行为，可以为工具栏添加额外的样式类：</p>
<pre class="crayon-plain-tag">&lt;!--  toolbar-bottom导致Material主题的工具栏放置于屏幕底部 --&gt;
&lt;div class="toolbar toolbar-bottom"&gt;
    &lt;div class="toolbar-inner"&gt;&lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">页签栏</span></div>
<p>页签栏只是工具栏的特例，它包含图标（或者图标+文本），而不仅仅是文本。 </p>
<div class="blog_h3"><span class="graybg">页签栏布局</span></div>
<p>与工具栏类似，只是多一个样式类声明：</p>
<pre class="crayon-plain-tag">&lt;!-- 比工具栏多一个tabbar的样式类 --&gt;
&lt;div class="toolbar tabbar"&gt;
    &lt;div class="toolbar-inner"&gt;
        &lt;a href="#tab1" class="tab-link active"&gt;
            &lt;i class="icon demo-icon-1"&gt;&lt;/i&gt;
        &lt;/a&gt;
        &lt;a href="#tab2" class="tab-link"&gt;
            &lt;i class="icon demo-icon-2"&gt;&lt;/i&gt;
        &lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<p>默认的，页签栏内的元素（链接）均匀的分布在页签栏中。但是要注意以下两点：</p>
<ol>
<li>在iPhone中，每个元素的大小一致，为屏幕宽度/元素个数</li>
<li>在iPad中，所有元素的被居中显示，元素最小宽度105px</li>
</ol>
<div class="blog_h3"><span class="graybg">为图标添加角标</span></div>
<pre class="crayon-plain-tag">&lt;div class="toolbar tabbar"&gt;
    &lt;div class="toolbar-inner"&gt;
        &lt;a href="#tab2" class="tab-link"&gt;
            &lt;i class="icon demo-icon-2"&gt;
                &lt;!-- 只需要图标元素内放置一个span元素，并添加badge样式，即可增加角标 --&gt;
                &lt;span class="badge bg-red"&gt;5&lt;/span&gt;&lt;!-- 红色背景角标，数字5 --&gt;
            &lt;/i&gt;
        &lt;/a&gt;
        &lt;a href="#tab4" class="tab-link"&gt;
            &lt;i class="icon demo-icon-4"&gt;
                &lt;span class="badge bg-green"&gt;15&lt;/span&gt;&lt;!-- 绿色背景角标，数字15 --&gt;
            &lt;/i&gt;
        &lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">图标+文本标签</span></div>
<p>类似的，为图标添加一个兄弟元素，可以显示文本标签：</p>
<pre class="crayon-plain-tag">&lt;a href="#tab1" class="tab-link active"&gt;
    &lt;i class="icon demo-icon-1"&gt;&lt;/i&gt;
    &lt;!-- 文本标签，默认位于图标下方 --&gt;
    &lt;span class="tabbar-label"&gt;Label 1&lt;/span&gt;
&lt;/a&gt;</pre>
<div class="blog_h3"><span class="graybg">可滚动页签栏</span></div>
<p>当页签栏中的元素非常多，屏幕宽度不足以显示时，应该使用可滚动页签栏，当手指划过页签栏时，会自动滚动以显示不可见元素：</p>
<pre class="crayon-plain-tag">&lt;!-- 只需要添加tabbar-scrollable样式类即可 --&gt;
&lt;div class="toolbar tabbar tabbar-scrollable"&gt;&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">与页签栏相关的方法</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 28%; text-align: center;">方法</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>app.hideToolbar(toolbar)</td>
<td rowspan="2">这两个方法同样适用于页签栏</td>
</tr>
<tr>
<td>app.showToolbar(toolbar)</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">自动隐藏页签栏</span></div>
<p>如果某个Ajax页面不需要显示页签栏，可以在页面上添加样式类：</p>
<pre class="crayon-plain-tag">&lt;!-- no-tabbar表示为该页面隐藏页签栏 --&gt;
&lt;div data-page="about" class="page no-tabbar"&gt;</pre>
<div class="blog_h2"><span class="graybg">滚动时隐藏导航/工具栏 </span></div>
<p>F7支持当页面<span style="background-color: #c0c0c0;">向下滚动时，自动隐藏</span>导航/工具栏。</p>
<p>要全局性的启用该功能，可以配置以下应用初始化参数：</p>
<ol>
<li>hideNavbarOnPageScroll：滚动时隐藏导航栏</li>
<li>hideToolbarOnPageScroll：滚动时隐藏工具栏</li>
<li>hideTabbarOnPageScroll：滚动时隐藏页签栏</li>
<li>showBarsOnPageScrollEnd ：滚动到页面底部时显示所有栏</li>
</ol>
<p>要针对某些特定页面启用该功能，可以在<pre class="crayon-plain-tag">&lt;div class="page-content"&gt;</pre> 元素上添加以下样式类：</p>
<ol>
<li>hide-bars-on-scroll</li>
<li> hide-navbar-on-scroll </li>
<li>hide-toolbar-on-scroll </li>
<li>hide-tabbar-on-scroll </li>
</ol>
<p>在全局启用时，可以使用下面的样式类，针对特定页面禁用此功能：</p>
<ol>
<li>keep-bars-on-scroll</li>
<li>keep-navbar-on-scroll</li>
<li>keep-toolbar-on-scroll</li>
<li>keep-tabbar-on-scroll </li>
</ol>
<div class="blog_h1"><span class="graybg">搜索栏</span></div>
<p>搜索栏可以对列表视图（List View）执行搜索，或者作为自定义搜索实现的视觉元素。</p>
<p>在线演示：<a href="http://framework7.taobao.org/docs-demos/searchbar.html">http://framework7.taobao.org/docs-demos/searchbar.html</a></p>
<div class="blog_h2"><span class="graybg">搜索栏布局</span></div>
<p>搜索栏应该放置在<pre class="crayon-plain-tag">.page</pre> 和<pre class="crayon-plain-tag">.page-content</pre> 元素之间：</p>
<pre class="crayon-plain-tag">&lt;!-- 页面 --&gt;
&lt;div class="page"&gt;
    &lt;!-- 搜索栏 --&gt;
    &lt;form class="searchbar"&gt;&lt;!-- 搜索栏容器元素，推荐使用form --&gt;
        &lt;div class="searchbar-input"&gt;
            &lt;input type="search" placeholder="Search"&gt;&lt;!-- 搜索栏 --&gt;
            &lt;a href="#" class="searchbar-clear"&gt;&lt;/a&gt;&lt;!-- 可选元素，用于清空输入值的按钮，可选 --&gt;
        &lt;/div&gt;
        &lt;a href="#" class="searchbar-cancel"&gt;Cancel&lt;/a&gt;&lt;!-- 取消搜索，隐藏搜索栏，清空结果过滤，可选 --&gt;
    &lt;/form&gt;
    &lt;!-- 搜索栏overlay，深色的、覆盖在页面内容上面的一层内容，可选 --&gt;
    &lt;div class="searchbar-overlay"&gt;&lt;/div&gt;
    
    &lt;!-- 页面内容部分 --&gt;
    &lt;div class="page-content"&gt;
        &lt;!-- searchbar-not-found：如果找不到匹配的元素，显示此div --&gt;
        &lt;div class="content-block searchbar-not-found"&gt;Nothing found&lt;/div&gt;
        &lt;!-- list-block-search：被搜索的列表块 --&gt;
        &lt;!-- searchbar-found：如果找到匹配的元素，显示此div --&gt;
        &lt;div class="list-block list-block-search searchbar-found"&gt;&lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">通过JS初始化搜索栏</span></div>
<p>除了搜索栏布局，我们还需要调用API初始化它：</p>
<pre class="crayon-plain-tag">/**
 * 初始化一个搜索栏
 * @param searchbarContainer 搜索栏容器元素，HTMLElement或者CSS选择器
 * @param parameters 搜索栏初始化参数
 * @return 已初始化的搜索栏实例
 */
app.searchbar(searchbarContainer, parameters);

//示例：
var mySearchbar = app.searchbar( '.searchbar', {
    searchList : '.list-block-search',
    searchIn : '.item-title'
} );</pre>
<div class="blog_h2">通过HTML初始化搜索栏</div>
<p>你也可以通过HTML初始化搜索栏：</p>
<pre class="crayon-plain-tag">&lt;div class="page"&gt;
    &lt;!-- 为搜索栏添加searchbar-ini属性，则F7自动初始化之 --&gt;
    &lt;!-- data-*属性提供初始化参数，连字符小写风格 --&gt;
    &lt;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"&gt;
        &lt;div class="searchbar-input"&gt;
            &lt;input type="search" placeholder="Search"&gt;
            &lt;a href="#" class="searchbar-clear"&gt;&lt;/a&gt;
        &lt;/div&gt;
        &lt;a href="#" class="searchbar-cancel"&gt;Cancel&lt;/a&gt;
    &lt;/form&gt;
    &lt;div class="searchbar-overlay"&gt;&lt;/div&gt;
    &lt;div class="page-content"&gt;
        &lt;div class="content-block searchbar-not-found"&gt;&lt;/div&gt;
        &lt;div class="list-block list-block-search searchbar-found"&gt;&lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<p>通过下面的方式可以获得DOM关联的搜索栏实例：</p>
<pre class="crayon-plain-tag">var searchbar = $$('.searchbar')[0].f7Searchbar; //通过该属性访问
searchbar.search('Hello world');</pre>
<div class="blog_h2"><span class="graybg">搜索栏初始化参数</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">参数</td>
<td style="text-align: center;">类型和默认值</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>searchList</td>
<td>string / HTMLElement</td>
<td>被搜索的列表块（list block），HTMLElement或者CSS选择器</td>
</tr>
<tr>
<td>searchIn</td>
<td>string = '.item-title'</td>
<td>CSS选择器，指定列表视图元素的字段，搜索在该字段上进行，通常我们通过元素的标题搜索（.item-title）</td>
</tr>
<tr>
<td>found</td>
<td>string / HTMLElement</td>
<td>搜索结果可用时显示的元素的CSS选择器或者DOM，如果不指定，默认使用页面内的.searchbar-found元素</td>
</tr>
<tr>
<td>notFound</td>
<td>string / HTMLElement</td>
<td>类似上面，搜索结果不可用时显示的元素，默认使用页面内的.searchbar-not-found元素</td>
</tr>
<tr>
<td>overlay</td>
<td>string / HTMLElement</td>
<td>搜索栏overlay元素，默认使用页面内的.searchbar-overlay元素</td>
</tr>
<tr>
<td>ignore</td>
<td>string = '.searchbar-ignore'</td>
<td>CSS选择器，哪些元素被搜索栏忽略，总是显示在搜索结果中</td>
</tr>
<tr>
<td>customSearch</td>
<td>boolean = false</td>
<td>如果设置为true，则搜索栏不去搜索searchList指定的列表块。你可以定制自己的搜索逻辑，并手工处理数据展示</td>
</tr>
<tr>
<td>hideDividers</td>
<td>boolean = true</td>
<td>如果列表分隔器没有匹配的条目，则隐藏分隔器</td>
</tr>
<tr>
<td>hideGroups</td>
<td>boolean = true</td>
<td>如果组内没有匹配的条目，则隐藏组标题</td>
</tr>
<tr>
<td>onSearch</td>
<td>function (s)</td>
<td>搜索时（输入值改变）触发此回调</td>
</tr>
<tr>
<td>onEnable</td>
<td>function (s)</td>
<td>当搜索栏被启用时，触发此回调</td>
</tr>
<tr>
<td>onDisable</td>
<td>function (s)</td>
<td>当搜索栏被禁用（例如点击取消按钮、或者触碰searchbar-overlay元素）时，触发此回调</td>
</tr>
<tr>
<td>onClear</td>
<td>function (s)</td>
<td>当用户点击了搜索栏的clear元素时触发此回调</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">搜索栏方法、属性与事件</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">方法/属性/事件</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>params</td>
<td>搜索栏的所有初始化参数</td>
</tr>
<tr>
<td>query</td>
<td>当前搜索条件，即输入框的内容</td>
</tr>
<tr>
<td>searchList</td>
<td>搜索列表块对应的DOM元素</td>
</tr>
<tr>
<td>container</td>
<td>搜索栏容器DOM元素</td>
</tr>
<tr>
<td>input</td>
<td>搜索输入框DOM元素</td>
</tr>
<tr>
<td>active</td>
<td>boolean，当前搜索框是否处于激活状态</td>
</tr>
<tr>
<td>search(query)</td>
<td>依据入参条件执行搜索</td>
</tr>
<tr>
<td>enable()</td>
<td>启用搜索栏</td>
</tr>
<tr>
<td>disable()</td>
<td>禁用搜索栏</td>
</tr>
<tr>
<td>clear()</td>
<td>清空查询条件并更新搜素结果</td>
</tr>
<tr>
<td>destroy()</td>
<td>销毁该搜索栏实例</td>
</tr>
<tr>
<td>⚡search</td>
<td rowspan="4">这些事件的target都是搜索栏关联的<pre class="crayon-plain-tag">&lt;div class="list-block"&gt;</pre> 元素。分别在以下时机触发：
<ol>
<li><span style="color: #333333; font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: small;"><span style="line-height: 22px;">搜索框的值改变时</span></span></li>
<li>点击搜索栏的clear元素，清空搜索框时</li>
<li>搜索栏被激活时</li>
<li>搜索栏去激活时</li>
</ol>
</td>
</tr>
<tr>
<td>⚡clearSearch</td>
</tr>
<tr>
<td>⚡enableSearch</td>
</tr>
<tr>
<td>⚡disableSearch</td>
</tr>
</tbody>
</table>
<div class="blog_h1"><span class="graybg">状态栏</span></div>
<p> 状态栏是指设备屏幕顶端的一个窄条，包含信标、电量、时间等信息。F7框架中和状态栏相关的主题是状态栏overlay。</p>
<div class="blog_h2"><span class="graybg">状态栏overlay</span></div>
<p><span style="background-color: #c0c0c0;">iOS7+</span>系统允许你创建全屏应用程序，但是状态栏可能覆盖应用程序的内容。F7能够处理该问题，当应用程序处于全屏状态时，F7会自动检测到并添加<pre class="crayon-plain-tag">with-statusbar-overlay</pre> 样式类到<pre class="crayon-plain-tag">&lt;html&gt;</pre> 元素上，当应用程序退出全屏时，则去掉该样式类。</p>
<p>该样式类自动在应用程序顶端添加20像素的补白，从而防止状态栏覆盖掉用程序内容。</p>
<div class="blog_h3"><span class="graybg">改变状态栏背景色</span></div>
<p>你可以控制<span style="background-color: #c0c0c0;">全屏应用状态栏的背景色</span>：</p>
<pre class="crayon-plain-tag">&lt;style&gt;
    /*修改状态栏背景色*/
    .statusbar-overlay {
        background: pink;
    }
&lt;/style&gt;
&lt;body&gt;
  &lt;div class="statusbar-overlay"&gt;&lt;/div&gt;
&lt;/div&gt;</pre>
<p><pre class="crayon-plain-tag">.statusbar-overlay</pre> 这个div总是<span style="background-color: #c0c0c0;">固定在屏幕顶部，默认隐藏</span>。当应用程序进入全屏状态、且<pre class="crayon-plain-tag">&lt;html&gt;</pre> 元素上具有<pre class="crayon-plain-tag">with-statusbar-overlay</pre> 样式时<span style="background-color: #c0c0c0;">自动显示</span>。</p>
<p>注意：</p>
<ol>
<li>Home界面中的Web应用，其状态栏总是白色，无法改变</li>
<li>Apache Cordova 应用的状态栏默认总是黑色，F7无法修改。你可以使用Cordova插件<pre class="crayon-plain-tag">cordova-plugin-statusbar</pre> 来定制状态栏颜色</li>
</ol>
<div class="blog_h1"><span class="graybg">侧边栏</span></div>
<p>侧边栏是从左侧或者右侧滑动进入屏幕，并且覆盖在页面主体内容上方的组件。</p>
<div class="blog_h2"><span class="graybg">侧边栏布局</span></div>
<pre class="crayon-plain-tag">&lt;body&gt;
    &lt;!-- 需要增加此元素，以便侧面板能够覆盖在应用主体内容上方（z-index） --&gt;
    &lt;div class="panel-overlay"&gt;&lt;/div&gt;
    &lt;!-- 左侧面板，打开时特效：移动应用主体内容 --&gt;
    &lt;div class="panel panel-left panel-reveal"&gt;&lt;/div&gt;
    &lt;!-- 右侧面板，打开时特效：覆盖应用主体内容  --&gt;
    &lt;div class="panel panel-right panel-cover"&gt;&lt;/div&gt;
&lt;/body&gt;</pre>
<div class="blog_h2"><span class="graybg">打开/关闭面板</span></div>
<div class="blog_h3"><span class="graybg">通过HTML</span></div>
<pre class="crayon-plain-tag">&lt;body&gt;
    &lt;div class="panel-overlay"&gt;&lt;/div&gt;
    &lt;div class="panel panel-left panel-reveal"&gt;
        &lt;div class="content-block"&gt;
            &lt;!--  close-panel类用于关闭面板 --&gt;
            &lt;p&gt;&lt;a href="#" class="close-panel"&gt;关闭当前面板&lt;/a&gt;&lt;/p&gt;
            &lt;!--  open-panel类用于打开面板，data-panel用于指定操作目标 --&gt;
            &lt;p&gt;&lt;a href="#" data-panel="right" class="open-panel"&gt;打开右侧面板&lt;/a&gt;&lt;/p&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/body&gt;</pre>
<div class="blog_h3"><span class="graybg">通过JavaScript </span></div>
<pre class="crayon-plain-tag">/**
 * 打开面板
 * @param position 打开哪一侧面板，"left" 或 "right"
 */
app.openPanel(position);
/**
 * 关闭当前打开的面板
 */
app.closePanel();</pre>
<div class="blog_h2"><span class="graybg">面板相关事件</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">事件</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>⚡open</td>
<td rowspan="4">这些事件的target都是<pre class="crayon-plain-tag">&lt;div class="panel"&gt;</pre> 元素。分别在以下时机触发：
<ol>
<li>面板打开动画开始时</li>
<li>面板打开动画完成时</li>
<li>面板关闭动画开始时</li>
<li>面板关闭动画完成时</li>
</ol>
</td>
</tr>
<tr>
<td>⚡opened</td>
</tr>
<tr>
<td>⚡close</td>
</tr>
<tr>
<td>⚡closed</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">通过滑动手势打开面板</span></div>
<p>F7支持通过滑动手势打开面板，但是<span style="background-color: #c0c0c0;">只有左侧或者右侧面板中的一个</span>可以启用该手势：</p>
<pre class="crayon-plain-tag">var app = new Framework7( {
    swipePanel : 'left' //让左侧面板支持滑动手势
} );</pre>
<p>其它与面板相关的应用初始化参数包括：swipePanelCloseOpposite、 swipePanelOnlyClose、swipePanelActiveArea、swipePanelNoFollow、swipePanelThreshold。</p>
<div class="blog_h2"><span class="graybg">判断面板是否打开</span></div>
<p>当面板处于打开状态时，F7会给<pre class="crayon-plain-tag">&lt;body&gt;</pre> 元素添加额外的样式类：<pre class="crayon-plain-tag">with-panel-[position]-[effect]</pre> ：</p>
<ol>
<li>position区分左右面板，取值left或right</li>
<li>effect表示面板打开效果，取值reveal或cover</li>
</ol>
<p>下面的代码测试当前是否以覆盖方式打开了左侧面板：</p>
<pre class="crayon-plain-tag">if ($$('body').hasClass('with-panel-left-cover')) {
    console.log('左侧面板处于打开状态')
}</pre>
<div class="blog_h1"><span class="graybg">内容块</span></div>
<p>内容块主要用于为<span style="background-color: #c0c0c0;">文本内容</span>添加<span style="background-color: #c0c0c0;">额外的格式或边距</span>： </p>
<pre class="crayon-plain-tag">&lt;div class="page-content"&gt;
    &lt;p&gt;页面中普通的，位于内容块之外的文本&lt;/p&gt;

    &lt;!-- 内容块 --&gt;
    &lt;div class="content-block"&gt;
        &lt;p&gt;内容块中的文本颜色改变，且和四周有额外的边距&lt;/p&gt;
    &lt;/div&gt;

    &lt;!-- 内容块 + inner容器 --&gt;
    &lt;div class="content-block"&gt;
        &lt;div class="content-block-inner"&gt;内容块背景颜色改变&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="content-block-title"&gt;为内容块添加标题&lt;/div&gt;
    &lt;div class="content-block"&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;

    &lt;!-- 带有内凹效果的内容块，在iOS主题中表现为圆角边框、额外的边距--&gt;
    &lt;div class="content-block inset"&gt;
        &lt;div class="content-block-inner"&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;!-- 仅在面板电脑中有内凹效果的内容块 --&gt;
    &lt;div class="content-block tablet-inset"&gt;
        &lt;div class="content-block-inner"&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h1"><span class="graybg"> 布局网格（Layout Grid）</span></div>
<p>使用 F7的布局网格，我们可以灵活的在页面中定位自己的组件。</p>
<div class="blog_h2"><span class="graybg">网格布局</span></div>
<pre class="crayon-plain-tag">&lt;!-- 布局表格以行包装列的形式出现 --&gt;
&lt;div class="row"&gt;&lt;!-- 包含两列的一行 --&gt;
    &lt;!-- 每个单元格被添加样式类col-*，*表示占据的宽度百分比 --&gt;
    &lt;div class="col-50"&gt;50%&lt;/div&gt;
    &lt;div class="col-50"&gt;50%&lt;/div&gt;
&lt;/div&gt;
&lt;!-- 默认的，单元格之间有15像素的空隙，添加no-gutter则无空隙 --&gt;
&lt;div class="row no-gutter"&gt;&lt;!-- 包含三列的一行 --&gt;
    &lt;div class="col-33"&gt;33%&lt;/div&gt;
    &lt;div class="col-33"&gt;33%&lt;/div&gt;
    &lt;div class="col-33"&gt;33%&lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">单元格样式类</span></div>
<p>用于指定网格的单元格的宽度的样式类包括：</p>
<ol>
<li><pre class="crayon-plain-tag">col-*</pre> ：其中*为5/10/15...90/95.100，数字代表占据的相对宽度。设置样式类为col-auto的单元格，平均分配剩余的宽度</li>
<li><pre class="crayon-plain-tag">tablet-*</pre> ：与上面类似，用于平板类型（窗口宽度大于768像素时）</li>
</ol>
<div class="blog_h2"><span class="graybg">为单元格统一添加样式</span></div>
<p>默认情况下，F7没有给单元格添加任何样式，可以参考如下的CSS语法统一添加：</p>
<pre class="crayon-plain-tag">div[class*="col-"] {
  background: #fff;
  text-align: center;
  color: #000;
  border: 1px solid #ddd;
  padding: 5px;
}
.row {
  margin-bottom: 15px;
}</pre>
<div class="blog_h1"><span class="graybg">覆盖类组件（Overlays）</span></div>
<p> 这一大类的F7组件都在z-index方向<span style="background-color: #c0c0c0;">覆盖在应用主体内容之上</span>，它们都属于<span style="background-color: #c0c0c0;">临时视图</span>（Temporary Views）的一部分。</p>
<div class="blog_h2"><span class="graybg">模态组件（Modal）</span></div>
<p>模态是一系列包含了简短内容的小面板，类似于<span style="background-color: #c0c0c0;">居中于屏幕的弹出窗口</span>。模态通常用于向用户提问，或者给用户发出通知。</p>
<div class="blog_h3"><span class="graybg">预定义模态组件</span></div>
<p>F7预定义了一些常用的模态组件，例如警告框、确认框等。这些模态组件的标题、按钮文本的<span style="background-color: #c0c0c0;">默认值</span>可以通过modalTitle、modalPreloaderTitle 、modalButtonOk、modalButtonCancel 等应用初始化参数修改。</p>
<table class=" fixed-word-wrap full-width">
<thead>
<tr>
<td style="width: 20%; text-align: center;">组件</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>信息框（Alert）</td>
<td>类似于window.alert()，可以具有标题、文本、点击后的回调。函数签名：<br />
<pre class="crayon-plain-tag">/**
 * @param text 信息内容
 * @param title 可选的标题
 * @param callbackOk 点击OK按钮后执行的回调函数
 * @return 动态创建的模态HTML元素
 */
app.alert(text, [title, callbackOk]);</pre>
</td>
</tr>
<tr>
<td>确认框（Confirm）</td>
<td>与信息框类似，但是具有确定、取消两个按钮，点击后可以执行不同的回调。函数签名：<br />
<pre class="crayon-plain-tag">/**
 * @param text 提示内容
 * @param title 提示标题
 * @param callbackOk 点击OK按钮时执行的回调
 * @param callbackCancel 点击Cancel按钮时执行的回调
 */
app.confirm(text, [title, callbackOk, callbackCancel]);</pre>
</td>
</tr>
<tr>
<td>提示框（Prompt）</td>
<td>与确认框类似，但是还让用户输入一些文本。函数签名：<br />
<pre class="crayon-plain-tag">/**
 * @param text 提示内容
 * @param title 提示标题
 * @param callbackOk 点击OK按钮时执行的回调
 * @param callbackCancel 点击Cancel按钮时执行的回调
 */
app.prompt(text, [title, callbackOk, callbackCancel]);
/**
 * 上面两个回调函数的签名
 * @param value 用户在文本框输入的值
 */
function callback(value);</pre>
</td>
</tr>
<tr>
<td>登录和密码框</td>
<td>可以进行用户身份验证的模态窗口。函数签名：<br />
<pre class="crayon-plain-tag">/**
 * @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);</pre>
</td>
</tr>
<tr>
<td>预加载器（Preloader）</td>
<td>用于提示用户：由于某些后台操作（例如XHR）正在执行，应用需要阻塞用户操作。<br />iOS主题下的默认UI效果是：旋转菊花 + 文本。<br />F7提供了两个函数来操控预加载器：<br />
<pre class="crayon-plain-tag">/**
 * 显示预加载器
 * @param title 预加载标题，默认从应用初始化参数modalPreloaderTitle中获得
 */
app.showPreloader([title]);
/**
 * 隐藏预加载器
 */
app.hidePreloader();</pre>
</td>
</tr>
<tr>
<td>指示器（Indicator）</td>
<td>和预加载类似，但是UI只有一个旋转菊花图标，没有文本。F7提供两个函数来操控指示器：<br />
<pre class="crayon-plain-tag">app.showIndicator();// 显示指示器
app.hideIndicator();// 隐藏指示器</pre>
</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">扩展模态组件</span></div>
<p>上表中所有预定义模态组件，实际上都属于“快捷方式”，它们最终都是调用下面的函数实现功能的： </p>
<pre class="crayon-plain-tag">/**
 * 新建一个模态组件
 * @param parameters 初始化参数
 * @return 动态创建的代表了模态组件的HTMLElement
 */
app.modal(parameters);</pre>
<p>定制的模块组件的内容可以相当丰富，下面是两个例子：</p>
<pre class="crayon-plain-tag">var modal = app.modal( {
    title : '照片墙',
    text : '你觉得我的照片怎么样',
    //文本后的内容被替换为Swiper Slider组件
    afterText : 
        '&lt;div class="swiper-container" style="width: auto; margin:5px -15px -15px"&gt;' + 
            '&lt;div class="swiper-pagination"&gt;&lt;/div&gt;' + 
            '&lt;div class="swiper-wrapper"&gt;' + 
                '&lt;div class="swiper-slide"&gt;&lt;img src="..." height="150" style="display:block"&gt;&lt;/div&gt;' + 
                '&lt;div class="swiper-slide"&gt;&lt;img src="..." height="150" style="display:block"&gt;&lt;/div&gt;' + 
            '&lt;/div&gt;' + 
        '&lt;/div&gt;',
    buttons : [ {
            text : '一般般'
        }, {
            text : '太好了',
            bold : true,
            onClick : function() {
                app.alert( '谢谢！' );
            }
        }
    ]
} );
app.swiper( $$( modal ).find( '.swiper-container' ), {
    pagination : '.swiper-pagination'
} );

/**
 * 该模态组件显示两个页签
 */
app.modal( {
    //标题被设置为切换页签的按钮
    title : '&lt;div class="buttons-row"&gt;' + 
                '&lt;a href="#tab1" class="button active tab-link"&gt;页签一&lt;/a&gt;' + 
                '&lt;a href="#tab2" class="button tab-link"&gt;页签二&lt;/a&gt;' +
             '&lt;/div&gt;',
    //文本被设置为两个页签
    text : '&lt;div class="tabs"&gt;' + 
               '&lt;div class="tab active" id="tab1"&gt;页签一的内容&lt;/div&gt;' + 
               '&lt;div class="tab" id="tab2"&gt;页签二的内容&lt;/div&gt;' + 
           '&lt;/div&gt;',
    buttons : [ {
        text : '确定',
        bold : true
    } ]
} );</pre>
<div class="blog_h3"><span class="graybg">模态初始化参数</span></div>
<table class=" fixed-word-wrap full-width">
<thead>
<tr>
<td style="width: 25%; text-align: center;">参数</td>
<td style="width: 30%; text-align: center;">类型与默认值</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>title</td>
<td>string</td>
<td>可选的模态组件标题，可以是HTML片段</td>
</tr>
<tr>
<td>text</td>
<td>string</td>
<td>可选的模态组件文本，可以是HTML片段</td>
</tr>
<tr>
<td>afterText</td>
<td>string</td>
<td>可选的，在text之后展示的额外文本，可以是HTML片段</td>
</tr>
<tr>
<td>buttons</td>
<td>Button[]</td>
<td>模态按钮的数组，每个元素均是如下格式的对象：<br />
<pre class="crayon-plain-tag">{
    //按钮的文本，可以是HTML
    string text;
    //是否用粗体显示按钮文本
    boolean bold = false;
    //点击该按钮后，模态组件是否自动关闭
    boolean close = true;
    //点击该按钮时执行的回调
    function onClick();
}</pre>
</td>
</tr>
<tr>
<td>verticalButtons</td>
<td>boolean = false</td>
<td>是否纵向排列模态按钮</td>
</tr>
<tr>
<td>onClick</td>
<td>function(modelEl, index)</td>
<td>
<p>用户点击 任何模态按钮后执行的函数：</p>
<ol>
<li>modelEl 模态窗口对应的HTMLElement</li>
<li>index 被点击按钮的索引</li>
</ol>
</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">关闭模态组件</span></div>
<pre class="crayon-plain-tag">/**
 * 关闭一个模态窗口
 * @param modal 代表模态组件的CSS选择器或者HTMLElement
 */
app.closeModal(modal);</pre>
<div class="blog_h3"><span class="graybg">模态相关的事件</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">方法/事件</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>⚡open</td>
<td rowspan="4">
<p>这些事件的target均为<pre class="crayon-plain-tag">&lt;div class="modal"&gt;</pre> 元素，分别在以下时机触发：</p>
<ol>
<li>模态打开动画开始时</li>
<li>模态打开动画结束时</li>
<li>模态关闭动画开始时</li>
<li>模态关闭动画结束时</li>
</ol>
</td>
</tr>
<tr>
<td>⚡opened</td>
</tr>
<tr>
<td>⚡close</td>
</tr>
<tr>
<td>⚡closed</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">模态模板</span></div>
<p>通过传递应用初始化参数<pre class="crayon-plain-tag">modalTemplate</pre> ，可以为模态组件定制HTML模板， 该参数必须是Template7模板，下面是一个例子：</p>
<pre class="crayon-plain-tag">&lt;div class="modal {{#unless buttons}}modal-no-buttons{{/unless}}"&gt;&lt;!-- 如果定义了按钮 --&gt;
  &lt;div class="modal-inner"&gt;
    &lt;!--  如果定义了标题 --&gt;
    {{#if title}}
      &lt;div class="modal-title"&gt;{{title}}&lt;/div&gt;
    {{/if}}
    &lt;!--  如果定义了文本 --&gt;
    {{#if text}}
       &lt;div class="modal-text"&gt;{{text}}&lt;/div&gt;
    {{/if}}
    &lt;!--  如果定义了文本后内容 --&gt;
    {{#if afterText}}
      {{afterText}}
    {{/if}}
  &lt;/div&gt;
  {{#if buttons}}
    &lt;div class="modal-buttons"&gt;
      &lt;!-- 遍历所有按钮 --&gt;
      {{#each buttons}}
        &lt;span class="modal-button {{#if bold}}modal-button-bold{{/if}}"&gt;{{text}}&lt;/span&gt;
      {{/each}}
    &lt;/div&gt;
  {{/if}}
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">Popup弹窗</span></div>
<p>这类弹窗<span style="background-color: #c0c0c0;">覆盖</span>F7应用的主体内容上面，默认从<span style="background-color: #c0c0c0;">屏幕底部滑动进入</span>。在<span style="background-color: #c0c0c0;">手机上具有全屏效果</span>，在平板上默认630像素宽高。</p>
<div class="blog_h3"><span class="graybg">Popup布局</span></div>
<pre class="crayon-plain-tag">&lt;body&gt;
  &lt;!-- 额外的样式类tablet-fullscreen让Popup在平板上也全屏 --&gt;
  &lt;div class="popup tablet-fullscreen"&gt;&lt;/div&gt;
&lt;/body&gt;</pre>
<div class="blog_h3"><span class="graybg">通过HTML打开/关闭Popup</span></div>
<pre class="crayon-plain-tag">&lt;body&gt;
    &lt;div class="page-content"&gt;
        &lt;div class="content-block"&gt;
            &lt;!-- 样式类open-popup用于打开Popup弹窗（可用于任何HTML元素，不仅仅是a），data-popup指定Popup的CSS选择器 --&gt;
            &lt;p&gt;&lt;a href="#" data-popup=".popup-about" class="open-popup"&gt;Open About Popup &lt;/a&gt;&lt;/p&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;!-- 额外的样式类popup-about相当于该弹窗的标识符 --&gt;
    &lt;div class="popup popup-about"&gt;
        &lt;div class="content-block"&gt;
            &lt;!-- 样式类close-popup用于关闭当前打开的弹窗 --&gt;
            &lt;p&gt;&lt;a href="#" class="close-popup"&gt;Close popup&lt;/a&gt;&lt;/p&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/body&gt;</pre>
<div class="blog_h3"><span class="graybg">通过JavaScript打开/关闭Popup</span></div>
<pre class="crayon-plain-tag">/**
 * 打开Popup弹窗
 * @param popup HTMLElement或者String（CSS选择器）
 */
app.popup(popup);
/**
 * 关闭Popup弹窗
 * @param popup
 *     HTMLElement或者String（CSS选择器）
 *     如果省略该参数，则关闭任何打开的Popup或其它模态组件
 */
app.closeModal(popup);</pre>
<div class="blog_h3"><span class="graybg">Popup弹窗相关的事件</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">方法/事件</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>⚡open</td>
<td rowspan="4">
<p>这些事件的target均为<pre class="crayon-plain-tag">&lt;div class="popup"&gt;</pre> 元素，分别在以下时机触发：</p>
<ol>
<li>Popup弹窗打开动画开始时</li>
<li>Popup弹窗打开动画结束时</li>
<li>Popup弹窗关闭动画开始时</li>
<li>Popup弹窗关闭动画结束时</li>
</ol>
</td>
</tr>
<tr>
<td>⚡opened</td>
</tr>
<tr>
<td>⚡close</td>
</tr>
<tr>
<td>⚡closed</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">动态Popup弹窗</span></div>
<p>F7提供了一个动态创建、打开Popup弹窗的函数：</p>
<pre class="crayon-plain-tag">/**
 * 动态打开一个Popup弹窗
 * @param popupHTML Popup的HTML内容
 * @param removeOnClose 默认true，是否在关闭时移除Popup的DOM
 */
app.popup(popupHTML, removeOnClose);</pre>
<p>下面是一个例子：</p>
<pre class="crayon-plain-tag">$$('.create-popup').on('click', function () {
  var popupHTML = 
     '&lt;div class="popup"&gt;'+
       '&lt;div class="content-block"&gt;'+
         '&lt;p&gt;Popup created dynamically.&lt;/p&gt;'+
         '&lt;p&gt;&lt;a href="#" class="close-popup"&gt;关闭&lt;/a&gt;&lt;/p&gt;'+
       '&lt;/div&gt;'+
     '&lt;/div&gt;';
  app.popup(popupHTML);
});</pre>
<div class="blog_h2"><span class="graybg">Popover弹窗</span></div>
<p>Popover类似于ExtJS的Tips，是一个展示<span style="background-color: #c0c0c0;">临时信息</span>的较小的弹出窗口。当用户触碰空白处时，Popover自动关闭。Popover默认宽度是320px。</p>
<p>在<span style="background-color: #c0c0c0;">小屏幕上，不建议使用</span>Popover，最好使用操作列表（Action Sheet）代替。</p>
<div class="blog_h3"><span class="graybg">Popover的布局</span></div>
<pre class="crayon-plain-tag">&lt;body&gt;
    &lt;div class="popover"&gt;
        &lt;!-- Popover的小箭头 --&gt;
        &lt;div class="popover-angle"&gt;&lt;/div&gt;
        &lt;!-- Popover的内容 --&gt;
        &lt;div class="popover-inner"&gt;
            &lt;!-- 这里面可以包含任何HTML内容 --&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/body&gt;</pre>
<div class="blog_h3"><span class="graybg">通过HTML打开/关闭Popover</span></div>
<pre class="crayon-plain-tag">&lt;body&gt;
    &lt;div class="page-content"&gt;
        &lt;div class="content-block"&gt;
            &lt;!-- open-popover用于打开Popover弹窗 --&gt;
            &lt;p&gt;&lt;a href="#" data-popover=".popover-about" class="open-popover"&gt;打开&lt;/a&gt;&lt;/p&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="popover popover-about"&gt;
        &lt;div class="popover-angle"&gt;&lt;/div&gt;
        &lt;div class="popover-inner"&gt;
            &lt;!-- close-popover用于关闭目前打开的Popover弹窗 --&gt;
            &lt;div class="content-block"&gt;&lt;a href="#" class="close-popover"&gt;关闭&lt;/a&gt;&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/body&gt;</pre>
<p>通过HTML打开的Popover，其显示位置会自动计算（在<span style="background-color: #c0c0c0;">打开Popover的元素的周围</span>），以确保正确显示。</p>
<div class="blog_h3"><span class="graybg">通过JavaScript打开/关闭Popover</span></div>
<pre class="crayon-plain-tag">/**
 * 打开一个Popover弹窗
 * @param popover 目标弹窗的HTMLElement或者CSS选择器
 * @param target 针对的元素，弹窗会在此元素的周围定位
 */
app.popover(popover, target);
/**
 * 关闭一个Popover弹窗
 * @param popover 
 *     目标弹窗的HTMLElement或者CSS选择器
 *     如果忽略此参数，则任何打开的Popover都被关闭
 */
app.closeModal(popover);</pre>
<div class="blog_h3"><span class="graybg">动态Popover弹窗</span></div>
<p>和Popover类似，Popover也可以动态创建和展示： </p>
<pre class="crayon-plain-tag">/**
 * 动态创建并打开一个Popover弹窗
 * 
 * @param popover
 *          Popover的HTML内容
 * @param target
 *          针对的元素，弹窗会在此元素的周围定位
 * @param removeOnClose
 *          默认true，是否在关闭时移除Popover的DOM
 */
app.popover( popoverHTML, target, removeOnClose );</pre>
<div class="blog_h3"><span class="graybg">Popover弹窗相关的事件</span></div>
<p>与Popup类似，事件的Target是<pre class="crayon-plain-tag">&lt;div class="popover"&gt;</pre> 元素。</p>
<div class="blog_h2"><span class="graybg">操作列表（Action Sheet）</span></div>
<p>操作列表通常表现为从<span style="background-color: #c0c0c0;">屏幕底部滑动进入</span>的、包含若干<span style="background-color: #c0c0c0;">纵向排列按钮</span>的弹窗。操作列表可以把<span style="background-color: #c0c0c0;">按钮分成若干组</span>。可以通过操作列表，让用户确认潜在危险的操作。</p>
<p><span style="background-color: #c0c0c0;">不建议在大屏幕（平板）上使用</span>操作列表，最好用Popover代替。</p>
<div class="blog_h3"><span class="graybg">创建和打开操作列表</span></div>
<p>操作列表属于动态组件，只能通过JavaScript创建和打开：</p>
<pre class="crayon-plain-tag">/**
 * 创建并打开由若干按钮组构成的操作列表
 * @param groups 相当于button[][]，按钮组的数组，每个按钮组则是button的数组
 * @return 动态创建的、代表操作列表的HTMLElement
 */
app.actions( groups );
/**
 * 创建并打开由若干按钮构成的操作列表（单个组）
 * @param buttons 按钮的数组
 * @return 动态创建的、代表操作列表的HTMLElement
 */
app.actions( buttons );</pre>
<div class="blog_h3"><span class="graybg">按钮初始化参数</span></div>
<p>上述groups、buttons的最内层元素是按钮的配置对象： </p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 15%; text-align: center;">参数</td>
<td style="text-align: center;">类型和默认值</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>text</td>
<td>string</td>
<td>按钮的文本，可以是HTML</td>
</tr>
<tr>
<td>bold</td>
<td>boolean = false</td>
<td>可选，设置按钮文本为粗体</td>
</tr>
<tr>
<td>color</td>
<td>string</td>
<td>可选，按钮的文字颜色，可以是10种内置颜色的英文名称</td>
</tr>
<tr>
<td>bg</td>
<td>string</td>
<td>可选，按钮的北京颜色 ，可以是10种内置颜色的英文名称</td>
</tr>
<tr>
<td>label</td>
<td>boolean = true</td>
<td>如果设置为true，则当前项<span style="background-color: #c0c0c0;">作为按钮组的标题</span>，而不是按钮</td>
</tr>
<tr>
<td>disabled</td>
<td>boolean = false</td>
<td>设置为true则按钮被标记为禁用</td>
</tr>
<tr>
<td>onClick</td>
<td>function()</td>
<td>点击按钮后，执行的回调</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">把操作列表转换为Popover</span></div>
<p>由于屏幕大小的原因，F7不建议：在手机上使用Popover；或者在平板上使用Action Sheet。为了让单份代码能够同时适用手机和平板，F7提供了操作列表到Popover的转换机制：</p>
<pre class="crayon-plain-tag">/**
 * 这两个函数，在手机上创建的是操作列表，而在平板上创建的则是Popover
 * @target HTMLElement或者CSS选择器，当作为Popover时，在哪个元素周围弹出
 * @groups 操作列表/Popover包含的按钮组的数组
 * @buttons 操作列表/Popover包含的按钮的数组
 */
app.actions(target, groups);
app.actions(target, buttons);</pre>
<div class="blog_h3"><span class="graybg">关闭操作列表</span></div>
<p>默认的，操作列表在以下情况下自动关闭：</p>
<ol>
<li>当其中某个按钮被点击时</li>
<li>当触碰操作列表外部的屏幕空间时（可通过应用初始化参数modalActionsCloseByOutside定制） </li>
</ol>
<p> 如果要手工关闭操作列表，可以调用：<pre class="crayon-plain-tag">app.closeModal(actionSheet)</pre> ，该方法前面的章节已有说明。</p>
<div class="blog_h3"><span class="graybg">操作列表相关事件</span></div>
<p>与Popup、Popover类似，操作列表具有4个相关事件，这些事件的Target均为<pre class="crayon-plain-tag">&lt;div class="actions-modal"&gt;</pre> 元素。</p>
<div class="blog_h3"><span class="graybg">操作列表模板</span></div>
<p>通过传递应用初始化参数<pre class="crayon-plain-tag">modalActionsTemplate</pre> ，可以为操作列表定制HTML模板， 该参数必须是Template7模板，下面的模板展现了操作列表的默认布局：</p>
<pre class="crayon-plain-tag">&lt;div class="actions-modal"&gt;
  &lt;!-- this表示单个组 --&gt;
  {{#each this}}
    &lt;div class="actions-modal-group"&gt;
      &lt;!-- this表示单个按钮 --&gt;
      {{#each this}}
          {{#if label}}
            &lt;span class="actions-modal-label"&gt;{{text}}&lt;/span&gt;&lt;!-- 作为标题 --&gt;
          {{else}}
            &lt;div class="actions-modal-button {{#if color}}color-{{color}}{{/if}} {{#if bold}}actions-modal-button-bold{{/if}}"&gt;{{text}}&lt;/div&gt;
          {{/if}}
      {{/each}}
    &lt;/div&gt;
  {{/each}}
&lt;/div&gt;</pre>
<p>如果你使用操作列表到Popover的转换，则还可以传递应用初始化参数<pre class="crayon-plain-tag">modalActionsToPopoverTemplate</pre>  ，从而定制目标Popover的HTML模板，下面是默认的模板：</p>
<pre class="crayon-plain-tag">&lt;div class="popover actions-popover"&gt;
  &lt;div class="popover-inner"&gt;
    &lt;!-- 每个按钮组转换为一个列表块 --&gt;
    {{#each this}}
    &lt;div class="list-block"&gt;
      &lt;ul&gt;
        &lt;!-- 每个按钮转换为一个列表条目 --&gt;
        {{#each this}}
        {{#if label}}
        &lt;li class="actions-popover-label {{#if color}}color-{{color}}{{/if}} {{#if bold}}actions-popover-bold{{/if}}"&gt;{{text}}&lt;/li&gt;
        {{else}}
        &lt;li&gt;&lt;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}}"&gt;{{text}}&lt;/a&gt;&lt;/li&gt;
        {{/if}}
        {{/each}}
      &lt;/ul&gt;
    &lt;/div&gt;
    {{/each}}
  &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">登录屏幕</span></div>
<p>大部分应用程序都有登录功能， 因此F7内置了登录屏幕组件。</p>
<div class="blog_h3"><span class="graybg">登录屏幕的布局</span></div>
<pre class="crayon-plain-tag">&lt;body&gt;
  &lt;!-- 登录屏幕应当是body的直接子元素 --&gt;
  &lt;div class="login-screen"&gt;
      &lt;!-- 所有子元素都是可选的 --&gt;
      &lt;!-- 默认的视图-页面布局 --&gt;
      &lt;div class="view"&gt;
        &lt;div class="page"&gt;
          &lt;!-- 页面内容包含额外的login-screen-content类 --&gt;
          &lt;div class="page-content login-screen-content"&gt;
            &lt;div class="login-screen-title"&gt;登录屏幕标题&lt;/div&gt;
            &lt;!-- 登录表单 --&gt;
            &lt;form&gt;
              &lt;div class="list-block"&gt;
                &lt;ul&gt;
                  &lt;li class="item-content"&gt;
                    &lt;div class="item-inner"&gt;
                      &lt;div class="item-title label"&gt;用户名&lt;/div&gt;
                      &lt;div class="item-input"&gt;
                        &lt;input type="text" name="username" placeholder="用户名"&gt;
                      &lt;/div&gt;
                    &lt;/div&gt;
                  &lt;/li&gt;
                  &lt;li class="item-content"&gt;
                    &lt;div class="item-inner"&gt;
                      &lt;div class="item-title label"&gt;密码&lt;/div&gt;
                      &lt;div class="item-input"&gt;
                        &lt;input type="password" name="password" placeholder="密码"&gt;
                      &lt;/div&gt;
                    &lt;/div&gt;
                  &lt;/li&gt;
                &lt;/ul&gt;
              &lt;/div&gt;
              &lt;div class="list-block"&gt;
                &lt;ul&gt;
                  &lt;li&gt;
                    &lt;a href="#" class="item-link list-button"&gt;登录&lt;/a&gt;
                  &lt;/li&gt;
                &lt;/ul&gt;
                &lt;div class="list-block-labe"&gt;与登录相关的提示信息&lt;/div&gt;
              &lt;/div&gt;
            &lt;/form&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
  &lt;/div&gt;
&lt;/body&gt;</pre>
<div class="blog_h3"><span class="graybg">打开/关闭登录屏幕</span></div>
<p>HTML方式：</p>
<pre class="crayon-plain-tag">&lt;a href="#" class="open-login-screen"&gt;打开登录屏幕&lt;/a&gt;
&lt;a href="#" class="close-login-screen"&gt;关闭登录屏幕&lt;/a&gt;</pre>
<p>JavaScript方式：</p>
<pre class="crayon-plain-tag">/**
 * 打开登录屏幕
 */
app.loginScreen();
/**
 * 关闭登录屏幕
 * @param loginScreen 登录屏幕的TMLElement或者CSS选择器
 */
app.closeModal(loginScreen);</pre>
<div class="blog_h3"><span class="graybg">登录屏幕相关事件</span></div>
<p>与Popup、Popover、ActionSheet类似，登录屏幕具有4个相关事件，这些事件的Target均为<pre class="crayon-plain-tag">&lt;div class="login-screen"&gt;</pre> 元素。 </p>
<div class="blog_h3"><span class="graybg">从登录屏幕启动应用</span></div>
<p>某些应用要求先登录后使用，我们可以为登录屏幕添加<pre class="crayon-plain-tag">modal-in</pre> 类，这样F7应用加载后，立即显示登录屏幕：</p>
<pre class="crayon-plain-tag">&lt;body&gt;
    &lt;div class="login-screen modal-in"&gt;&lt;/div&gt;
&lt;/body&gt;</pre>
<div class="blog_h2"><span class="graybg">模态选取器（Picker Modal）</span></div>
<p>这是一种特殊的Overlay组件，可以用于实现定制的选取器。其<span style="background-color: #c0c0c0;">内容不受限制</span>，UI默认表现为从屏幕底部滑入的弹窗，右上侧有一个关闭按钮，类似于手机虚拟键盘。</p>
<div class="blog_h3"><span class="graybg">模态选取器布局</span></div>
<pre class="crayon-plain-tag">&lt;body&gt;
    &lt;!-- 模态选取器容器元素 --&gt;
    &lt;div class="picker-modal"&gt;
        &lt;!-- 可选的工具栏 --&gt;
        &lt;div class="toolbar"&gt;
            &lt;div class="toolbar-inner"&gt;
                &lt;div class="left"&gt;&lt;/div&gt;
                &lt;div class="right"&gt;
                    &lt;a href="#" class="link close-picker"&gt;完成&lt;/a&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;!-- 选取器内部元素 --&gt;
        &lt;div class="picker-modal-inner"&gt;
            &lt;!-- 选取器内容，任意自定义HTML --&gt;
            &lt;div class="content-block"&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/body&gt;</pre>
<div class="blog_h3"><span class="graybg">打开/关闭选取器</span></div>
<p>HTML方式：</p>
<pre class="crayon-plain-tag">&lt;a href="#" data-picker=".picker-1" class="link open-picker"&gt;打开选取器&lt;/a&gt;
&lt;a href="#" data-picker=".picker-1" class="close-picker"&gt;关闭选取器&lt;/a&gt;
&lt;div class="picker-modal picker-1"&gt;选取器实例&lt;/div&gt;</pre>
<p>JavaScript方式： </p>
<pre class="crayon-plain-tag">/**
 * 打开选取器
 * 
 * @param picker
 *            选取器的HTMLElement或者CSS选择器
 */
app.pickerModal( picker );
/**
 * 关闭选取器
 * 
 * @param picker
 *            选取器的HTMLElement或者CSS选择器
 *            如果不指定则关闭任何打开的模态窗口
 */
app.closeModal( picker );</pre>
<div class="blog_h3"><span class="graybg">动态创建选取器</span></div>
<pre class="crayon-plain-tag">/**
 * 动态创建并打开选取器
 * @param pickerHTML 选取器的HTML
 * @param removeOnClose 是否在关闭选取器时将其从DOM中移除
 */
app.pickerModal(pickerHTML, removeOnClose);</pre>
<div class="blog_h3"><span class="graybg">模态选取器相关事件</span></div>
<p>与Popup、Popover、ActionSheet、登录屏幕类似，模态选取器具有4个相关事件，这些事件的Target均为<pre class="crayon-plain-tag">&lt;div class="picker-modal"&gt;</pre> 元素。 </p>
<div class="blog_h1"><span class="graybg">预加载指示器（Preloader Indicator）</span></div>
<p>F7自带了基于SVG和CSS动画的的预加载提示器，可以随意的放大缩小，其UI效果是旋转菊花。预加载指示器具有两个版本，分别用于浅色、深色背景。</p>
<p>以<span style="background-color: #c0c0c0;">模态方式</span>使用预加载指示器，可以通过上一章提到的“预加载器”、“指示器”。</p>
<pre class="crayon-plain-tag">&lt;!-- 默认预加载器  --&gt;
&lt;span class="preloader"&gt;&lt;/span&gt;
&lt;!-- 白色版本的预加载器，用于深色背景 --&gt;
&lt;span class="preloader preloader-white"&gt;&lt;/span&gt;
&lt;!-- 指定大小 --&gt;</pre>
<div class="blog_h1"><span class="graybg"> 进度条（Progress Bar）</span></div>
<p>除了预加载指示器以外，F7还提供另外一种用于提示“正在处理”活动的组件——进度条。进度条分为确定的（Determinate，显示实际进度）、无限的（Infinite）两种。</p>
<div class="blog_h2"><span class="graybg">进度条布局</span></div>
<pre class="crayon-plain-tag">&lt;!-- 确定的进度条，20%完成进度 --&gt;
&lt;div class="progressbar" data-progress="20"&gt;
    &lt;span&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;!-- 也可以用span元素 --&gt;
&lt;span class="progressbar" data-progress="50"&gt;
    &lt;span&gt;&lt;/span&gt;
&lt;/span&gt;

&lt;!-- 无限的进度条 --&gt;
&lt;div class="progressbar-infinite"&gt;&lt;/div&gt;
&lt;span class="progressbar-infinite"&gt;&lt;/span&gt;
&lt;!-- 多彩效果 --&gt;
&lt;div class="progressbar-infinite color-multi"&gt;&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">进度条JavaScript API</span></div>
<pre class="crayon-plain-tag">/**
 * 设置确定进度条的进度
 * @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);</pre>
<div class="blog_h1"><span class="graybg">列表视图（List View,Table View）</span></div>
<p>列表视图是多用途、强大的UI组件，在iOS应用中经常可以看到。列表视图在一个可滚动的区域内<span style="background-color: #c0c0c0;">显示多行数据</span>，可选的，它讲数据<span style="background-color: #c0c0c0;">分为若干组/段</span>。我们可以用列表视图来：</p>
<ol>
<li>在层次型数据结构（树形）内进行导航</li>
<li>展现列表中的数据、选项</li>
<li>显示详细信息</li>
</ol>
<div class="blog_h2"><span class="graybg">列表视图的布局</span></div>
<pre class="crayon-plain-tag">&lt;!-- 列表块（List block）：列表块元素是列表视图的包装（wrapper）元素 --&gt;
&lt;!-- 注意不要把list-block放在content-block内 --&gt;
&lt;div class="list-block"&gt;
    &lt;!-- ul内是列表视图的全部元素 --&gt;
    &lt;ul&gt;
        &lt;!-- li代表列表视图的元素（条目），其内容相当复杂而灵活 --&gt;
        &lt;li&gt;
            &lt;!-- item-content为必需，作为item-media、item-inner的包装器--&gt;
            &lt;div class="item-content"&gt;
                &lt;!-- item-media为可选，用于图标、图片等媒体元素 --&gt;
                &lt;div class="item-media"&gt;
                    &lt;i class="icon my-icon"&gt;&lt;/i&gt;
                &lt;/div&gt;
                &lt;!-- item-inner为必需，作为item-title、item-after的包装器 --&gt;
                &lt;div class="item-inner"&gt;
                    &lt;!-- 必需，单行的元素标题 --&gt;
                    &lt;div class="item-title"&gt;列表元素的标题&lt;/div&gt;
                    &lt;!-- 可选，标题后内容，可以是标记（badge）、开关、按钮等任意HTML，默认右侧对齐 --&gt;
                    &lt;div class="item-after"&gt;列表元素的标签&lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
    &lt;!-- 可以在列表块的结尾处，添加一个列表块标签 --&gt;
    &lt;div class="list-block-label"&gt;列表块标签&lt;/div&gt;
&lt;/div&gt;</pre>
<p> 如果li元素内没有其它内容，你可以把item-content类标注到li元素上，少写一个div：</p>
<pre class="crayon-plain-tag">&lt;li class="item-content"&gt;
    &lt;div class="item-media"&gt;
        &lt;i class="icon my-icon"&gt;&lt;/i&gt;
    &lt;/div&gt;
    &lt;div class="item-inner"&gt;
        &lt;div class="item-title"&gt;&lt;/div&gt;
    &lt;/div&gt;
&lt;/li&gt;</pre>
<div class="blog_h3"><span class="graybg">链接元素</span></div>
<p>很多时候需要在点击列表条目后，<span style="background-color: #c0c0c0;">链接到其它页面</span>，这时需要为<pre class="crayon-plain-tag">&lt;div class="item-content"&gt;</pre> 添加额外的包装元素：</p>
<pre class="crayon-plain-tag">&lt;li&gt;
    &lt;!-- 额外的包装元素 --&gt;
    &lt;a href="#" class="item-link"&gt; &lt;!-- 导致列表右侧出现额外的箭头（链接）标记 --&gt;
        &lt;div class="item-content"&gt;
            &lt;div class="item-media"&gt;&lt;/div&gt;
            &lt;div class="item-inner"&gt;&lt;/div&gt;
        &lt;/div&gt;
    &lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
    &lt;!-- 如果li下没有其它元素，则可以把a、div合并 --&gt;
    &lt;a href="#" class="item-link item-content"&gt;
        &lt;div class="item-media"&gt;...&lt;/div&gt;
        &lt;div class="item-inner"&gt;...&lt;/div&gt;
    &lt;/a&gt;
&lt;/li&gt; </pre>
<div class="blog_h3"><span class="graybg">列表分隔器</span></div>
<p>可以插入类似下面的li元素，将列表分为两个部分：</p>
<pre class="crayon-plain-tag">&lt;li class="item-divider"&gt;Divider title here&lt;/li&gt;</pre>
<div class="blog_h3"><span class="graybg">分组的列表</span></div>
<p>可以将不同的列表元素进行分组：</p>
<pre class="crayon-plain-tag">&lt;div class="list-block"&gt;
  &lt;!-- 第一个分组 --&gt;
  &lt;div class="list-group"&gt;
    &lt;ul&gt;
      &lt;!--  分组的标题 --&gt;
      &lt;li class="list-group-title"&gt;&lt;/li&gt;
      &lt;li class="item-content"&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/div&gt;
  &lt;!-- 第二个分组--&gt;
  &lt;div class="list-group"&gt;
    &lt;ul&gt;
      &lt;li class="list-group-title"&gt;&lt;/li&gt;
      &lt;li class="item-content"&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">Inset效果的列表块</span></div>
<p>列表块可以是Inset（非全宽度、圆角矩形边框）的：</p>
<pre class="crayon-plain-tag">&lt;div class="list-block inset"&gt;
  &lt;ul&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;!-- 仅在平板电脑上启用Inset效果 --&gt;
&lt;div class="list-block tablet-inset"&gt;
  &lt;ul&gt;&lt;/ul&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">联系人列表</span></div>
<p>该组件是<span style="background-color: #c0c0c0;">分组列表的特例</span>，用于显示联系人的列表，其布局如下：</p>
<pre class="crayon-plain-tag">&lt;!-- page-content元素必须有额外的contacts-content类 --&gt;
&lt;div class="page-content contacts-content"&gt;
    &lt;!-- list-block元素必须有额外的contacts-block类 --&gt;
    &lt;div class="list-block contacts-block"&gt;
        &lt;div class="list-group"&gt;
            &lt;ul&gt;
                &lt;li class="list-group-title"&gt;汪&lt;/li&gt;
                &lt;li&gt;
                    &lt;div class="item-content"&gt;
                        &lt;div class="item-inner"&gt;
                            &lt;div class="item-title"&gt;汪震&lt;/div&gt;
                        &lt;/div&gt;
                    &lt;/div&gt;
                &lt;/li&gt;
                &lt;li&gt;
                    &lt;div class="item-content"&gt;
                        &lt;div class="item-inner"&gt;
                            &lt;div class="item-title"&gt;汪静好&lt;/div&gt;
                        &lt;/div&gt;
                    &lt;/div&gt;
                &lt;/li&gt;
            &lt;/ul&gt;
        &lt;/div&gt;
        &lt;div class="list-group"&gt;
            &lt;ul&gt;
                &lt;li class="list-group-title"&gt;李&lt;/li&gt;
                &lt;li&gt;
                    &lt;div class="item-content"&gt;
                        &lt;div class="item-inner"&gt;
                            &lt;div class="item-title"&gt;李晓蒙&lt;/div&gt;
                        &lt;/div&gt;
                    &lt;/div&gt;
                &lt;/li&gt;
            &lt;/ul&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">媒体列表视图</span></div>
<p>该组件是列表视图的扩展，用于显示更复杂的数据，其布局如下：</p>
<pre class="crayon-plain-tag">&lt;!-- 媒体列表有额外的media-list元素 --&gt;
&lt;div class="list-block media-list"&gt;
    &lt;ul&gt;
        &lt;li&gt;
            &lt;!-- 必需的item-content，和列表视图一样，作为item-media、item-inner的包装器 --&gt;
            &lt;div class="item-content"&gt;
                &lt;!-- 可选的item-media --&gt;
                &lt;div class="item-media"&gt;
                    &lt;img src="path/to/img.jpg"&gt;
                &lt;/div&gt;
                &lt;div class="item-inner"&gt;&lt;!-- 必须 --&gt;
                    &lt;div class="item-title-row"&gt;&lt;!-- 类似与列表视图 --&gt;
                        &lt;div class="item-title"&gt;元素标题&lt;/div&gt;
                        &lt;div class="item-after"&gt;元素标签&lt;/div&gt;
                    &lt;/div&gt;
                    &lt;!--子标题，单行文本 --&gt;
                    &lt;div class="item-subtitle"&gt;子标题&lt;/div&gt;
                    &lt;!--占两行的额外文本 --&gt;
                    &lt;div class="item-text"&gt;额外文本内容&lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">可滑动（Swipeable ）列表 </span></div>
<p>该组件是列表视图的扩展，支持滑动手势（例如滑动以删除， swipe-to-delete），滑动后可以显示<span style="background-color: #c0c0c0;">针对列表元素的隐藏按钮</span>。 可滑动列表的布局如下：</p>
<pre class="crayon-plain-tag">&lt;div class="list-block"&gt;
    &lt;ul&gt;
        &lt;!-- li元素上需要额外的swipeout类 --&gt;
        &lt;li class="swipeout"&gt;
            &lt;!-- swipeout-content、swipeout-actions-left/right必须是直接子元素 --&gt;
            &lt;!-- 元素内容元素外部通常包裹swipeout-content元素 --&gt;
            &lt;div class="swipeout-content"&gt;
                &lt;!-- 如果只有item-content这一个子元素，那么它可以和父元素合并 --&gt;
                &lt;div class="item-content"&gt;
                    &lt;div class="item-media"&gt;&lt;/div&gt;
                    &lt;div class="item-inner"&gt;&lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
            &lt;!-- 左侧操作集，手指向右滑动时的显示 --&gt;
            &lt;div class="swipeout-actions-left"&gt;
                &lt;!-- 这里可以是按钮、链接--&gt;
                &lt;a href="#"&gt;操作1&lt;/a&gt;
                &lt;a href="#"&gt;操作2&lt;/a&gt;
            &lt;/div&gt;
            &lt;!-- 右侧操作集，手指向左滑动时的显示 --&gt;
            &lt;div class="swipeout-actions-right"&gt;
                &lt;a href="#"&gt;操作3&lt;/a&gt;
                &lt;!--  swipeout-close，点击后关闭（隐藏）操作集 --&gt;
                &lt;a class="swipeout-close" href="#"&gt;操作4&lt;/a&gt;
            &lt;/div&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">滑动以删除（Swipe To Delete） </span></div>
<p>F7对滑动删除这一经常使用的特性内置了支持，你只需要在操作集中增加<pre class="crayon-plain-tag">&lt;a class="swipeout-delete"&gt;</pre> 按钮即可。</p>
<pre class="crayon-plain-tag">&lt;!-- 添加data-confirm，则在删除前会提示用户确认 --&gt;
&lt;!-- 设置data-close-on-cancel为true，当用户点击确认框的取消按钮时，自动关闭当前列表元素的操作集 --&gt;
&lt;a href="#" 
   class="swipeout-delete" 
   data-confirm="真的要删除吗" 
   data-confirm-title="请确认" 
   data-close-on-cancel="true" &gt;删除&lt;/a&gt;</pre>
<div class="blog_h3"><span class="graybg">长滑（Overswipe）时直接执行操作</span></div>
<p>F7支持当滑动距离过长时，自动执行：</p>
<ol>
<li>向左长滑时，自动执行右侧操作集的最后一个按钮上的动作</li>
<li>向右长滑时，自动执行左侧操作集的第一个按钮上的动作</li>
</ol>
<p>启用长滑时，F7<span style="background-color: #c0c0c0;">通过脚本</span>触发相应按钮的<span style="background-color: #c0c0c0;">click事件</span>。在长滑执行期间，目标按钮会添加额外的<pre class="crayon-plain-tag">swipeout-overswipe-active</pre> 样式类。</p>
<p>启用长滑的示例代码如下：</p>
<pre class="crayon-plain-tag">&lt;div class="swipeout-actions-left"&gt;
    &lt;!-- 左侧的第一个按钮，可以添加swipeout-overswipe以启用长滑 --&gt;
    &lt;a href="#" class="swipeout-overswipe bg-green reply"&gt;回复&lt;/a&gt;
    &lt;a href="#" class="bg-blue forward"&gt;转发&lt;/a&gt;
&lt;/div&gt;
&lt;div class="swipeout-actions-right"&gt;
    &lt;a href="#" class="mark bg-orange"&gt;标记&lt;/a&gt;
    &lt;!-- 右侧的最后一个按钮，可以添加swipeout-overswipe以启用长滑 --&gt;
    &lt;a href="#" class="swipeout-delete swipeout-overswipe"&gt;删除&lt;/a&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">滑动列表相关的方法、属性和事件</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">方法/属性/事件</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>app.swipeoutOpen()</td>
<td>
<pre class="crayon-plain-tag">/**
 * 打开（滑动动画）并显示目标列表条目的操作集
 * @param el 列表条目的HTMLElement（li）或CSS选择器
 * @param direction 显示左侧还是右侧的操作集，left/right
 * @param callback 滑动动画执行完毕时执行的回调
 */
function swipeoutOpen( el, direction, callback );</pre>
</td>
</tr>
<tr>
<td>app.swipeoutClose()</td>
<td>
<pre class="crayon-plain-tag">/**
 * 关闭（滑动动画）目标列表条目并隐藏操作集
 * @param el 列表条目的HTMLElement（li）或CSS选择器
 * @param callback 滑动动画执行完毕时执行的回调
 */
function swipeoutClose( el, callback );</pre>
</td>
</tr>
<tr>
<td>app.swipeoutDelete()</td>
<td>
<pre class="crayon-plain-tag">/**
 * 滑动并删除目标列表条目
 * @param el 列表条目的HTMLElement（li）或CSS选择器
 * @param callback 动画执行完毕，即将把li元素从DOM中移除前执行的回调
 */
function swipeoutDelete( el, callback );</pre>
</td>
</tr>
<tr>
<td>app.swipeoutOpenedEl</td>
<td>该属性指向当前处于打开状态的列表条目的HTMLElement</td>
</tr>
<tr>
<td>⚡swipeout</td>
<td rowspan="7">
<p>这些事件的Target都是<pre class="crayon-plain-tag">&lt;li class="swipeout"&gt;</pre> 元素</p>
<ol>
<li>swipeout：手指滑动列表条目的过程时触发，<pre class="crayon-plain-tag">event.detail.progress</pre> 属性存放当前滑动进度的百分比值</li>
<li>open：打开条目时，滑动动画开始时触发</li>
<li>opened：打开条目时，滑动动画结束时触发</li>
<li>close：关闭条目时，滑动动画开始时触发</li>
<li>closed：关闭条目时，滑动动画结束时触发</li>
<li>deleted：删除条目时，滑动动画结束后，即将从DOM中删除li元素前触发</li>
</ol>
</td>
</tr>
<tr>
<td>⚡open</td>
</tr>
<tr>
<td>⚡opened</td>
</tr>
<tr>
<td>⚡close</td>
</tr>
<tr>
<td>⚡closed</td>
</tr>
<tr>
<td>⚡delete</td>
</tr>
<tr>
<td>⚡deleted</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">可排序列表</span></div>
<p>该组件是列表视图的扩展，支持调整条目的顺序，其布局如下：</p>
<pre class="crayon-plain-tag">&lt;!-- 列表块元素上需要额外的sortable样式类 --&gt;
&lt;div class="list-block sortable"&gt;
    &lt;ul&gt;
        &lt;li&gt;
            &lt;div class="item-content"&gt;
                &lt;div class="item-media"&gt;&lt;/div&gt;
                &lt;div class="item-inner"&gt;&lt;/div&gt;
            &lt;/div&gt;
            &lt;!-- 一个可拖拽的小图标，用来调整条目的顺序，默认隐藏 --&gt;
            &lt;div class="sortable-handler"&gt;&lt;/div&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">启用/禁用排序</span></div>
<p>通过HTML：</p>
<pre class="crayon-plain-tag">&lt;!-- data-sortable指定目标可排序列表的CSS选择器  --&gt;
&lt;a href="#" data-sortable=".sortable" class="open-sortable"&gt;启用排序&lt;/a&gt;
&lt;a href="#" data-sortable=".sortable" class="close-sortable"&gt;禁用排序&lt;/a&gt;
&lt;a href="#" data-sortable=".sortable" class="toggle-sortable"&gt;切换启禁用状态&lt;/a&gt;</pre>
<p>通过JavaScript：</p>
<pre class="crayon-plain-tag">/**
 * @param sortableContainer
 *            可排序列表（&lt;div class="list-block sortable"&gt;）的HTMLElement或者CSS选择器 
 *            如果不指定，F7尝试寻找第一个可排序列表
 */
app.sortableOpen( sortableContainer ); // 启用
app.sortableClose( sortableContainer ); // 禁用
app.sortableToggle( sortableContainer ); // 切换</pre>
<div class="blog_h3"><span class="graybg">可排序列表相关事件</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">事件</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>⚡open</td>
<td rowspan="2">这两个事件的Target均为<pre class="crayon-plain-tag">&lt;div class="list-block sortable"&gt;</pre> 元素。分别在启用、禁用可排序功能时触发</td>
</tr>
<tr>
<td>⚡close</td>
</tr>
<tr>
<td>⚡sort</td>
<td>该事件的Target为<pre class="crayon-plain-tag">&lt;li&gt;</pre> ，当用户释放拖拽小图标时触发</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">虚列表（Virtual List）</span></div>
<p>使用虚列表，我们可以在不影响性能的前提下展现具有大量元素的列表。虚列表和搜索栏、无限滚动、下拉刷新、滑动删除等F7组件完全兼容 。</p>
<div class="blog_h3"><span class="graybg">虚列表布局</span></div>
<pre class="crayon-plain-tag">&lt;!-- 额外的virtual-list样式类 --&gt;
&lt;div class="list-block virtual-list"&gt;
    &lt;!-- 内部保持空白 --&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">虚列表的初始化</span></div>
<p>需要调用JavaScript API来初始化虚列表的内容：</p>
<pre class="crayon-plain-tag">/**
 * 初始化一个虚列表
 * @param listBlockContainer 列表块（list-block）的HTMLElement或者CSS选择器
 * @param parameters 虚列表初始化参数
 * @return 已初始化的初始化实例
 */
app.virtualList( listBlockContainer, parameters );</pre>
<p>注意列表块元素在此时必须已经存在于DOM中，如果当前不是首页，你应当在pageInit事件内初始化虚列表。 </p>
<div class="blog_h3"><span class="graybg">虚列表初始化参数</span></div>
<table class=" fixed-word-wrap full-width">
<thead>
<tr>
<td style="width: 25%; text-align: center;">参数</td>
<td style="text-align: center;">类型和默认值</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>items</td>
<td>array</td>
<td>列表条目的数组。不使用模板时，其元素是HTML片段；使用模板时，其元素一般是纯数据（JSON对象）</td>
</tr>
<tr>
<td>rowsBefore</td>
<td>number</td>
<td>在当前屏幕滚动位置之前（即屏幕底部）渲染的条目的数量，默认是单屏可容纳行数的2倍</td>
</tr>
<tr>
<td>rowsAfter</td>
<td>number</td>
<td>在当前屏幕滚动位置之后渲染的条目的数量，默认是单屏可容纳行数的1倍</td>
</tr>
<tr>
<td>cols</td>
<td>number = 1</td>
<td>每行显示的条目数量，当使用动态高度（height参数为函数）的虚列表时，此选项不兼容</td>
</tr>
<tr>
<td>height</td>
<td>number = 44 /<br />function(item) </td>
<td>每个条目的高度，如果指定函数，则高度为函数的返回值<br />注意，该参数并<span style="background-color: #c0c0c0;">不会设置条目的高度样式</span></td>
</tr>
<tr>
<td>template</td>
<td>string / function</td>
<td>Template7字符串模板或者Template已编译模板（函数形式），用来<span style="background-color: #c0c0c0;">渲染单个条目</span>。该目标必须包含条目的完整布局，包括li元素</td>
</tr>
<tr>
<td>renderItem</td>
<td>function(index, item)</td>
<td>该函数可以代替template来渲染每个条目</td>
</tr>
<tr>
<td>dynamicHeightBufferSize</td>
<td>number = 1</td>
<td>用于动态高度列表，控制缓冲大小（buffer size）</td>
</tr>
<tr>
<td>cache</td>
<td>boolean = true</td>
<td>是否启用已渲染条目的DOM缓存。如果列表条目中包含用户交互元素（按钮、表单元素等）或者列表条目可能被修改，可以启用</td>
</tr>
<tr>
<td>updatableScroll</td>
<td>boolean</td>
<td>在滚动时，设备是否更新、处理滚动事件。默认对于所有iOS 8-为fasle</td>
</tr>
<tr>
<td>showFilteredItemsOnly</td>
<td>boolean = false</td>
<td>是否仅显示<pre class="crayon-plain-tag">filter()</pre> 过滤后的元素</td>
</tr>
<tr>
<td>searchByItem</td>
<td>function(query, index, item)</td>
<td>搜索栏使用的搜索判断函数，入参包括查询条件、待判断条目及其索引。如果条目匹配搜索，则该函数应当返回true</td>
</tr>
<tr>
<td>searchAll</td>
<td>function(query, items)</td>
<td>搜索栏使用的搜索函数，你必须遍历items，并返回匹配的item数组</td>
</tr>
<tr>
<td>onItemBeforeInsert</td>
<td>function(list, item)</td>
<td>回调，条目被插入到虚拟文档片段（virtual document fragment）中时调用<br />文档片段相当于包含了本次<span style="background-color: #c0c0c0;">待渲染的列表条目的临时DOM</span>，下同</td>
</tr>
<tr>
<td>onBeforeClear</td>
<td>function(list, fragment)</td>
<td>回调，当前DOM列表将被移除前调用</td>
</tr>
<tr>
<td>onItemsBeforeInsert</td>
<td>function(list, fragment)</td>
<td>回调，当前DOM列表将被移除后，新的文档片段被插入前调研与</td>
</tr>
<tr>
<td>onItemsAfterInsert</td>
<td>function(list, fragment)</td>
<td>回调，新的文档片段被插入后调用</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">虚列表的方法和属性</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 30%; text-align: center;">方法/属性</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>items</td>
<td>虚列表包含的条目</td>
</tr>
<tr>
<td>filteredItems</td>
<td>过滤后的条目 </td>
</tr>
<tr>
<td>domCache</td>
<td>条目的DOM缓存 </td>
</tr>
<tr>
<td>params</td>
<td>所有初始化参数 </td>
</tr>
<tr>
<td>listBlock</td>
<td>list-block的Dom7元素实例 </td>
</tr>
<tr>
<td>pageContent</td>
<td>page-content的Dom7元素实例 </td>
</tr>
<tr>
<td>currentFromIndex</td>
<td>当前正在渲染的第一个条目的索引 </td>
</tr>
<tr>
<td>currentToIndex</td>
<td>当前正在渲染的最后一个条目的索引</td>
</tr>
<tr>
<td>reachEnd</td>
<td>如果当前已经渲染了最后一个条目，则为true </td>
</tr>
<tr>
<td>filterItems(indexes)</td>
<td>仅显示indexes数组中包含的条目 </td>
</tr>
<tr>
<td>resetFilter()</td>
<td>禁用过滤器，显示全部条目 </td>
</tr>
<tr>
<td>appendItem(item)</td>
<td rowspan="2">添加条目到虚列表的尾部  </td>
</tr>
<tr>
<td>appendItems(items)</td>
</tr>
<tr>
<td>prependItem(item)</td>
<td rowspan="2">添加条目到虚列表的头部</td>
</tr>
<tr>
<td>prependItems(items)</td>
</tr>
<tr>
<td>replaceItem(index, items)</td>
<td>从指定索引开始替换条目</td>
</tr>
<tr>
<td>replaceAllItems(items)</td>
<td>替换全部条目 </td>
</tr>
<tr>
<td>moveItem(oldIdx, newIdx)</td>
<td>将虚拟条目从oldIndex移动到newIdx </td>
</tr>
<tr>
<td>insertItemBefore(index, item)</td>
<td>在指定索引前面插入元素</td>
</tr>
<tr>
<td>deleteItem(index)</td>
<td rowspan="2">删除指定索引上的元素  </td>
</tr>
<tr>
<td>deleteItems(indexes)</td>
</tr>
<tr>
<td>deleteAllItems()</td>
<td>删除全部元素</td>
</tr>
<tr>
<td>clearCache()</td>
<td>清空DOM缓存 </td>
</tr>
<tr>
<td>destroy()</td>
<td>销毁虚列表的实例，解除所有事件注册 </td>
</tr>
<tr>
<td>update()</td>
<td>更新虚列表，<span style="background-color: #c0c0c0;">重新计算列表的size</span>、<span style="background-color: #c0c0c0;">重新渲染</span>虚列表 </td>
</tr>
<tr>
<td>scrollToItem(index)</td>
<td>滚动虚拟列表到指定的索引 </td>
</tr>
</tbody>
</table>
<p> 注意，上述添加、删除、改变列表元素的方法，其操作结果会<span style="background-color: #c0c0c0;">立即反应到视图上</span>。</p>
<div class="blog_h1"><span class="graybg"> 手风琴与可折叠（Accordion / Collapsible）</span></div>
<div class="blog_h2"><span class="graybg">手风琴布局</span></div>
<p>通用的手风琴布局如下：</p>
<pre class="crayon-plain-tag">&lt;!-- 手风琴条目列表 --&gt;
&lt;div class="accordion-list"&gt;
    &lt;!-- 手风琴条目 --&gt;
    &lt;div class="accordion-item"&gt;
        &lt;!-- 触碰后展开/折叠条目内容，必需 --&gt;
        &lt;div class="accordion-item-toggle"&gt;&lt;/div&gt;
        &lt;!-- 默认隐藏的条目内容，必需 --&gt;
        &lt;div class="accordion-item-content"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;!-- 处于展开状态的手风琴条目，只能有一个 --&gt;
    &lt;div class="accordion-item accordion-item-expanded"&gt;
        &lt;div class="accordion-item-toggle"&gt;&lt;/div&gt;
        &lt;div class="accordion-item-content"&gt;&lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">可折叠布局</span></div>
<p>手风琴布局实质上是多个<span style="background-color: #c0c0c0;">联动的可折叠条目的集合</span> ，可收折叠的手风琴条目可以脱离<pre class="crayon-plain-tag">accordion-list</pre> 单独使用：</p>
<pre class="crayon-plain-tag">&lt;div class="accordion-item"&gt;
    &lt;div class="accordion-item-toggle"&gt;&lt;/div&gt;
    &lt;div class="accordion-item-content"&gt;&lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">手风琴列表视图</span></div>
<p>可以把手风琴布局和列表视图结合起来使用：</p>
<pre class="crayon-plain-tag">&lt;div class="list-block accordion-list"&gt;
    &lt;ul&gt;
        &lt;li class="accordion-item"&gt;&lt;!-- 使用li代替通用手风琴布局中的div --&gt;
            &lt;a href="" class="item-link item-content"&gt;&lt;!-- 使用item-link代替accordion-item-toggle --&gt;
                &lt;div class="item-inner"&gt;
                    &lt;div class="item-title"&gt;条目标题&lt;/div&gt;
                &lt;/div&gt;
            &lt;/a&gt;
            &lt;div class="accordion-item-content"&gt;条目内容&lt;/div&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">定制手风琴</span></div>
<p> 可以通过如下方式修改手风琴条目展开、折叠时的样式：</p>
<pre class="crayon-plain-tag">&lt;div class="content-block accordion-list custom-accordion"&gt;
    &lt;div class="accordion-item"&gt;
        &lt;div class="accordion-item-toggle"&gt;
            &lt;!--  折叠时的图标，显示一个+号 --&gt;
            &lt;i class="icon icon-plus"&gt;+&lt;/i&gt;
            &lt;!-- 展开时的图标，显示一个-号 --&gt;
            &lt;i class="icon icon-minus"&gt;-&lt;/i&gt;
            &lt;span&gt;条目标题&lt;/span&gt;
        &lt;/div&gt;
        &lt;div class="accordion-item-content"&gt;
            &lt;p&gt;条目内容&lt;/p&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
/* 设置折叠、展开图标的边框为圆形  */
.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;
}
&lt;/style&gt;</pre>
<div class="blog_h2"><span class="graybg">手风琴相关方法</span></div>
<pre class="crayon-plain-tag">/**
 * @param item
 *            手风琴条目（accordion-item）的HTMLElement或CSS选择器
 */
app.accordionOpen( item ); // 展开手风琴条目
app.accordionClose( item ); // 折叠手风琴条目
app.accordionToggle( item );// 切换手风琴条目的展开/折叠状态</pre>
<div class="blog_h2"><span class="graybg">手风琴相关事件 </span></div>
<p>以下4个事件的Target均为<pre class="crayon-plain-tag">&lt;div class="accordion-item"&gt;</pre> 。触发时机分别为：</p>
<ol>
<li>open 条目打开动画开始时</li>
<li>opened 条目打开动画结束时</li>
<li>close 条目关闭动画开始时</li>
<li>closed 条目关闭动画结束时</li>
</ol>
<div class="blog_h1"><span class="graybg">卡片（Cards）</span></div>
<p>类似于列表视图，卡片也是包含和组织相关信息的常用方式。单张卡片常常包含一些相关的图片、文字、连接信息，作为更详细信息的入口，本站的首页就是卡片布局典型的例子。F7完整的支持卡片布局。</p>
<div class="blog_h2"><span class="graybg">卡片的布局</span></div>
<pre class="crayon-plain-tag">&lt;!-- 卡片容器 --&gt;
&lt;div class="card"&gt;
    &lt;!-- 卡片头部，常常显示卡片标题，可选 --&gt;
    &lt;div class="card-header"&gt;Header&lt;/div&gt;
    &lt;!-- 卡片主体部分，必需 --&gt;
    &lt;div class="card-content"&gt;
        &lt;!-- 可选的内部包装元素，添加额外的补白 --&gt;
        &lt;div class="card-content-inner"&gt;Card content&lt;/div&gt;
    &lt;/div&gt;
    &lt;!-- 卡片脚注，包含一些附加信息，链接/动作按钮等，可选 --&gt;
    &lt;div class="card-footer"&gt;Footer&lt;/div&gt;
&lt;/div&gt;</pre>
<p>注意，卡片头、脚使用flexbox布局（display:flex），在垂直方向默认居中对齐。如果你需要顶部/底部对齐，可以：</p>
<pre class="crayon-plain-tag">&lt;div class="card-header" valgin="top"&gt;
&lt;div class="card-footer" valgin="bottom"&gt;</pre>
<div class="blog_h3"><span class="graybg">作为列表条目的卡片</span></div>
<pre class="crayon-plain-tag">&lt;!-- 需要为列表块添加额外的样式类cards-list --&gt;
&lt;div class="list-block cards-list"&gt;
    &lt;ul&gt;
        &lt;li class="card"&gt;&lt;!-- 条目元素需要添加card类 --&gt;
            &lt;div class="card-header"&gt;Card Header&lt;/div&gt;
            &lt;div class="card-content"&gt;
                &lt;div class="card-content-inner"&gt;Card content&lt;/div&gt;
            &lt;/div&gt;
            &lt;div class="card-footer"&gt;Card footer&lt;/div&gt;
        &lt;/li&gt;
        &lt;li class="card"&gt;
            &lt;div class="card-header"&gt;Card Header&lt;/div&gt;
            &lt;div class="card-content"&gt;
                &lt;div class="card-content-inner"&gt;Card content&lt;/div&gt;
            &lt;/div&gt;
            &lt;div class="card-footer"&gt;Card footer&lt;/div&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;</pre>
<div class="blog_h1"><span class="graybg">Chips</span></div>
<p> 该组件只适用于Material主题。</p>
<p>Chips在一个很小的内联块中显示复杂的信息，其中可以包含照片、小标题、文本。在视觉效果上，Chip表现为圆角小矩形：</p>
<p><img class="aligncenter size-full wp-image-10908" src="https://blog.gmem.cc/wp-content/uploads/2016/01/chips.png" alt="chips" width="314" height="36" /></p>
<div class="blog_h2"><span class="graybg">Chips的布局 </span></div>
<pre class="crayon-plain-tag">&lt;!-- 容器元素 --&gt;
&lt;div class="chip"&gt;
    &lt;!-- 媒体元素，指定一个图片/头像等，可选 --&gt;
    &lt;div class="chip-media"&gt;
        &lt;img src="avator/alex.png"&gt;
    &lt;/div&gt;
    &lt;!-- 文本标签 --&gt;
    &lt;div class="chip-label"&gt;Alex Wong&lt;/div&gt;
    &lt;!-- 删除按钮，可选 --&gt;
    &lt;a href="#" class="chip-delete"&gt;&lt;/a&gt;
&lt;/div&gt;</pre>
<div class="blog_h1"><span class="graybg">按钮</span></div>
<p>F7框架包含了大量开箱即用的按钮组件，只需要把合适的样式类添加到<span style="background-color: #c0c0c0;">链接/按钮/提交input</span>元素上即可。</p>
<p>F7中的按钮默认均为<pre class="crayon-plain-tag">display:block</pre> ，且<span style="background-color: #c0c0c0;">占据父容器100%宽度</span>。</p>
<div class="blog_h2"><span class="graybg">iOS主题按钮</span></div>
<p>普通按钮，默认具有蓝色边框和蓝色文字样式：</p>
<pre class="crayon-plain-tag">&lt;p&gt;&lt;a href="#" class="button"&gt;Button&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="#" class="button"&gt;Button&lt;/a&gt;&lt;/p&gt;</pre>
<p>激活态按钮，默认具有蓝色背景和白色文字样式：</p>
<pre class="crayon-plain-tag">&lt;a href="#" class="button active"&gt;Active Button&lt;/a&gt;</pre>
<p>圆角按钮，具有更加圆润的边框：</p>
<pre class="crayon-plain-tag">&lt;p&gt;&lt;a href="#" class="button button-round"&gt;Round Button&lt;/a&gt;&lt;/p&gt;</pre>
<p>大按钮，比普通按钮更高：</p>
<pre class="crayon-plain-tag">&lt;a href="#" class="button button-big"&gt;Big Button &lt;/a&gt;</pre>
<p>按钮行，其中每个按钮具有相同的宽度，没有边距：</p>
<pre class="crayon-plain-tag">&lt;p class="buttons-row"&gt;
    &lt;a href="#" class="button"&gt;Button 1&lt;/a&gt;
    &lt;a href="#" class="button"&gt;Button 2&lt;/a&gt;
    &lt;a href="#" class="button"&gt;Button 3&lt;/a&gt;
&lt;/p&gt;</pre>
<p>填充按钮，看上去和激活态按钮类似，但是点击/触碰时有额外的样式效果：</p>
<pre class="crayon-plain-tag">&lt;a href="#" class="button button-fill"&gt;Fill Button &lt;/a&gt;</pre>
<p>彩色按钮：</p>
<pre class="crayon-plain-tag">&lt;!-- 彩色按钮，在按钮行上指定主题 --&gt;
&lt;p class="buttons-row theme-pink"&gt;
    &lt;a href="#" class="button active"&gt;Button 1&lt;/a&gt;
    &lt;a href="#" class="button"&gt;Button 2&lt;/a&gt;
    &lt;a href="#" class="button"&gt;Button 3&lt;/a&gt;
&lt;/p&gt;
&lt;!-- 彩色按钮，指定单个按钮的颜色类 --&gt;
&lt;a href="#" class="button button-fill color-green"&gt;Green&lt;/a&gt;</pre>
<p>由按钮组成的列表视图：</p>
<pre class="crayon-plain-tag">&lt;div class="content-block-title"&gt;Inset list block buttons&lt;/div&gt;
&lt;div class="list-block inset"&gt;
    &lt;ul&gt;
        &lt;li&gt;
            &lt;a href="#" class="item-link list-button"&gt;List Button 1&lt;/a&gt;
        &lt;/li&gt;
        &lt;li&gt;
            &lt;a href="#" class="item-link list-button"&gt;List Button 2&lt;/a&gt;
        &lt;/li&gt;
        &lt;li&gt;
            &lt;a href="#" class="item-link list-button"&gt;List Button 3&lt;/a&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;</pre>
<p>使用网格布局对按钮进行排版，这样可以让<span style="background-color: #c0c0c0;">按钮之间有边距</span>： </p>
<pre class="crayon-plain-tag">&lt;div class="row"&gt;
    &lt;div class="col-50"&gt;
        &lt;a href="#" class="button button-big button-red"&gt;Cancel&lt;/a&gt;
    &lt;/div&gt;
    &lt;div class="col-50"&gt;
        &lt;a href="#" class="button button-big button-green"&gt;Submit&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">Material主题按钮</span></div>
<p>普通按钮，与iOS主题类似，但是没有边框：</p>
<pre class="crayon-plain-tag">&lt;p&gt;&lt;a href="#" class="button"&gt;Button&lt;/a&gt;&lt;/p&gt;</pre>
<p>按钮行，与iOS主题类似，但是没有边框：</p>
<pre class="crayon-plain-tag">&lt;p class="buttons-row"&gt;
  &lt;a href="#" class="button"&gt;Button&lt;/a&gt;
  &lt;a href="#" class="button"&gt;Button&lt;/a&gt;
&lt;/p&gt;</pre>
<p>浮雕效果按钮（Raised Buttons） ，具有阴影效果：</p>
<pre class="crayon-plain-tag">&lt;a href="#" class="button button-raised"&gt;Button&lt;/a&gt;</pre>
<p>填充按钮，默认具有蓝色背景和白色文字：</p>
<pre class="crayon-plain-tag">&lt;a href="#" class="button button-fill button-raised"&gt;Button&lt;/a&gt;</pre>
<p>为Material波纹效果（从触碰点向周围扩散的动画）指定颜色：</p>
<pre class="crayon-plain-tag">&lt;a href="#" class="button color-green ripple-pink"&gt;Button&lt;/a&gt;</pre>
<p>大按钮、列表块按钮、彩色按钮与iOS主题类似。 </p>
<div class="blog_h1"><span class="graybg">浮动动作按钮</span></div>
<p>浮动动作按钮（FAB）仅适用于Material主题，在视觉效果上，它表现为浮动的（不随页面滚动，通常位于屏幕右下角）、圆形的的按钮 。触碰后，FAB可能会：</p>
<ol>
<li>变形：转换为一个Popover </li>
<li>快速拨号：弹出一组相关的按钮</li>
</ol>
<div class="blog_h2"><span class="graybg">浮动按钮的布局</span></div>
<pre class="crayon-plain-tag">&lt;!-- 当前页面 --&gt;
&lt;div class="page navbar-fixed"&gt;
    &lt;!-- 导航栏--&gt;
    &lt;div class="navbar"&gt;
        &lt;div class="navbar-inner"&gt;
            &lt;div class="center"&gt;&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;!-- 浮动动作按钮 --&gt;
    &lt;a href="#" class="floating-button color-pink"&gt;
        &lt;i class="icon icon-plus"&gt;&lt;/i&gt;&lt;!-- 按钮图标 --&gt;
    &lt;/a&gt;
    &lt;!-- 可滚动的页面内容 --&gt;
    &lt;div class="page-content"&gt;
        &lt;div class="content-block"&gt;&lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">变形为Popover</span></div>
<p>如果你需要在触碰FAB后显示一个Popover，可以：</p>
<pre class="crayon-plain-tag">&lt;div class="page navbar-fixed"&gt;
    &lt;!-- open-popover 用于打开一个Popover --&gt;
    &lt;!-- floating-button-to-popover 在打开Popover时显示变形动画 --&gt;
    &lt;!-- data-popover指定目标Popover的CSS选择器 --&gt;
    &lt;a href="#" data-popover=".demo-popver" class="floating-button floating-button-to-popover open-popover color-purple"&gt;
        &lt;i class="icon icon-plus"&gt;&lt;/i&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;!-- Popover --&gt;
&lt;div class="popover demo-popover"&gt;
    &lt;div class="popover-inner"&gt;
        &lt;div class="list-block"&gt;
            &lt;ul&gt;
                &lt;li&gt;
                    &lt;a href="#" class="item-content item-link"&gt;
                        &lt;div class="item-inner"&gt;
                            &lt;div class="item-title"&gt;Link&lt;/div&gt;
                        &lt;/div&gt;
                    &lt;/a&gt;
                &lt;/li&gt;
            &lt;/ul&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h2 blog_h3">快速拨号（弹出一组按钮） </div>
<p>可以在触碰FAB后，向上动画弹出一组按钮。再次触碰FAB，则按相反的动画隐藏这些按钮。你应当保证按钮组元素的数量在3-6之间：</p>
<pre class="crayon-plain-tag">&lt;div class="page navbar-fixed"&gt;
    &lt;div class="navbar"&gt;
        &lt;div class="navbar-inner"&gt;
            &lt;div class="center"&gt;&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;!-- 快速拨号包装元素 --&gt;
    &lt;div class="speed-dial"&gt;
        &lt;a href="#" class="floating-button"&gt;
            &lt;!-- 第一个按钮：快速拨号按钮组处于关闭状态时显示 --&gt;
            &lt;i class="icon icon-plus"&gt;&lt;/i&gt;
            &lt;!-- 第二个按钮：快速拨号按钮组处于打开状态时显示 --&gt;
            &lt;i class="icon icon-close"&gt;&lt;/i&gt;
        &lt;/a&gt;
        &lt;!-- 快速拨号按钮组 --&gt;
        &lt;div class="speed-dial-buttons"&gt;
            &lt;!-- 第一个按钮（最下面） --&gt;
            &lt;a href="#"&gt;
                &lt;i class="icon demo-icon-email"&gt;&lt;/i&gt;
            &lt;/a&gt;
            &lt;!-- 第二个按钮 --&gt;
            &lt;a href="#"&gt;
                &lt;i class="icon demo-icon-calendar"&gt;&lt;/i&gt;
            &lt;/a&gt;
            &lt;!-- 第三个按钮 --&gt;
            &lt;a href="#"&gt;
                &lt;i class="icon demo-icon-upload"&gt;&lt;/i&gt;
            &lt;/a&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="page-content"&gt;&lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h1"><span class="graybg">表单</span></div>
<p>F7支持大量的表单元素类型，表单元素通常在列表视图中组织。</p>
<div class="blog_h2"><span class="graybg">表单布局</span></div>
<pre class="crayon-plain-tag">&lt;!-- 表单中的元素（字段）往往放置到一个列表视图中 --&gt;
&lt;form id="formx" class="list-block"&gt; &lt;!-- 有时也使用div元素 --&gt;
    &lt;ul&gt;
        &lt;li&gt;
            &lt;div class="item-content"&gt;
                &lt;!-- 图标为可选元素 --&gt;
                &lt;div class="item-media"&gt;字段图标&lt;/div&gt;
                &lt;div class="item-inner"&gt;
                    &lt;!-- 标签为可选元素 --&gt;
                    &lt;div class="item-title label"&gt;字段标签&lt;/div&gt;
                    &lt;!-- 表单元素的包装元素 --&gt;
                    &lt;div class="item-input"&gt;
                        &lt;!-- 各类型字段的HTML标记存放在这里 --&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/form&gt;</pre>
<div class="blog_h2"><span class="graybg">支持的基本表单元素类型 </span></div>
<p>可以放在<pre class="crayon-plain-tag">&lt;div class="item-input"&gt;</pre> 内部的表单元素如下表：</p>
<table class=" fixed-word-wrap full-width">
<thead>
<tr>
<td style="width: 20%; text-align: center;">元素类型</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>各种文本元素</td>
<td>支持text、password、email、url、tel、date、number、datetime-local等类型：<br />
<pre class="crayon-plain-tag">&lt;div class="item-input"&gt;
    &lt;input type="text"&gt;
&lt;/div&gt;</pre>
</td>
</tr>
<tr>
<td>选择菜单</td>
<td>
<pre class="crayon-plain-tag">&lt;div class="item-input"&gt;
    &lt;select&gt;&lt;/select&gt;
&lt;/div&gt;</pre>
</td>
</tr>
<tr>
<td>多行文本</td>
<td>
<pre class="crayon-plain-tag">&lt;div class="item-input"&gt;
    &lt;textarea&gt;&lt;/textarea&gt;
&lt;/div&gt;</pre></p>
<p> 注意，作为列表条目时，需要额外的对齐属性：</p>
<pre class="crayon-plain-tag">&lt;li class="align-top"&gt;&lt;!-- 必须顶部对齐 --&gt;
    &lt;div class="item-content"&gt;
        &lt;div class="item-inner"&gt;
            &lt;div class="item-title label"&gt;&lt;/div&gt;
            &lt;div class="item-input"&gt;
                &lt;textarea&gt;&lt;/textarea&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/li&gt;</pre>
</td>
</tr>
<tr>
<td>可缩放多行文本</td>
<td>文本框的大小会随着其内容自动缩放：<br />
<pre class="crayon-plain-tag">&lt;div class="item-input"&gt;
    &lt;textarea class="resizable"&gt;&lt;/textarea&gt;
&lt;/div&gt;</pre>
</td>
</tr>
<tr>
<td>开关</td>
<td>需要额外的包装元素：<br />
<pre class="crayon-plain-tag">&lt;div class="item-input"&gt;
    &lt;label class="label-switch"&gt;&lt;!-- 额外的包装 --&gt;
        &lt;input type="checkbox"&gt;
        &lt;div class="checkbox"&gt;&lt;/div&gt;
    &lt;/label&gt;
&lt;/div&gt;</pre>
</td>
</tr>
<tr>
<td>滑块</td>
<td>可以选择一个范围的值，需要额外的包装元素：<br />
<pre class="crayon-plain-tag">&lt;div class="item-input"&gt;
    &lt;div class="range-slider"&gt;&lt;!-- 额外的包装 --&gt;
        &lt;input type="range" min="0" max="100" step="0.1"&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">基本表单元素完整示例</span></div>
<p><pre class="crayon-plain-tag">&lt;form id="formx" class="list-block"&gt;
    &lt;ul&gt;
        &lt;!-- 文本输入 --&gt;
        &lt;li&gt;
            &lt;div class="item-content"&gt;
                &lt;div class="item-media"&gt;
                    &lt;i class="icon icon-form-name"&gt;&lt;/i&gt;
                &lt;/div&gt;
                &lt;div class="item-inner"&gt;
                    &lt;div class="item-title label"&gt;Name&lt;/div&gt;
                    &lt;!-- 普通文本框 --&gt;
                    &lt;div class="item-input"&gt;
                        &lt;input type="text" placeholder="Your name"&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/li&gt;
        &lt;li&gt;
            &lt;div class="item-content"&gt;
                &lt;div class="item-media"&gt;
                    &lt;i class="icon icon-form-email"&gt;&lt;/i&gt;
                &lt;/div&gt;
                &lt;div class="item-inner"&gt;
                    &lt;div class="item-title label"&gt;E-mail&lt;/div&gt;
                    &lt;div class="item-input"&gt;
                        &lt;!-- 电子邮件 --&gt;
                        &lt;input type="email" placeholder="E-mail"&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/li&gt;
        &lt;!-- 下拉选择菜单 --&gt;
        &lt;li&gt;
            &lt;div class="item-content"&gt;
                &lt;div class="item-media"&gt;
                    &lt;i class="icon icon-form-gender"&gt;&lt;/i&gt;
                &lt;/div&gt;
                &lt;div class="item-inner"&gt;
                    &lt;div class="item-title label"&gt;Gender&lt;/div&gt;
                    &lt;div class="item-input"&gt;
                        &lt;select&gt;
                            &lt;option&gt;Male&lt;/option&gt;
                            &lt;option&gt;Female&lt;/option&gt;
                        &lt;/select&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/li&gt;
        &lt;!-- 日期控件 --&gt;
        &lt;li&gt;
            &lt;div class="item-content"&gt;
                &lt;div class="item-media"&gt;
                    &lt;i class="icon icon-form-calendar"&gt;&lt;/i&gt;
                &lt;/div&gt;
                &lt;div class="item-inner"&gt;
                    &lt;div class="item-title label"&gt;Birth date&lt;/div&gt;
                    &lt;div class="item-input"&gt;
                        &lt;input type="date" placeholder="Birth day" value="2014-04-30"&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/li&gt;
        &lt;!-- 开关 --&gt;
        &lt;li&gt;
            &lt;div class="item-content"&gt;
                &lt;div class="item-media"&gt;
                    &lt;i class="icon icon-form-toggle"&gt;&lt;/i&gt;
                &lt;/div&gt;
                &lt;div class="item-inner"&gt;
                    &lt;div class="item-title label"&gt;Switch&lt;/div&gt;
                    &lt;div class="item-input"&gt;
                        &lt;label class="label-switch"&gt;
                            &lt;input type="checkbox"&gt;
                            &lt;div class="checkbox"&gt;&lt;/div&gt;
                        &lt;/label&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/li&gt;
        &lt;!-- 滑块 --&gt;
        &lt;li&gt;
            &lt;div class="item-content"&gt;
                &lt;div class="item-media"&gt;
                    &lt;i class="icon icon-form-settings"&gt;&lt;/i&gt;
                &lt;/div&gt;
                &lt;div class="item-inner"&gt;
                    &lt;div class="item-title label"&gt;Slider&lt;/div&gt;
                    &lt;div class="item-input"&gt;
                        &lt;div class="range-slider"&gt;
                            &lt;input type="range" min="0" max="100" value="50" step="0.1"&gt;
                        &lt;/div&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/li&gt;
        &lt;!-- 多行文本 --&gt;
        &lt;li class="align-top"&gt;
            &lt;div class="item-content"&gt;
                &lt;div class="item-media"&gt;
                    &lt;i class="icon icon-form-comment"&gt;&lt;/i&gt;
                &lt;/div&gt;
                &lt;div class="item-inner"&gt;
                    &lt;div class="item-title label"&gt;Textarea&lt;/div&gt;
                    &lt;div class="item-input"&gt;
                        &lt;textarea&gt;&lt;/textarea&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/form&gt;</pre>
<div class="blog_h2"><span class="graybg">复选框组/单选框组</span></div>
<p>这是一个列表视图的扩展，可用于创建复选框/单选框的分组。</p>
<div class="blog_h3"><span class="graybg">复选框组</span></div>
<pre class="crayon-plain-tag">&lt;div class="list-block"&gt;
    &lt;ul&gt;
        &lt;!-- 第一个复选框 --&gt;
        &lt;li&gt;
            &lt;!-- 列表条目的内容必须是label元素，且添加样式类label-checkbox --&gt;
            &lt;label class="label-checkbox item-content"&gt;
                &lt;!-- input必须是第一个元素 --&gt;
                &lt;input type="checkbox" name="my-checkbox" value="Books" checked="checked"&gt;&lt;!-- 默认选中 --&gt;
                &lt;!-- 图标 --&gt;
                &lt;div class="item-media"&gt;
                    &lt;i class="icon icon-form-checkbox"&gt;&lt;/i&gt;
                &lt;/div&gt;
                &lt;!-- 文本 --&gt;
                &lt;div class="item-inner"&gt;
                    &lt;div class="item-title"&gt;Books&lt;/div&gt;
                &lt;/div&gt;
            &lt;/label&gt;
        &lt;/li&gt;
        &lt;!-- 第二个复选框 --&gt;
        &lt;li&gt;
            &lt;label class="label-checkbox item-content"&gt;
                &lt;input type="checkbox" name="my-checkbox" value="Movies"&gt;
                &lt;div class="item-media"&gt;
                    &lt;i class="icon icon-form-checkbox"&gt;&lt;/i&gt;
                &lt;/div&gt;
                &lt;div class="item-inner"&gt;
                    &lt;div class="item-title"&gt;Movies&lt;/div&gt;
                &lt;/div&gt;
            &lt;/label&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">单选框组</span></div>
<p>Material主题支持额外的图标，iOS主题则不支持图标：</p>
<pre class="crayon-plain-tag">&lt;div class="list-block"&gt;
    &lt;ul&gt;
        &lt;!-- 第一个单选框 --&gt;
        &lt;li&gt;
            &lt;!-- 列表条目的内容必须是label元素，且添加样式类label-radio --&gt;
            &lt;label class="label-radio item-content"&gt;
                &lt;!-- input必须是第一个元素 --&gt;
                &lt;input type="radio" name="my-radio" value="Books" checked="checked"&gt;&lt;!-- 默认选中 --&gt;
                &lt;!-- 图标，仅Material主题支持 --&gt;
                &lt;div class="item-media"&gt;
                    &lt;i class="icon icon-form-radio"&gt;&lt;/i&gt;
                &lt;/div&gt;
                &lt;div class="item-inner"&gt;
                    &lt;div class="item-title"&gt;Books&lt;/div&gt;
                &lt;/div&gt;
            &lt;/label&gt;
        &lt;/li&gt;
        &lt;!-- 第二个单选框 --&gt;
        &lt;li&gt;
            &lt;label class="label-radio item-content"&gt;
                &lt;input type="radio" name="my-radio" value="Movies"&gt;
                &lt;div class="item-inner"&gt;
                    &lt;div class="item-title"&gt;Movies&lt;/div&gt;
                &lt;/div&gt;
            &lt;/label&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">与媒体列表视图联用</span></div>
<p>复选框组、单选框组可以和媒体列表视图一起工作，展现更丰富的内容。下面是一个示例：</p>
<pre class="crayon-plain-tag">&lt;div class="content-block-title"&gt;你最喜爱的歌曲是？&lt;/div&gt;
&lt;div class="list-block media-list"&gt;
    &lt;ul&gt;
        &lt;li&gt;
            &lt;label class="label-radio item-content"&gt;
                &lt;input type="radio" name="my-radio" checked&gt;
                &lt;div class="item-media"&gt;
                    &lt;img src="..." width="80"&gt;
                &lt;/div&gt;
                &lt;div class="item-inner"&gt;
                    &lt;div class="item-title-row"&gt;
                        &lt;div class="item-title"&gt;黄色潜水艇&lt;/div&gt;
                        &lt;div class="item-after"&gt;$15&lt;/div&gt;
                    &lt;/div&gt;
                    &lt;div class="item-subtitle"&gt;披头士&lt;/div&gt;
                    &lt;div class="item-text"&gt;披头士乐队60年代的一首著名歌曲&lt;/div&gt;
                &lt;/div&gt;
            &lt;/label&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">智能选择（Smart Select）</span></div>
<p>使用智能选择，并结合复选框组/单选框组，你可以轻易的把常规的下拉菜单（select）<span style="background-color: #c0c0c0;"> 转换为动态页面</span>。在Native的iOS应用中，经常可以看到类似的UI特性。</p>
<div class="blog_h3"><span class="graybg">智能选择的基本布局</span></div>
<pre class="crayon-plain-tag">&lt;form class="list-block"&gt;
    &lt;ul&gt;
        &lt;!-- 第一个智能选择组件 --&gt;
        &lt;li&gt;
            &lt;!-- 需要额外的 "smart-select" 样式类 --&gt;
            &lt;a href="#" class="item-link smart-select"&gt;
                &lt;select name="fruits"&gt;
                    &lt;option value="apple" selected&gt;苹果&lt;/option&gt;
                    &lt;option value="pineapple"&gt;橘子&lt;/option&gt;
                &lt;/select&gt;
                &lt;!-- 在列表视图中显示的内容 --&gt;
                &lt;div class="item-content"&gt;
                    &lt;div class="item-inner"&gt;
                        &lt;!-- 文本 --&gt;
                        &lt;div class="item-title"&gt;水果&lt;/div&gt;
                        &lt;!-- 哪个菜单选项处于选中状态 --&gt;
                        &lt;div class="item-after"&gt;苹果&lt;/div&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/a&gt;
        &lt;/li&gt;
        &lt;!-- 第二个智能选择组件 --&gt;
    &lt;/ul&gt;
&lt;/form&gt;</pre>
<p>注意智能选择只能在<span style="background-color: #c0c0c0;">已初始化的视图</span>中使用。 </p>
<div class="blog_h3"><span class="graybg">单搜索栏的智能选择</span></div>
<pre class="crayon-plain-tag">&lt;div class="list-block"&gt;
    &lt;ul&gt;
        &lt;!-- 
            带搜索栏的智能选择条目 
            data-searchbar 为此智能选择启用搜索栏
            data-searchbar-placeholder 搜索框的占位符文本
            data-searchbar-cancel 取消按钮的文本
        --&gt;
        &lt;li&gt;
            &lt;a href="#" class="item-link smart-select" data-searchbar="true" data-searchbar-placeholder="Search fruits"&gt;
            &lt;/a&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">定制子页面的标题和返回链接 </span></div>
<p>默认的，智能选择子页面的标题与父页面一致，返回按钮的文本默认则由应用初始化参数<pre class="crayon-plain-tag">smartSelectBackText</pre>  指定。这些文本都可以定制：</p>
<pre class="crayon-plain-tag">&lt;div class="list-block"&gt;
    &lt;ul&gt;
        &lt;!--
            data-page-title 子页面标题
            data-back-text 子页面返回按钮文本
        --&gt;
        &lt;li&gt;
            &lt;a href="#" class="item-link smart-select" data-page-title="美味的水果" data-back-text="返回"&gt;&lt;/a&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">在Popup中打开子页面</span></div>
<p>F7支持以Popup的方式打开智能选择组件，设置应用初始化参数<pre class="crayon-plain-tag">smartSelectOpenIn:'popup'</pre>  则默认所有智能选择均以Popup的方式打开。下面演示如何指定单个智能选择以Popup方式打开：</p>
<pre class="crayon-plain-tag">&lt;div class="list-block"&gt;
    &lt;ul&gt;
        &lt;li&gt;
            &lt;!-- data-open-in设置为popup，则以弹窗方式打开智能选择 --&gt;
            &lt;a href="#" class="item-link smart-select" data-open-in="popup"&gt; &lt;/a&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">以选取器（Picker）的方式打开子页面</span></div>
<p>F7还支持在选取器模态窗口，而不是页面中打开智能选择组件，设置应用初始化参数<pre class="crayon-plain-tag">smartSelectOpenIn:'picker'</pre>  则默认所有智能选择均以Picker的方式打开。下面演示如何指定单个智能选择以Picker方式打开：</p>
<pre class="crayon-plain-tag">&lt;div class="list-block"&gt;
    &lt;ul&gt;
        &lt;li&gt;
            &lt;!-- 
                data-open-in设置为picker，则以选取器方式打开智能选择 
                data-picker-height 指定选取器的高度
            --&gt;
            &lt;a href="#" class="item-link smart-select" data-open-in="picker" data-picker-height="200px"&gt;&lt;/a&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">为选项指定图标</span></div>
<pre class="crayon-plain-tag">&lt;a href="#" class="item-link smart-select"&gt;
    &lt;!-- 在select元素上添加data-option-image、data-option-icon，为所有选项指定默认图标 --&gt;
    &lt;select name="fruits" data-option-image=""&gt;
        &lt;!-- data-option-image 指定图标 --&gt;
        &lt;option value="apple" selected data-option-image=""&gt;苹果&lt;/option&gt;
        &lt;option value="pineapple" data-option-image=""&gt;菠萝&lt;/option&gt;
        &lt;!-- data-option-color 指定文本颜色 --&gt;
        &lt;option value="pear" data-option-color="orange" data-option-image&gt;梨&lt;/option&gt;
    &lt;/select&gt;
    &lt;div class="item-content"&gt;
        &lt;div class="item-inner"&gt;
            &lt;div class="item-title"&gt;水果&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/a&gt;</pre>
<div class="blog_h3"><span class="graybg">多选和选项分组</span></div>
<pre class="crayon-plain-tag">&lt;div class="list-block"&gt;
    &lt;ul&gt;
        &lt;li&gt;
            &lt;a href="#" class="item-link smart-select"&gt;
                &lt;!-- multiple ：表示支持多选 --&gt;
                &lt;!-- maxlength：指定最多选中的选项个数 --&gt;
                &lt;select name="car" multiple maxlength="3"&gt;
                    &lt;!-- 使用optgroup，可以将选项分组，组名由label指定 --&gt;
                    &lt;optgroup label="日产"&gt;
                        &lt;option value="honda" selected&gt;本田&lt;/option&gt;
                        &lt;option value="lexus"&gt;雷克萨斯&lt;/option&gt;
                        &lt;option value="mazda"&gt;马自达&lt;/option&gt;
                        &lt;option value="nissan"&gt;尼桑&lt;/option&gt;
                        &lt;option value="toyota"&gt;丰田&lt;/option&gt;
                    &lt;/optgroup&gt;
                    &lt;optgroup label="德产"&gt;
                        &lt;option value="audi"&gt;奥迪&lt;/option&gt;
                        &lt;option value="bmw"&gt;宝马&lt;/option&gt;
                        &lt;option value="mercedes"&gt;奔驰&lt;/option&gt;
                        &lt;option value="volvo"&gt;沃尔沃&lt;/option&gt;
                    &lt;/optgroup&gt;
                &lt;/select&gt;
                &lt;div class="item-content"&gt;
                    &lt;div class="item-inner"&gt;
                        &lt;div class="item-title"&gt;汽车品牌&lt;/div&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/a&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">选择后自动关闭智能选择</span></div>
<pre class="crayon-plain-tag">&lt;div class="list-block"&gt;
    &lt;ul&gt;
        &lt;li&gt;
        &lt;!-- 设置data-back-on-select="true" 则智能选择可以自动关闭 --&gt;
            &lt;a href="#" class="item-link smart-select" data-back-on-select="true"&gt;
                &lt;select&gt;&lt;/select&gt;
                &lt;div class="item-content"&gt;&lt;/div&gt;
            &lt;/a&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;</pre>
<div class="blog_h3">与虚列表联用</div>
<p>如果选项特别多（例如1000个），则可以使用虚列表：</p>
<pre class="crayon-plain-tag">&lt;div class="list-block"&gt;
    &lt;ul&gt;
        &lt;li&gt;
            &lt;!--
                data-virtual-list="true" 使用虚列表
                data-virtual-list-height="55"设置虚列表单条目的高度为55px
            --&gt;
            &lt;a href="#" class="item-link smart-select" data-virtual-list="true" data-virtual-list-height="55"&gt;
                &lt;select name="numbers"&gt;
                    &lt;option value="1"&gt;1&lt;/option&gt;
                    &lt;option value="2"&gt;2&lt;/option&gt;
                    ...
                    &lt;option value="100000"&gt;100000&lt;/option&gt;
                &lt;/select&gt;
                &lt;div class="item-content"&gt;&lt;/div&gt;
            &lt;/a&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">为智能选择设置色彩主题</span></div>
<p>可以为智能选择页面、Popup设置主题：</p>
<pre class="crayon-plain-tag">&lt;div class="list-block"&gt;
    &lt;ul&gt;
        &lt;li&gt;
            &lt;!-- data-navbar-theme="red" 设置导航栏为红色主题 --&gt;
            &lt;!-- data-form-theme="green" 设置表单为绿色主题 --&gt;
            &lt;a href="#" class="item-link smart-select" data-navbar-theme="red" data-form-theme="green"&gt;
                &lt;select name="car"&gt;&lt;/select&gt;
                &lt;div class="item-content"&gt;&lt;/div&gt;
            &lt;/a&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">设置selected的选项</span></div>
<pre class="crayon-plain-tag">&lt;div class="list-block"&gt;
    &lt;ul&gt;
        &lt;li&gt;
            &lt;a href="#" class="item-link smart-select"&gt;
                &lt;select name="fruits"&gt;
                    &lt;option value="apple"&gt;Apple&lt;/option&gt;&lt;!-- 被选中 --&gt;
                    &lt;option value="pineapple"&gt;Pineapple&lt;/option&gt;
                &lt;/select&gt;
                &lt;div class="item-content"&gt;
                    &lt;div class="item-inner"&gt;
                        &lt;div class="item-title"&gt;Fruit&lt;/div&gt;
                        &lt;!-- 在item-after元素上设置smart-select-value，则其文本对应的选项自动选中 --&gt;
                        &lt;div class="item-after smart-select-value"&gt;Apple&lt;/div&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/a&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">与智能选择相关的JavaScript API </span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 30%; text-align: center;">方法</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>app.smartSelectOpen()</td>
<td>
<pre class="crayon-plain-tag">/**
 * 打开一个智能选择页面/弹窗/选取器
 * @param smartSelect 目标.smart-select元素对应的HTMLElement或者CSS选择器
 */
function smartSelectOpen(smartSelect);</pre>
</td>
</tr>
<tr>
<td>app.smartSelectAddOption()</td>
<td>
<pre class="crayon-plain-tag">/**
 * 动态的为智能选择添加选项
 * @param select HTML或者CSS选择器，对应select或者optgroup元素
 * @param optionHTML 被插入的选项的完整HTML
 * @param index 新选项插入的索引，如果不指定则插入到最后
 */
function smartSelectAddOption(select, optionHTML, index)</pre>
</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">禁用表单元素</span></div>
<p>F7支持为任何元素添加“禁用”样式：</p>
<ol>
<li>disabled样式类：可以为任何元素添加禁用样式</li>
<li>disabled属性：可以为表单元素添加禁用样式</li>
</ol>
<p>被禁用的元素具有较低的不透明度，而且<span style="background-color: #c0c0c0;">不接受任何touch/click事件</span>。</p>
<pre class="crayon-plain-tag">&lt;div class="list-block"&gt;
    &lt;ul&gt;
        &lt;!-- 此列表条目被禁用 --&gt;
        &lt;li class="item-content disabled"&gt;
            &lt;div class="item-inner"&gt;
                &lt;div class="item-title"&gt;&lt;/div&gt;
            &lt;/div&gt;
        &lt;/li&gt;
        &lt;!-- 此条目的表单元素被禁用 --&gt;
        &lt;li class="item-content"&gt;
            &lt;div class="item-inner"&gt;
                &lt;div class="item-input"&gt;
                    &lt;!-- 禁用的元素 --&gt;
                    &lt;input type="text" name="name" disabled&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">表单数据读取/载入</span></div>
<p>F7提供了一些便利的方法，用来收集表单数据为JSON，或者读取JSON并设置表单元素的值。</p>
<table class=" fixed-word-wrap full-width">
<thead>
<tr>
<td style="width: 25%; text-align: center;">方法</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>app.formToJSON()</td>
<td>
<pre class="crayon-plain-tag">/**
 * 收集表单字段的值，并组成一个JSON对象
 * @param form 表单元素的HTMLElement或者CSS选择器
 * @returns 返回JSON对象
 */
function formToJSON( form );</pre></p>
<p> 注意：</p>
<ol>
<li>只有<span style="background-color: #c0c0c0;">具有name属性</span>的input/select/textarea等元素，其值才会包含在结果JSON。name属性作为<span style="background-color: #c0c0c0;">JSON字段的名称</span></li>
<li>复选框checkbox和多选的select，其值<span style="background-color: #c0c0c0;">存储为数组</span></li>
</ol>
</td>
</tr>
<tr>
<td>app.formFromJSON()</td>
<td>
<pre class="crayon-plain-tag">/**
 * 使用JSON填充表单
 * @param form 目标表单的HTMLElement或者CSS选择器
 * @param formData 用来填充的JSON
 */
function formFromJSON(form, formData);</pre>
</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">表单数据的本地存储</span></div>
<p>F7支持自动存储/加载表单数据，即使是Ajax页面也支持。要启用本地存储，只需要：</p>
<ol>
<li>为表单添加额外的样式类：store-data</li>
<li>为表单设置id属性</li>
<li>为所有表单字段设置name属性，不设置的字段将被忽略</li>
</ol>
<p> JavaScript API不需要直接调用。下面是一个样例：</p>
<pre class="crayon-plain-tag">&lt;!-- 设置表单的id，添加store-data样式类 --&gt;
&lt;form id="my-form" class="list-block store-data"&gt;
    &lt;ul&gt;
        &lt;li&gt;
            &lt;div class="item-content"&gt;
                &lt;div class="item-inner"&gt;
                    &lt;div class="item-title label"&gt;姓名&lt;/div&gt;
                    &lt;div class="item-input"&gt;
                        &lt;!-- 确保表单元素具有name属性 --&gt;
                        &lt;input type="text" name="name" placeholder="请输入你的姓名"&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/li&gt;
        &lt;li&gt;
    &lt;/ul&gt;
&lt;/form&gt;</pre>
<div class="blog_h3"><span class="graybg">本地存储如何工作</span></div>
<ol>
<li>在监听到<pre class="crayon-plain-tag">pageInit</pre> 事件后，F7会调用<pre class="crayon-plain-tag">formFromJSON</pre> 函数，从HTML5的本地存储（Local Storage）中加载数据</li>
<li>在监听到表单元素的<pre class="crayon-plain-tag">change</pre> 事件后，F7会调用<pre class="crayon-plain-tag">formToJSON()</pre> 函数，存储最新的表单元素值到本地存储中</li>
</ol>
<p>任何一个表单都具有自己的本地存储键，键命名规则为<pre class="crayon-plain-tag">localStorage.f7form-[formID]</pre> ，其中formID就是表单的id属性。本地存储的值是串行化后的JSON对象。</p>
<div class="blog_h3"><span class="graybg">本地存储相关方法和事件</span></div>
<p>F7提供了一些API，可以用来管理表单的本地存储：</p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 45%; text-align: center;">方法/事件</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>app.formGetData(formId)</td>
<td>获得特定表单的本地存储，返回JSON对象</td>
</tr>
<tr>
<td>app.formDeleteData(formId)</td>
<td>删除特地表单的本地存储</td>
</tr>
<tr>
<td>formStoreData(formId, formJSON)</td>
<td>以formJSON替换特定表单的本地存储</td>
</tr>
<tr>
<td>⚡formFromJSON</td>
<td>formFromJSON()方法被调用后触发</td>
</tr>
<tr>
<td>⚡formToJSON</td>
<td>formToJSON()方法被调用后触发</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">基于XHR的表单提交</span></div>
<p>F7支持基于Ajax的自动表单提交，自动提交有两种方式</p>
<ol>
<li>当用户点击submit按钮时，或者表单的submit事件被手工触发时</li>
<li>当用户修改表单字段值时，或者表单/表单元素的change事件被手工触发时</li>
</ol>
<div class="blog_h3"><span class="graybg">基于submit事件的自动提交</span></div>
<pre class="crayon-plain-tag">&lt;!--
添加ajax-submit样式类，则表单支持submit事件时自动提交
action 存放接受请求的地址
method 使用的HTTP方法
enctype HTML的内容类型（Content type）
--&gt;
&lt;form action="/save" method="GET" class="ajax-submit" enctype="application/x-www-form-urlencoded"&gt;&lt;/form&gt;</pre>
<div class="blog_h3"><span class="graybg">基于change事件的自动提交</span> </div>
<p>与上面类似：</p>
<pre class="crayon-plain-tag">&lt;form action="/save" method="GET" class="ajax-submit-onchange"&gt;&lt;/form&gt;</pre>
<div class="blog_h3"><span class="graybg">与XHR表单提交相关的事件</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">事件</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>⚡submitted</td>
<td rowspan="3">
<p>这些事件的Target均为<pre class="crayon-plain-tag">&lt;form class="ajax-submit"&gt;</pre> 元素。分别在：</p>
<ol>
<li>成功处理XHR请求后</li>
<li>在发送XHR请求前</li>
<li>XHR请求处理失败后</li>
</ol>
<p>触发。示例：</p>
<pre class="crayon-plain-tag">$$( 'form.ajax-submit' ).on( 'submitted', function( e ) {
    var xhr = e.detail.xhr; // 浏览器的XMLHttpRequest对象
    var data = e.detail.data; // Ajax响应的内容
} );</pre>
</td>
</tr>
<tr>
<td>⚡beforeSubmit</td>
</tr>
<tr>
<td>⚡submitError</td>
</tr>
</tbody>
</table>
<div class="blog_h1"><span class="graybg"> 页签（Tabs）</span></div>
<p> 使用页签，可以方便的在不同内容直接切换。
<div class="blog_h2"><span class="graybg">页签的布局</span></div>
<pre class="crayon-plain-tag">&lt;!-- 页签包装元素 --&gt;
&lt;div class="tabs"&gt;
    &lt;!-- 页签，必须具有tab类，唯一的id，激活的（可见）页签添加active类 --&gt;
    &lt;div class="tab active" id="tab1"&gt;页签一的内容&lt;/div&gt;
    &lt;div class="tab" id="tab2"&gt;页签二的内容&lt;/div&gt;
    &lt;div class="tab" id="tab3"&gt;页签三的内容&lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">在页签之间切换</span></div>
<pre class="crayon-plain-tag">&lt;!-- 为链接添加tab-link类，则它可以用来打开页签  --&gt;
&lt;!-- href指定页签的id --&gt;
&lt;!-- active指定此链接的样式为激活的 --&gt;
&lt;a href="#tab1" class="tab-link active"&gt;页签一&lt;/a&gt;
&lt;a href="#tab2" class="tab-link"&gt;页签二&lt;/a&gt;
&lt;a href="#tab3" class="tab-link"&gt;页签三&lt;/a&gt;</pre>
<div class="blog_h3"><span class="graybg">按钮组+页签的典型示例</span></div>
<pre class="crayon-plain-tag">&lt;div class="page-content"&gt;
    &lt;div class="content-block"&gt;
        &lt;!-- 按钮组，用于控制页签 --&gt;
        &lt;div class="buttons-row"&gt;
            &lt;a href="#tab1" class="tab-link active button"&gt;Tab1&lt;/a&gt;
            &lt;a href="#tab2" class="tab-link button"&gt;Tab2&lt;/a&gt;
            &lt;a href="#tab3" class="tab-link button"&gt;Tab3&lt;/a&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;!-- 页签--&gt;
    &lt;div class="tabs"&gt;
        &lt;div id="tab1" class="tab active"&gt;
            &lt;div class="content-block"&gt;&lt;/div&gt;
        &lt;/div&gt;
        &lt;div id="tab2" class="tab"&gt;
            &lt;div class="content-block"&gt;&lt;/div&gt;
        &lt;/div&gt;
        &lt;div id="tab3" class="tab"&gt;
            &lt;div class="content-block"&gt;&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">一个链接打开多个页签</span></div>
<p>有时需要在点击链接时，打开（属于不同页签的）多个标签页，这时可以使用data-tab属性而不是href：</p>
<pre class="crayon-plain-tag">&lt;!-- 顶部页签 --&gt;
&lt;div class="tabs tabs-top"&gt;
    &lt;div class="tab tab1 active"&gt;...&lt;/div&gt;
    &lt;div class="tab tab2"&gt;...&lt;/div&gt;
&lt;/div&gt;
&lt;!-- 底部页签 --&gt;
&lt;div class="tabs tabs-bottom"&gt;
    &lt;div class="tab tab1 active"&gt;...&lt;/div&gt;
    &lt;div class="tab tab2"&gt;...&lt;/div&gt;
&lt;/div&gt;
&lt;div class="tab-links"&gt;
    &lt;!-- data-tab指定需要显示的标签页的选择器，.tab1导致顶部、底部页签的第一个标签页同时显示 --&gt;
    &lt;a href="#" class="tab-link" data-tab=".tab1"&gt;Tab 1&lt;/a&gt;
    &lt;a href="#" class="tab-link" data-tab=".tab2"&gt;Tab 2&lt;/a&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">启用页签动画</span></div>
<p>需要额外的包装元素：</p>
<pre class="crayon-plain-tag">&lt;div class="tabs-animated-wrap"&gt;
    &lt;div class="tabs"&gt;&lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">通过滑动手势（Swipe）切换标签页 </span></div>
<pre class="crayon-plain-tag">&lt;div class="pages navbar-fixed"&gt;
    &lt;div data-page="home" class="page with-subnavbar"&gt;
        &lt;div class="navbar"&gt;
            &lt;div class="navbar-inner"&gt;
                &lt;div class="subnavbar"&gt;
                    &lt;!-- 该例子把按钮组放在子导航栏中 --&gt;
                    &lt;div class="buttons-row"&gt;
                        &lt;a href="#tab1" class="button active tab-link"&gt;Tab1&lt;/a&gt;
                        &lt;a href="#tab2" class="button tab-link"&gt;Tab2&lt;/a&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;!-- tabs-swipeable-wrap包装用于启用滑动手势 --&gt;
        &lt;div class="tabs-swipeable-wrap"&gt;
            &lt;div class="tabs"&gt;
                &lt;!-- 使用 page-content类，以便保持每个标签页的滚动位置 --&gt;
                &lt;div id="tab1" class="page-content tab active"&gt;
                    &lt;div class="content-block"&gt;&lt;/div&gt;
                &lt;/div&gt;
                &lt;div id="tab2" class="page-content tab"&gt;
                    &lt;div class="content-block"&gt;&lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">页签相关方法和事件</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">方法/事件</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>app.showTab(tab)</td>
<td>激活一个标签页，tab为标签页的HTMLElement或者CSS选择器</td>
</tr>
<tr>
<td>⚡show</td>
<td>该事件的Target为<pre class="crayon-plain-tag">&lt;div class="tab"&gt;</pre> ，当页签变得可见时触发，示例：<br />
<pre class="crayon-plain-tag">$$('#tab1').on('show', function () {
    app.alert('页签一已激活');
});</pre>
</td>
</tr>
</tbody>
</table>
<div class="blog_h1"><span class="graybg"> Swiper Slider（幻灯片组件）</span></div>
<p>F7的幻灯片组件Swiper非常强大，支持灵活的配置。该组件已经发展为独立组件，可以<span style="background-color: #c0c0c0;">不依赖于F7</span>框架使用，并且用在<span style="background-color: #c0c0c0;">桌面浏览器</span>上也非常合适。</p>
<p>Swiper支持多种特性：</p>
<ol>
<li>分页：默认显示一组小圆点，类似于iOS主屏幕下部的bullet，指示当前是第几张幻灯片</li>
<li>水平或者垂直方向切换，分页也相应的显示在底部/右侧</li>
<li>嵌套的幻灯片</li>
<li>同时显示多列幻灯片</li>
<li>同时显示多行幻灯片</li>
<li>显示左右侧的导航按钮</li>
<li>循环显示幻灯片</li>
<li>各种切换效果：淡入淡出、3D立方体、3D封面流、3D翻转效果</li>
<li>显示幻灯缩略图</li>
<li>键盘导航、鼠标中键导航</li>
<li>动态增减幻灯片数量</li>
<li>视差效果</li>
<li>以分数（1/10）、进度条等方式显示分页信息</li>
<li>支持图片延迟加载</li>
</ol>
<div class="blog_h2"><span class="graybg">幻灯片组件的HTML布局</span></div>
<div class="blog_h3"><span class="graybg">简单幻灯片组件</span></div>
<pre class="crayon-plain-tag">&lt;!-- 主容器，包含幻灯片、分页 --&gt;
&lt;div class="swiper-container"&gt;
    &lt;!-- 幻灯片条目的额外包装元素 --&gt;
    &lt;div class="swiper-wrapper"&gt;
        &lt;!-- 幻灯片条目，可以包含任意HTML --&gt;
        &lt;div class="swiper-slide"&gt;Slide 1&lt;/div&gt;
        &lt;div class="swiper-slide"&gt;Slide 2&lt;/div&gt;
        &lt;div class="swiper-slide"&gt;Slide 3&lt;/div&gt;
    &lt;/div&gt;
    &lt;!-- 包含自动创建的分页小圆点，可选元素 --&gt;
    &lt;div class="swiper-pagination"&gt;&lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">哈希导航</span></div>
<pre class="crayon-plain-tag">&lt;div class="swiper-container"&gt;
    &lt;div class="swiper-wrapper"&gt;
        &lt;!-- 通过data-hash设置幻灯片的哈希值 --&gt;
        &lt;div class="swiper-slide" data-hash="slide1"&gt;Slide 1&lt;/div&gt;
        &lt;div class="swiper-slide" data-hash="slide2"&gt;Slide 2&lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;script type="text/javascript"&gt;
var swiper = new Swiper('.swiper-container', {
    hashnav: true
})
&lt;/script&gt;</pre>
<div class="blog_h3"><span class="graybg">图片和延迟加载 </span></div>
<pre class="crayon-plain-tag">&lt;div class="swiper-container"&gt;
    &lt;div class="swiper-wrapper"&gt;
        &lt;!-- 延迟加载的图片 --&gt;
        &lt;div class="swiper-slide"&gt;
            &lt;img data-src="path/to/picture-1.jpg" class="swiper-lazy"&gt;
            &lt;div class="swiper-lazy-preloader"&gt;&lt;/div&gt;
        &lt;/div&gt;
        &lt;!-- 延迟加载的图片，可以使用data-srcset属性（视网膜屏，4x表示4个物理像素组成1个显示像素） --&gt;
        &lt;div class="swiper-slide"&gt;
            &lt;img data-src="path/to/logo-small.png" data-srcset="path/logo/logo-large.png 2x" class="swiper-lazy"&gt;
            &lt;div class="swiper-lazy-preloader"&gt;&lt;/div&gt;
        &lt;/div&gt;
        &lt;!-- 延迟加载的背景图片 --&gt;
        &lt;div class="swiper-slide"&gt;
            &lt;div data-background="path/to/picture-2.jpg" class="swiper-lazy"&gt;
                &lt;div class="swiper-lazy-preloader"&gt;&lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;!-- 延迟加载的背景图片，设置在幻灯片元素上 --&gt;
        &lt;div data-background="path/to/picture-3.jpg" class="swiper-slide swiper-lazy"&gt;
            &lt;div class="swiper-lazy-preloader"&gt;&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;script type="text/javascript"&gt;
var swiper = new Swiper('.swiper-container', {
    preloadImages: false,
    lazyLoading: true
});  
&lt;/script&gt;</pre>
<div class="blog_h2"><span class="graybg">初始化幻灯片组件</span></div>
<div class="blog_h3"><span class="graybg">通过HTML</span></div>
<pre class="crayon-plain-tag">&lt;!-- 
    只需为容器添加swiper-init类，即可通过HTML初始化幻灯片
    data-***用于指定初始化参数，必须把驼峰式大小写改为短横线小写风格
    亦可通过data-swiper，传递一个JSON字符串，以指定所有初始化参数
--&gt;
&lt;div class="swiper-container swiper-init" data-speed="400" data-space-between="40" data-pagination=".swiper-pagination"&gt;
    &lt;div class="swiper-wrapper"&gt;&lt;/div&gt;
&lt;/div&gt;</pre>
<p>下面的代码获得通过HTML初始化的幻灯片组件实例：</p>
<pre class="crayon-plain-tag">var swiper = $$('.swiper-container')[0].swiper;
swiper.slideNext(); //调用方法</pre>
<div class="blog_h3"><span class="graybg">通过JavaScript</span></div>
<p>初始化幻灯片，需要容器元素的DOM已经存在，因此需要在pageInit事件/回调中调用初始化函数：</p>
<pre class="crayon-plain-tag">/**
 * @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
});</pre>
<div class="blog_h2"><span class="graybg">幻灯片组件的初始化参数</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">参数</td>
<td style="width: 28%; text-align: center;">类型和默认值</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>initialSlide</td>
<td>number = 0</td>
<td>最初显示的幻灯片的索引</td>
</tr>
<tr>
<td>direction</td>
<td>string = 'horizontal'</td>
<td>幻灯片的切换方向，还可以取值“vertical”<br />如果设置为vertical，则分页bullet显示在右侧而不是底部</td>
</tr>
<tr>
<td>speed</td>
<td>number = 300</td>
<td>幻灯切换动画持续的毫秒数</td>
</tr>
<tr>
<td>width</td>
<td>number</td>
<td rowspan="2">设置组件的宽高，这些选项会导致幻灯片组件失去响应式（Responsive）特性</td>
</tr>
<tr>
<td>height</td>
<td>number</td>
</tr>
<tr>
<td>autoHeight</td>
<td>boolean = false</td>
<td>如果设置为true，那么组件包装元素的高度将自动与当前幻灯片的高度一致</td>
</tr>
<tr>
<td>roundLengths</td>
<td>boolean = false</td>
<td>如果设置为true，则自动舍入幻灯片的宽高为整数，避免某些屏幕上文本显示模糊</td>
</tr>
<tr>
<td>nested</td>
<td>boolean = false</td>
<td>仅在嵌套的、且与父组件direction相同的幻灯组件上设置为true，以修正touch事件拦截</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>自动播放</em></td>
</tr>
<tr>
<td>autoplay</td>
<td>number</td>
<td>自动播放间隔ms，如果不设置该参数，则禁用自动播放</td>
</tr>
<tr>
<td>autoplayStopOnLast</td>
<td>boolean = false</td>
<td>是否在到达最后一张幻灯时停止播放，对循环模式无效</td>
</tr>
<tr>
<td>autoplayDisableOnInteraction</td>
<td>boolean = true</td>
<td>是否在用户与组件交互时，停止自动播放<br />在交互结束后，自动播放会重新开始</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>CSS特效</em></td>
</tr>
<tr>
<td>effect</td>
<td>string = 'slide'</td>
<td>幻灯片切换CSS特效，可以是：
<ol>
<li><span style="color: #333333; font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 22px;">slide：</span><span style="color: #333333; font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 22px;"> 滑动</span></li>
<li>fade： 淡入淡出</li>
<li>cube： 3D立方体</li>
<li>coverflow： 3D封面流</li>
<li>flip： 3D翻转</li>
</ol>
</td>
</tr>
<tr>
<td>fade</td>
<td>object = <br />
<pre class="crayon-plain-tag">{
    crossFade: false
}</pre>
</td>
<td>淡入淡出特效的参数</td>
</tr>
<tr>
<td>cube</td>
<td>object = <br />
<pre class="crayon-plain-tag">{
  slideShadows: true,
  shadow: true,
  shadowOffset: 20,
  shadowScale: 0.94
}</pre>
</td>
<td>
<p>3D立方体特效的参数，禁用阴影可以获得更好的性能</p>
</td>
</tr>
<tr>
<td>coverflow</td>
<td>object = <br />
<pre class="crayon-plain-tag">{
  rotate: 50,
  stretch: 0,
  depth: 100,
  modifier: 1,
  slideShadows : true
}</pre>
</td>
<td>3D封面流特效的参数，禁用阴影可以获得更好的性能</td>
</tr>
<tr>
<td>flip</td>
<td>object = <br />
<pre class="crayon-plain-tag">{
  slideShadows : true
  limitRotation: true
}</pre>
</td>
<td>3D翻转特效的参数，</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>视差效果</em></td>
</tr>
<tr>
<td>parallax</td>
<td>boolean = false</td>
<td>如果启用，则可以在幻灯元素内使用parallaxed元素</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>幻灯片网格</em></td>
</tr>
<tr>
<td>spaceBetween</td>
<td>number = 0</td>
<td>两张幻灯片之间的举例</td>
</tr>
<tr>
<td>slidesPerView</td>
<td>number = 1<br />string = 'auto'</td>
<td>每个视图包含的幻灯片数量，即同时能够显示的幻灯片数量<br />设置为auto，并且loop: true，则同时需要设置loopedSlides参数<br />设置为auto，则与多行模式（slidesPerColumn 大于1）不兼容</td>
</tr>
<tr>
<td>slidesPerColumn</td>
<td>number = 1</td>
<td>每一列显示幻灯片的数量，多行布局</td>
</tr>
<tr>
<td>slidesPerColumnFill</td>
<td>string = 'column'</td>
<td>可选值column/row，指定幻灯片如何填充行</td>
</tr>
<tr>
<td>slidesPerGroup</td>
<td>number = 1</td>
<td>指定几张幻灯片分为一组</td>
</tr>
<tr>
<td>centeredSlides</td>
<td>boolean = false</td>
<td>如果设置为true，则当前幻灯片被居中显示</td>
</tr>
<tr>
<td>slidesOffsetBefore</td>
<td>number = 0</td>
<td>在容器的开始处（所有幻灯片之前）添加额外的偏移量</td>
</tr>
<tr>
<td>slidesOffsetAfter</td>
<td>number = 0</td>
<td>在容器的结束处（所有幻灯片之后）添加额外的偏移量</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>鼠标指针</em></td>
</tr>
<tr>
<td>grabCursor</td>
<td>boolean = false</td>
<td>悬停在幻灯片上时，显示手状鼠标指针</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>触碰</em></td>
</tr>
<tr>
<td>touchEventsTarget</td>
<td>string = 'container'</td>
<td>在哪个元素上（Target）监听touch事件，可以是：
<ol>
<li><span style="color: #333333; font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 22px;">container：在.swiper-container元素上</span></li>
<li>wrapper：在.swiper-wrapper元素上</li>
</ol>
</td>
</tr>
<tr>
<td>touchAngle</td>
<td>number = 45</td>
<td>可以触发移动操作的滑动操作的角度限制</td>
</tr>
<tr>
<td>simulateTouch</td>
<td>boolean = true</td>
<td>设置为true，则支持鼠标拖拽模拟触碰滑动操作</td>
</tr>
<tr>
<td>shortSwipes</td>
<td>boolean = true</td>
<td>是否启用短滑</td>
</tr>
<tr>
<td>longSwipes</td>
<td>boolean = true</td>
<td>是否启用长滑</td>
</tr>
<tr>
<td>followFinger</td>
<td>boolean = true</td>
<td>手指滑动时，幻灯片是否也跟着移动</td>
</tr>
<tr>
<td>onlyExternal</td>
<td>boolean = false</td>
<td>如果设置为true，则只能通过API调用来切换幻灯片</td>
</tr>
<tr>
<td>threshold</td>
<td>number = 0</td>
<td>触发幻灯片移动的最小滑动距离，单位px</td>
</tr>
<tr>
<td>touchMoveStopPropagation</td>
<td>boolean = true</td>
<td>是否禁止touchmove事件的传播（propagation）</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>点击</em></td>
</tr>
<tr>
<td>preventClicks</td>
<td>boolean = true</td>
<td>在滑动时，避免在链接上意外触发click事件</td>
</tr>
<tr>
<td>preventClicksPropagation</td>
<td>boolean = true</td>
<td>在滑动时，禁止点击事件的传播</td>
</tr>
<tr>
<td>slideToClickedSlide</td>
<td>boolean = false</td>
<td>如果设置为true，在某种幻灯片上点击，则切换至该幻灯片</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>滑动手势</em></td>
</tr>
<tr>
<td>allowSwipeToPrev</td>
<td>boolean = true</td>
<td>是否允许向前（左/上）滑动</td>
</tr>
<tr>
<td>allowSwipeToNext</td>
<td>boolean = true</td>
<td>是否允许向后（右/下）滑动</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>分页</em></td>
</tr>
<tr>
<td>pagination</td>
<td>string / HTMLElement</td>
<td>分页内容的容器元素或者其CSS选择器</td>
</tr>
<tr>
<td>paginationType</td>
<td>string = 'bullets'</td>
<td>
<p>分页显示方式：</p>
<ol>
<li>bullets 一排小圆点</li>
<li>fraction 类似于1/10这样的数字</li>
<li>progress 进度条</li>
<li>custom 自定义</li>
</ol>
</td>
</tr>
<tr>
<td>paginationHide</td>
<td>boolean = true</td>
<td>是否允许通过点击分页容器，来切换分页的可见性</td>
</tr>
<tr>
<td>paginationClickable</td>
<td>boolean = false</td>
<td>是否允许通过点击小圆点来切换到相应幻灯片，仅用于bullet</td>
</tr>
<tr>
<td>paginationElement</td>
<td>string = 'span'</td>
<td>单个小圆点在什么HTML标记内显示，仅用于bullet</td>
</tr>
<tr>
<td>paginationBulletRender</td>
<td>function(index, className)</td>
<td>bullet类型的分页的渲染函数，示例：<br />
<pre class="crayon-plain-tag">function( index, className ) {
    return '&lt;span class="' + className + '"&gt;' + 
               ( index + 1 ) + 
           '&lt;/span&gt;';
}</pre>
</td>
</tr>
<tr>
<td>paginationFractionRender</td>
<td>function(swiper, currentClassName, totalClassName)</td>
<td>fraction类型的分页的渲染函数，示例：<br />
<pre class="crayon-plain-tag">function ( swiper, currentClassName, totalClassName ) {
    return 
    '&lt;span class="' + currentClassName + '"&gt;&lt;/span&gt;' + 
    ' of ' + '&lt;span class="' + totalClassName + '"&gt;&lt;/span&gt;';
};</pre>
</td>
</tr>
<tr>
<td>paginationProgressRender</td>
<td>function(swiper, progressbarClass)</td>
<td>progress类型的分页的渲染函数，示例：<br />
<pre class="crayon-plain-tag">function (swiper, progressbarClass) {
    return '&lt;span class="' + progressbarClass + '"&gt;&lt;/span&gt;';
}</pre>
</td>
</tr>
<tr>
<td>paginationCustomRender</td>
<td>function (swiper, current, total)</td>
<td>custom类型的分页的渲染函数，示例：<br />
<pre class="crayon-plain-tag">function (swiper, current, total) {
    return current + ' of ' + total;
}</pre>
</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>滚动条</em></td>
</tr>
<tr>
<td>scrollbar</td>
<td>string / HTMLElement</td>
<td>滚动条的容器元素</td>
</tr>
<tr>
<td>scrollbarHide</td>
<td>boolean = true</td>
<td>在结束用户交互后，是否自动隐藏滚动条</td>
</tr>
<tr>
<td>scrollbarDraggable</td>
<td>boolean = false</td>
<td>是否允许拖拽滚动条</td>
</tr>
<tr>
<td>scrollbarSnapOnRelease</td>
<td>boolean = false</td>
<td>是否滚动条后，是否立即确定幻灯片位置</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>键盘/滚轮</em></td>
</tr>
<tr>
<td>keyboardControl</td>
<td>boolean = false</td>
<td>是否启用键盘导航，如果设置为true，那么可以用上下左右方向键进行幻灯片切换</td>
</tr>
<tr>
<td>mousewheelControl</td>
<td>boolean = false</td>
<td>是否启用滚轮导航</td>
</tr>
<tr>
<td>mousewheelReleaseOnEdges</td>
<td>boolean = false</td>
<td>如果设置为true，到达第一/最后一张幻灯片后，继续滚动滚轮时，允许页面滚动</td>
</tr>
<tr>
<td>mousewheelInvert</td>
<td>boolean = false</td>
<td>是否翻转鼠标滚轮方向</td>
</tr>
<tr>
<td>mousewheelSensitivity</td>
<td>number = 1</td>
<td>滚轮滚动速度的倍率</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>哈希导航</em></td>
</tr>
<tr>
<td>hashnav</td>
<td>boolean = false</td>
<td>设置为true，则允许对幻灯片组件进行哈希导航</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>图片</em></td>
</tr>
<tr>
<td>preloadImages</td>
<td>boolean = true</td>
<td>如果启用，那么组件会强制预加载所有图片</td>
</tr>
<tr>
<td>updateOnImagesReady</td>
<td>boolean = true</td>
<td>如果设置为true，那么所有图片预加载完毕后，组件会重新初始化，需要preloadImages:true</td>
</tr>
<tr>
<td>lazyLoading</td>
<td>boolean = false</td>
<td>设置为true则启用延迟加载，需要preloadImages:false</td>
</tr>
<tr>
<td>lazyLoadingInPrevNext</td>
<td>boolean = false</td>
<td rowspan="2">设置相邻图片的延迟加载规则<br />第二个参数指定多远的相邻图片会被预加载，不得小于slidesPerView</td>
</tr>
<tr>
<td>lazyLoadingInPrevNextAmount</td>
<td>number = 1</td>
</tr>
<tr>
<td>lazyLoadingOnTransitionStart</td>
<td>boolean = false</td>
<td>默认的，组件会在切换动画结束后开始延迟的加载，设置为true，则动画开始时就加载</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>循环模式</em></td>
</tr>
<tr>
<td>loop</td>
<td>boolean = false</td>
<td>设置为true，则循环播放幻灯片</td>
</tr>
<tr>
<td>loopAdditionalSlides</td>
<td>number = 0</td>
<td>启用循环模式后，多少幻灯片被克隆显示</td>
</tr>
<tr>
<td>loopedSlides</td>
<td>number = null</td>
<td>在循环模式中，如果同时指定了slidesPerView:'auto'，则需要设置该参数</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>回调函数</em></td>
</tr>
<tr>
<td>runCallbacksOnInit</td>
<td>boolean = true</td>
<td>是否在幻灯片组件初始化时执行onTransitionStart/End、onSlideChangeStart/End回调</td>
</tr>
<tr>
<td>onInit</td>
<td rowspan="9">
<p>function(swiper)</p>
<p>其中：</p>
<ol>
<li>swiper 幻灯片组件对象</li>
</ol>
</td>
<td>组件初始化后立即执行</td>
</tr>
<tr>
<td>onSlideChangeStart</td>
<td>切换到其它幻灯片的动画开始时执行</td>
</tr>
<tr>
<td>onSlideChangeEnd</td>
<td>切换到其它幻灯片的动画结束后执行</td>
</tr>
<tr>
<td>onSlideNextStart</td>
<td rowspan="2">与前面类似，但是仅适用于向前切换时</td>
</tr>
<tr>
<td>onSlideNextEnd</td>
</tr>
<tr>
<td>onSlidePrevStart</td>
<td rowspan="2">与前面类似，但是仅适用于向后切换时</td>
</tr>
<tr>
<td>onSlidePrevEnd</td>
</tr>
<tr>
<td>onTransitionStart</td>
<td>在转换开始时执行</td>
</tr>
<tr>
<td>onTransitionEnd</td>
<td>在转换结束后执行</td>
</tr>
<tr>
<td>onTouchStart</td>
<td rowspan="8">function(swiper, event)</td>
<td>用户触碰幻灯片时触发</td>
</tr>
<tr>
<td>onTouchMove</td>
<td>用户触碰幻灯片，并滑动手指时触发</td>
</tr>
<tr>
<td>onTouchMoveOpposite</td>
<td>用户触碰幻灯片，并以对立方向滑动手指时触发<br />所谓对立方向是指，如果组件direction是水平的，而手指滑动方向是垂直的</td>
</tr>
<tr>
<td>onSliderMove</td>
<td>用户触碰幻灯片，并滑动手指导致幻灯片移动时触发</td>
</tr>
<tr>
<td>onTouchEnd</td>
<td>用户放开手指后触发</td>
</tr>
<tr>
<td>onClick</td>
<td>用户点击幻灯片后触发，要求手指触碰屏幕至少300ms</td>
</tr>
<tr>
<td>onTap</td>
<td>用户轻点幻灯片后触发</td>
</tr>
<tr>
<td>onDoubleTap</td>
<td>用户连续两次轻点幻灯片后触发</td>
</tr>
<tr>
<td>onImagesReady</td>
<td>function(swiper)</td>
<td>所有图片都加载完毕后触发</td>
</tr>
<tr>
<td>onProgress</td>
<td>function(swiper, progress)</td>
<td>幻灯片显示进度变化时触发，progress是0-1之间的数字</td>
</tr>
<tr>
<td>onReachBeginning</td>
<td>function(swiper)</td>
<td>幻灯片切换到起始位置（initial position）时触发</td>
</tr>
<tr>
<td>onReachEnd</td>
<td>function(swiper)</td>
<td>幻灯片切换到起最后一张时触发</td>
</tr>
<tr>
<td>onDestroy</td>
<td>function(swiper)</td>
<td>组件被销毁时触发</td>
</tr>
<tr>
<td>onAutoplay</td>
<td>function(swiper)</td>
<td>类似于onSlideChangeStart，但是由自动播放触发</td>
</tr>
<tr>
<td>onAutoplayStart</td>
<td>function(swiper)</td>
<td>自动播放开始时触发</td>
</tr>
<tr>
<td>onAutoplayStop</td>
<td>function(swiper)</td>
<td>自动部分停止后触发</td>
</tr>
<tr>
<td>onLazyImageLoad</td>
<td>function (swiper, slide, image)</td>
<td>开始延迟加载图片时触发</td>
</tr>
<tr>
<td>onLazyImageReady</td>
<td>function (swiper, slide, image)</td>
<td>延迟加载的图片加载完毕后触发</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>CSS名字空间 </em></td>
</tr>
<tr>
<td>slideClass</td>
<td>string = 'swiper-slide'</td>
<td>幻灯片的样式类名</td>
</tr>
<tr>
<td>slideActiveClass</td>
<td>string = 'swiper-slide-active'</td>
<td>当前幻灯片的样式类名</td>
</tr>
<tr>
<td>slideVisibleClass</td>
<td>string = 'swiper-slide-visible'</td>
<td>可见的幻灯片的样式类名</td>
</tr>
<tr>
<td>slideDuplicateClass</td>
<td>string = 'swiper-slide-duplicate'</td>
<td>复制的幻灯片的样式类名</td>
</tr>
<tr>
<td>slideNextClass</td>
<td>string = 'swiper-slide-next'</td>
<td>下一个幻灯片的样式类名</td>
</tr>
<tr>
<td>slidePrevClass</td>
<td>string = 'swiper-slide-prev'</td>
<td>上一个幻灯片的样式类名</td>
</tr>
<tr>
<td>wrapperClass</td>
<td>string = 'swiper-wrapper'</td>
<td>组件包装元素的样式类名</td>
</tr>
<tr>
<td>bulletClass</td>
<td>string = 'swiper-pagination-bullet'</td>
<td>bullet分页小圆点的类名</td>
</tr>
<tr>
<td>bulletActiveClass</td>
<td>string = 'swiper-pagination-bullet-active'</td>
<td>bullet分页当前小圆点的类名</td>
</tr>
<tr>
<td>paginationHiddenClass</td>
<td>string = 'swiper-pagination-hidden'</td>
<td>隐藏分页区的类名</td>
</tr>
<tr>
<td>paginationCurrentClass</td>
<td>string = 'swiper-pagination-current'</td>
<td>当前分页数值的类名</td>
</tr>
<tr>
<td>paginationTotalClass</td>
<td>string = 'swiper-pagination-total'</td>
<td>总计分页数值的类名</td>
</tr>
<tr>
<td>paginationProgressbarClass</td>
<td>string = 'swiper-pagination-progressbar'</td>
<td>分页进度条的类名</td>
</tr>
<tr>
<td>buttonDisabledClass</td>
<td>string = 'swiper-button-disabled'</td>
<td>禁用按钮的类名</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">幻灯片组件的属性和方法</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 45%; text-align: center;">属性/方法</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>array params</td>
<td>组件初始化参数对象</td>
</tr>
<tr>
<td>array container</td>
<td>Dom7/jQuery元素集，container[0]为组件的容器元素</td>
</tr>
<tr>
<td>array wrapper</td>
<td>Dom7/jQuery元素集，wrapper[0]为组件的Wrapper元素</td>
</tr>
<tr>
<td>array slides</td>
<td>Dom7/jQuery元素集，所有幻灯片元素的集合</td>
</tr>
<tr>
<td>array bullets</td>
<td>Dom7/jQuery元素集，所有小圆点的集合</td>
</tr>
<tr>
<td>number width</td>
<td>容器的宽度</td>
</tr>
<tr>
<td>number height</td>
<td>容器的高度</td>
</tr>
<tr>
<td>translate</td>
<td>wrapper的当前translate值</td>
</tr>
<tr>
<td>number progress</td>
<td>当前播放进度，0-1之间</td>
</tr>
<tr>
<td>number activeIndex</td>
<td>当前活动幻灯片的索引</td>
</tr>
<tr>
<td>number previousIndex</td>
<td>前一个幻灯片的索引</td>
</tr>
<tr>
<td>boolean isBeginning</td>
<td>如果当前是第一张幻灯片，则为true</td>
</tr>
<tr>
<td>boolean  isEnd</td>
<td>如果当前是最后一张幻灯片，则为true</td>
</tr>
<tr>
<td>boolean autoplaying</td>
<td>如果当前处于自动播放模式，则为true</td>
</tr>
<tr>
<td>boolean animatingru</td>
<td>如果当前正在执行转换动画，则为true</td>
</tr>
<tr>
<td>object touches</td>
<td>包含触碰事件若干参数：startX、startY、currentX、currentY、diff</td>
</tr>
<tr>
<td>clickedIndex</td>
<td>最后一次被点击的幻灯片的索引</td>
</tr>
<tr>
<td>clickedSlide</td>
<td>最后一次被点击的幻灯片</td>
</tr>
<tr>
<td>slideNext(runCallbacks, speed)</td>
<td rowspan="3">
<p>执行转换动画，并切换到下一张、上一张、指定的幻灯片</p>
<ol>
<li>runCallbacks 是否执行回调</li>
<li>speed 转换动画执行时间，ms</li>
</ol>
</td>
</tr>
<tr>
<td>slidePrev(runCallbacks, speed)</td>
</tr>
<tr>
<td>slideTo(index, speed, runCallbacks)</td>
</tr>
<tr>
<td>update(updateTranslate)</td>
<td>
<p>更新布局和渲染，实际上是调用以下函数：</p>
<ol>
<li>updateContainerSize() 重新计算容器尺寸</li>
<li>updateSlidesSize() 重新计算幻灯片数量及其偏移量</li>
<li>updateProgress() 重新计算播放进度</li>
<li>updatePagination() 重新计算分页布局并重渲染小圆点</li>
<li>updateClasses() 更新幻灯片和小圆点的active/prev/next样式类</li>
</ol>
<p>在手工添加/删除幻灯片后、隐藏/显示组件后、对组件进行DOM操作后应该调用此方法</p>
</td>
</tr>
<tr>
<td>onResize()</td>
<td>改变浏览器大小后该方法被调用</td>
</tr>
<tr>
<td>detachEvents()</td>
<td>移除所有事件监听器</td>
</tr>
<tr>
<td>attachEvents()</td>
<td>重新添加所有监听器</td>
</tr>
<tr>
<td>startAutoplay()</td>
<td>开始自动播放</td>
</tr>
<tr>
<td>stopAutoplay()</td>
<td>停止自动播放</td>
</tr>
<tr>
<td>destroy(deleteInstance, cleanupStyles)</td>
<td>销毁组件实例，移除所有监听器<br />deleteInstance  是否删除组件实例，默认true<br />cleanupStyles  是否清除自定义样式，默认false</td>
</tr>
<tr>
<td>appendSlide(slides)</td>
<td rowspan="2">附加新的幻灯片到组件的尾部、头部。示例：<br />
<pre class="crayon-plain-tag">swiper.appendSlide('&lt;div class="swiper-slide"&gt;Slide 10"&lt;/div&gt;')
swiper.appendSlide([
   '&lt;div class="swiper-slide"&gt;Slide 10"&lt;/div&gt;', 
   '&lt;div class="swiper-slide"&gt;Slide 11"&lt;/div&gt;'
]);</pre>
</td>
</tr>
<tr>
<td>prependSlide(slides)</td>
</tr>
<tr>
<td>removeSlide(slideIndex)</td>
<td>移除指定索引对应的幻灯片</td>
</tr>
<tr>
<td>removeAllSlides()</td>
<td>移除全部幻灯片</td>
</tr>
<tr>
<td>setWrapperTranslate(translate)</td>
<td>为Wrapper元素设置CSS转换的translate值</td>
</tr>
<tr>
<td>getWrapperTranslate()</td>
<td>获得Wrapper元素的CSS转换的translate值</td>
</tr>
<tr>
<td>on(callback, handler)</td>
<td>添加回调函数/事件监听器。示例：<br />
<pre class="crayon-plain-tag">swiper.on('slideChangeStart', function () {
    console.log('slide change start');
});</pre>
</td>
</tr>
<tr>
<td>once(callback, handler)</td>
<td>添加一次性回调函数/事件监听器</td>
</tr>
<tr>
<td>off(callback)</td>
<td>移除指定回调/事件的全部处理函数</td>
</tr>
<tr>
<td>lockSwipeToNext()</td>
<td>禁止向前切换幻灯片</td>
</tr>
<tr>
<td>unlockSwipeToNext()</td>
<td>禁止向后切换幻灯片</td>
</tr>
<tr>
<td>lockSwipes()</td>
<td>禁止幻灯片切换</td>
</tr>
<tr>
<td>unlockSwipes()</td>
<td>允许幻灯片切换</td>
</tr>
<tr>
<td>disableMousewheelControl()</td>
<td>禁止滚轮控制</td>
</tr>
<tr>
<td>enableMousewheelControl()</td>
<td>启用滚轮控制</td>
</tr>
<tr>
<td>disableKeyboardControl()</td>
<td>禁止键盘控制</td>
</tr>
<tr>
<td>enableKeyboardControl()</td>
<td>启用键盘控制</td>
</tr>
</tbody>
</table>
<div class="blog_h1"><span class="graybg">照片浏览器（Photo Browser）</span></div>
<p>该组件模拟iOS系统照片浏览器的行为，用于展示图片/照片，支持<span style="background-color: #c0c0c0;">缩放和平移</span>操作。 </p>
<div class="blog_h2"><span class="graybg">创建照片浏览器实例</span></div>
<p> 仅支持通过JavaScript API创建：</p>
<pre class="crayon-plain-tag">/**
 * @param parameters 照片浏览器初始化参数
 * @reutrn 已初始化的照片浏览器实例
 */
app.photoBrowser( parameters );</pre>
<div class="blog_h2"><span class="graybg">照片浏览器初始化参数</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">参数</td>
<td style="width: 30%; text-align: center;">类型和默认值</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>photos</td>
<td>array = []</td>
<td>一个数组，元素可以是：
<ol>
<li><span style="color: #333333; font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: small;"><span style="line-height: 22px;">URL字符串</span></span></li>
<li>对象，具有url（或者html）、caption属性</li>
</ol>
</td>
</tr>
<tr>
<td>initialSlide</td>
<td>number = 0</td>
<td>以幻灯片显示照片（photo slide）时，第一张显示的照片的索引</td>
</tr>
<tr>
<td>spaceBetween</td>
<td>number = 20</td>
<td>幻灯片的间距</td>
</tr>
<tr>
<td>speed</td>
<td>number = 300</td>
<td>幻灯片切换动画的时间，ms</td>
</tr>
<tr>
<td>zoom</td>
<td>boolean = true</td>
<td>是否支持Zoom/Pan操作</td>
</tr>
<tr>
<td>maxZoom</td>
<td>number = 3</td>
<td>最大缩放倍数</td>
</tr>
<tr>
<td>minZoom</td>
<td>number = 1</td>
<td>最小缩放倍数</td>
</tr>
<tr>
<td>exposition</td>
<td>boolean = true</td>
<td>是否在点击照片浏览器后，启用展览模式（exposition mode）</td>
</tr>
<tr>
<td>expositionHideCaptions</td>
<td>boolean = false</td>
<td>在展览模式时是否隐藏标题</td>
</tr>
<tr>
<td>swipeToClose</td>
<td>boolean = true</td>
<td>如果启用，上下滑动手指可以关闭照片浏览器</td>
</tr>
<tr>
<td>view</td>
<td>View</td>
<td>如果使用page类型的照片浏览器，该参数指定页面所在的已初始化的视图</td>
</tr>
<tr>
<td>type</td>
<td>string = 'standalone'</td>
<td>
<p>定义照片浏览器的打开方式：</p>
<ol>
<li>standalone 打开为overlay，以特定的转换效果</li>
<li>popup 打开为popup</li>
<li>page 插入新页面到视图，并加载此页面，在其中打开浏览器</li>
</ol>
</td>
</tr>
<tr>
<td>loop</td>
<td>boolean = false</td>
<td>是否循环播放幻灯片</td>
</tr>
<tr>
<td>theme</td>
<td>string = 'light'</td>
<td>照片浏览器主题，可以设置为dark，深色</td>
</tr>
<tr>
<td>captionsTheme</td>
<td>string</td>
<td>标题的主题，可以设置为dark或light，默认和theme一致</td>
</tr>
<tr>
<td>navbar</td>
<td>boolean = true</td>
<td>是否显示照片浏览器的导航栏</td>
</tr>
<tr>
<td>toolbar</td>
<td>boolean = true</td>
<td>是否显示照片浏览器的工具栏</td>
</tr>
<tr>
<td>backLinkText</td>
<td>string = 'Close'</td>
<td>返回链接的文字</td>
</tr>
<tr>
<td>ofText</td>
<td>string = 'of'</td>
<td>可以设置of的替换文本</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>延迟加载</em></td>
</tr>
<tr>
<td>lazyLoading</td>
<td>boolean = false</td>
<td>是否启用照片延迟加载</td>
</tr>
<tr>
<td>lazyLoadingInPrevNext</td>
<td>boolean = false</td>
<td>设置为true，则启用临近（左/右）照片的延迟加载</td>
</tr>
<tr>
<td>lazyLoadingOnTransitionStart</td>
<td>boolean = false</td>
<td>是否在切换动画开始时即加载照片</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>模板</em></td>
</tr>
<tr>
<td>template</td>
<td>string</td>
<td>照片浏览器的Template7模板</td>
</tr>
<tr>
<td>navbarTemplate</td>
<td>string</td>
<td>导航栏的Template7模板</td>
</tr>
<tr>
<td>toolbarTemplate</td>
<td>string</td>
<td>工具栏的Template7模板</td>
</tr>
<tr>
<td>photoTemplate</td>
<td>string</td>
<td>单个照片元素的Template7模板</td>
</tr>
<tr>
<td>photoLazyTemplate</td>
<td>string</td>
<td>单个延迟加载照片的Template7模板</td>
</tr>
<tr>
<td>objectTemplate</td>
<td>string</td>
<td>单个object元素的Template7模板</td>
</tr>
<tr>
<td>captionTemplate</td>
<td>string</td>
<td>单个标题元素的Template7模板</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>回调</em></td>
</tr>
<tr>
<td>onOpen</td>
<td>function(photobrowser)</td>
<td>照片浏览器打开时执行</td>
</tr>
<tr>
<td>onClose</td>
<td>function(photobrowser)</td>
<td>照片浏览器关闭时执行</td>
</tr>
<tr>
<td>onSwipeToClose</td>
<td>function(photobrowser)</td>
<td>用户通过滑动手势关闭照片浏览器时执行</td>
</tr>
<tr>
<td>onSlideChangeStart</td>
<td>function(swiper)</td>
<td rowspan="2">在动画开始前/结束后执行</td>
</tr>
<tr>
<td>onSlideChangeEnd</td>
<td>function(swiper)</td>
</tr>
<tr>
<td>onTransitionStart</td>
<td>function(swiper)</td>
<td rowspan="2">在转换开始前/结束后执行</td>
</tr>
<tr>
<td>onTransitionEnd</td>
<td>function(swiper)</td>
</tr>
<tr>
<td>onClick</td>
<td>function(swiper, event)</td>
<td>点击/触碰照片超过300ms后触发</td>
</tr>
<tr>
<td>onTap</td>
<td>function(swiper, event)</td>
<td>轻触照片后触发</td>
</tr>
<tr>
<td>onDoubleTap</td>
<td>function(swiper, event)</td>
<td>连续两次轻触照片后触发</td>
</tr>
<tr>
<td>onLazyImageLoad</td>
<td>function(swiper, slide, image)</td>
<td>开始照片延迟加载前触发</td>
</tr>
<tr>
<td>onLazyImageReady</td>
<td>function(swiper, slide, image)</td>
<td>照片延迟加载完毕后触发</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">照片浏览器属性和方法 </span></div>
<table class=" fixed-word-wrap full-width">
<thead>
<tr>
<td style="width: 30%; text-align: center;">属性/方法</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>swiper</td>
<td>包含已经初始化的幻灯片组件的（Swiper）实例</td>
</tr>
<tr>
<td>container</td>
<td>容器元素的Dom7元素</td>
</tr>
<tr>
<td>exposed</td>
<td>是否处于展览模式</td>
</tr>
<tr>
<td>activeSlideIndex</td>
<td>当前照片索引</td>
</tr>
<tr>
<td>params</td>
<td>所有初始化参数</td>
</tr>
<tr>
<td>open(index)</td>
<td>打开照片浏览器并切换到指定索引的照片，如果不指定index，则显示上一次打开的照片</td>
</tr>
<tr>
<td>close()</td>
<td>关闭照片浏览器</td>
</tr>
<tr>
<td>toggleZoom()</td>
<td>启用/禁用当前照片的缩放</td>
</tr>
<tr>
<td>toggleExposition()</td>
<td>启用/禁用展览模式</td>
</tr>
<tr>
<td>enableExposition()</td>
<td>启用展览模式</td>
</tr>
<tr>
<td>disableExposition()</td>
<td>禁用展览模式</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg" style="font-weight: bold; color: #007755;">照片浏览器模板</span></div>
<p>照片浏览器组件允许通过模板定制其UI</p>
<div class="blog_h3"><span class="graybg">主模板（template）</span></div>
<p>其它模板都会嵌入到该模板中。</p>
<pre class="crayon-plain-tag">&lt;div class="photo-browser photo-browser-{{theme}}"&gt;
    &lt;div class="view navbar-fixed toolbar-fixed"&gt;
        {{#unless material}}{{#if navbar}}
        navbarTemplate
        {{/if}}{{/unless}}
        &lt;div class="page no-toolbar {{#unless navbar}}no-navbar{{/unless}} toolbar-fixed navbar-fixed" data-page="photo-browser-slides"&gt;
            {{#if material}}{{#if navbar}}
            navbarTemplate
            {{/if}}{{/if}}
            {{#if toolbar}}
            toolbarTemplate
            {{/if}}
            &lt;div class="photo-browser-captions photo-browser-captions-{{js "this.captionsTheme || this.theme"}}"&gt;
                {{#each photos}}{{#if caption}}
                captionTemplate
                {{/if}}{{/each}}
            &lt;/div&gt;
            &lt;div class="photo-browser-swiper-container swiper-container"&gt;
                &lt;div class="photo-browser-swiper-wrapper swiper-wrapper"&gt;
                    {{#each photos}}
                    {{#js_compare "this.html || ((typeof this === \'string\' || this instanceof String) &amp;&amp; (this.indexOf(\'&lt;\') &gt;= 0 || this.indexOf(\'&gt;\') &gt;= 0))"}}
                        objectTemplate
                    {{else}}
                        {{#if @root.lazyLoading}}
                        photoLazyTemplate
                        {{else}}
                        photoTemplate
                        {{/if}}
                    {{/js_compare}}
                    {{/each}}
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">导航栏模板（navbarTemplate）</span></div>
<pre class="crayon-plain-tag">&lt;div class="navbar"&gt;
    &lt;div class="navbar-inner"&gt;
        &lt;div class="left sliding"&gt;
            &lt;!-- photo-browser-close-link 点击后会关闭照片浏览器，并且解除事件监听器 --&gt;
            &lt;a href="#" class="link close-popup photo-browser-close-link {{#unless backLinkText}}icon-only{{/unless}} {{js "this.type === \'page\' ? \'back\' : \'\'"}}"&gt;
                &lt;i class="icon icon-back {{iconsColorClass}}"&gt;&lt;/i&gt;
                {{#if backLinkText}}&lt;span&gt;{{backLinkText}}&lt;/span&gt;{{/if}}
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="center sliding"&gt;
            &lt;!-- photo-browser-current 当前照片的索引 --&gt;
            &lt;span class="photo-browser-current"&gt;&lt;/span&gt; 
            &lt;span class="photo-browser-of"&gt;{{ofText}}&lt;/span&gt;   
            &lt;!-- photo-browser-current 照片总数 --&gt;
            &lt;span class="photo-browser-total"&gt;&lt;/span&gt;
        &lt;/div&gt;
        &lt;div class="right"&gt;&lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">工具栏模板（toolbarTemplate）</span></div>
<pre class="crayon-plain-tag">&lt;div class="toolbar tabbar"&gt;
    &lt;div class="toolbar-inner"&gt;
        &lt;!-- 切换到前一张照片的按钮 --&gt;
        &lt;a href="#" class="link photo-browser-prev"&gt;
            &lt;i class="icon icon-prev {{iconsColorClass}}"&gt;&lt;/i&gt;
        &lt;/a&gt;
        &lt;!-- 切换到后一张照片的按钮 --&gt;
        &lt;a href="#" class="link photo-browser-next"&gt;
            &lt;i class="icon icon-next {{iconsColorClass}}"&gt;&lt;/i&gt;
        &lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">照片模板（photoTemplate）</span></div>
<pre class="crayon-plain-tag">&lt;div class="photo-browser-slide swiper-slide"&gt;
    &lt;span class="photo-browser-zoom-container"&gt;
        &lt;img src="{{js "this.url || this"}}"&gt;
    &lt;/span&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">延迟加载照片模板（photoLazyTemplate） </span></div>
<pre class="crayon-plain-tag">&lt;div class="photo-browser-slide photo-browser-slide-lazy swiper-slide"&gt;
    &lt;div class="preloader {{@root.preloaderColorClass}}"&gt;{{#if @root.material}}{{@root.materialPreloaderSvg}}{{/if}}&lt;/div&gt;
    &lt;span class="photo-browser-zoom-container"&gt;
        &lt;img data-src="{{js " this.url || this"}}" class="swiper-lazy"&gt;
    &lt;/span&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">对象元素模板（objectTemplate）</span></div>
<pre class="crayon-plain-tag">&lt;div class="photo-browser-slide photo-browser-object-slide swiper-slide"&gt;{{js "this.html || this"}}&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">标题模板（captionTemplate） </span></div>
<pre class="crayon-plain-tag">&lt;div class="photo-browser-caption" data-caption-index="{{@index}}"&gt;
    {{caption}}
&lt;/div&gt;</pre>
<div class="blog_h1"><span class="graybg">自动完成（Autocomplete）</span></div>
<p> F7提供了一个移动设备友好、为触碰操作优化的自动完成组件。</p>
<div class="blog_h2"><span class="graybg">创建自动完成组件实例</span></div>
<p>只能通过JavaScript API创建：</p>
<pre class="crayon-plain-tag">/**
 * @param parameters 初始化参数
 * @return 已初始化的自动完成组件的实例
 */
app.autocomplete(parameters);</pre>
<div class="blog_h2"><span class="graybg">自动完成组件的初始化参数</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">参数</td>
<td style="width: 25%; text-align: center;">类型和默认值</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>openIn</td>
<td>string = 'page'</td>
<td>
<p>组件如何打开：</p>
<ol>
<li>page 页面</li>
<li>popup 弹窗</li>
<li>dropdown 下拉列表</li>
</ol>
</td>
</tr>
<tr>
<td>source</td>
<td>function<br /> (autocomplete, query, render)</td>
<td>
<p>该函数执行搜索：</p>
<ol>
<li>autocomplete 组件实例</li>
<li>query 查询文本</li>
<li>render 渲染回调，必须传递匹配条目的数组给此回调</li>
</ol>
<p>示例：</p>
<pre class="crayon-plain-tag">var allItems = [];
function source( autocomplete, query, render ) {
    var results = [];
    if ( query.length === 0 ) {
        // 无查询条件
        render( results );
        return;
    }
    //根据查询条件过滤数据
    for ( var i = 0; i &lt; fruits.length; i++ ) {
        if ( allItems.indexOf( query ) &gt;= 0 ) {
            results.push( fruits[i] );
        }
    }
    //调用渲染函数
    render( results );
}</pre>
</td>
</tr>
<tr>
<td>limit</td>
<td>number</td>
<td>自动完成显示条目的最大数量</td>
</tr>
<tr>
<td>preloader</td>
<td>boolean = false</td>
<td>设置为true，则在自动完成的布局中添加预加载指示器（Preloader）</td>
</tr>
<tr>
<td>preloaderColor</td>
<td>string</td>
<td>预加载指示器的颜色，可以是white/black</td>
</tr>
<tr>
<td>valueProperty</td>
<td>string = 'id'</td>
<td>匹配条目的什么属性作为值（Value）使用</td>
</tr>
<tr>
<td>textProperty</td>
<td>string = 'text'</td>
<td>匹配条目的什么属性作为显示值（Display value）使用</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>专用于Standalone模式（以page或popup打开组件）的参数</em></td>
</tr>
<tr>
<td>opener</td>
<td>string/HTMLElement</td>
<td>链接的HTMLElement或CSS选择器，点击此链接后打开自动完成页面或者Popup</td>
</tr>
<tr>
<td>popupCloseText</td>
<td>string = 'Close'</td>
<td>Popup关闭文本</td>
</tr>
<tr>
<td>backText</td>
<td>string = 'Back'</td>
<td>页面的后退文本</td>
</tr>
<tr>
<td>pageTitle</td>
<td>string</td>
<td>页面的标题</td>
</tr>
<tr>
<td>searchbarPlaceholderText</td>
<td>string = 'Search...'</td>
<td>搜索栏占位符文本</td>
</tr>
<tr>
<td>searchbarCancelText</td>
<td>string = 'Cancel'</td>
<td>搜索栏取消按钮文本</td>
</tr>
<tr>
<td>notFoundText</td>
<td>string = 'Nothing found'</td>
<td>无匹配条目条目时显示的文本</td>
</tr>
<tr>
<td>multiple</td>
<td>boolean = false</td>
<td>是否允许选择多个条目</td>
</tr>
<tr>
<td>backOnSelect</td>
<td>boolean = false</td>
<td>选中一个条目后立即关闭自动完成组件，仅用于单选模式</td>
</tr>
<tr>
<td>navbarTheme</td>
<td>string</td>
<td>导航栏主题颜色</td>
</tr>
<tr>
<td>formTheme</td>
<td>string</td>
<td>表单主题颜色</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>专用于下拉菜单模式的参数</em></td>
</tr>
<tr>
<td>input</td>
<td>string/HTMLElement</td>
<td>与此自动完成组件相关的文本输入框</td>
</tr>
<tr>
<td>dropdownPlaceholderText</td>
<td>string</td>
<td>下拉列表占位符文本</td>
</tr>
<tr>
<td>updateInputValueOnSelect</td>
<td>boolean = true</td>
<td>选中一个条目后，自动更新文本输入框</td>
</tr>
<tr>
<td>expandInput</td>
<td>boolean = false</td>
<td>如果设置为true，则列表视图中的item-input元素的宽度扩展为屏幕宽度</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>回调</em></td>
</tr>
<tr>
<td>onChange</td>
<td>function (autocomplete, value)</td>
<td>自动完成值改变后，执行此回调：
<ol>
<li><span style="color: #333333; font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: small;"><span style="line-height: 22px;">autocomplete 组件实例</span></span></li>
<li>value 选中的条目</li>
</ol>
</td>
</tr>
<tr>
<td>onOpen</td>
<td>function (autocomplete)</td>
<td>自动完成组件打开时执行此回调</td>
</tr>
<tr>
<td>onClose</td>
<td>function (autocomplete)</td>
<td>自动完成组件关闭时执行此回调</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>模板</em></td>
</tr>
<tr>
<td>navbarTemplate</td>
<td>string</td>
<td>Standalone模式导航栏模板</td>
</tr>
<tr>
<td>itemTemplate</td>
<td>string</td>
<td>Standalone模式表单条目（radio/checkbox）模板</td>
</tr>
<tr>
<td>dropdownTemplate</td>
<td>string</td>
<td>下拉列表模板</td>
</tr>
<tr>
<td>dropdownItemTemplate</td>
<td>string</td>
<td>下拉列表条目的模板</td>
</tr>
<tr>
<td>dropdownPlaceholderTemplate</td>
<td>string</td>
<td>下拉列表占位符的模板</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">自动完成组件的方法和属性</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">方法/属性</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>params</td>
<td>组件的初始化参数</td>
</tr>
<tr>
<td>value </td>
<td>选中条目的数组 </td>
</tr>
<tr>
<td>opened</td>
<td>组件是否处于打开状态 </td>
</tr>
<tr>
<td>dropdown</td>
<td>下拉列表的Dom7实例 </td>
</tr>
<tr>
<td>popup</td>
<td>Popup（如果打开）的Dom7实例 </td>
</tr>
<tr>
<td>open() </td>
<td>打开组件 </td>
</tr>
<tr>
<td>close()</td>
<td>关闭组件 </td>
</tr>
<tr>
<td>showPreloader()</td>
<td>显示预加载提示符 </td>
</tr>
<tr>
<td>hidePreloader()</td>
<td>隐藏预加载提示符 </td>
</tr>
<tr>
<td>destroy()</td>
<td>销毁组件，解除所有事件监听器</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg"><span style="font-weight: bold; color: #007755;">自动完成组件的默认模板</span> </span></div>
<p>本节列出F7为自动完成组件提供的缺省模板，定制这些模板可以改变组件的外观。
<div class="blog_h3"><span class="graybg">navbarTemplate</span></div>
<p>导航栏模板：该模板用于Standalone模式。</p>
<pre class="crayon-plain-tag">&lt;div class="navbar {{#if navbarTheme}}theme-{{navbarTheme}}{{/if}}"&gt;&lt;!-- 设置主题 --&gt;
    &lt;div class="navbar-inner"&gt;
        &lt;div class="left sliding"&gt;&lt;!-- 左侧，依据iOS/Material设置不同的按钮 --&gt;
            {{#if material}}
            &lt;a href="#" class="link {{#if inPopup}}close-popup{{else}}back{{/if}} icon-only"&gt;
              &lt;i class="icon icon-back"&gt;&lt;/i&gt;
            &lt;/a&gt;
            {{else}}
            &lt;a href="#" class="link {{#if inPopup}}close-popup{{else}}back{{/if}}"&gt;
                &lt;i class="icon icon-back"&gt;&lt;/i&gt;
                {{#if inPopup}}
                &lt;span&gt;{{popupCloseText}}&lt;/span&gt;
                {{else}}
                &lt;span&gt;{{backText}}&lt;/span&gt;
                {{/if}}
            &lt;/a&gt;
            {{/if}}
        &lt;/div&gt;
        &lt;div class="center sliding"&gt;{{pageTitle}}&lt;/div&gt;&lt;!-- 中间，显示页面标题 --&gt;
        {{#if preloader}}
        &lt;div class="right"&gt;&lt;!-- 右侧，显示预加载提示符 --&gt;
            &lt;div class="autocomplete-preloader preloader {{#if preloaderColor}}preloader-{{preloaderColor}}{{/if}}"&gt;&lt;/div&gt;
        &lt;/div&gt;
        {{/if}}
    &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">itemTemplate</span></div>
<p>列表条目模板：每个备选条目（列表视图的元素）使用的模板。</p>
<pre class="crayon-plain-tag">&lt;li&gt;
    &lt;label class="label-{{inputType}} item-content"&gt;
        &lt;!-- 单/复选框，隐藏 --&gt;
        &lt;input type="{{inputType}}" name="{{inputName}}" value="{{value}}" {{#if selected}}checked{{/if}}&gt;
        &lt;!-- 图标和文本的布局，依主题而不同 --&gt;
        {{#if material}}
            &lt;div class="item-media"&gt;
                &lt;i class="icon icon-form-{{inputType}}"&gt;&lt;/i&gt;
            &lt;/div&gt;
            &lt;div class="item-inner"&gt;
                &lt;div class="item-title"&gt;{{text}}&lt;/div&gt;
            &lt;/div&gt;
        {{else}}
            {{#if checkbox}}
            &lt;div class="item-media"&gt;
                &lt;i class="icon icon-form-checkbox"&gt;&lt;/i&gt;
            &lt;/div&gt;
            {{/if}}
            &lt;div class="item-inner"&gt;
                &lt;div class="item-title"&gt;{{text}}&lt;/div&gt;
            &lt;/div&gt;
        {{/if}}
    &lt;/label&gt;
&lt;/li&gt;</pre>
<div class="blog_h3"><span class="graybg">dropdownTemplate</span></div>
<p>下拉菜单外框使用的模板。</p>
<pre class="crayon-plain-tag">&lt;div class="autocomplete-dropdown"&gt;
    &lt;div class="autocomplete-dropdown-inner"&gt;
        &lt;!-- 列表视图放在这里 --&gt;
        &lt;div class="list-block"&gt;
            &lt;ul&gt;&lt;/ul&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;!-- 预加载指示器 --&gt;
    {{#if preloader}}
    &lt;div class="autocomplete-preloader preloader {{#if preloaderColor}}preloader-{{preloaderColor}}{{/if}}"&gt;
      {{#if material}}{{materialPreloaderHtml}}{{/if}}
    &lt;/div&gt;
    {{/if}}
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">dropdownItemTemplate</span></div>
<p>下拉菜单模式下，每个备选条目使用的模板。</p>
<pre class="crayon-plain-tag">&lt;li&gt;
    &lt;label class="{{#unless placeholder}}label-radio{{/unless}} item-content" data-value="{{value}}"&gt;
        &lt;div class="item-inner"&gt;
            &lt;div class="item-title"&gt;{{text}}&lt;/div&gt;
        &lt;/div&gt;
    &lt;/label&gt;
&lt;/li&gt;</pre>
<div class="blog_h3"><span class="graybg">dropdownPlaceholderTemplate</span></div>
<p>下拉菜单模式下，占位符文本使用的模板。</p>
<pre class="crayon-plain-tag">&lt;li class="autocomplete-dropdown-placeholder"&gt;
    &lt;div class="item-content"&gt;
        &lt;div class="item-inner"&gt;
            &lt;div class="item-title"&gt;{{text}}&lt;/div&gt;
        &lt;/div&gt;
    &lt;/label&gt;
&lt;/li&gt;</pre>
<div class="blog_h2"><span class="graybg">应用举例</span></div>
<div class="blog_h3"><span class="graybg">下拉菜单模式+Ajax</span></div>
<pre class="crayon-plain-tag">&lt;div class="list-block"&gt;
    &lt;ul&gt;
        &lt;li class="item-content"&gt;
            &lt;div class="item-title label"&gt;显示语言&lt;/div&gt;
            &lt;div class="item-input"&gt;
                &lt;input type="text" placeholder="Language" id="autocomplete-dropdown-ajax"&gt;
            &lt;/div&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;
&lt;script type="text/javascript"&gt;
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 &lt; data.length; i++ ) {
                    if ( data[i].name.toLowerCase().indexOf( query.toLowerCase() ) &gt;= 0 ) results.push( data[i] );
                }
                // 隐藏指示器
                autocomplete.hidePreloader();
                // 异步的执行渲染函数 
                render( results );
            }
        } );
    }
} );
&lt;/script&gt;</pre>
<div class="blog_h1"><span class="graybg">选取器（Picker）</span></div>
<p>Picker提供了一些基础功能，利用这些功能，你可以很方便的定制UI风格与iOS类似的选取器。</p>
<p>Picker可以用作内联组件（ inline component），也可以用作Overlay。在平板电脑上，Overlay的选取器自动被转换为<span style="background-color: #c0c0c0;">Popover</span>。</p>
<div class="blog_h2"><span class="graybg">创建和访问选取器实例 </span></div>
<p>只能通过JavaScript API创建：</p>
<pre class="crayon-plain-tag">/**
 * @param parameters 选取器初始化参数
 * @return 已实例化的选取器实例
 */
app.picker(parameters);</pre>
<div class="blog_h3"><span class="graybg">获得内联选取器实例</span></div>
<p>对于通过内联（inline）方式创建的选取器，可以通过其HTML容器的属性获得选取器实例：</p>
<pre class="crayon-plain-tag">var picker = $$('.picker-inline')[0].f7Picker;</pre>
<div class="blog_h2"><span class="graybg">选取器（列）初始化参数</span></div>
<div class="blog_h3"><span class="graybg">选取器初始化参数</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 20%; text-align: center;">参数</td>
<td style="text-align: center;">类型和默认值</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>container</td>
<td>HTMLElement/string</td>
<td>仅用于内联（inline）选取器，存放生成的选取器对象的容器的HTMLElement或者CSS选择器</td>
</tr>
<tr>
<td>input</td>
<td>HTMLElement/string</td>
<td>与此选取器相关的input元素的HTMLElement或者CSS选择器</td>
</tr>
<tr>
<td>scrollToInput</td>
<td>boolean = true</td>
<td>当打开选取器时，滚动视口（Viewport，即page-content）到input元素</td>
</tr>
<tr>
<td>inputReadOnly</td>
<td>boolean = true</td>
<td>如果设置为true，则input元素被设置readonly属性</td>
</tr>
<tr>
<td>convertToPopover</td>
<td>boolean = true</td>
<td>在大屏幕上（Pad）把模态选取器转换为Popover</td>
</tr>
<tr>
<td>onlyOnPopover</td>
<td>boolean = false</td>
<td>如果设置为true，则选取器总是在Popover中打开</td>
</tr>
<tr>
<td>cssClass</td>
<td>string</td>
<td>在模态选取器上设置的额外CSS类</td>
</tr>
<tr>
<td>closeByOutsideClick</td>
<td>boolean = true</td>
<td>是否在点击外部区域后，自动关闭选取器</td>
</tr>
<tr>
<td>toolbar</td>
<td>boolean = true</td>
<td>启用模态选取器工具栏</td>
</tr>
<tr>
<td>toolbarCloseText</td>
<td>string = 'Done'</td>
<td>选取器工具栏上关闭按钮的文本</td>
</tr>
<tr>
<td>toolbarTemplate</td>
<td>string = <br />
<pre class="crayon-plain-tag">&lt;div class="toolbar"&gt;
  &lt;div class="toolbar-inner"&gt;
    &lt;div class="left"&gt;&lt;/div&gt;
    &lt;div class="right"&gt;
      &lt;a href="#" class="link close-picker"&gt;
        {{closeText}}
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</pre>
</td>
<td>工具栏的Template7模板</td>
</tr>
<tr>
<td>rotateEffect</td>
<td>boolean = false</td>
<td>是否启用3D滚动效果</td>
</tr>
<tr>
<td>momentumRatio</td>
<td>boolean = false</td>
<td>对选取器进行触碰并滑动操作后，更大的值是否产生更多的momentum</td>
</tr>
<tr>
<td>updateValuesOnMomentum</td>
<td>boolean = false</td>
<td>在momentum期间是否更新选取器和input的值</td>
</tr>
<tr>
<td>updateValuesOnTouchmove</td>
<td>boolean = true</td>
<td>在触碰并滑动时，是否更新选取器和input的值</td>
</tr>
<tr>
<td>value</td>
<td>array</td>
<td>初始值的数组，每个元素对应了选取器单个列的值</td>
</tr>
<tr>
<td>formatValue</td>
<td>function (p, values, displayValues)</td>
<td>用于格式化input的值的函数，values/displayValues为两个数组，其索引为idx的元素，分别为当前选取器值第idx列的值/显示值</td>
</tr>
<tr>
<td>cols</td>
<td>array</td>
<td>选取器的数据定义，为一个数组，其每个元素定义了选取器的单个列，元素格式为PO，符合“列参数”规定</td>
</tr>
<tr>
<td>onChange</td>
<td>function (p, values, displayValues)</td>
<td>当选取器的值改变时该函数被调用。values/displayValues为两个数组，其索引为idx的元素，分别为当前选取器值第idx列的值/显示值</td>
</tr>
<tr>
<td>onOpen</td>
<td>function (p)</td>
<td>选取器打开时，执行该回调</td>
</tr>
<tr>
<td>onClose</td>
<td>function (p)</td>
<td>选取器关闭时，执行该回调</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">选取器列初始化参数</span></div>
<table class=" fixed-word-wrap full-width">
<thead>
<tr>
<td style="width: 20%; text-align: center;">参数</td>
<td style="text-align: center;">类型和默认值</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>values</td>
<td>array</td>
<td>该列的值数组</td>
</tr>
<tr>
<td>displayValues</td>
<td>array</td>
<td>该列的显示值数组</td>
</tr>
<tr>
<td>cssClass</td>
<td>string</td>
<td>在列HTML容器上设置的额外CSS样式类</td>
</tr>
<tr>
<td>textAlign</td>
<td>string</td>
<td>列文本的对齐方式，可以是left/center/right</td>
</tr>
<tr>
<td>width</td>
<td>number</td>
<td>列宽度，单位px</td>
</tr>
<tr>
<td>divider</td>
<td>boolean = false</td>
<td>作为分隔字符的列，不需要values/displays，例如用来隔开时间的冒号</td>
</tr>
<tr>
<td>content</td>
<td>string</td>
<td>分隔字符（串）的内容</td>
</tr>
<tr>
<td>onChange</td>
<td>function (p, value, displayValue)</td>
<td>列的值发生变化时调用此回调</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">选取器（列）属性和方法 </span></div>
<div class="blog_h3"><span class="graybg">选取器属性和方法</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 35%; text-align: center;">属性/方法</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>params</td>
<td>初始化参数</td>
</tr>
<tr>
<td>value</td>
<td>数组，选取器当前每列的值</td>
</tr>
<tr>
<td>displayValue</td>
<td>数组，选取器当前每列的显示值</td>
</tr>
<tr>
<td>opened</td>
<td>此选取器当前是否处于打开状态</td>
</tr>
<tr>
<td>inline</td>
<td>此选取器是否为内联的</td>
</tr>
<tr>
<td>cols</td>
<td>列对象的数组，每个元素都有自己的属性和方法（参见下表）。下面示例如何获得第一个列对象：<br />
<pre class="crayon-plain-tag">// 获取第一个列对象
var col = picker.cols[0];</pre>
</td>
</tr>
<tr>
<td>container</td>
<td>选取器的HML容器的Dom7对象</td>
</tr>
<tr>
<td>setValue(values, duration)</td>
<td>
<p>设置选取器的值：</p>
<ol>
<li>values：数组，对应每个列的值</li>
<li>duration：动画持续时间</li>
</ol>
</td>
</tr>
<tr>
<td>open()</td>
<td>打开选取器</td>
</tr>
<tr>
<td>close()</td>
<td>关闭选取器</td>
</tr>
<tr>
<td>destroy()</td>
<td>销毁选取器实例，移除所有监听器</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">选取器列属性和方法 </span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 35%; text-align: center;">属性/方法</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>container</td>
<td>列HTML元素的Dom7对象</td>
</tr>
<tr>
<td>items</td>
<td>列条目HTML元素的Dom7对象</td>
</tr>
<tr>
<td>value</td>
<td>列的当前值</td>
</tr>
<tr>
<td>displayValue</td>
<td>列的当前显示值</td>
</tr>
<tr>
<td>activeIndex</td>
<td>列当前值在值列表中的索引</td>
</tr>
<tr>
<td>setValue(value, duration)</td>
<td>设置此列的当前值</td>
</tr>
<tr>
<td>replaceValues(values, displayValues)</td>
<td>替换此列的值/显示值列表</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">应用举例</span></div>
<div class="blog_h3"><span class="graybg">双列联动选取器 </span></div>
<p>所谓联动，是指第一列的值改变后，第二列的值列表自动被替换： </p>
<pre class="crayon-plain-tag">&lt;div class="content-block-title"&gt;联动示例&lt;/div&gt;
&lt;div class="list-block"&gt;
    &lt;ul&gt;
        &lt;li&gt;
            &lt;div class="item-content"&gt;
                &lt;div class="item-inner"&gt;
                    &lt;div class="item-input"&gt;
                        &lt;input type="text" placeholder="你的车型" readonly id="picker-dependent"&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;
&lt;script type="text/javascript"&gt;
    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,
        }, ]
    } );
&lt;/script&gt;</pre>
<div class="blog_h3"><span class="graybg">时间选取器</span></div>
<p>这是一个多列、内联的选取器实例：</p>
<pre class="crayon-plain-tag">&lt;div class="content-block-title"&gt;内联选取器：日期-时间&lt;/div&gt;
&lt;div class="content-block"&gt;
 &lt;div style="padding:0; margin-right:-15px; width:auto" class="content-block-inner"&gt;
   &lt;div style="margin:0" class="list-block"&gt;
     &lt;ul style="border-top:none"&gt;
       &lt;li&gt;
         &lt;div class="item-content"&gt;
           &lt;div class="item-inner"&gt;
             &lt;div class="item-input"&gt;
               &lt;input type="text" placeholder="选取日期/时间" readonly id="picker-date"&gt;
             &lt;/div&gt;
           &lt;/div&gt;
         &lt;/div&gt;
       &lt;/li&gt;
     &lt;/ul&gt;
   &lt;/div&gt;
   &lt;div id="picker-date-container"&gt;&lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script type="text/javascript"&gt;
    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() &lt; 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] &gt; 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 &lt;= 2030; i++ ) { arr.push( i ); }
                return arr;
            } )(),
        },
        // 日期 时间的分隔符列，空格
        { divider : true,  content : '  ' },
        // 小时
        {
            values : ( function() {
                var arr = [];
                for ( var i = 0; i &lt;= 23; i++ ) { arr.push( i ); }
                return arr;
            } )(),
        },
        // 小时:分钟的分隔符列，冒号
        { divider : true, content : ':' },
        // 分钟
        {
            values : ( function() {
                var arr = [];
                for ( var i = 0; i &lt;= 59; i++ ) { arr.push( i &lt; 10 ? '0' + i : i ); }
                return arr;
            } )(),
        } ]
    } );
&lt;/script&gt;</pre>
<div class="blog_h1"><span class="graybg">日历（日期选取器）</span></div>
<p>F7提供的日历（Calendar）组件为触碰操作优化，可以方便的处理日期字段。与一般的选取类似，日历支持内联、overlay展示方式。</p>
<div class="blog_h2"><span class="graybg">创建和访问日历实例</span></div>
<p>只能通过JavaScript API创建日历实例：</p>
<pre class="crayon-plain-tag">/**
 * @param parameters 日历初始化参数
 * @return 已初始化的日历对象实例
 */
app.calendar(parameters);

// 访问内联日历组件的实例
var calendar = $$('.calenadr-inline')[0].f7Calendar;</pre>
<div class="blog_h2"><span class="graybg">日历初始化参数</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 22%; text-align: center;">参数</td>
<td style="text-align: center;">类型和默认值</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>container</td>
<td>HTMLElement/string</td>
<td rowspan="11">同普通选取器组件</td>
</tr>
<tr>
<td>input</td>
<td>HTMLElement/string</td>
</tr>
<tr>
<td>scrollToInput</td>
<td>boolean = true</td>
</tr>
<tr>
<td>inputReadOnly</td>
<td>boolean = true</td>
</tr>
<tr>
<td>convertToPopover</td>
<td>boolean = true</td>
</tr>
<tr>
<td>onlyOnPopover</td>
<td>boolean = false</td>
</tr>
<tr>
<td>cssClass</td>
<td>string</td>
</tr>
<tr>
<td>closeByOutsideClick</td>
<td>boolean = true</td>
</tr>
<tr>
<td>toolbar</td>
<td>boolean = true</td>
</tr>
<tr>
<td>toolbarCloseText</td>
<td>string = 'Done'</td>
</tr>
<tr>
<td>toolbarTemplate</td>
<td>string = <br />
<pre class="crayon-plain-tag">&lt;div class="toolbar"&gt;
  &lt;div class="toolbar-inner"&gt;
    {{monthPicker}}
    {{yearPicker}}
  &lt;/div&gt;
&lt;/div&gt;</pre>
</td>
</tr>
<tr>
<td>value</td>
<td>array</td>
<td>初始被选中的日期的数组，每个元素为选中的日期（Date）对象</td>
</tr>
<tr>
<td>disabled</td>
<td rowspan="2">DateRange，用于表示日期的范围，可以用数组、函数、对象三种形式表示：<br />
<pre class="crayon-plain-tag">//数组方式，指定起止日期
var range = [ 
    new Date(2015, 10, 10), 
    new Date(2015, 10, 11)
];

//函数方式，对任意日期返回true/false
//true则包含在Range内
function range( date ) {
    if ( date.getFullYear() === 2015 
         &amp;&amp; date.getMonth() === 10 ) {
        return true;
    }
    else {
        return false;
    }
}

//对象方式
range = {
    from: new Date(2015, 9, 1),
    to: new Date(2015, 11, 31)
}</pre>
</td>
<td>额外的被禁用的日期范围</td>
</tr>
<tr>
<td>events</td>
<td>具有事件的日期范围，这些日期数字的下面具有额外的小圆点标记</td>
</tr>
<tr>
<td>rangesClasses</td>
<td>array</td>
<td>用于为日期范围添加额外的样式。为一数组，每个元素均为：<br />
<pre class="crayon-plain-tag">{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 )
        }
    } ]
} );</pre>
</td>
</tr>
<tr>
<td>formatValue</td>
<td>function (p, values)</td>
<td>格式化日期，输出到input元素。函数的返回值必须是一个string，values为Date对象的数组</td>
</tr>
<tr>
<td>monthNames</td>
<td>array = <br />['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August' , 'September' , 'October', 'November', 'December']</td>
<td>所有月份的名称</td>
</tr>
<tr>
<td>monthNamesShort</td>
<td>array = <br />['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']</td>
<td>所有月份的简称</td>
</tr>
<tr>
<td>dayNames</td>
<td>array = <br />['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']</td>
<td>所有DOW的名称</td>
</tr>
<tr>
<td>dayNamesShort</td>
<td>array = <br />['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']</td>
<td>所有DOW的检查</td>
</tr>
<tr>
<td>updateValuesOnTouchmove</td>
<td>boolean  = true</td>
<td>在触碰被移动后，更新选取器和input的值</td>
</tr>
<tr>
<td>firstDay</td>
<td>number = 1</td>
<td>一周的第一天，默认1即星期一</td>
</tr>
<tr>
<td>weekendDays</td>
<td>array = [0, 6]</td>
<td>周末是那几天，默认周六、日</td>
</tr>
<tr>
<td>dateFormat</td>
<td>string = 'yyyy-mm-dd'</td>
<td>日期格式：
<ol>
<li><span style="color: #333333; font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: small;"><span style="line-height: 22px;">yyyy 四位年份</span></span></li>
<li>yy 二位年份</li>
<li>mm 二位月份</li>
<li>m 月份</li>
<li>MM 完整月份名称</li>
<li>M 月份短名称</li>
<li>dd 二位日期</li>
<li>d 日期</li>
<li>DD 完整DOW名称</li>
<li>D  DOW简称</li>
</ol>
</td>
</tr>
<tr>
<td>multiple</td>
<td>boolean = false</td>
<td>允许选择多个日期值</td>
</tr>
<tr>
<td>rangePicker</td>
<td>boolean = false</td>
<td>允许范围选择，与multiple不兼容</td>
</tr>
<tr>
<td>direction</td>
<td>string = 'horizontal'</td>
<td>月份布局方向，可以是vertical/horizontal</td>
</tr>
<tr>
<td>minDate</td>
<td>Date = null</td>
<td>允许的最小日期</td>
</tr>
<tr>
<td>maxDate</td>
<td>Date = null</td>
<td>允许的最大日期</td>
</tr>
<tr>
<td>touchmove</td>
<td>boolean = true</td>
<td>触碰并滑动时是否切换日历月份</td>
</tr>
<tr>
<td>animate</td>
<td>boolean = true</td>
<td>启用动画效果</td>
</tr>
<tr>
<td>closeOnSelect</td>
<td>boolean = false</td>
<td>选择后是否立即关闭日历</td>
</tr>
<tr>
<td>weekHeader</td>
<td>boolean = true</td>
<td>是否显示DOW头，以DOW简称</td>
</tr>
<tr>
<td>monthPicker</td>
<td>boolean = true</td>
<td>是否在工具栏显示月份选择器</td>
</tr>
<tr>
<td>monthPickerTemplate</td>
<td>string = <br />
<pre class="crayon-plain-tag">&lt;div class="picker-calendar-month-picker"&gt;
    &lt;a href="#" class="link icon-only picker-calendar-prev-month"&gt;
        &lt;i class="icon icon-prev"&gt;&lt;/i&gt;
    &lt;/a&gt;
    &lt;span class="current-month-value"&gt;&lt;/span&gt;
    &lt;a href="#" class="link icon-only picker-calendar-next-month"&gt;
        &lt;i class="icon icon-next"&gt;&lt;/i&gt;
    &lt;/a&gt;
&lt;/div&gt;</pre>
</td>
<td>月份选择器的Template7模板</td>
</tr>
<tr>
<td>yearPicker</td>
<td>boolean = true</td>
<td>是否在工具栏显示年度选择器</td>
</tr>
<tr>
<td>yearPickerTemplate</td>
<td>string = <br />
<pre class="crayon-plain-tag">&lt;div class="picker-calendar-year-picker"&gt;
    &lt;a href="#" class="link icon-only picker-calendar-prev-year"&gt;
        &lt;i class="icon icon-prev"&gt;&lt;/i&gt;
    &lt;/a&gt;
    &lt;span class="current-year-value"&gt;&lt;/span&gt;
    &lt;a href="#" class="link icon-only picker-calendar-next-year"&gt;
        &lt;i class="icon icon-next"&gt;&lt;/i&gt;
    &lt;/a&gt;
&lt;/div&gt;</pre>
</td>
<td>年度选择器的Template7模板</td>
</tr>
<tr>
<td>onChange</td>
<td>function (p, values, displayValues)</td>
<td>选取器的值改变后，执行该回调</td>
</tr>
<tr>
<td>onMonthAdd</td>
<td>function (p, monthContainer)</td>
<td>新的月份对应的HTML加入到DOM后执行</td>
</tr>
<tr>
<td>onDayClick</td>
<td>function (p, dayContainer, year, month, day)</td>
<td>用户点击/选择任意日期后执行</td>
</tr>
<tr>
<td>onMonthYearChangeStart</td>
<td>function (p, year, month)</td>
<td>在动画切换月份开始时执行</td>
</tr>
<tr>
<td>onMonthYearChangeEnd</td>
<td>function (p, year, month)</td>
<td>在动画切换月份结束时执行</td>
</tr>
<tr>
<td>onOpen</td>
<td>function (p)</td>
<td>在打开日历时执行</td>
</tr>
<tr>
<td>onClose</td>
<td>function (p)</td>
<td>在关闭日历时执行</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">日历属性与方法</span></div>
<table class=" fixed-word-wrap full-width">
<thead>
<tr>
<td style="width: 40%; text-align: center;">属性/方法</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>params</td>
<td>日历的初始化参数</td>
</tr>
<tr>
<td>value</td>
<td>数组，包含当前选中的日期对象</td>
</tr>
<tr>
<td>opened</td>
<td>如果日历当前处于打开状态，则为true</td>
</tr>
<tr>
<td>inline</td>
<td>如果当前日历是内联的，则为true</td>
</tr>
<tr>
<td>container</td>
<td>日历组件的HTML容器，Dom7对象</td>
</tr>
<tr>
<td>setValue(values)</td>
<td>设置新的，被选择的日期，支持入参数组</td>
</tr>
<tr>
<td>nextMonth(duration)</td>
<td>在duration毫秒后，动画至下一月</td>
</tr>
<tr>
<td>prevMonth(duration)</td>
<td>在duration毫秒后，动画至上一月</td>
</tr>
<tr>
<td>nextYear()</td>
<td>动画至下一年</td>
</tr>
<tr>
<td>prevYear()</td>
<td>动画至上一年</td>
</tr>
<tr>
<td>setYearMonth(year, month, duration)</td>
<td>在duration毫秒后，动画至year年month月</td>
</tr>
<tr>
<td>open()</td>
<td>打开日历</td>
</tr>
<tr>
<td>close()</td>
<td>关闭日历</td>
</tr>
<tr>
<td>destroy()</td>
<td>销毁日历实例并移除事件监听器</td>
</tr>
</tbody>
</table>
<div class="blog_h1"><span class="graybg">下拉以刷新</span></div>
<p>下拉刷新是很多移动应用使用的组件， 用于触发页面内容更新。</p>
<div class="blog_h2"><span class="graybg">下拉刷新布局</span></div>
<p>可以集成下拉刷新功能到页面中：</p>
<pre class="crayon-plain-tag">&lt;div class="page"&gt;
    &lt;!-- page-content元素需要添加额外的pull-to-refresh-content类 --&gt;
    &lt;!-- data-ptr-distance为触发刷新动作的下拉距离，单位像素，默认44 --&gt;
    &lt;div class="page-content pull-to-refresh-content" data-ptr-distance="55"&gt;
        &lt;!-- 隐藏的下拉刷新层，包含一个预加载提示符和一个箭头图标 --&gt;
        &lt;div class="pull-to-refresh-layer"&gt;
            &lt;div class="preloader"&gt;&lt;/div&gt;
            &lt;div class="pull-to-refresh-arrow"&gt;&lt;/div&gt;
        &lt;/div&gt;
        &lt;!-- 常规页面内容 --&gt;
        &lt;div class="list-block"&gt;&lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">下拉刷新组件的事件序列</span></div>
<ol>
<li>当用户下拉pull-to-refresh-content元素时，该元素获得额外样式类：pull-down</li>
<li>当用户下拉pull-to-refresh-content元素超过data-ptr-distance后，该元素获得额外样式类：pull-up。默认的，箭头图标的方向将反转，提示用户可以释放并刷新</li>
<li>当处于pull-up状态时，用户释放下拉手势，pull-to-refresh-layer元素获得额外样式类：refreshing。默认的箭头图标隐藏，预加载提示符显示</li>
</ol>
<div class="blog_h2"><span class="graybg">下拉刷新相关事件</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 20%; text-align: center;">事件</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>⚡pullstart</td>
<td rowspan="5">
<p>这些事件的Target均为<pre class="crayon-plain-tag">&lt;div class="pull-to-refresh-content"&gt;</pre> 元素，触发时机分别为：</p>
<ol>
<li>开始下拉pull-to-refresh-content元素时</li>
<li>在移动pull-to-refresh-content元素的过程中</li>
<li>释放pull-to-refresh-content元素时</li>
<li>组件进入刷新（refreshing）状态时</li>
<li>刷新完毕后，组件返回初始状态时，该事件在<pre class="crayon-plain-tag">pullToRefreshDone()</pre> 被调用后触发</li>
</ol>
</td>
</tr>
<tr>
<td>⚡pullmove</td>
</tr>
<tr>
<td>⚡pullend</td>
</tr>
<tr>
<td>⚡refresh</td>
</tr>
<tr>
<td>⚡refreshdone</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">下拉刷新相关方法</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 35%; text-align: center;">方法</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>app.pullToRefreshDone(ptrContent)</td>
<td>
<p>ptrContent为pull-to-refresh-content元素对应的HTMLElement或者CSS选择器，下同</p>
<p>当刷新动作完成后，调用此方法可以重置组件，用户可以再次下拉刷新</p>
</td>
</tr>
<tr>
<td>app.pullToRefreshTrigger(ptrContent) </td>
<td>手工触发下拉刷新操作</td>
</tr>
<tr>
<td>app.destroyPullToRefresh(ptrContent)</td>
<td>禁用页面上的下拉刷新组件</td>
</tr>
<tr>
<td>app.initPullToRefresh(ptrContent)</td>
<td>启用页面上的下拉刷新组件</td>
</tr>
</tbody>
</table>
<div class="blog_h1"><span class="graybg">无限滚动</span></div>
<p> 当页面滚动到接近底部时，利用无限滚动组件可以加载额外的内容或者触发特定的动作。</p>
<div class="blog_h2"><span class="graybg">无限滚动布局</span></div>
<p>可以在任何可滚动容器上添加额外样式类，来启用无限滚动组件。例如：</p>
<pre class="crayon-plain-tag">&lt;div class="page"&gt;
    &lt;!-- 
        infinite-scroll 启用无限滚动功能的样式类
        data-distance 离底部多远时，触发无限滚动事件，单位像素，默认50px
    --&gt;
    &lt;div class="page-content infinite-scroll" data-distance="100"&gt;&lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">在顶部进行无限滚动</span></div>
<p>默认的，页面滚动到底部时触发无限滚动，如果要在滚动到顶部时触发无限滚动，可以：</p>
<pre class="crayon-plain-tag">&lt;div class="page"&gt;
    &lt;!-- 添加额外的样式类infinite-scroll-top --&gt;
    &lt;div class="page-content infinite-scroll infinite-scroll-top"&gt;&lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">无限滚动相关方法和事件</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 30%; text-align: center;">方法/事件</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>⚡infinite</td>
<td>该事件的Target为<pre class="crayon-plain-tag">&lt;div class="page-content infinite-scroll"&gt;</pre> 元素。当页面滚动到里底部还有data-distance时触发</td>
</tr>
<tr>
<td>app.attachInfiniteScroll(container)</td>
<td rowspan="2">添加/移除无限滚动事件监听器到infinite-scroll元素对应的HTMLElement或者CSS选择器</td>
</tr>
<tr>
<td>app.detachInfiniteScroll(container)</td>
</tr>
</tbody>
</table>
<div class="blog_h1"><span class="graybg"> 通知（Notifications）</span></div>
<p>使用通知组件，可以实现类似于iOS消息推送（Push）的效果。</p>
<div class="blog_h2"><span class="graybg">通知的布局</span></div>
<p>通知仅仅是媒体列表视图的特例，通常不需要手工处理其布局（JavaScript API会自动创建）。当你创建了通知组件后，F7会自动添加notifications元素到body中：</p>
<pre class="crayon-plain-tag">&lt;body&gt;
    &lt;!-- 随通知组件自动添加的新元素，为一个媒体列表视图 --&gt;
    &lt;div class="notifications list-block media-list"&gt;
        &lt;ul&gt;
            &lt;!-- 每一行对应一个通知条目 --&gt;
            &lt;li class="notification-item"&gt;
                &lt;div class="item-content"&gt;
                    &lt;div class="item-media"&gt;
                        &lt;!-- 通知媒体内容 --&gt;
                    &lt;/div&gt;
                    &lt;div class="item-inner"&gt;
                        &lt;div class="item-title-row"&gt;
                            &lt;div class="item-title"&gt;
                                &lt;!-- 通知标题 --&gt;
                            &lt;/div&gt;
                            &lt;div class="item-after"&gt;
                                &lt;!-- 通知关闭图标 --&gt;
                                &lt;a href="#" class="close-notification"&gt;&lt;/a&gt;
                            &lt;/div&gt;
                        &lt;/div&gt;
                        &lt;div class="item-subtitle"&gt;
                            &lt;!-- 通知子标题 --&gt;
                        &lt;/div&gt;
                        &lt;div class="item-text"&gt;
                            &lt;!-- 通知消息文本 --&gt;
                        &lt;/div&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/li&gt;

        &lt;/ul&gt;
    &lt;/div&gt;
&lt;/body&gt;</pre>
<div class="blog_h2"><span class="graybg">通知相关方法 </span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 35%; text-align: center;">方法</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>app.addNotification(parameters)</td>
<td>以初始化参数parameters添加/显示一个通知</td>
</tr>
<tr>
<td>app.closeNotification(notificationElement) </td>
<td>关闭一个通知，notificationElement为对应的HTMLElement或者CSS选择器</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">通知初始化参数 </span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 15%; text-align: center;">参数</td>
<td style="width: 15%; text-align: center;">类型和默认值</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>title</td>
<td>string</td>
<td>仅iOS主题。通知的标题，默认值为应用初始化参数notificationTitle</td>
</tr>
<tr>
<td>subtitle</td>
<td>string</td>
<td>仅iOS主题。通知子标题，默认值为应用初始化参数notificationSubtitle</td>
</tr>
<tr>
<td>media</td>
<td>string</td>
<td>仅iOS主题。媒体元素，指定图标/图片的HTML字符串，默认值为应用初始化参数notificationMedia</td>
</tr>
<tr>
<td>hold</td>
<td>number</td>
<td>在多少ms后自动关闭通知，默认值为应用初始化参数notificationHold</td>
</tr>
<tr>
<td>closeIcon</td>
<td>boolean = true</td>
<td>仅iOS主题。是否显示关闭图标</td>
</tr>
<tr>
<td>button</td>
<td>object</td>
<td>
<p>Material通知按钮，支持三个属性：</p>
<ol>
<li>text 按钮文本</li>
<li>color 按钮颜色名称</li>
<li>close 点击后是否关闭通知</li>
</ol>
</td>
</tr>
<tr>
<td>closeOnClick</td>
<td>boolean = false</td>
<td>是否在点击后自动关闭通知</td>
</tr>
<tr>
<td>additionalClass</td>
<td>string</td>
<td>在通知元素上添加的额外样式类，用于外观定制</td>
</tr>
<tr>
<td>custom</td>
<td>string</td>
<td>用于定制通知的HTML布局</td>
</tr>
<tr>
<td>onClick</td>
<td>function</td>
<td>通知被点击后执行的回调</td>
</tr>
<tr>
<td>onClose</td>
<td>function</td>
<td>通知被关闭后执行的回调</td>
</tr>
</tbody>
</table>
<div class="blog_h1"><span class="graybg"> 图片延迟加载（Lazy Load）</span></div>
<p>该组件用于推迟页面中图片的加载，仅当页面滚动到图片所在位置时，才触发加载动作。该功能可以提升页面加载速度、滚动性能，并降低流量消耗。</p>
<p>要延迟加载的图片必须位于可滚动的页面（<pre class="crayon-plain-tag">&lt;div class="page-content"&gt;</pre> ）内。</p>
<div class="blog_h2"><span class="graybg">用法</span></div>
<div class="blog_h3"><span class="graybg">普通图片</span></div>
<pre class="crayon-plain-tag">&lt;div class="page-content"&gt;
    &lt;!-- 使用data-src代替src，并且添加lazy样式类 --&gt;
    &lt;img data-src="path/to/image.jpg" class="lazy"&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">背景图片</span></div>
<pre class="crayon-plain-tag">&lt;div class="page-content"&gt;
    &lt;!-- data-background使用指定背景图片 --&gt;
    &lt;div data-background="path/to/image.jpg" class="lazy"&gt;&lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">淡入效果</span></div>
<p> 当延迟加载的图片成功加载后，可以淡入的显示：</p>
<pre class="crayon-plain-tag">&lt;div class="page-content"&gt;
    &lt;img data-src="path/to/image.jpg" class="lazy lazy-fadein"&gt;
    &lt;div data-background="path/to/image.jpg" class="lazy lazy-fadein"&gt;&lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">手工触发加载 </span></div>
<p>手工触发lazy事件，即可立即加载目标图片：</p>
<pre class="crayon-plain-tag">$$('img.lazy').trigger('lazy');
$$('div.lazy').trigger('lazy');</pre>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/framework7-study-note-2">Framework7学习笔记（二）：组件</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/framework7-study-note-2/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Framework7学习笔记（一）：基础</title>
		<link>https://blog.gmem.cc/framework7-study-note-1</link>
		<comments>https://blog.gmem.cc/framework7-study-note-1#comments</comments>
		<pubDate>Sun, 27 Dec 2015 11:09:32 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[F7]]></category>
		<category><![CDATA[学习笔记]]></category>

		<guid isPermaLink="false">https://blog.gmem.cc/?p=10369</guid>
		<description><![CDATA[<p>Framework7简介 Framework7（以下简称F7）是用于开发具有iOS/Android原生外观的混合移动应用/Web应用的开源框架，同时它也可以作为快速原型工具使用。F7完全基于Web技术——HTML、CSS、JavaScript。 F7简单易用，我们可以仅仅编写常规的HTML，不需要开发定制的标签（Angular那样），或者通过JavaScript来描述我们的页面（ExtJS那样）。 F7原先专注于iOS平台，现在也支持Google的Material design specification——Android平台的UI设计规范。 F7内置了大量的组件，例如模态窗口、侧面板、表格、表单、列表等等，使用这些组件时，几乎不需要编写JavaScript。 F7的外观易于定制，所有样式被分离在较小的[crayon-69d6607b47da4996200055-i/] 文件中。我们可以基于Less.js修改和编译样式。 F7还包括更多的特性： 原生的滚动效果（Native Scrolling） 不依赖任何第三方框架 高性能的，基于CSS的动画 支持缓存、历史、预加载（Preloading） 支持无限制的多视图，不需要任何JavaScript代码即可控制视图 简洁的JavaScript API DOM7：内置的DOM操控库，风格类似于jQuery 起步：第一个F7应用 基本布局：index.html 该页面声明了应用程序基本的布局： [crayon-69d6607b47dab164005467/] <a class="read-more" href="https://blog.gmem.cc/framework7-study-note-1">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/framework7-study-note-1">Framework7学习笔记（一）：基础</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h1"><span class="graybg">Framework7简介</span></div>
<p>Framework7（以下简称F7）是用于开发具有<span style="background-color: #c0c0c0;">iOS/Android原生外观</span>的<span style="background-color: #c0c0c0;">混合移动应用/Web应用</span>的开源框架，同时它也可以作为<span style="background-color: #c0c0c0;">快速原型</span>工具使用。F7完全基于Web技术——HTML、CSS、JavaScript。</p>
<p>F7简单易用，我们可以仅仅编写常规的HTML，不需要开发定制的标签（Angular那样），或者通过JavaScript来描述我们的页面（ExtJS那样）。</p>
<p>F7原先专注于iOS平台，现在也支持Google的Material design specification——Android平台的UI设计规范。</p>
<p>F7内置了大量的组件，例如模态窗口、侧面板、表格、表单、列表等等，使用这些组件时，几乎不需要编写JavaScript。</p>
<p>F7的外观易于定制，所有样式被分离在较小的<pre class="crayon-plain-tag">.less</pre> 文件中。我们可以基于Less.js修改和编译样式。</p>
<p>F7还包括更多的特性：</p>
<ol>
<li>原生的滚动效果（Native Scrolling）</li>
<li>不依赖任何第三方框架</li>
<li>高性能的，基于CSS的动画</li>
<li>支持缓存、历史、预加载（Preloading）</li>
<li>支持无限制的多视图，不需要任何JavaScript代码即可控制视图</li>
<li>简洁的JavaScript API</li>
<li>DOM7：内置的DOM操控库，风格类似于jQuery</li>
</ol>
<div class="blog_h1"><span class="graybg"><a id="first-f7-app"></a>起步：第一个F7应用</span></div>
<div class="blog_h3"><span class="graybg">基本布局：index.html</span></div>
<p>该页面声明了应用程序基本的布局：</p>
<pre class="crayon-plain-tag">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset="utf-8"&gt;
    &lt;meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *"&gt;
    &lt;meta name="format-detection" content="telephone=no"&gt;
    &lt;meta name="msapplication-tap-highlight" content="no"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, minimal-ui"&gt;
    &lt;meta name="apple-mobile-web-app-capable" content="yes"&gt;
    &lt;meta name="apple-mobile-web-app-status-bar-style" content="black"&gt;
    &lt;title&gt;第一个F7应用&lt;/title&gt;
    &lt;!-- 主题样式表 --&gt;
    &lt;link rel="stylesheet" href="css/framework7.ios.css"&gt;
    &lt;!-- 配色样式表 --&gt;
    &lt;link rel="stylesheet" href="css/framework7.ios.colors.css"&gt;
    &lt;!-- Path to your custom app styles--&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;!-- PhoneGap应用全屏模式下，用于状态栏overlay --&gt;
    &lt;div class="statusbar-overlay"&gt;&lt;/div&gt;
    &lt;!-- 面板overlay--&gt;
    &lt;div class="panel-overlay"&gt;&lt;/div&gt;
    &lt;!-- 带reveal特效的左侧面板 --&gt;
    &lt;div class="panel panel-left panel-reveal"&gt;
      &lt;div class="content-block"&gt;
        &lt;p&gt;这里存放左侧面板的内容&lt;/p&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;!-- 所有视图 --&gt;
    &lt;div class="views"&gt;
      &lt;!-- 主视图，应当包含"view-main"样式类 --&gt;
      &lt;div class="view view-main"&gt;
        &lt;!-- 顶部导航栏--&gt;
        &lt;div class="navbar"&gt;
          &lt;div class="navbar-inner"&gt;
            &lt;!-- 在应用标题上添加sliding效果 --&gt;
            &lt;div class="center sliding"&gt;第一个F7应用&lt;/div&gt;
            &lt;div class="right"&gt;
              &lt;!-- 
                右侧内容仅仅是一个图标，因此添加icon-only类
                open-panel类提示F7，点击链接时打开面板
              --&gt;
              &lt;a href="#" class="link icon-only open-panel"&gt;&lt;i class="icon icon-bars"&gt;&lt;/i&gt;&lt;/a&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
        &lt;!-- 页面容器，由于使用了fixed-through的导航栏、工具栏，需要添加合适的样式类--&gt;
        &lt;div class="pages navbar-through toolbar-through"&gt;
          &lt;!-- 页面，"data-page" 属性包含页面的名称 --&gt;
          &lt;div data-page="index" class="page"&gt;
            &lt;!-- 可滚动的页面内容 --&gt;
            &lt;div class="page-content"&gt;
              &lt;p&gt;页面内容&lt;/p&gt;
              &lt;a href="about.html"&gt;关于&lt;/a&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
        &lt;!-- 底部的工具栏 --&gt;
        &lt;div class="toolbar"&gt;
          &lt;div class="toolbar-inner"&gt;
            &lt;!-- 工具栏链接--&gt;
            &lt;a href="#" class="link"&gt;链接1&lt;/a&gt;
            &lt;a href="#" class="link"&gt;链接2&lt;/a&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;!-- Cordova的JavaScript占位符--&gt;
    &lt;script type="text/javascript" src="cordova.js"&gt;&lt;/script&gt; 
    &lt;!-- Framework7的JavaScript文件 --&gt;
    &lt;script type="text/javascript" src="js/framework7.js"&gt;&lt;/script&gt;
    &lt;!-- 当前应用的JavaScript文件 --&gt;
    &lt;script type="text/javascript" src="js/index.js"&gt;&lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre>
<div class="blog_h3"><span class="graybg">页面片段：about.html</span></div>
<pre class="crayon-plain-tag">&lt;!-- 我们不需要在此页面中定义完整的布局，该页面是通过Ajax解析并纳入DOM的。这种做法和AngularJS的ngInclude类似 --&gt;

&lt;!-- 顶部导航栏 --&gt;
&lt;div class="navbar"&gt;
    &lt;div class="navbar-inner"&gt;
        &lt;div class="left"&gt;
            &lt;a href="#" class="back link"&gt; &lt;i class="icon icon-back"&gt;&lt;/i&gt; &lt;span&gt;返回&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="center sliding"&gt;关于&lt;/div&gt;
        &lt;div class="right"&gt;
            &lt;a href="#" class="link icon-only open-panel"&gt;&lt;i class="icon icon-bars"&gt;&lt;/i&gt;&lt;/a&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;!-- 声明页面 --&gt;
&lt;div class="pages"&gt;
    &lt;!-- about页面 --&gt;
    &lt;div data-page="about" class="page"&gt;
        &lt;div class="page-content"&gt;
            &lt;div class="content-block"&gt;
                &lt;p&gt;关于本应用&lt;/p&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">脚本：index.js</span></div>
<p>初始化应用和视图：</p>
<pre class="crayon-plain-tag">// 初始化F7应用程序
var app = new Framework7();

// 快捷方式，用于操控DOM
var $$ = Dom7;

// 添加布局中声明的主视图
var mainView = app.addView( '.view-main', {
    // 启用动态导航栏
    dynamicNavbar : true
} );</pre>
<p>如果要针对某个页面的添加脚本，可以：</p>
<pre class="crayon-plain-tag">// 推荐的方式：使用onPageInit回调
app.onPageInit( 'about', function( page ) {
    // 在这里操控about页面
} );

// 另外一种方式，针对所有页面的pageInit事件处理器
$$( document ).on( 'pageInit', function( e ) {
    // 从事件中获得页面信息
    var page = e.detail.page;

    if ( page.name === 'about' ) {
        // 在这里操控about页面
    }
    ;
} );

// 或者，使用活动的pageInit事件处理器
$$( document ).on( 'pageInit', '.page[data-page="about"]', function( e ) {
    // 在这里操控about页面
} );</pre>
<div class="blog_h3"><span class="graybg">运行效果</span></div>
<p><img class="aligncenter wp-image-10653" src="https://blog.gmem.cc/wp-content/uploads/2015/12/f7-firstapp.png" alt="f7-firstapp" width="710" height="293" /></p>
<div class="blog_h1"><span class="graybg"> Framework7核心</span></div>
<div class="blog_h2"><span class="graybg">Dom7</span></div>
<p>在DOM操控方面，F7没有使用第三方库，而是自己实现了一个称为DOM7的组件。该组件的<span style="background-color: #c0c0c0;">接口风格类似于jQuery</span>：</p>
<pre class="crayon-plain-tag">var $$ = Dom7;
$$( '.something' ).on( 'click', function( e ) {
    $$( this ).addClass( 'hello' ).attr( 'title', 'world' ).insertAfter( '.something-else' );
} );</pre>
<div class="blog_h3"><span class="graybg">Dom7常用方法</span></div>
<p>下面的方法均属于元素集——即<pre class="crayon-plain-tag">Dom7()</pre> 调用的返回值：</p>
<table class=" fixed-word-wrap full-width">
<thead>
<tr>
<td style="width: 20%; text-align: center;">方法</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>addClass()</td>
<td>添加样式类：<br />
<pre class="crayon-plain-tag">//为所有p元素添加intro类
$$('p').addClass('intro');</pre>
</td>
</tr>
<tr>
<td>removeClass()</td>
<td>移除样式类：<br />
<pre class="crayon-plain-tag">//从所有具有big样式类的a元素上移除big样式类
$$('a.big').removeClass('big');</pre>
</td>
</tr>
<tr>
<td>hasClass()</td>
<td>判断是否存在至少一个匹配元素具有样式类：<br />
<pre class="crayon-plain-tag">$$('p').hasClass('intro');</pre>
</td>
</tr>
<tr>
<td>toggleClass()</td>
<td>如果匹配元素上有指定样式类，移除；反之则添加：<br />
<pre class="crayon-plain-tag">$$('h1, h2').toggleClass('small');</pre>
</td>
</tr>
<tr>
<td>prop() </td>
<td>读取或者写入Property：<br />
<pre class="crayon-plain-tag">var isChecked = $$('input').prop('checked'); //读取
//设置所有checkbox为选中
$$('input[type="checkbox"]').prop('checked', true);
//设置多个属性
$$('input').prop({
  checked: false,
  disabled: true
});</pre>
</td>
</tr>
<tr>
<td>attr()</td>
<td>读取或者写入Attribute，Attribute与Property类似，但是前者<span style="background-color: #c0c0c0;">相当于直接操作XML的属性节点</span>：<br />
<pre class="crayon-plain-tag">var link = $$( 'a' ).attr( 'href' );
$$( 'a' ).attr( 'href', 'http://google.com' );
$$( 'a' ).attr( {
    id : 'new-id',
    title : 'Link to Google',
    href : 'http://google.com'
} );
$$( 'img' ).removeAttr( 'src' );</pre>
</td>
</tr>
<tr>
<td>val()</td>
<td>得到第一个匹配元素的值，或者设置所有匹配元素的值：<br />
<pre class="crayon-plain-tag">//&lt;input id="myInput" type="text" value="Lorem ipsum"/&gt;
var inputVal = $$('#myInput').val(); 
$$('input#myInput').val('New value here');</pre>
</td>
</tr>
<tr>
<td>data()</td>
<td>读取第一个匹配元素上存储的（任意）数据，或者写入所有匹配元素的数据：<br />
<pre class="crayon-plain-tag">$$( 'a' ).data( 'user', {
    id : '123',
    name : 'John',
    email : 'john@doe.com'
} );
var user = $$( 'a' ).data( 'user' );
// {id: '123', name: 'John', email: 'john@doe.com'}
$$( 'a' ).removeData( 'user' );</pre>
</td>
</tr>
<tr>
<td>dataset()</td>
<td>返回元素上定义的数据集（即data- 属性）为简单对象：<br />
<pre class="crayon-plain-tag">&lt;div id="my-div" data-loop="true" data-animate-pages="false" data-index="0" data-hello="world"&gt;&lt;/div&gt;
&lt;script type="text/javascript"&gt;
var dataset = $$('#my-div').dataset();
/**
{
    loop: true,
    animatePages: false,
    index: 0,
    hello: 'world'
}
 */
&lt;/script&gt;</pre>
</td>
</tr>
<tr>
<td>transform()</td>
<td>添加CSS转换属性：<br />
<pre class="crayon-plain-tag">$$('a').transform('rotate(90deg)')</pre>
</td>
</tr>
<tr>
<td>transition()</td>
<td>设置CSS变换持续时间：<br />
<pre class="crayon-plain-tag">$$('p').transition(300)</pre>
</td>
</tr>
<tr>
<td>on()</td>
<td>注册事件处理器：<br />
<pre class="crayon-plain-tag">// 函数签名：
function on(eventName, handler, useCapture);
// delegatedTarget被代理事件源
function on(eventName, delegatedTarget, handler, useCapture);
//用法示例：
$$('a').on('click', function (e) { 
    console.log('clicked'); 
});
//同时监听多种事件
$$('input[type="text"]').on('keyup keydown change', function (e) { 
    console.log('input value changed'); 
});
//代理事件处理器
$$(document).on('click', 'a', function (e) { 
    console.log('link clicked'); 
});</pre>
</td>
</tr>
<tr>
<td>once()</td>
<td>注册只执行一次的事件处理器</td>
</tr>
<tr>
<td>off()</td>
<td>移除事件处理器：<br />
<pre class="crayon-plain-tag">//函数签名
function off(eventName, handler, useCapture);
function off(eventName, delegatedTarget, handler, useCapture);

//移除一个事件处理器，clickHandler必须已经注册为处理器
$$('a').off('click', clickHandler);</pre>
</td>
</tr>
<tr>
<td>trigger()</td>
<td>触发匹配元素上指定事件，并执行所有已注册的事件处理器：<br />
<pre class="crayon-plain-tag">//函数签名
function trigger(eventName, eventData);</pre>
</td>
</tr>
<tr>
<td>transitionEnd()</td>
<td>添加CSS变换结束处理器：<br />
<pre class="crayon-plain-tag">$$('a').transitionEnd(function(){  })</pre>
</td>
</tr>
<tr>
<td>animationEnd()</td>
<td>添加动画效果结束处理器：<br />
<pre class="crayon-plain-tag">$$('a').animationEnd(function(){  })</pre>
</td>
</tr>
<tr>
<td>width()</td>
<td>得到第一个匹配元素的实际宽度</td>
</tr>
<tr>
<td>outerWidth()</td>
<td>得到第一个匹配元素的宽度，包括补白和边框，如果入参true，则还包括margin</td>
</tr>
<tr>
<td>height()</td>
<td>得到第一个匹配元素的实际高度</td>
</tr>
<tr>
<td>outerHeight()</td>
<td>得到第一个匹配元素的高度，包括补白和边框，如果入参true，则还包括marg</td>
</tr>
<tr>
<td>offset()</td>
<td>得到第一个匹配元素相对于document的偏移量：<br />
<pre class="crayon-plain-tag">var coords = $$('.content').offset(); 
// {top: 100, left: 200}</pre>
</td>
</tr>
<tr>
<td>hide()</td>
<td>设置<pre class="crayon-plain-tag">display:none</pre> 以隐藏所有匹配元素</td>
</tr>
<tr>
<td>show()</td>
<td>设置<pre class="crayon-plain-tag">display:block</pre> 以显示所有匹配元素</td>
</tr>
<tr>
<td>css()</td>
<td>获取或者设置CSS属性：<br />
<pre class="crayon-plain-tag">//得到left属性
$$('.content').css('left'); 
//设置left属性
$$('.content').css('left', '100px');
//设置多个CSS属性
$$('a').css({
    left: '100px',
    top: '200px',
    color: 'red',
    width: '300px',
    marginLeft: '17px', //驼峰式转写
    'padding-right': '20px' //原始样式名称，非法标识符需要引号
});</pre>
</td>
</tr>
<tr>
<td>scrollTop()</td>
<td rowspan="3">滚动元素</td>
</tr>
<tr>
<td>scrollLeft()</td>
</tr>
<tr>
<td>scrollTo()</td>
</tr>
<tr>
<td>add()</td>
<td>添加元素到既有的Dom7元素集中：<br />
<pre class="crayon-plain-tag">var links = $$('a');
links.add('p').addClass('blue');
links.add($$('div')).addClass('red');</pre>
</td>
</tr>
<tr>
<td>each()</td>
<td>迭代元素集合，执行回调函数</td>
</tr>
<tr>
<td>html()</td>
<td>得到第一个元素的HTML内容，或者设置所有匹配元素的HTML内容</td>
</tr>
<tr>
<td>text()</td>
<td>得到第一个元素的文本内容，或者设置所有匹配元素的文本内容</td>
</tr>
<tr>
<td>is()</td>
<td>判断当前元素集是否匹配指定的CSS选择器、HTML元素或者Dom7元素集合：<br />
<pre class="crayon-plain-tag">$$('div').is(CSSSelector);
$$('div').is(HTMLElement);</pre>
</td>
</tr>
<tr>
<td>index()</td>
<td>得到第一个元素在其兄弟元素中的相对索引</td>
</tr>
<tr>
<td>eq(idx)</td>
<td>获得元素集中第idx个元素</td>
</tr>
<tr>
<td>append()</td>
<td>在元素集所有元素的结尾插入指定的HTML元素或者HTML字符串</td>
</tr>
<tr>
<td>appendTo(el)</td>
<td>把元素集插入到el元素的结尾</td>
</tr>
<tr>
<td>prepend()</td>
<td>在元素集所有元素的起始处插入指定的HTML元素或者HTML字符串</td>
</tr>
<tr>
<td>prependTo(el)</td>
<td>把元素集插入到el元素的起始处</td>
</tr>
<tr>
<td>insertBefore(tgt)</td>
<td>在目标（CSS选择器、HTML元素、Dom7元素集）之前插入当前匹配的元素集</td>
</tr>
<tr>
<td>insertAfter(tgt)</td>
<td>在目标（CSS选择器、HTML元素、Dom7元素集）之后插入当前匹配的元素集</td>
</tr>
<tr>
<td>next([sel])</td>
<td>获得元素集每个元素的下一个弟弟元素，如果提供selector，则仅返回匹配此选择器的弟弟元素</td>
</tr>
<tr>
<td>nextAll([sel])</td>
<td>获得元素集每个元素的全部弟弟元素，如果提供selector，则仅返回匹配此选择器的弟弟元素</td>
</tr>
<tr>
<td>prev([sel])</td>
<td>获得元素集每个元素的下一个哥哥元素，如果提供selector，则仅返回匹配此选择器的哥哥元素</td>
</tr>
<tr>
<td>prevAll([sel])</td>
<td>获得元素集每个元素的全部哥哥元素，如果提供selector，则仅返回匹配此选择器的哥哥元素</td>
</tr>
<tr>
<td>parent([sel])</td>
<td>获得元素集每个元素的第一个匹配选择器的祖先元素</td>
</tr>
<tr>
<td>parents([sel])</td>
<td>获得元素集每个元素的所有匹配选择器的祖先元素</td>
</tr>
<tr>
<td>find([sel])</td>
<td>获得元素集每个元素的所有匹配选择器的后代元素</td>
</tr>
<tr>
<td>children([sel])</td>
<td>获得元素集每个元素的所有匹配选择器的儿子元素</td>
</tr>
<tr>
<td>filter(callback)</td>
<td>过滤当前元素集：<br />
<pre class="crayon-plain-tag">var redLinks = $$('a').filter(function(index, el) {
    return $$(this).hasClass('red');
})</pre>
</td>
</tr>
<tr>
<td>remove()</td>
<td>从DOM树中移除当前元素集</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">Dom7事件快捷方法 </span></div>
<p>下表是一系列事件处理的快捷方式，它们都属于元素集对象。调用<pre class="crayon-plain-tag">event()</pre> 手工触发指定事件，调用<pre class="crayon-plain-tag">event(handleFunc)</pre> 则注册事件监听器：</p>
<table class=" full-width fixed-word-wrap">
<tbody>
<tr>
<td style="width: 25%;">blur</td>
<td style="width: 25%;">focus</td>
<td style="width: 25%;">focusin</td>
<td style="width: 25%;">focusout</td>
</tr>
<tr>
<td>click</td>
<td>keyup</td>
<td>keydown</td>
<td>keypress</td>
</tr>
<tr>
<td>mouseenter</td>
<td>mouseover</td>
<td>mousedown</td>
<td>mousemove</td>
</tr>
<tr>
<td>mouseout</td>
<td>mouseleave</td>
<td>mouseup</td>
<td>submit</td>
</tr>
<tr>
<td>touchstart</td>
<td>touchend</td>
<td>touchmove</td>
<td>change</td>
</tr>
<tr>
<td>resize</td>
<td>scroll</td>
<td> </td>
<td> </td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">Dom7工具函数</span></div>
<p>下列函数都直接定义在Dom7上：</p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">函数</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>each()</td>
<td>遍历“可迭代对象”，函数签名：<pre class="crayon-plain-tag">Dom7.each(object/array, callback);</pre> <br />示例：<br />
<pre class="crayon-plain-tag">var fruits = ['Apple', 'Orange', 'Pineapple', 'Bannana'];
$$.each(fruits, function (index, value) {});  
var person = {
    firstName: 'Alex',
    lastName: 'Wong',
    age: 25,
};
$$.each(person, function (key, value) {});</pre>
</td>
</tr>
<tr>
<td>parseUrlQuery()</td>
<td>解析URL并提取请求参数：<br />
<pre class="crayon-plain-tag">var query = $$.parseUrlQuery('http://google.com/?id=5&amp;foo=bar');
console.log(query); //-&gt; {id: 5, foo: 'bar'}</pre>
</td>
</tr>
<tr>
<td>isArray()</td>
<td>判断一个对象是否为数组</td>
</tr>
<tr>
<td>unique()</td>
<td>返回数组的一个去重副本</td>
</tr>
<tr>
<td>serializeObject()</td>
<td>以URL请求参数的形式串行化一个简单对象（PO）</td>
</tr>
<tr>
<td>toCamelCase()</td>
<td>从短横线连接风格（web-app）转换为驼峰式大小写（webApp）</td>
</tr>
<tr>
<td>dataset()</td>
<td>将元素（CSS选择器）中的data-*属性转换为简单对象（PO）</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">Ajax支持</span></div>
<p>我们可以调用<pre class="crayon-plain-tag">$$.ajax(parameters)</pre> 来发送Ajax请求并处理结果，其中parameters会一个配置对象，可以指定以下属性：</p>
<table class=" fixed-word-wrap full-width">
<thead>
<tr>
<td style="width: 15%; text-align: center;">属性</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>async</td>
<td>是否异步发送请求，默认true</td>
</tr>
<tr>
<td>url</td>
<td>请求的目标地址</td>
</tr>
<tr>
<td>method</td>
<td>请求使用的HTTP方法，默认'GET'</td>
</tr>
<tr>
<td>cache</td>
<td>是否允许浏览器缓存请求，默认true。如果设置为false则自动添加<pre class="crayon-plain-tag">_nocache={timestamp}</pre> 到GET请求参数</td>
</tr>
<tr>
<td>contentType</td>
<td>内容类型，默认'application/x-www-form-urlencoded'，还可以指定为'multipart/form-data'、'text/plain'。<br />对于跨域请求，如果设置contentType为<span style="background-color: #c0c0c0;">前述三者之外的任意值</span>，会导致浏览器发送preflight的OPTIONS请求到服务器</td>
</tr>
<tr>
<td>crossDomain</td>
<td>如果要对本域强制使用跨站请求，可以设置为true</td>
</tr>
<tr>
<td>data</td>
<td>需要发送给服务器的数据，对于GET请求，会编码为请求参数（除非该参数已经是字符串）附加到URL后面</td>
</tr>
<tr>
<td>processData</td>
<td>默认true，设置为false可以阻止Dom7把Object形式的data编码为请求参数形式</td>
</tr>
<tr>
<td>dataType</td>
<td>期望服务器返回的数据类型， 默认'text'，可以指定为'json'</td>
</tr>
<tr>
<td>headers</td>
<td>以键值对形式指定额外的请求头</td>
</tr>
<tr>
<td>xhrFields</td>
<td>设置到浏览器原生XHR对象上的键值对</td>
</tr>
<tr>
<td>username</td>
<td>HTTP验证用户名</td>
</tr>
<tr>
<td>password</td>
<td>HTTP验证密码</td>
</tr>
<tr>
<td>timeout</td>
<td>请求处理超时的毫秒数</td>
</tr>
<tr>
<td>beforeSend</td>
<td>在XHR请求发送前执行的回调：<pre class="crayon-plain-tag">function (xhr)</pre> ，可以用于修改请求</td>
</tr>
<tr>
<td>error</td>
<td>在XHR请求执行失败后执行的回调：<pre class="crayon-plain-tag">function (xhr, status)</pre> </td>
</tr>
<tr>
<td>success</td>
<td>在XHR请求执行成功后执行的回调：<pre class="crayon-plain-tag">function (data, status, xhr)</pre> <br />如果dataType设置为json，那么data自动转换为JavaScript对象，转换失败则status显示为parseerror<br />Framework7要求严格规范的JSON格式</td>
</tr>
<tr>
<td>complete</td>
<td>在XHR请求处理完毕后执行的回调，该回调在error/success之后执行：<pre class="crayon-plain-tag">function (xhr, status)</pre> </td>
</tr>
<tr>
<td>statusCode</td>
<td>指定不同HTTP状态码对应的回调：<br />
<pre class="crayon-plain-tag">$$.ajax({
  url: 'somepage.html',
  statusCode: {
    404: function (xhr) {
      alert('page not found');
    }
  }
});</pre>
</td>
</tr>
</tbody>
</table>
<p>为了简化常用类型的XHR请求的发送，Dom7提供以下快捷函数：</p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">函数</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>Dom7.get()</td>
<td rowspan="3">这三个函数都接受三个入参：
<ol>
<li>url，请求的URL</li>
<li>data，发送给服务器的对象或者字符串</li>
<li>处理成功后的回调函数：<pre class="crayon-plain-tag">function (data, status, xhr)</pre> </li>
</ol>
</td>
</tr>
<tr>
<td>Dom7.post()</td>
</tr>
<tr>
<td>Dom7.getJSON()</td>
</tr>
</tbody>
</table>
<p>下表列出Dom7扩展的，全局的Ajax监听事件。这些事件都从<pre class="crayon-plain-tag">document</pre> 对象上发出：</p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">事件</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>ajaxStart</td>
<td>在XHR请求发送前触发，可以全局性的修改请求，例如添加请求头</td>
</tr>
<tr>
<td>ajaxError</td>
<td>当任何XHR请求处理失败时触发</td>
</tr>
<tr>
<td>ajaxSuccess</td>
<td>当任何XHR请求处理成功时触发</td>
</tr>
<tr>
<td>ajaxComplete</td>
<td>当任何XHR请求处理完毕后触发，该事件在ajaxError/ajaxSuccess之后触发</td>
</tr>
</tbody>
</table>
<p>使用上述事件的例子如下：</p>
<pre class="crayon-plain-tag">$$(document).on('ajaxComplete', function (e) {
  var xhr = e.detail.xhr;
  console.log('request performed');
});</pre>
<div class="blog_h2"><span class="graybg">布局</span></div>
<p>F7框架的文档中多次提到布局（Layout）这一个词，在这里<span style="background-color: #c0c0c0;">布局是指应用程序或者F7组件的HTML结构</span>。</p>
<div class="blog_h3"><span class="graybg">应用程序HTML布局</span></div>
<p>开发F7应用的第一步，就是创建包含应用程序骨架的index.html文件，此文件包含了应用程序的基本布局。</p>
<p>iOS的基础布局样例可以参考<a href="#first-f7-app">前面的章节</a>，Android Material风格的布局，与iOS稍微不同：</p>
<pre class="crayon-plain-tag">&lt;div data-page="index" class="page"&gt;

    &lt;!-- 顶部导航栏需要置于页的内部 --&gt;
    &lt;div class="navbar"&gt;
        &lt;div class="navbar-inner"&gt;
            &lt;div class="center"&gt;Awesome App&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;

    &lt;!-- 底部工具栏需要置于页的内部 --&gt;
    &lt;div class="toolbar"&gt;
      &lt;div class="toolbar-inner"&gt;
          &lt;!-- Toolbar links --&gt;
          &lt;a href="#" class="link"&gt;Link 1&lt;/a&gt;
          &lt;a href="#" class="link"&gt;Link 2&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">应用初始化 </span></div>
<p>可以调用下面的函数初始化F7应用，变量app代表了F7应用的实例：</p>
<pre class="crayon-plain-tag">var app = new Framework7( { /* 唯一的入参是包含所有初始化参数的对象 */
    // 模态窗口的默认标题
    modalTitle : '消息',

    // 启用哈希（#）导航
    pushState : true,

    // 在XHR请求前后，分别显示，隐藏指示器
    onAjaxStart : function( xhr ) {
        myApp.showIndicator();
    },
    onAjaxComplete : function( xhr ) {
        myApp.hideIndicator();
    }
} );</pre>
<div class="blog_h3"><span class="graybg"><a id="app-init-params"></a>应用初始化参数详解</span></div>
<p>F7提供了大量可用的构造参数，如下表：</p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">参数<em>/属性</em></td>
<td style="text-align: center;">类型和默认值</td>
<td style="width: 35%; text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;" colspan="3"><em>Material Theme主题专用参数</em></td>
</tr>
<tr>
<td>material</td>
<td>boolean = false</td>
<td>设置为true则启用Material特有的JS行为</td>
</tr>
<tr>
<td>materialPageLoadDelay</td>
<td>number = 0</td>
<td>新加载页面动画的启动延迟，单位毫秒</td>
</tr>
<tr>
<td>materialRipple</td>
<td>boolean = true</td>
<td>启用Material的触碰波痕效果</td>
</tr>
<tr>
<td>materialRippleElements</td>
<td>string = <br />
<pre class="crayon-plain-tag">.ripple
a.link
a.item-link
.button
.modal-button
.tab-link
.label-radio
.label-checkbox
.actions-modal-button
a.searchbar-clear
.floating-button</pre>
</td>
<td>启用触碰波痕效果的元素的CSS选择器</td>
</tr>
<tr>
<td>materialPreloaderHtml</td>
<td>string = <br />
<pre class="crayon-plain-tag">&lt;span class="preloader-inner"&gt;
    &lt;span class="preloader-inner-gap"&gt;&lt;/span&gt;
    &lt;span class="preloader-inner-left"&gt;
        &lt;span class="preloader-inner-half-circle"&gt;&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class="preloader-inner-right"&gt;
        &lt;span class="preloader-inner-half-circle"&gt;&lt;/span&gt;
    &lt;/span&gt;
&lt;/span&gt;</pre>
</td>
<td> Material主题预加载器（Preloader）的HTML</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>缓存</em></td>
</tr>
<tr>
<td>cache</td>
<td>boolean = true</td>
<td>是否启用GET方式的Ajax的缓存</td>
</tr>
<tr>
<td>cacheDuration</td>
<td>number = 1000*60*10</td>
<td>缓存有效期，单位毫秒</td>
</tr>
<tr>
<td>cacheIgnore</td>
<td>array = []</td>
<td>那些URL需要禁用缓存</td>
</tr>
<tr>
<td>cacheIgnoreGetParameters</td>
<td>boolean = false</td>
<td>缓存时是否忽略附在URL后面的参数，如果启用，那么不同查询参数只生成同一个缓存</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>快速点击库</em></td>
</tr>
<tr>
<td>fastClicks</td>
<td>boolean = true</td>
<td>Fast clicks是F7内置的组件，移除300ms的click事件触发延迟</td>
</tr>
<tr>
<td>fastClicksDelayBetweenClicks</td>
<td>number = 50</td>
<td>连续多次click事件的最小间隔</td>
</tr>
<tr>
<td>fastClicksDistanceThreshold</td>
<td>number = 10</td>
<td>如果轻触/移动（tap/move）的距离大于此值，则click事件不会触发</td>
</tr>
<tr>
<td>activeState</td>
<td>boolean = true</td>
<td>如果启用，F7为当前被触碰的元素添加active-state样式类</td>
</tr>
<tr>
<td>activeStateElemets</td>
<td>string = 'a, button, label, span'</td>
<td>CSS选择器，指定哪些元素支持activeState配置</td>
</tr>
<tr>
<td>tapHold</td>
<td>boolean = false</td>
<td>设置为true则启用轻触并保持（tap hold）事件</td>
</tr>
<tr>
<td>tapHoldDelay</td>
<td>number = 750</td>
<td>在轻触后，必须维持多少ms才触发tap hold事件</td>
</tr>
<tr>
<td>tapHoldPreventClicks</td>
<td>boolean = true</td>
<td>禁止在tap hold事件之后触发click事件</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>导航路由</em></td>
</tr>
<tr>
<td>router</td>
<td>boolean  = true</td>
<td>设置为false禁用内置的导航路由器</td>
</tr>
<tr>
<td>ajaxLinks</td>
<td>string = undefined</td>
<td>默认的，F7通过Ajax加载所有<pre class="crayon-plain-tag">&lt;a&gt;</pre> 链接。如果指定该参数，那么只有匹配CSS选择器的元素，才使用Ajax加载</td>
</tr>
<tr>
<td>dynamicPageUrl</td>
<td>string  ='content-{{index}}'</td>
<td>动态加载页的URL规则，支持占位符：<br /><pre class="crayon-plain-tag">{{index}}</pre>  在导航历史中的索引<br /><pre class="crayon-plain-tag">{{name}}</pre> 页面的<pre class="crayon-plain-tag">data-page</pre> 属性</td>
</tr>
<tr>
<td>uniqueHistory</td>
<td>boolean = false </td>
<td>设置为true，F7保持视图的导航历史条目的唯一性，重复的条目会被删除</td>
</tr>
<tr>
<td>uniqueHistoryIgnoreGetParameters</td>
<td>boolean = false</td>
<td>判断导航历史条目唯一性时，是否忽略URL参数</td>
</tr>
<tr>
<td>externalLinks</td>
<td>string = '.external'</td>
<td>CSS选择器，用于指定哪些链接属于“外部链接”，不应当由F7处理</td>
</tr>
<tr>
<td>allowDuplicateUrls</td>
<td>boolean = false</td>
<td>
<p>设置为true，则允许加载与当前活动页URL相同的页<br />在指向当前页面本身的导航时有用</p>
</td>
</tr>
<tr>
<td>animateNavBackIcon</td>
<td>boolean = false</td>
<td>仅IOS。让后退图标的动画效果更加Native</td>
</tr>
<tr>
<td>animatePages</td>
<td>boolean = true</td>
<td>设置为false可以禁用页面切换动画</td>
</tr>
<tr>
<td>preloadPreviousPage</td>
<td>boolean = true</td>
<td>swipe back page特性需要启用该选项</td>
</tr>
<tr>
<td>preroute</td>
<td>function(view, options);</td>
<td>
<p>该回调拦截路由默认的load/back动作，可以加载其它页或者做额外的工作</p>
<p>返回false则阻止当前路由</p>
<p>该回调在preprocess之前执行</p>
</td>
</tr>
<tr>
<td>preprocess</td>
<td>function(content, url, next);</td>
<td>
<p>导航时，可以在插入DOM之前，修改加载的内容。这意味着我们可以使用自己习惯的客户端模板引擎（例如Template7、AngularJS）</p>
<p>此回调中无法访问传递给页面的上下文，可以通过URL的GET参数向新页面传递信息</p>
<p>执行返回操作时，不会触发该回调</p>
</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>Push State</em></td>
</tr>
<tr>
<td>pushState</td>
<td>boolean = false</td>
<td>是否启用#导航，启用时，用户可以点击浏览器的前进、后退按钮，在应用的不同页面之间进行切换</td>
</tr>
<tr>
<td>pushStateSeparator</td>
<td>string = '#!/'</td>
<td>Push State的URL分隔符，URL会呈现为类似<pre class="crayon-plain-tag">http://gmem.cc/#!/hello.html</pre> 的形式</td>
</tr>
<tr>
<td>pushStateNoAnimation</td>
<td>boolean = false</td>
<td>如果设置为true，在Push State之间导航不会产生动画效果</td>
</tr>
<tr>
<td>pushStatePreventOnLoad</td>
<td>boolean = true</td>
<td>启用后，应用加载时第一个pop state事件被忽略，可以避免不必要的加载动作</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em> Swipe back（仅iOS主题）</em></td>
</tr>
<tr>
<td>swipeBackPage</td>
<td>boolean = true</td>
<td>启用后，可以用从屏幕左侧边缘滑入的手势切换到上一个页面</td>
</tr>
<tr>
<td>swipeBackPageThreshold</td>
<td>number = 0</td>
<td>滑动距离最小多少像素后，导致Swipe back操作触发</td>
</tr>
<tr>
<td>swipeBackPageActiveArea</td>
<td>number = 30</td>
<td>触发Swipe back操作的屏幕左侧边缘的宽度</td>
</tr>
<tr>
<td>swipeBackPageAnimateShadow</td>
<td>boolean = true</td>
<td>是否在Swipe back时启用阴影效果</td>
</tr>
<tr>
<td>swipeBackPageAnimateOpacity</td>
<td>boolean = true</td>
<td>是否在Swipe back时启用透明效果</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>可排序列表</em></td>
</tr>
<tr>
<td>sortable</td>
<td>boolean = true</td>
<td>如果不使用可排序列表（sortable lists ）特性，可以禁用以提升性能</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em> Swipeout</em></td>
</tr>
<tr>
<td>swipeout</td>
<td>boolean = true</td>
<td>如果不使用swipeout特性，可以禁用以提升性能</td>
</tr>
<tr>
<td>swipeoutNoFollow</td>
<td>boolean = false</td>
<td>用于老旧设备，可以提升性能</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>侧面板</em></td>
</tr>
<tr>
<td>swipePanel</td>
<td>string = false</td>
<td>
<p>可以设置为left（左侧）/right（右侧），默认禁用</p>
<p>启用后，可以通过swipe手势从左侧/右侧打开侧面板</p>
</td>
</tr>
<tr>
<td>swipePanelCloseOpposite</td>
<td>boolean = true</td>
<td>可以关闭对面的面板，即右面板之于左面板</td>
</tr>
<tr>
<td>swipePanelOnlyClose</td>
<td>boolean = false</td>
<td>仅允许通过swipe关闭面板，而不允许打开</td>
</tr>
<tr>
<td>swipePanelActiveArea</td>
<td>number = false</td>
<td>触发Swipe面板操作的屏幕左侧边缘的宽度</td>
</tr>
<tr>
<td>swipePanelNoFollow</td>
<td>boolean = false</td>
<td>用于老旧设备，可以提升性能</td>
</tr>
<tr>
<td>swipePanelThreshold</td>
<td>number = 0</td>
<td>滑动距离最小多少像素后，导致Swipe 面板操作触发</td>
</tr>
<tr>
<td>panelsCloseByOutside</td>
<td>boolean = true</td>
<td>是否允许在面板外部轻触，以关闭面板</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>模态窗口</em></td>
</tr>
<tr>
<td>modalTitle</td>
<td>string = 'Framework7'</td>
<td>模态窗口（Alert、Confirm、Prompt）的默认标题</td>
</tr>
<tr>
<td>modalButtonOk</td>
<td>string = 'OK'</td>
<td>OK按钮默认文本</td>
</tr>
<tr>
<td>modalButtonCancel</td>
<td>string = 'Cancel'</td>
<td>Cancel按钮默认文本</td>
</tr>
<tr>
<td>modalPreloaderTitle</td>
<td>string = 'Loading... '</td>
<td>正在加载的提示文本</td>
</tr>
<tr>
<td>modalCloseByOutside</td>
<td>boolean = false</td>
<td>是否允许在外部轻触以关闭模态窗口</td>
</tr>
<tr>
<td>actionsCloseByOutside</td>
<td>boolean = true</td>
<td>与上一选项类似， 但是用于Action Sheet modal</td>
</tr>
<tr>
<td>popupCloseByOutside</td>
<td>boolean = true</td>
<td>与上一选项类似， 但是用于Popup modal</td>
</tr>
<tr>
<td>modalTemplate</td>
<td>string = undefined</td>
<td>用于模态窗口的Template7模板</td>
</tr>
<tr>
<td>modalActionsTemplate</td>
<td>string  = undefined</td>
<td>用于Action Sheet模块窗口的Template7模板</td>
</tr>
<tr>
<td>modalActionsToPopoverTemplate</td>
<td>string</td>
<td>用于转换为Popover的Action Sheet的Template7模板</td>
</tr>
<tr>
<td>modalUsernamePlaceholder</td>
<td>string = 'Username'</td>
<td>用户名输入框的占位符</td>
</tr>
<tr>
<td>modalPasswordPlaceholder</td>
<td>string = 'Password'</td>
<td>密码输入框的占位符</td>
</tr>
<tr>
<td>modalStack</td>
<td>boolean = true</td>
<td>禁止同时打开多个模态窗口，如果多个模态窗口被触发，那么最顶层的被关闭后，下层模态窗口才打开</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>Smart Select</em></td>
</tr>
<tr>
<td>smartSelectOpenIn</td>
<td>string = 'page'</td>
<td>智能选择如何被打开<br />可选值page、popup、picker</td>
</tr>
<tr>
<td>smartSelectBackTemplate</td>
<td>string =<br />
<pre class="crayon-plain-tag">&lt;div class="left sliding"&gt;
  &lt;a href="#" class="back link"&gt;
    &lt;i class="icon icon-back"&gt;&lt;/i&gt;
    &lt;span&gt;{{backText}}&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;</pre>
</td>
<td>智能选择页面后退按钮的HTML模板</td>
</tr>
<tr>
<td>smartSelectPopupCloseTemplate</td>
<td>string = <br />
<pre class="crayon-plain-tag">&lt;div class="left"&gt;
  &lt;a href="#" class="link close-popup"&gt;
    &lt;i class="icon icon-back"&gt;&lt;/i&gt;
    &lt;span&gt;{{closeText}}&lt;/span&gt;
  &lt;/a&gt;
&lt;/div&gt;</pre>
</td>
<td>智能选择弹框关闭按钮的HTML模板</td>
</tr>
<tr>
<td>smartSelectBackText</td>
<td>string = 'Back'</td>
<td>后退按钮文本</td>
</tr>
<tr>
<td>smartSelectPopupCloseText</td>
<td>string = 'Close'</td>
<td>关闭按钮文本</td>
</tr>
<tr>
<td>smartSelectPickerCloseText</td>
<td>string = 'Done'</td>
<td>完毕按钮文本</td>
</tr>
<tr>
<td>smartSelectSearchbar</td>
<td>boolean = false</td>
<td>是否启用智能选择的搜索功能</td>
</tr>
<tr>
<td>smartSelectBackOnSelect</td>
<td>boolean = false</td>
<td>如果启用，当用户选择任意一项后，智能选择页面自动关闭</td>
</tr>
<tr>
<td>smartSelectFormTheme</td>
<td>string = undefined</td>
<td>智能选择页面/弹框的表单元素使用的颜色主题代码</td>
</tr>
<tr>
<td>smartSelectNavbarTheme</td>
<td>string = undefined</td>
<td>智能选择页面/弹框的导航栏使用的颜色主题代码</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>导航栏和工具栏</em></td>
</tr>
<tr>
<td>hideNavbarOnPageScroll</td>
<td>boolean = false</td>
<td>如果设置为true，导航栏在页面下滚时自动隐藏，上滚时自动显示</td>
</tr>
<tr>
<td>hideToolbarOnPageScroll</td>
<td>boolean = false</td>
<td>如果设置为true，工具栏在页面下滚时自动隐藏，上滚时自动显示</td>
</tr>
<tr>
<td>hideTabbarOnPageScroll</td>
<td>boolean = false</td>
<td>如果设置为true，页签栏（Tabbar）在页面下滚时自动隐藏，上滚时自动显示<br />仅针对基于Tab Bar的页面布局</td>
</tr>
<tr>
<td>showBarsOnPageScrollEnd</td>
<td>boolean = true</td>
<td>当滚动到页面底部时，自动显示导航、工具栏</td>
</tr>
<tr>
<td>showBarsOnPageScrollTop</td>
<td>boolean = true</td>
<td>当滚动到页面顶部时，自动显示导航、工具栏</td>
</tr>
<tr>
<td>scrollTopOnNavbarClick</td>
<td>boolean = false</td>
<td>如果设置为true，点击导航栏中的'center'元素，自动滚动当前活动页面到最顶部</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>图片延迟加载</em></td>
</tr>
<tr>
<td>imagesLazyLoadThreshold</td>
<td>number  = 0</td>
<td>默认的，图片只有显示在当前屏幕上时，才加载<br />修改此参数，则图片距离屏幕还剩N像素时就加载</td>
</tr>
<tr>
<td>imagesLazyLoadSequential</td>
<td>boolean = true</td>
<td>如果启用，图片会顺序的一个个加载</td>
</tr>
<tr>
<td>imagesLazyLoadPlaceholder</td>
<td>string</td>
<td>正在加载的图片的占位符，默认是一个1像素的图片</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>通知</em></td>
</tr>
<tr>
<td>notificationTitle</td>
<td>string = undefined</td>
<td>仅iOS，所有通知的默认标题</td>
</tr>
<tr>
<td>notificationSubtitle</td>
<td>string = undefined</td>
<td>仅iOS，所有通知的默认子标题</td>
</tr>
<tr>
<td>notificationMedia</td>
<td>string = undefined</td>
<td>仅iOS，所有通知的默认媒体（图标或者图片）</td>
</tr>
<tr>
<td>notificationHold</td>
<td>number = undefined</td>
<td>所有通知默认持续的毫秒数</td>
</tr>
<tr>
<td>notificationCloseOnClick</td>
<td>boolean = false</td>
<td>设置为true，则点击通知关闭之</td>
</tr>
<tr>
<td>notificationCloseIcon</td>
<td>boolean = true</td>
<td>仅iOS，设置为true默认显示关闭按钮</td>
</tr>
<tr>
<td>notificationCloseButtonText</td>
<td>string = 'Close'</td>
<td>仅Material，关闭按钮的默认文本</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>状态栏（仅iOS主题）</em></td>
</tr>
<tr>
<td>statusbarOverlay</td>
<td>boolean = undefined</td>
<td>自动检测全屏模式并处理状态栏overlay，在顶部添加额外的像素以改善UI效果</td>
</tr>
<tr>
<td>scrollTopOnStatusbarClick</td>
<td>boolean = false</td>
<td>如果设置为true，在状态栏上点击后，当前活动页面滚动到顶部</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>Template7</em></td>
</tr>
<tr>
<td>template7Pages</td>
<td>boolean = false</td>
<td>设置为true，使用Template7来渲染Ajax和动态页面</td>
</tr>
<tr>
<td>template7Data</td>
<td>object = {}</td>
<td>用于渲染Template7模板的数据</td>
</tr>
<tr>
<td>precompileTemplates</td>
<td>boolean = false</td>
<td>启用后，F7预编译所有Template7模板</td>
</tr>
<tr>
<td><em>templates</em></td>
<td>object = {}</td>
<td>所有预编译的模板，可以通过该属性访问</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>页面回调</em></td>
</tr>
<tr>
<td>onPageBeforeInit</td>
<td rowspan="7">
<p>function(app, page);</p>
<p>其中：</p>
<ol>
<li>app为当前F7应用对象</li>
<li>page为操作的页面数据对象</li>
</ol>
<p>这些参数与对应的<a href="#page-callback">页面回调</a>具有类似的功能</p>
</td>
<td>当F7插入新的页面到DOM中后，该回调被执行<br />该回调和pageBeforeInit事件具有一样的效果</td>
</tr>
<tr>
<td>onPageInit</td>
<td>当F7初始化被请求页面的组件和导航栏时，该回调被执行<br />该回调和pageInit事件具有一样的效果</td>
</tr>
<tr>
<td>onPageBeforeAnimation</td>
<td>当页面被初始化完毕，准备执行页面/导航栏动画时，该回调被执行<br />该回调和pageBeforeAnimation事件具有一样的效果</td>
</tr>
<tr>
<td>onPageAfterAnimation</td>
<td>当页面/导航栏动画执行完毕后，该回调被执行<br />该回调和pageAfterAnimation事件具有一样的效果</td>
</tr>
<tr>
<td>onPageBeforeRemove</td>
<td>当页面即将从DOM中移除时，该回调被执行<br />该回调和pageBeforeRemove事件具有一样的效果</td>
</tr>
<tr>
<td>onPageBack</td>
<td>在back转换之前，执行该回调，与onPageBeforeAnimation针对new页面不同，该回调是针对old页面（即将被切换掉的页面）<br />该回调和pageBack事件具有一样的效果</td>
</tr>
<tr>
<td>onPageAfterBack</td>
<td>在back转换之后，执行该回调，该回调同样针对old页面，而onPageAfterAnimation针对新页面<br />该回调和pageAfterBack事件具有一样的效果</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>Ajax回调</em></td>
</tr>
<tr>
<td>onAjaxStart</td>
<td rowspan="2">function(xhr);</td>
<td>在Ajax请求开始前执行的回调，以XHR数据作为参数</td>
</tr>
<tr>
<td>onAjaxComplete</td>
<td>在Ajax请求完毕后执行的回调，以XHR数据作为参数</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>Namespace</em></td>
</tr>
<tr>
<td>viewClass</td>
<td>string =  'view'</td>
<td>视图元素（View element）的CSS类名</td>
</tr>
<tr>
<td>viewMainClass</td>
<td>string = 'view-main'</td>
<td>主视图元素的CSS类名</td>
</tr>
<tr>
<td>viewsClass</td>
<td>string = 'views'</td>
<td>所有视图元素（Views element）的CSS类名</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>初始化</em></td>
</tr>
<tr>
<td>init</td>
<td>boolean = true</td>
<td>如果设置为false，则必须调用Framework7的<pre class="crayon-plain-tag">init()</pre> 方法手工初始化F7</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">preprocess：使用模板引擎</span></div>
<p>通过设置preprocess，我们可以使用任何客户端模板引擎来解析模板、生成DOM。例如：</p>
<pre class="crayon-plain-tag">var app = new Framework7( {
    preprocess : function( content, url, next ) {
        if ( url === 'user.html' ) {
            // 编译模板
            var template = Template7.compile( content );
            // 链接模板为DOM
            var resultContent = template( {
                title : 'User',
                user : [ 'Alex', 'Meng', 'Cai' ]
            } );
            return resultContent;
        }
    }
} );</pre>
<p>可以解析Template7模板：</p>
<pre class="crayon-plain-tag">&lt;div class="navbar"&gt;
  &lt;div class="navbar-inner"&gt;
    &lt;div class="center"&gt;{{title}}&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="pages"&gt;
  &lt;div data-page="user" class="user"&gt;
    &lt;div class="user-content"&gt;
      &lt;ul&gt;
        {{#each user}}
        &lt;li&gt;{{this}}&lt;/li&gt;
        {{/each}}
      &lt;/ul&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</pre>
<p> 为preprocess指定第四个参数next，可以异步的返回链接后的DOM：</p>
<pre class="crayon-plain-tag">var app = new Framework7( {
    preprocess : function( content, url, next ) {
        if ( url === 'user.html' ) {
            // 通过XHR加载用户的JSON数据，用以填充模板
            $$.get( 'user.json', function( data ) {
                // 编译
                var template = Template7.compile( content );
                // 链接
                var resultContent = template( data );
                // 把结果传递给next
                next( resultContent );
            } );
            // 使用next，则不需要返回任何值
        }
    }
} );</pre>
<div class="blog_h3"><span class="graybg">preroute：路由拦截 </span></div>
<p>使用该参数可以阻止F7路由机制的默认行为， 从而加载其他页面、重定向或者执行其他动作。例如当未登录用户请求某个页面时，自动切换到登录页面：</p>
<pre class="crayon-plain-tag">var app = new Framework7( {
    preroute : function( view, options ) {
        if ( !userLoggedIn ) {
            //加载其它页面
            view.router.loadPage( 'auth.html' ); 
            return false; // 返回false则阻止默认路由行为
        }
    }
} );</pre>
<div class="blog_h2"><span class="graybg">视图</span></div>
<p>在F7中，元素<pre class="crayon-plain-tag">&lt;div class="views"&gt;</pre> 是所有可视化视图（visual view，除了面板、模态窗口之外的视图）的容器，一个F7应用只能有一个views元素。<pre class="crayon-plain-tag">app.views</pre> 属性指向所有视图实例的数组。</p>
<p>元素<pre class="crayon-plain-tag">&lt;div class="view"&gt;</pre> 则代表了一个独立的<span style="background-color: #c0c0c0;">视图，可以拥有自己的设置、导航和历史</span>，每个视图可以具有自己的<span style="background-color: #c0c0c0;">导航栏/工具栏布局</span>以及不同的<span style="background-color: #c0c0c0;">样式</span>。</p>
<p>下面是视图的HTML结构示例：</p>
<pre class="crayon-plain-tag">&lt;body&gt;
    &lt;!-- 面板视图不包括在views内 --&gt;
    &lt;div class="panel panel-left panel-cover"&gt;
        &lt;div class="view panel-view"&gt;...&lt;/div&gt;
    &lt;/div&gt;
    &lt;!-- 所有可视化视图，必须作为子元素，这便于我们整个的移动应用——例如打开侧面板时 --&gt;
    &lt;div class="views"&gt;
        &lt;!-- view-main为主视图 --&gt;
        &lt;div class="view view-main"&gt;
            &lt;!-- 每个视图可以具有自己的导航栏页面、工具栏 --&gt;
            &lt;!-- Navbar--&gt;
            &lt;!-- Pages --&gt;
            &lt;!-- Toolbar--&gt;
        &lt;/div&gt;
        &lt;!-- 另外一个视图 --&gt;
        &lt;div class="view another-view"&gt;
            &lt;!-- Navbar--&gt;
            &lt;!-- Pages --&gt;
            &lt;!-- Toolbar--&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;!-- 弹窗、模态窗口不包括在views内 --&gt;
    &lt;div class="popup"&gt;
        &lt;div class="view popup-view"&gt;...&lt;/div&gt;
    &lt;/div&gt;
&lt;/body&gt;</pre>
<div class="blog_h3"><span class="graybg">主视图</span></div>
<p>主视图由样式类<pre class="crayon-plain-tag">view-main</pre>  声明，主视图的作用是：</p>
<ol>
<li>默认的，所有链接均在主视图中加载页面</li>
<li>PushState哈希导航仅支持主视图</li>
</ol>
<div class="blog_h3"><span class="graybg">视图初始化</span></div>
<p>可以使用如下方法添加新的视图：</p>
<pre class="crayon-plain-tag">/**
 * @param container  HTML元素或者CSS选择器，视图的容器元素
 * @param parameters 视图的初始化参数
 */
app.addView(container, parameters); //返回一个视图对象</pre>
<div class="blog_h3"><span class="graybg">视图初始化参数详解</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">参数<em>/属性</em></td>
<td style="text-align: center;">类型和默认值</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>dynamicNavbar</td>
<td>boolean = false</td>
<td>仅iOS主题。为视图启用动态导航栏</td>
</tr>
<tr>
<td>url</td>
<td>string = undefined</td>
<td>默认（初始）视图的URL，如果不设置，等同于document的URL</td>
</tr>
<tr>
<td>domCache</td>
<td>boolean = false</td>
<td>设置为true启用内联页面，这样先前访问的页面均保存在导航链中，不从DOM中移除</td>
</tr>
<tr>
<td>linksView</td>
<td>string / View instance = undefined</td>
<td>另外一个视图的CSS选择器，或者已经初始化的View实例，默认的，所有链接在此视图中加载页面<br />该参数可以在运行时动态改变</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>导航</em></td>
</tr>
<tr>
<td>uniqueHistory</td>
<td>boolean</td>
<td rowspan="5">
<p>覆盖相应的应用初始化参数</p>
<p>&nbsp;</p>
</td>
</tr>
<tr>
<td>uniqueHistoryIgnoreGetParameters</td>
<td>boolean = false</td>
</tr>
<tr>
<td>allowDuplicateUrls</td>
<td>boolean</td>
</tr>
<tr>
<td>animatePages</td>
<td>boolean</td>
</tr>
<tr>
<td>preloadPreviousPage</td>
<td>boolean</td>
</tr>
<tr>
<td>reloadPages</td>
<td>boolean = false</td>
<td>如果启用，视图总是重新载入当前的活动页 </td>
</tr>
<tr>
<td>preroute</td>
<td>function(view, options) </td>
<td rowspan="2">覆盖相应的应用初始化参数</td>
</tr>
<tr>
<td>preprocess</td>
<td>function(content, url, next)</td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>  Swipe back（仅iOS主题）<br />覆盖相应的应用初始化参数</em></td>
</tr>
<tr>
<td style="text-align: center;" colspan="3"><em>回调（仅iOS主题）   </em></td>
</tr>
<tr>
<td>onSwipeBackMove </td>
<td>function(callbackData)</td>
<td rowspan="5">执行Swipe back操作时，在各阶段执行这些回调，回调入参callbackData为一对象，包含以下属性：
<ol>
<li><span style="color: #333333; font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: small;"><span style="line-height: 22px;">percentage 移动的百分比</span></span></li>
<li>activePage 当前活动页对应的HTML元素</li>
<li>previousPage 先前（左边）页面对应的HTML元素</li>
<li>activeNavbar 当前导航栏对应的元素</li>
<li>previousNavbar 先前导航栏对应的元素</li>
</ol>
<p>    </p>
</td>
</tr>
<tr>
<td>onSwipeBackBeforeChange</td>
<td>function(callbackData)</td>
</tr>
<tr>
<td>onSwipeBackAfterChange </td>
<td>function(callbackData)</td>
</tr>
<tr>
<td>onSwipeBackBeforeReset</td>
<td>function(callbackData) </td>
</tr>
<tr>
<td>onSwipeBackAfterReset </td>
<td>function(callbackData)</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">视图的属性、方法和事件</span></div>
<table class=" fixed-word-wrap full-width">
<thead>
<tr>
<td style="width: 28%; text-align: center;">属性/方法/事件</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>params</td>
<td>返回视图初始化参数对象，你可以重写某些参数：<br />
<pre class="crayon-plain-tag">mainView.params.linksView = '.another-view'</pre>
</td>
</tr>
<tr>
<td>history</td>
<td>返回视图历史记录的数组，数组的每个元素是已加载页面的URL</td>
</tr>
<tr>
<td>contentCache</td>
<td>返回缓存的页面，仅在使用动态生成的内容时，该属性有效</td>
</tr>
<tr>
<td>url</td>
<td>返回当前活动页面的URL</td>
</tr>
<tr>
<td>pagesContainer</td>
<td>返回作为页面容器的HTML元素</td>
</tr>
<tr>
<td>activePage</td>
<td>返回当前页面数据（Page data）对象，该对象代表了当前活动页面</td>
</tr>
<tr>
<td>main</td>
<td>如果当前视图是主视图，返回true</td>
</tr>
<tr>
<td>router</td>
<td>返回该视图的路由对象</td>
</tr>
<tr>
<td>hideNavbar()</td>
<td rowspan="2">隐藏或显示导航栏</td>
</tr>
<tr>
<td>showNavbar()</td>
</tr>
<tr>
<td>hideToolbar()</td>
<td rowspan="2">隐藏或显示工具栏</td>
</tr>
<tr>
<td>showToolbar()</td>
</tr>
<tr>
<td>destroy()</td>
<td>销毁已初始化的视图，解除swipe事件监听器，并禁用导航</td>
</tr>
<tr>
<td>⚡swipeBackMove</td>
<td rowspan="5">与上面的几个回调对应</td>
</tr>
<tr>
<td>⚡swipeBackBeforeChange</td>
</tr>
<tr>
<td>⚡swipeBackAfterChange</td>
</tr>
<tr>
<td>⚡swipeBackBeforeReset</td>
</tr>
<tr>
<td>⚡swipeBackAfterReset</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">视图默认URL</span></div>
<p>除了使用初始化参数url，你还可以在视图元素上设置data-url属性，来指定默认URL：</p>
<pre class="crayon-plain-tag">&lt;div class="view" data-url="index2.html"&gt;</pre>
<div class="blog_h3"><span class="graybg">得到当前视图</span></div>
<p>除了主视图外，我们还可能在popup、popover、面板、Tab中定义视图。某些情况下我们需要得到“当前的”视图——即位于<span style="background-color: #c0c0c0;">界面最顶层</span>的视图，这是可以调用：</p>
<pre class="crayon-plain-tag">app.getCurrentView(index)</pre>
<p>如果当前有<span style="background-color: #c0c0c0;">多个活动视图</span> ，例如使用拆分视图布局（Split View layout）时，可以传入index来指明需要返回哪个视图。该函数返回<span style="background-color: #c0c0c0;">视图实例，或者视图的数组</span>。</p>
<div class="blog_h3"><span class="graybg">从DOM访问视图实例</span></div>
<p>F7为<pre class="crayon-plain-tag">&lt;div class="view"&gt;</pre> 元素添加了特殊的属性<pre class="crayon-plain-tag">f7View</pre> ，它指向元素关联的视图实例：</p>
<pre class="crayon-plain-tag">var viewsElement = $$('.view-main')[0];
var viewInstance = viewsElement.f7View;</pre>
<p>使用app.views属性，可以遍历所有视图：</p>
<pre class="crayon-plain-tag">for (var i = 0; i &lt; app.views.length; i ++) {
    var view = app.views[i];
    if (view.main) app.alert('I found main View!')
}</pre>
<div class="blog_h2"><span class="graybg">页面</span></div>
<p>在F7中，页面的概念和传统的Web page类似。下面的代码示意了页面在F7布局里面的位置：</p>
<pre class="crayon-plain-tag">&lt;div class="views"&gt;
    &lt;div class="view view-main"&gt;
        &lt;!-- 所有页面的容器元素 --&gt;
        &lt;div class="pages"&gt;
            &lt;div class="page" data-page="home"&gt;&lt;!-- 页面唯一名称 --&gt;
                &lt;div class="page-content"&gt;页面内容，包括所有F7组件，必须声明在这里&lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<p><span style="background-color: #c0c0c0;">页面必然属于某个视图</span>，页面可以<span style="background-color: #c0c0c0;">静态的编写在主布局文件（内联）</span>中，也可以<span style="background-color: #c0c0c0;">动态的从模板中加载</span>进来，甚至通过API<span style="background-color: #c0c0c0;">动态创建</span>。</p>
<p>和视图类似，在主布局文件（index.html）中，所有<span style="background-color: #c0c0c0;">页面必须在容器</span><pre class="crayon-plain-tag">&lt;div class="pages"&gt;</pre> 里面声明，以确保页面能够正常切换。</p>
<p><pre class="crayon-plain-tag">data-page</pre> 属性指定了页面的唯一名称，该属性在页面回调（page callbacks）中非常有用，有助于鉴别哪个页面被加载。</p>
<p>所有<span style="background-color: #c0c0c0;">F7视觉组件</span>——例如列表、表单——<span style="background-color: #c0c0c0;">必须存放在</span><pre class="crayon-plain-tag">&lt;div class="page-content"&gt;</pre> 元素下，只有这样F7才能正确的确定布局、绘制样式和滚动视图。</p>
<div class="blog_h3"><span class="graybg">页面事件</span></div>
<p>页面导航的关键部分是页面事件，通过页面事件我们可以<span style="background-color: #c0c0c0;">操控刚刚加载的页面</span>，例如执行JS代码。页面事件的Target（事件源）均为<pre class="crayon-plain-tag">&lt;div class="page"&gt;</pre> 元素，可用的事件如下：</p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">事件</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>pageBeforeInit</td>
<td>当F7把新页面插入到DOM时触发该事件</td>
</tr>
<tr>
<td>pageInit</td>
<td>当F7初始化了新页面中的组件和导航栏后触发该事件</td>
</tr>
<tr>
<td>pageReinit</td>
<td>当缓存的页面再次可见时触发该事件，仅适用于内联页面（ Inline Pages，即DOM cached pages）</td>
</tr>
<tr>
<td>pageBeforeAnimation</td>
<td>当页面初始化完毕后，准备执行动画时，触发该事件</td>
</tr>
<tr>
<td>pageAfterAnimation</td>
<td>当页面动画执行完毕后，触发该事件</td>
</tr>
<tr>
<td>pageBeforeRemove</td>
<td>在页面从DOM中移除时，触发该事件<br />监听该事件，以便移除相关的事件处理函数、插件</td>
</tr>
<tr>
<td>pageBack</td>
<td>与pageBeforeAnimation类似，但是针对old页面——从屏幕中间向右滑出的那个</td>
</tr>
<tr>
<td>pageAfterBack</td>
<td>与pageAfterAnimation类似，但是针对old页面</td>
</tr>
</tbody>
</table>
<p>下面是注册页面事件处理函数的例子：</p>
<pre class="crayon-plain-tag">// 针对所有页面，推荐方式
$$( document ).on( 'pageInit', function( e ) {

} );
// 针对特定页面
$$( document ).on( 'pageInit', '.page[data-page="about"]', function( e ) {
} );</pre>
<div class="blog_h3"><span class="graybg"><a id="page-callback"></a>页面回调</span></div>
<p>除了通过应用初始化参数指定全局性页面回调以外，还可以调用Framework7对象的<span style="background-color: #c0c0c0;">相应方法</span>，来<span style="background-color: #c0c0c0;">针对特定页面回调</span>：</p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 30%; text-align: center;">回调</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>app.onPageBeforeInit</td>
<td rowspan="8">这些函数的签名均为：<br />
<pre class="crayon-plain-tag">function(pageName, callback(page));</pre></p>
<p>其中：</p>
<ol>
<li>pageName：该回调针对的<span style="background-color: #c0c0c0;">页面的名称</span>，可以用<span style="background-color: #c0c0c0;">空格分隔多个页面</span>。如果指定<span style="background-color: #c0c0c0;">*则针对所有页面</span></li>
<li>callback(page)：回调函数，入参是页面数据对象，返回值是一个callbackObject对象</li>
</ol>
<p>callbackObject对象具有以下方法：</p>
<ol>
<li><pre class="crayon-plain-tag">trigger()</pre> 手工触发回调函数</li>
<li><pre class="crayon-plain-tag">remove()</pre> 移除回调函数</li>
</ol>
<p>&nbsp;</p>
</td>
</tr>
<tr>
<td>app.onPageInit</td>
</tr>
<tr>
<td>app.onPageReinit</td>
</tr>
<tr>
<td>app.onPageBeforeAnimation</td>
</tr>
<tr>
<td>app.onPageAfterAnimation</td>
</tr>
<tr>
<td>app.onPageBeforeRemove</td>
</tr>
<tr>
<td>app.onPageBack</td>
</tr>
<tr>
<td>app.onPageAfterBack</td>
</tr>
</tbody>
</table>
<p>如果要<span style="background-color: #c0c0c0;">针对特定页面</span>执行逻辑，页面回调是非常好的选择。页面回调比起页面事件有如下<span style="background-color: #c0c0c0;">优势</span>：</p>
<ol>
<li>回调不是事件，意味着更少的内存使用、更低几率的内存泄漏。同样，你不需要考虑何时解除注册</li>
<li>代码结构角度来看，更加便利</li>
</ol>
<div class="blog_h3"><span class="graybg">针对初始页面（Inital Pages）的回调</span></div>
<p>有时我们需要对<span style="background-color: #c0c0c0;">初始页面</span>——即内联在index.html中的页面——进行回调，这些页面已经<span style="background-color: #c0c0c0;">随着应用的初始化而初始化</span>，后续注册的回调无法拦截。这时，我们可以手工初始化应用， 并在之前注册回调：</p>
<pre class="crayon-plain-tag">var app = new Framework7({
  init: false // 禁止自动初始化
});          
 
// 注册回调
myApp.onPageInit('home', function (page) {
});
 
myApp.init(); //手工初始化应用</pre>
<div class="blog_h3"><span class="graybg">页面数据</span></div>
<p> 在页面回调（包括应用初始化参数）、页面事件中，可以访问所谓“页面数据（Page data）”对象，该对象包含页面的相关信息：</p>
<pre class="crayon-plain-tag">//从回调中访问页面数据
app.onPageInit('about', function (page) {
});
 
// 从事件处理函数中访问页面数据
$$(document).on('pageInit', function (e) {
  var page = e.detail.page;
});</pre>
<p>页面数据对象包含以下属性：</p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 25%; text-align: center;">属性</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>name</td>
<td>string ，页面名称，对应页面元素的data-page属性</td>
</tr>
<tr>
<td>url</td>
<td>string ，页面的URL</td>
</tr>
<tr>
<td>query</td>
<td>object ， 页面URL的查询参数部分转换为的对象，例如<pre class="crayon-plain-tag">index.html?id=10&amp;count=20&amp;color=blue</pre> 会转换为：<br />
<pre class="crayon-plain-tag">{
    id: '10',
    count: '20',
    color: 'blue'
}</pre>
</td>
</tr>
<tr>
<td>view</td>
<td>object ， 该页面所属的视图实例</td>
</tr>
<tr>
<td>container</td>
<td>HTMLElement，页面对应的HTML元素</td>
</tr>
<tr>
<td>from</td>
<td>string，页面“来自的方向”，对于新加载的页面，该属性值为“right”；对于通过Back按钮加载的历史页面，该属性值为“left”</td>
</tr>
<tr>
<td>navbarInnerContainer</td>
<td>HTMLElement，与此页面相关的navbar-inner元素，仅用于动态导航栏（Dynamic Navbars）</td>
</tr>
<tr>
<td>swipeBack</td>
<td>boolean，如果为真，则表示动画由Swipe back触发。仅适用于onPageBefore/AfterAnimation回调和事件</td>
</tr>
<tr>
<td>context</td>
<td>object，当使用Template7模板时，传递给当前页面的Template7上下文对象</td>
</tr>
<tr>
<td>fromPage</td>
<td>上一个活动页的页面数据对象 </td>
</tr>
</tbody>
</table>
<div class="blog_h1"><span class="graybg"><a id="navigation"></a>导航/路由</span></div>
<p>F7的页面导航（Navigation ）功能相当灵活，你可以通过多种方式处理页面：</p>
<ol>
<li>Ajax页面（Ajax Pages）：从其它文件中加载页面，这是<span style="background-color: #c0c0c0;">默认行为</span></li>
<li>动态页面（Dynamic Pages）：可以使用JavaScript API动态的创建并加载页面</li>
<li>内联页面（Inline Pages）：页面的内容可以直接编写在当前HTML里面，不需要额外的加载行为</li>
<li><a href="/framework7-study-note-3#template7-pages">Template7页面</a>：可以通过Template7模板加载页面。注意这并不是一种独立的页面类型，只是基于T7模板来解析Ajax页面和动态页面</li>
<li>以上方式可以混合使用</li>
</ol>
<p>前面我们提到，F7中的视图是应用中独立的可视化部分，可以具有自己的导航和历史。<span style="background-color: #c0c0c0;">导航路由器</span>（Navigation router）连接到特定视图，<span style="background-color: #c0c0c0;">作为视图的一部分</span>，负责页面路由、导航工作。</p>
<div class="blog_h2"><span class="graybg">视图导航API</span></div>
<div class="blog_h3"><span class="graybg"><a id="nav-methods"></a>导航方法</span></div>
<p>F7主要提供了两个方法，用于执行路由：</p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 28%; text-align: center;">方法</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>view.router.load(options)</td>
<td>加载请求的页面到视图中，同时触发动画效果</td>
</tr>
<tr>
<td>view.router.back(options)</td>
<td>返回导航历史中的上一个页面，同时触发动画效果</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg"><a id="nav-params"></a>导航参数</span></div>
<p>上面两个方法的options参数是一个配置对象，支持以下配置参数：</p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 18%; text-align: center;">参数</td>
<td style="width: 25%; text-align: center;">类型</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>url</td>
<td>string</td>
<td>目标页面的URL</td>
</tr>
<tr>
<td>content</td>
<td>string/HTMLElement/<br />jQuery Collection/<br />DOM7 Collection/<br />HTMLElement[]</td>
<td>路由到动态页面：动态页面的内容 </td>
</tr>
<tr>
<td>pageName</td>
<td>string</td>
<td>路由到内联页面：内联页面的名称，即data-page属性的值 </td>
</tr>
<tr>
<td>template</td>
<td>function(Template7已编译模板)</td>
<td>路由到动态页面：需要被链接并加载的Template7模板 </td>
</tr>
<tr>
<td colspan="3"><em>注：以上4个参数必须<span style="background-color: #c0c0c0;">互斥</span>的使用</em></td>
</tr>
<tr>
<td>context</td>
<td>object/array</td>
<td>Template7模板需要链接到的上下文对象</td>
</tr>
<tr>
<td>contextName</td>
<td>string</td>
<td> Template7模板需要链接到的上下文对象，为template7Data中的某个简单数据对象，或者其子对象（点号导航）</td>
</tr>
<tr>
<td>query</td>
<td>object</td>
<td>额外的查询参数，这些参数以后可以通过页面数据的query属性取回</td>
</tr>
<tr>
<td>force</td>
<td>boolean</td>
<td>仅用于back()方法，设置为true会忽视既有的历史记录，强制重新加载页面<br />默认的，当前页来自的那个页面会驻留在DOM中，不消除，因此重新不加载也可以显示之</td>
</tr>
<tr>
<td>ignoreCache</td>
<td>boolean</td>
<td>如果设置为true，忽略已经缓存的URL，通过XHR强制加载 </td>
</tr>
<tr>
<td>animatePages</td>
<td>boolean</td>
<td>覆盖对应的视图初始化参数 </td>
</tr>
<tr>
<td>reload</td>
<td>boolean</td>
<td>如果设置为true，不会把目标页面加载为新页面，而是仅仅替换掉<span style="background-color: #c0c0c0;">当前页面</span>，并替换<span style="background-color: #c0c0c0;">视图历史</span>中最新条目</td>
</tr>
<tr>
<td>reloadPrevious</td>
<td>boolean</td>
<td>与reload类似，但是替换视图历史中上一个页面</td>
</tr>
<tr>
<td>pushState</td>
<td>boolean</td>
<td>是否把加载的页面压入记录到浏览器的历史中 ，用于哈希导航</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg"><a id="nav-shortcuts"></a>导航快捷方法</span></div>
<p>除了load/back以外，F7还提供了一系列的快捷方法：</p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 35%; text-align: center;">快捷方法</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;" colspan="2"><em>加载新页面的快捷方法</em></td>
</tr>
<tr>
<td>view.router.loadPage(url)</td>
<td>从指定URL加载页面到视图，在<pre class="crayon-plain-tag">&lt;a&gt;</pre> 元素上点击通常具有一样的效果</td>
</tr>
<tr>
<td>view.loadContent(content)</td>
<td>加载动态页面，content为新的页面的内容，可以是string、HTMLElement、HTMLElement[]、jQuery/Dom7元素集合</td>
</tr>
<tr>
<td style="text-align: center;" colspan="2">重新载入当前页面的快捷方法</td>
</tr>
<tr>
<td>view.router.reloadPage(url)</td>
<td rowspan="2">
<p>与上面两个快捷方法类似，但是替换掉当前页面（同时修改视图的历史记录），而不是加入新页面</p>
</td>
</tr>
<tr>
<td>view.router.reloadContent(content)</td>
</tr>
<tr>
<td style="text-align: center;" colspan="2">重新载入上一个页面（如果视图的DOM中存在两个页面）的快捷方法</td>
</tr>
<tr>
<td>view.router.reloadPreviousPage(url)</td>
<td rowspan="2">与上面两个快捷方法类似，但是替换的是上一个页面</td>
</tr>
<tr>
<td>view.router.reloadPreviousPage(url)</td>
</tr>
<tr>
<td style="text-align: center;" colspan="2">刷新页面的快捷方法</td>
</tr>
<tr>
<td>view.router.refreshPage()</td>
<td rowspan="2">相当于使用与当前页面相同的URL执行reload操作</td>
</tr>
<tr>
<td>view.router.refreshPreviousPage()</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">Ajax页面</span></div>
<p>默认的，Framework7会<span style="background-color: #c0c0c0;">使用XHR加载所有链接</span>，除非链接元素上标记样式类：<pre class="crayon-plain-tag">&lt;a class="external"&gt;</pre> ，或者<span style="background-color: #c0c0c0;">链接的href为空或者#</span>。应用初始化参数ajaxLinks可以改变此默认行为。因此，点击一个链接元素后，通常F7会：</p>
<ol>
<li>发送XHR请求到目标页面</li>
<li>解析目标页面</li>
<li>插入到目标页面到当前DOM中</li>
<li>执行动画以切换（transition）到新页面</li>
</ol>
<div class="blog_h3"><span class="graybg">单页面的结构</span></div>
<p>F7的页面解析器很智能，因此供内部使用的页面<span style="background-color: #c0c0c0;">不需要是完整的HTML</span>（可以不包含html、head、body）、也<span style="background-color: #c0c0c0;">不需要包含完整的F7布局</span>（不需要views、pages等）。考虑下面的页面：</p>
<pre class="crayon-plain-tag">&lt;div class="page" data-page="about"&gt;
    Content
&lt;/div&gt;</pre>
<p>F7的页面解析器<span style="background-color: #c0c0c0;">仅仅尝试</span>找到XHR加载得到的HTML中的<pre class="crayon-plain-tag">&lt;div class="page"&gt;</pre> 元素，并将其解析为页面。</p>
<div class="blog_h3"><span class="graybg">多页面的结构</span></div>
<p>F7允许<span style="background-color: #c0c0c0;">多个视图加载同一个URL，却显示不同的内容</span>。考虑下面的布局：</p>
<pre class="crayon-plain-tag">&lt;div class="views"&gt;
    &lt;!-- 左视图 --&gt;
    &lt;div class="view view-main left-view"&gt;
        &lt;a href="about.html"&gt; About &lt;/a&gt;
    &lt;/div&gt;
    &lt;!-- 右视图 --&gt;
    &lt;div class="view right-view"&gt;
        &lt;a href="about.html"&gt; About &lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<p> 左右两个视图都包含执行about.html链接。about.html则可以针对不同视图提供差异化内容：</p>
<pre class="crayon-plain-tag">&lt;div class="view view-main left-view"&gt;
    &lt;div class="page" data-page="about-right"&gt;左视图显示的内容&lt;/div&gt;
&lt;/div&gt;
&lt;div class="view right-view"&gt;
    &lt;div class="page" data-page="about-right"&gt;右视图显示的内容&lt;/div&gt;
&lt;/div&gt;</pre>
<p>这里的关键之处是，你需要使用view元素包裹page元素。view元素的<span style="background-color: #c0c0c0;">CSS样式类必须和页面对应的视图一致</span>。 </p>
<div class="blog_h3"><span class="graybg">动态导航栏页面的结构</span></div>
<p>本节内容仅适用于iOS主题。</p>
<p>动态导航栏元素是独立在页面元素之外的，如果你需要在新页面中指定导航栏内容，可以：</p>
<pre class="crayon-plain-tag">&lt;div class="navbar"&gt;导航栏内容&lt;/div&gt;
&lt;div class="page" data-page="about"&gt;页面内容&lt;/div&gt;</pre>
<p>在使用多页面时，可以把上面两者包装到同一个view元素中。</p>
<div class="blog_h3"><span class="graybg">返回到原先的页面</span></div>
<p>可以在链接上特殊样式类back，这样链接被点击后，自动返回上一个页面：</p>
<pre class="crayon-plain-tag">&lt;div class="page" data-page="about"&gt;
    &lt;a href="index.html" class="back"&gt; Go back to home page &lt;/a&gt;
&lt;/div&gt;</pre>
<p>如果导航历史中<span style="background-color: #c0c0c0;">存在其他页面</span>，那么<span style="background-color: #c0c0c0;">href属性被忽略</span>。否则F7通过href载入“前一个”页面。</p>
<div class="blog_h3"><span class="graybg">禁用Swipe back</span></div>
<p>我们可以为特定页面禁用Swipe back：<pre class="crayon-plain-tag">&lt;div class="page no-swipeback"&gt;&lt;/div&gt;</pre> 。</p>
<div class="blog_h3"><span class="graybg">针对页面启/禁动画</span></div>
<p>应用程序初始化参数noAnimate可以在全局范围禁用页面切换动画。</p>
<p>我们也可以针对页面启/禁动画：</p>
<pre class="crayon-plain-tag">&lt;div class="page" data-page="about"&gt;
    &lt;!-- 禁用动画 --&gt;
    &lt;a href="about.html" class="no-animation"&gt; Load About page immediately &lt;/a&gt;
    &lt;!-- 对返回链接禁用动画 --&gt;
    &lt;a href="index.html" class="back no-animation"&gt; Go back immediately &lt;/a&gt;
    &lt;!-- 启用动画 --&gt;
    &lt;a href="about.html" class="with-animation"&gt; Load About page with animation &lt;/a&gt;
    &lt;!-- 对返回链接启用动画 --&gt;
    &lt;a href="index.html" class="back with-animation"&gt; Go back with animation &lt;/a&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">使用额外导航参数加载页面</span></div>
<p>把驼峰式大小写的<a href="#nav-params">导航参数</a>改为连字符+小写格式，附加<pre class="crayon-plain-tag">data-</pre> 前缀，就可以在<pre class="crayon-plain-tag">&lt;a&gt;</pre> 元素的属性中声明<span style="background-color: #c0c0c0;">任意额外的</span>导航参数：</p>
<pre class="crayon-plain-tag">&lt;!-- reload=true,ignoreCache=true --&gt;
&lt;a href="about.html" data-reload="true" data-ignore-cache="true"&gt;&lt;/a&gt;
&lt;!-- force=true --&gt;
&lt;a href="about.html" class="back" data-force="true"&gt;&lt;/a&gt;
&lt;!-- animatePages=true --&gt;
&lt;a href="about.html" data-animate-pages="false"&gt;&lt;/a&gt;
&lt;!-- 导航到已有T7模板 --&gt;
&lt;a href="#" data-template="contactsTemplate"&gt;Contacts&lt;/a&gt;</pre>
<div class="blog_h3"><span class="graybg">使用JS加载页面或返回</span></div>
<p>与HTML链接元素等价的JS加载/返回页面方式是：</p>
<pre class="crayon-plain-tag">view.router.loadPage('about.html');
view.router.back();</pre>
<div class="blog_h2"><span class="graybg">动态页面</span></div>
<p>F7允许即使的创建并加载动态页面，而不进行额外的XHR请求。动态页面无法通过 <pre class="crayon-plain-tag">&lt;a&gt;</pre> 元素完成，必须使用路由API（两个<a href="#nav-methods">导航方法</a>reload/back或者相应<a href="#nav-shortcuts">快捷方法</a>）。</p>
<p>关于Ajax页面结构的说明，完全适用于动态页面。</p>
<div class="blog_h3"><span class="graybg">在JS中编写动态页面</span></div>
<pre class="crayon-plain-tag">var mainView = new Framework7().addView('.view-main');
// 动态页面的内容，结构必须符合F7规范
var newPageContent = '&lt;div class="page" data-page="my-page"&gt;' +
                        '&lt;div class="page-content"&gt;' +
                          '&lt;p&gt;Here comes new page&lt;/p&gt;' +
                        '&lt;/div&gt;' +
                      '&lt;/div&gt;';
 
//加载页面
mainView.router.loadContent(newPageContent);
//另一种方式
mainView.router.load({
  content: newPageContent,
  animatePages: false
});</pre>
<div class="blog_h3"><span class="graybg">使用内联模板</span></div>
<p>在JavaScript中编写HTML很麻烦，我们可以在主布局文件中声明：</p>
<pre class="crayon-plain-tag">&lt;script type="text/template" id="myPage"&gt;
    &lt;div class="navbar"&gt;
        &lt;div class="navbar-inner"&gt;
            &lt;div class="center"&gt;My Page&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="page" data-page="my-page"&gt;
        &lt;div class="page-content"&gt;
            &lt;p&gt;Here comes page content&lt;/p&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/script&gt;</pre>
<p>然后通过路由API加载： </p>
<pre class="crayon-plain-tag">view.router.loadContent($('#myPage').html());</pre>
<div class="blog_h3"><span class="graybg">动态页面的URL </span></div>
<p>默认情况下动态页面的URL属于哈希导航，遵循<pre class="crayon-plain-tag">#content-{{index}}</pre> 格式，其中index是导航历史中的页面索引号。该行为可以通过应用初始化参数dynamicPageUrl修改。</p>
<div class="blog_h2"><span class="graybg">内联页面（DOM缓存）</span></div>
<p>内联页面指直接声明在主布局文件（index.html）中的页面。这种页面不需要额外的Ajax加载动作/动态创建动作，会随着应用的初始化自动加载。</p>
<p>默认情况下，内联页面是禁用的，要<span style="background-color: #c0c0c0;">为某个视图启用</span>内联页面功能，你需要：</p>
<pre class="crayon-plain-tag">var mainView = myApp.addView('.view-main', {
    domCache: true //启用内联页面功能
});</pre>
<p>如果不启用domCache参数，则无法通过<pre class="crayon-plain-tag">#pageName</pre> 导航到其它内联页面。</p>
<div class="blog_h3"><span class="graybg">内联页面DOM结构</span></div>
<p>必须为<span style="background-color: #c0c0c0;">非当前活动页面</span>添加额外的cached样式类。<span style="background-color: #c0c0c0;">最后一个</span>没有标注cached的内联页面会自动显示：</p>
<pre class="crayon-plain-tag">&lt;div class="views"&gt;
    &lt;div class="view view-main"&gt;
        &lt;div class="pages"&gt;
            &lt;!-- 内联页面，当前活动页面 --&gt;
            &lt;div class="page" data-page="index"&gt;
                &lt;div class="page-content"&gt;
                    &lt;p&gt;Home page&lt;/p&gt;
                &lt;/div&gt;
            &lt;/div&gt;

            &lt;!-- 已缓存的内联页面 --&gt;
            &lt;div class="page cached" data-page="about"&gt;
                &lt;div class="page-content"&gt;
                    &lt;p&gt;About page&lt;/p&gt;
                &lt;/div&gt;
            &lt;/div&gt;

            &lt;!-- 已缓存的内联页面 --&gt;
            &lt;div class="page cached" data-page="services"&gt;
                &lt;div class="page-content"&gt;
                    &lt;p&gt;Services page&lt;/p&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">使用动态导航栏时的内联页面的DOM结构 </span></div>
<p>本节内容仅适用于iOS主题。</p>
<p>动态导航栏元素是独立在页面元素之外的，要为每个内联页面定制动态导航栏，需要额外的HTML标签：</p>
<pre class="crayon-plain-tag">&lt;div class="views"&gt;
    &lt;div class="view view-main"&gt;
        &lt;!-- 所有内联页面的导航栏设置 --&gt;
        &lt;div class="navbar"&gt;
            &lt;!-- 页面1的导航栏，注意data-page属性和对应的页面保持一致 --&gt;
            &lt;div class="navbar-inner" data-page="index"&gt;&lt;div class="center"&gt;Home&lt;/div&gt;&lt;/div&gt;
            &lt;!-- 页面2的导航栏，注意已缓存的页面的导航栏会加上cached标签 --&gt;
            &lt;div class="navbar-inner cached" data-page="about"&gt;&lt;div class="center"&gt;About&lt;/div&gt;&lt;/div&gt;
            &lt;!-- 页面3的导航栏 --&gt;
            &lt;div class="navbar-inner cached" data-page="services"&gt;&lt;div class="center"&gt;Services&lt;/div&gt;&lt;/div&gt;
        &lt;/div&gt;
        &lt;!-- 所有内联页面 --&gt;
        &lt;div class="pages navbar-through"&gt;
            &lt;!-- 页面1（当前） --&gt;
            &lt;div class="page" data-page="index"&gt;&lt;div class="page-content"&gt;&lt;p&gt;Home page&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
            &lt;!-- 页面2 （已缓存）--&gt;
            &lt;div class="page cached" data-page="about"&gt;&lt;div class="page-content"&gt;&lt;p&gt;About page&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
            &lt;!-- 页面3（已缓存） --&gt;
            &lt;div class="page cached" data-page="services"&gt;&lt;div class="page-content"&gt;&lt;p&gt;Services page&lt;/p&gt;&lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">内联页面的URL</span></div>
<p>内联页面的URL属于哈希导航，遵循<pre class="crayon-plain-tag">#{{pageName}}</pre> 格式，我们可以使用下面的URL链接到内联页面about：</p>
<pre class="crayon-plain-tag">&lt;a href="#about"&gt;Go to About page&lt;/a&gt;</pre>
<div class="blog_h3"><span class="graybg">通过JS加载内联页面</span></div>
<pre class="crayon-plain-tag">view.router.load({pageName: 'about'});</pre>
<div class="blog_h2"><span class="graybg">跨视图链接</span></div>
<p>使用JavaScript API，可以很方便的使用view实例加载任何页面。此外，F7还允许点击视图1中的某个链接，而把目标页面加载到视图2中，这就是所谓跨视图链接：</p>
<pre class="crayon-plain-tag">&lt;!-- 只需要通过data-view属性指定目标视图的CSS选择器，就可以进行跨视图链接 --&gt;
&lt;a href="products.html" data-view=".right-view"&gt; Products &lt;/a&gt;
&lt;!-- 右视图 --&gt;
&lt;div class="view right-view"&gt;...&lt;/div&gt;</pre>
<p>对于“back”链接，同样可以使用data-view属性。</p>
<div class="blog_h1"><span class="graybg">样式（Styling）</span></div>
<div class="blog_h2"><span class="graybg">色彩方案</span></div>
<p>F7为iOS主题、Material主题预置了<span style="background-color: #c0c0c0;">多套色彩方案</span>。并分别提供<span style="background-color: #c0c0c0;">深/浅两套</span>布局主题（Layout Theme）。</p>
<p>要启用色彩方案的支持，必须在F7主样式表文件后附加样式表文件：</p>
<pre class="crayon-plain-tag">&lt;!-- iOS主题色彩方案样式表 --&gt;
&lt;link rel="stylesheet" href="path/to/framework7.ios.colors.min.css"&gt;
&lt;!-- Material主题色彩方案样式表 --&gt;
&lt;link rel="stylesheet" href="path/to/framework7.material.colors.min.css"&gt;</pre>
<div class="blog_h3"><span class="graybg">色彩方案列表</span></div>
<p> <img class="aligncenter size-large wp-image-10969" src="https://blog.gmem.cc/wp-content/uploads/2015/12/f7-colors-521x1024.png" alt="f7-colors" width="521" height="1024" /></p>
<div class="blog_h3"><span class="graybg">应用色彩方案</span></div>
<p>可以在多个元素上应用色彩方案，只需要添加相应的<pre class="crayon-plain-tag">theme-*</pre> 样式类：</p>
<pre class="crayon-plain-tag">&lt;body class="theme-red"&gt;&lt;/body&gt; &lt;!-- 全局 --&gt;
&lt;div class="page theme-green"&gt;&lt;/div&gt; &lt;!-- 页面 --&gt;
&lt;div class="list-block theme-pink"&gt;&lt;/div&gt; &lt;!-- 列表 --&gt;
&lt;div class="navbar theme-orange"&gt;&lt;/div&gt; &lt;!-- 导航栏 --&gt;
&lt;div class="buttons-row theme-yellow"&gt;&lt;/div&gt; &lt;!-- 按钮 --&gt;</pre>
<div class="blog_h3"><span class="graybg">应用布局主题 </span></div>
<p>可以指定应用是深色风格还是浅色风格：</p>
<pre class="crayon-plain-tag">&lt;body class="layout-dark"&gt;&lt;/body&gt;
&lt;div class="page layout-white"&gt;&lt;/div&gt;
&lt;div class="list-block layout-dark"&gt;&lt;/div&gt;</pre>
<div class="blog_h3"><span class="graybg">辅助样式类</span></div>
<p>F7提供了若干与色彩方案相关的辅助样式类：</p>
<ol>
<li>color-*：指定元素的文本颜色</li>
<li>bg-*：指定元素的背景颜色</li>
<li>border-*：指定元素的边框颜色 </li>
</ol>
<p>注意，不支持在指定色彩方案的容器内指定辅助样式类：</p>
<pre class="crayon-plain-tag">&lt;div class="theme-red"&gt;
    &lt;a href="#" class="color-blue"&gt;链接将是红色的，而不是蓝色&lt;/a&gt;
&lt;/div&gt;</pre>
<div class="blog_h2"><span class="graybg">边框（细线）</span></div>
<p> 从F7的1.x版本开始，支持使用<pre class="crayon-plain-tag">:after</pre> 和<pre class="crayon-plain-tag">:before</pre> 伪元素代替CSS边框。这样就可以支持iOS视网膜屏幕0.5px、0.33px（iPhone 6P）的细线。</p>
<p>伪元素使用规则很简单：</p>
<ol>
<li>:after对应bottom、right细线</li>
<li>:before对应left、top细线</li>
</ol>
<div class="blog_h3"><span class="graybg">使用示例</span></div>
<pre class="crayon-plain-tag">/* 修改导航栏底部细线为红色 */
.navbar:after {
  background-color: red;
}
/* 移除导航栏、工具栏的细线 */
.navbar:after {
  display:none;
}
.toolbar:before {
  display:none;
}</pre>
<div class="blog_h3"><span class="graybg"><strong>no-border类 </strong></span></div>
<p>该样式类也可以用于移除细线，但是目前不支持导航栏、工具栏、卡片（包括头/尾）。</p>
<div class="blog_h1"><span class="graybg">快速点击库</span></div>
<p>本章介绍的功能是F7内置的快速点击库的一部分，必须在应用初始化参数中启用快速点击才可以使用。</p>
<div class="blog_h2"><span class="graybg">活动状态</span></div>
<p>F7使用所谓活动状态（active state） 来高亮显示被触碰的按钮与链接。</p>
<p>类似于CSS选择器<pre class="crayon-plain-tag">:active</pre> ，当你<span style="background-color: #c0c0c0;">触碰元素并持续一小段时间</span>后，F7会自动添加<pre class="crayon-plain-tag">active-state</pre> 样式类。通过定制CSS，可以为被触碰的元素添加额外样式：</p>
<pre class="crayon-plain-tag">/* 一般状态 */
.my-button {
    color: red;
}
/* 活动状态（触碰） */
.my-button.active-state {
    color: blue;
}</pre>
<div class="blog_h2"><span class="graybg">长按事件</span></div>
<p> F7支持触碰并保持（Tap Hold）事件，亦即长按（Long Tap）事件。此功能默认禁用，可以设置应用初始化参数tapHold、tapHoldDelay、tapHoldPreventClicks以启用并定制。</p>
<p>你可能需要禁用移动浏览器默认的长按动作，向目标元素添加额外样式规则：</p>
<pre class="crayon-plain-tag">-moz-user-select: none;        
-webkit-user-select: none;        
user-select: none;</pre>
<p> 你可以监听<pre class="crayon-plain-tag">taphold</pre> 事件，指定长按时需要执行的动作。</p>
<div class="blog_h2"><span class="graybg">波纹效果</span></div>
<p>仅用于Material主题，可以在触碰点生成一个扩散的涟漪效果。 此效果默认全局范围内启用，设置应用初始化参数<pre class="crayon-plain-tag">materialRipple:false</pre> 则可禁用。哪些元素启用此效果，则由应用初始化参数<pre class="crayon-plain-tag">materialRippleElements</pre> 指定。</p>
<p>要为某个元素启用波纹效果，可以：</p>
<pre class="crayon-plain-tag">&lt;a href="#" class="my-link ripple"&gt;Link With Ripple Effect&lt;/a&gt;</pre>
<p>要为某个元素禁用波纹效果，可以：</p>
<pre class="crayon-plain-tag">&lt;a href="#" class="button no-ripple"&gt;Button Without Ripple Effect&lt;/a&gt;</pre>
<div class="blog_h3"><span class="graybg">指定波纹颜色</span></div>
<p>可以使用内置的<pre class="crayon-plain-tag">ripple-*</pre> 样式类，或者自定义：</p>
<pre class="crayon-plain-tag">.button .ripple-wave {
    background-color: #ff0000;
}</pre>
<div class="blog_h1"><span class="graybg">实用工具</span></div>
<div class="blog_h2"><span class="graybg">设备API</span></div>
<p>F7内置了一个设备检测库，在应用初始化后，你可以访问<pre class="crayon-plain-tag">app.device</pre> 对象。该对象包含若干与设备相关的有用信息：</p>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 15%; text-align: center;">属性</td>
<td style="width: 15%; text-align: center;">类型</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>os</td>
<td>string</td>
<td>操作系统类型， 可以是android、ios。对于其它任何系统，均为undefined</td>
</tr>
<tr>
<td>osVersion</td>
<td>string</td>
<td>操作系统版本字符串</td>
</tr>
<tr>
<td>android</td>
<td>boolean</td>
<td>是否为安卓设备</td>
</tr>
<tr>
<td>ios</td>
<td>boolean</td>
<td>是否为iOS设备</td>
</tr>
<tr>
<td>ipad</td>
<td>boolean</td>
<td>是否为iPad</td>
</tr>
<tr>
<td>iphone</td>
<td>boolean</td>
<td>是否为iPhone</td>
</tr>
<tr>
<td>pixelRatio</td>
<td>number</td>
<td>像素比率，在高分屏中，多少物理像素对应一个逻辑像素</td>
</tr>
<tr>
<td>webView</td>
<td>boolean</td>
<td>如果应用程序运行在UIWebView中，则为true。使用Phonegap时，此属性为true</td>
</tr>
<tr>
<td>minimalUi</td>
<td>boolean</td>
<td>minimal-ui模式是否处于启用状态</td>
</tr>
<tr>
<td>statusBar</td>
<td>boolean</td>
<td>仅iOS，当应用在全屏模式下运行，并且需要状态栏Overlay时为true</td>
</tr>
</tbody>
</table>
<p>要在应用初始化之前使用设备API，可以：</p>
<pre class="crayon-plain-tag">var device = Framework7.prototype.device;
if (device.iphone) {
    console.log('this is iPhone')
}</pre>
<div class="blog_h3"><span class="graybg">额外的样式类 </span></div>
<p>设备API会自动为html元素添加额外的样式类，便于开发者针对不同设备定制UI： </p>
<pre class="crayon-plain-tag">&lt;!-- 为iOS 7.1设备添加的额外样式类 --&gt;
&lt;html class="ios ios-7 ios-7-1 ios-gt-6 pixel-ratio-1"&gt;
&lt;!-- 为iOS 7.1视网膜屏、运行全屏应用程序时添加的样式类 --&gt;
&lt;html class="ios ios-7 ios-7-1 ios-gt-6 retina pixel-ratio-2 with-statusbar-overlay"&gt;
&lt;!-- 为iOS 8.0的iPhone 6 Plus添加的样式类 --&gt;
&lt;html class="ios ios-8 ios-8-0 ios-gt-6 ios-gt-7 retina pixel-ratio-3 with-statusbar-overlay"&gt;
&lt;!-- 为 Android 4.4 设备添加的额外样式类 --&gt;
&lt;html class="android android-4 android-4-4"&gt;</pre>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/framework7-study-note-1">Framework7学习笔记（一）：基础</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/framework7-study-note-1/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
