[关闭]
@kirkzwy 2014-07-22T05:58:02.000000Z 字数 54323 阅读 22994

Framework7中文文档

coding javascript 学习


欢迎开始使用framewor7制作高水平的iOS应用。

在正式开始阅读文档之前,我们十分推荐你从getting started引导开始,从该部分你可以学习到如何下载和配置framework7,并了解framework7的基本布局。

framework7的的学习难度是十分低的,只要你会HTML和CSS,对了解一点点的javascript,你就基本上懂得如何使用framework7去制作iOS应用了。

为了更好地学习framework7,我们推荐你按顺序去阅读本文档。

那我们先从最基本的应用HTML布局-App HTML Layout开始。

应用HTML布局

开发应用的第一步,就是按照应用的框架去写index.html,以下是index.html的最基本布局:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <!-- Required meta tags-->
  5. <meta charset="utf-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, minimal-ui">
  7. <meta name="apple-mobile-web-app-capable" content="yes">
  8. <meta name="apple-mobile-web-app-status-bar-style" content="black">
  9. <!-- Your app title -->
  10. <title>My App</title>
  11. <!-- Path to Framework7 Library CSS-->
  12. <link rel="stylesheet" href="path/to/framework7.min.css">
  13. <!-- Path to your custom app styles-->
  14. <link rel="stylesheet" href="path/to/my-app.css">
  15. </head>
  16. <body>
  17. <!-- Status bar overlay for full screen mode (PhoneGap) -->
  18. <div class="statusbar-overlay"></div>
  19. <!-- Views -->
  20. <div class="views">
  21. <!-- Your main view, should have "view-main" class -->
  22. <div class="view view-main">
  23. <!-- Top Navbar-->
  24. <div class="navbar">
  25. <div class="navbar-inner">
  26. <!-- We need cool sliding animation on title element, so we have additional "sliding" class -->
  27. <div class="center sliding">Awesome App</div>
  28. </div>
  29. </div>
  30. <!-- Pages container, because we use fixed-through navbar and toolbar, it has additional appropriate classes-->
  31. <div class="pages navbar-through toolbar-through">
  32. <!-- Page, "data-page" contains page name -->
  33. <div data-page="index" class="page">
  34. <!-- Scrollable page content -->
  35. <div class="page-content">
  36. <p>Page content goes here</p>
  37. <!-- Link to another page -->
  38. <a href="about.html">About app</a>
  39. </div>
  40. </div>
  41. </div>
  42. <!-- Bottom Toolbar-->
  43. <div class="toolbar">
  44. <div class="toolbar-inner">
  45. <!-- Toolbar links -->
  46. <a href="#" class="link">Link 1</a>
  47. <a href="#" class="link">Link 2</a>
  48. </div>
  49. </div>
  50. </div>
  51. </div>
  52. <!-- Path to Framework7 Library JS-->
  53. <script type="text/javascript" src="path/to/framework7.min.js"></script>
  54. <!-- Path to your app js-->
  55. <script type="text/javascript" src="path/to/my-app.js"></script>
  56. </body>
  57. </html>

正如你看到的,布局十分简单,关键是你要在<head>内关联好CSS,和在<body>的尾部配置好JS文件就可以了。

在后面相关的章节中,你可以了解到关于如何去设置statusbar overlay,views,navbar,toolbar,pages,panels和其他组件。

在这个基本的模板的基础上,我们可以需要初始化应用-initialize our app在my-app.js文件上。

初始化应用

在我们设置好HTML文件的布局,关联好必须的CSS和JS文件后,我们就应该着手开始初始化我们应用的参数配置(我们这里建议你在my-app.js的文件中进行):

  1. var myApp = new Framework7();

为了方便日后的连接,在上面的代码例子中,我们定义了一个叫myapp的变量去保存framework7的实例。变量没有要求必须命名为myapp,可以命名成你喜欢的名字。

这是十分简单的操作,与此同时,可以通过对framework7的对象传人不同的参数,实现更加个性化的配置,例子如下:

  1. var myApp = new Framework7({
  2. pushState: true,
  3. swipePanel: 'left',
  4. // ... other parameters
  5. });

下面的表格列出了相关的参数:

参数 类型 默认设置 描述
Caching
cache boolean true Because Framework7 uses Ajax to load HTML content for pages it is useful to use caching, especially if your content in those pages updates not very often.
cacheDuration number 1000*60*10 Duration in ms (milliseconds) while app will use cache instead of loading page using another Ajax request. By default it is 10 minutes.
cacheIgnore array [] Array of URLs (string) that should not be cached by Framework7
Fast clicks library
fastClicks boolean true Fast clicks is a built-in library that removes 300ms delay from links and form elements in mobile browser while you click them. You can disable this built-in library if you want to use other third party fast clicks script.
Navigation
ajaxLinks string undefined By default (when this parameter is not specified) Framework7 will load all links (<a>) using Ajax. You can change this behavior by passing here CSS selector string for links that should be loaded with Ajax, like "a.ajax" - only all links with "ajax" class
pushState boolean false If you develop web app (not PhoneGap or Home Screen web app) it is useful to enable hash navigation (browser url will look like "http://my-webapp.com/#/about.html"). Also user will be able to navigate through app's history by using browser's default back and forward buttons.
animateNavBackIcon boolean false This option (when enabled) gives more native look for dynamic navbar left back-link icon animation. Useful only when you use dynamic navbar with default back-link icon on left side set as "sliding".
preloadPreviousPage boolean true Enable/disable preloading of previous page when you go deep in navigation. Should be enabled for correct work of "swipe back page" feature.
Swipe back
swipeBackPage boolean true Enable/disable ability to swipe back from left edge of screen to get to the previous page.
swipeBackPageThreshold number 0 Value in px. Swipe back action will start if "touch distance" will be more than this value.
swipeBackPageActiveArea number 30 Value in px. Width of invisible left edge of the screen that triggers swipe back action
swipeBackPageBoxShadow boolean true Enable/disable box-shadow animation during swipe back action. You can disable it to improve performance
Sortable Lists
sortable boolean true If you don't to use sortable lists you can disable it for potentially better performance.
Swipeout
swipeout boolean true If you will not use swipeouts you can disable this feature for potentially better performance.
swipeoutNoFollow boolean false Fallback option for potentially better performance on old/slow devices. If you enable it, then swipeout item will not follow your finger during touch, it will be automatically opened/closed on swipe left/right.
Side Panels
swipePanel string false Disabled by default. If you want to enable ability to open side panels with swipe you can pass here "left" (for left panel) or "right" (for right panel).
swipePanelActiveArea number false Value in px. Width of invisible edge from the screen that triggers swipe panel
swipePanelNoFollow boolean false Fallback option for potentially better performance on old/slow devices. If you enable it, then side panel will not follow your finger during touch, it will be automatically opened/closed on swipe left/right.
swipePanelThreshold number 0 Value in px. Panel will not move with swipe if "touch distance" will be less than this value.
panelsCloseByOutside boolean true Enable/disable ability to close panel by clicking outside of panel (on panel's overlay)
panelsVisibleZIndex number 6000 CSS z-index property for panel
Modals
modalTitle string 'Framework7' Default title for modals (Alert, Confirm, Prompt)
modalButtonOk string 'OK' Default text for modal's "OK" button
modalButtonCancel string 'Cancel' Default text for modal's "Cancel" button
modalPreloaderTitle string 'Loading... ' Default text for preloader modal
modalCloseByOutside boolean false Enable/disable ability to close modal (Alert, Confirm, Prompt) by clicking outside of modal (on modal's overlay)
actionsCloseByOutside boolean true The same as previous but for Action Sheet modal
popupCloseByOutside boolean true The same as previous but for Popup modal
modalTemplate string Look below* Full HTML template for modals (like alert, confirm and prompt)
modalActionsTemplate string '<div class="actions-modal">{{buttons}}</div>' HTML template for Action Sheet. Could be useful if you want to add some custom elements to Action Sheet layout.
Ajax Callbacks
onAjaxStart function(xhr) - Callback function that will be executed in the beginning of Ajax request. This function accepts xhr data as an argument.
onAjaxComplete function(xhr) - Callback function that will be executed after Ajax request. This function accepts xhr data as an argument.
preprocess function(content, url) - This callback function allows you to modify loaded Ajax content right before it will be injected to DOM. As arguments this function receive "content" and "url" of the loaded page. This option will be very useful if you are going to use some client-side template engine like "Handlebars", "Mustache", etc. After you modify content within this function you should return it: return content
Namespace

Attention! If you change following class names you will also need to change them in CSS!

viewClass string 'view' Class name for your View element
viewMainClass string 'view-main' Class name for your Main View element
viewsClass string 'views' Class name for your Views element
Init
init boolean true By default Framework7 will be initialized automatically when you call new Framework7(). If you want to prevent this behavior you can disable it with this option and then initialize it manually with myApp.init() when you need it.

*模态对话框模板的参数包含了所有设置模态对话框需要的HTML布局(如提醒,确认和弹出对话框等),下面例子是模态对话框的HTML布局:

  1. '<div class="modal {{noButtons}}">' +
  2. '<div class="modal-inner">' +
  3. '{{if title}}<div class="modal-title">{{title}}</div>{{/if title}}' +
  4. '<div class="modal-text">{{text}}</div>' +
  5. '{{afterText}}' +
  6. '</div>' +
  7. '<div class="modal-buttons">{{buttons}}</div>' +
  8. '</div>'

my-app.JS文件中要这样配置代码:

  1. var myApp = new Framework7({
  2. // Default title for modals
  3. modalTitle: 'My App',
  4. // If it is webapp, we can enable hash navigation:
  5. pushState: true,
  6. // Hide and show indicator during ajax requests
  7. onAjaxStart: function (xhr) {
  8. myApp.showIndicator();
  9. },
  10. onAjaxComplete: function (xhr) {
  11. myApp.hideIndicator();
  12. }
  13. });

例子:"preprocess" 内容配置

framework7可以兼容你喜爱的客户端框架引擎(如Handlebars或者Mustache),接下来,我们看一下如何混合使用Handlebars作为我们的客户端模板引擎(Handlebars的文件需要在framework7的HTML中关联)

my-app.js中作如下配置:

  1. var myApp = new Framework7({
  2. preprocess: function (content, url) {
  3. if (url === 'people.html') {
  4. var template = Handlebars.compile(content);
  5. var resultContent = template({
  6. title: 'People',
  7. people: ['John', 'Ivan', 'Mary']
  8. })
  9. return resultContent;
  10. }
  11. }
  12. });

people.html页面中作以下配置

  1. <div class="navbar">
  2. <div class="navbar-inner">
  3. <div class="center">{{title}}</div>
  4. </div>
  5. </div>
  6. <div class="pages">
  7. <div data-page="people" class="page">
  8. <div class="page-content">
  9. <ul>
  10. {{#each people}}
  11. <li>{{this}}</li>
  12. {{/each}}
  13. </ul>
  14. </div>
  15. </div>
  16. </div>

下一步

在配置好my-app.js之后,我们就要在HTML上增加和配置视图Views

视图

视图view(<div class="view">)是在应用上的一个独立的视觉区域,它拥有自己的设置,导航和历史。不同的视图可以有不一样布局的导航条和工具条,界面风格也可以不一样。可以把它看作是应用里面的一个应用。因为视图具有这样的功能特性,所以framework7可以很方便的维护应用的每一个部分。

总视图views(div class="views">)是各个独立可见视图的容器,它永远保持可见(除了在modals模态对话框和panels其他面板中),所以总视图views是你的应用主体的主要容器,views元素在整个应用中只允许有一个

下面是关于views的HTML结构:

  1. <body>
  2. ...
  3. <div class="panel panel-left panel-cover">
  4. <div class="view panel-view"> ... </div>
  5. </div>
  6. <!-- Views -->
  7. <div class="views">
  8. <!-- Your main view -->
  9. <div class="view view-main">
  10. <!-- Navbar-->
  11. <!-- Pages -->
  12. <!-- Toolbar-->
  13. </div>
  14. <!-- Another view -->
  15. <div class="view another-view">
  16. <!-- Navbar-->
  17. <!-- Pages -->
  18. <!-- Toolbar-->
  19. </div>
  20. </div>
  21. <div class="popup">
  22. <div class="view popup-view"> ... </div>
  23. </div>
  24. ...
  25. </body>

如以下的代码所示,应用几乎是有不同的view视图组成的,记住一个重要的规则所有可见的视图view都必须包含在总视图views(div class="views">)里。在你移动整个应用的视图时,会自动增加一些动画效果(如打开设置面板panel)。

主视图Main View

主视图Main View是需要在class上添加main view的。为什么需要主视图,所有预设的链接都会加载到主视图上(除了在初始视图Initialize View上的链接)。

初始视图Initialize View

我们已经设置了必要的视图,和对我们的应用进行了初始化initialized,现在我们需要在javascript文件上对我们的视图做初始化。

注意:不是每一个视图都必须初始化,那些具有导航作用的视图才需要初始化,其他的视图(如弹出对话框)不必初始化,但我需要在HTML上配置好他们,从而保持正确的导航条,页面和工具条的正确布局。

myApp变量是我们在之前的文档上设置的framework7的初始化实例:

  1. var myApp = new Framework7({
  2. // ...
  3. });

该实例针对应用的不同部分有不同的方法,其中有一个方法是用于初始化视图view的。
myApp.addView(selector, parameters)用于初始化视图的方法:
selector--字符串或者HTML元素类型;如果是字符串,可能是CSS的视图元素选择器。
parameters--对象类型;具有视图参数的对象。
该方法返回的是一个带有视图实例的对象。

视图初始化参数View initialization parameters

Parameter Type Default Description
dynamicNavbar boolean false Set to true to enable Dynamic Navbar in this View
domCache boolean false If enabled then all previous pages in navigation chain will not removed from DOM when you navigate deeper and deeper. It could be useful, for example, if you have some Form from 5 steps (5 pages) and when you are on last 5th page you need access to form that was on 1st page.
linksView string / HTMLElement undefined CSS Selector of another view or HTMLElement of other view. By defaul all links in initialized (only) view will load pages in this view. You can change this logic on the fly by changing this paremeter. This tell links to load pages in other view.
animatePages boolean Enable/disable animated transitions between pages for the current View. By default, equal to the same App's parameter. Allows to override global App parameter for current View.
Swipe back
swipeBackPage boolean By default, equal to the same App's parameter. Allows to override global App parameter for current View
swipeBackPageThreshold number By default, equal to the same App's parameter. Allows to override global App parameter for current View
swipeBackPageActiveArea number By default, equal to the same App's parameter. Allows to override global App parameter for current View
swipeBackPageBoxShadow boolean By default, equal to the same App's parameter. Allows to override global App parameter for current View

通过查阅以上表格我们可以了解到全部用于初始化我们视图的参数,下面是相关的代码实例:

  1. var myApp = new Framework7({
  2. // ...
  3. });
  4. /* Initialize views */
  5. var mainView = myApp.addView('.view-main', {
  6. dynamicNavbar: true
  7. })
  8. var anotherView = myApp.addView('.another-view');

就是如此简单,在上面的例子中,我们没有对设置面板panel和弹出对话框popup进行初始化,因为他们不用于导航,只是具有保持视觉页面正确左右。如果上述的两种视图具有导航作用,你仍然需要对他进行初始化。

视图方法及属性View Methods & Properties

在上面的例子中我们可以看到我们初始化了视图,并用mainViewanotherView两个变量保存了一个视图实例。视图实例是一个对象,所以它也具有相关的方法和参数对视图进行维护,接下来我们看看mainView的属性和方法。

属性
mainView.params Returns object with intialized parameters. You can access and rewrite some parameters like mainView.params.linksView = '.another-view'
mainView.history Returns array with View's history. Each array element contains URL of loaded page
mainView.contentCache Returns object with cached pages. It is available only if you use dynamically generated content
mainView.url Returns string with url of currently active (loaded) page
mainView.pagesContainer Returns HTMLElement link to pages element
mainView.main Returns true if this view is main view
方法
mainView.loadPage(url)
  • url - string. URL of page to load
This method will load required page to view. In other word will do the same if you click on some link with this URL
mainView.loadContent(content)
  • content - string or HTMLElement or [jQuery/Zepto/DOM7 collection] or [array of HTMLElement].
This method allows to load dynamically generated content as a new usual page.
mainView.goBack(url)
  • url - string. URL of page to get back. URL will be ignored if there are pages in navigation history.
This method will trigger reverse animation to the previous page. In other word will do the same if you click on "back"
mainView.hideNavbar() Hide navbar in this View
mainView.showNavbar() Show navbar in this View
mainView.hideToolbar() Hide toolbar in this View
mainView.showToolbar() Show toolbar in this View
mainView.destroy() Destroy initialized View, detach swipe events, and disable navigation

视图URL的默认设置Default View URL

因为某些原因,你发现了framework7上错误设置了视图的URL(视图的URL用于保存视图的历史记录),或者你想设置跟默认设置不一样的URL,你可以通过视图HTML元素中的data-url属性进行设置,例子如下:

  1. <div class="view" data-url="index2.html">

使用其他方法获取视图实例Access to View's instance with other ways

有些时候,你需要通过HTML元素去获取视图实例,这是很简单的一件事情,当你初始化视图之后,framework7会自动添加属性链接在<div class="view">中,所以在任何时候都可以很方便地通过javascript去获取,例子如下:

  1. var viewsElement = $$('.view-main')[0];
  2. var viewInstance = viewsElement.f7View;

除此之外,视图的实例都被保存在一个很特别的应用属性--views(这是一个包含所有视图的数组)里,如果你想获取主视图,可以写以下代码:

  1. for (var i = 0; i < myApp.views.length; i ++) {
  2. var view = myApp.views[i];
  3. if (view.main) myApp.alert('I found main View!')
  4. }

下一步

进入页面pages章节。

页面Pages

页面pages跟我们平时认识到的网站页面的概念是一样的。

接下来我们看一下页面的HTML结构:

  1. <body>
  2. ...
  3. <!-- Views -->
  4. <div class="views">
  5. <!-- Your main view -->
  6. <div class="view view-main">
  7. <!-- Pages -->
  8. <div class="pages">
  9. <div class="page" data-page="home">
  10. <div class="page-content">
  11. ... page content goes here ...
  12. </div>
  13. </div>
  14. </div>
  15. </div>
  16. <!-- Another view -->
  17. <div class="view another-view">
  18. <!-- Pages -->
  19. <div class="pages">
  20. <div class="page" data-page="home-another">
  21. <div class="page-content">
  22. ... page content goes here ...
  23. </div>
  24. </div>
  25. </div>
  26. </div>
  27. </div>
  28. ...
  29. </body>

总页面pages是在独立视图下各个页面的总容器。它是必须存在,不然的话其他页面都不能被识别。

注意:

可以允许只有一个页面在一个视图里面。

data-page属性

你可能已经注意到了,例子中的每个页面都包含了一个data-page属性,并且有独立的页面名称。这不是必须的,但这是推荐的做法。

因为这个属性值对于控制页面事件page events,并针对具体的已加载的页面做操作是十分有帮助的。

页面内容page content

所有可见的内容(如列表,表单等),应该放在<div class="page-content>里面,而<div class="page-content>应该是<div class="page">的其中一个子节点。这是为了正确的样式,布局和滚动所需。

页面事件Page Event

现在我们来了解一下页面导航中比较重要的部分,页面事件。通过页面事件,我们可以使用javascript来对特定的已加载页面进行操作:

事件 目标 描述
pageBeforeInit Page Element<div class="page"> Event will be triggered when Framework7 just inserts new page to DOM
pageInit Page Element<div class="page"> Event will be triggered after Framework7 initialize required page's components and navbar
pageBeforeAnimation Page Element<div class="page"> Event will be triggered when everything initialized and page (and navbar) is ready to be animated
pageAfterAnimation Page Element<div class="page"> Event will be triggered after page (and navbar) animation
pageBeforeRemove Page Element<div class="page"> Event will be triggered right before Page will be removed from DOM. This event could be very useful if you need to detach some events / destroy some plugins to free memory

下面我们来了解一下如何使用这些事件。有两种方法添加页面控制器:

  1. // Option 1. Using one 'pageInit' handler for all pages (recommended way):
  2. $$(document).on('pageInit', function (e) {
  3. // Do something here when page loaded and initialized
  4. })
  5. // Option 2. Using live 'pageInit' event handlers for each page (not recommended)
  6. $$(document).on('pageInit', '.page[data-page="about"]', function (e) {
  7. // Do something here when page with data-page="about" attribute loaded and initialized
  8. })

就像你看到的那么简单,但是当我们只有一个控制器怎么来控制哪个页面被首先加载呢,这时我们就需要用到page data了

Page Data

在页面事件中page data为我们的控制提供了很多方便:

  1. // Option 1. Using one 'pageInit' handler for all pages (recommended way):
  2. $$(document).on('pageInit', function (e) {
  3. // Page Data contains all required information about loaded and initialized page
  4. var page = e.detail.page;
  5. })

在上面的代码例子中,我们定以了一个叫page的page data变量。这是一个具有以下属性的对象:

Page Data Properties
page.name Contains string value of data-page attribute
page.url Contains string URL of just loaded page
page.query object with URL query parameters. If your page URL is "about.html?id=10&count=20&color=blue" then page.query will contain:
{
  id: '10',
  count: '20',
  color: 'blue'
}                  
page.view object. View instance that contains this page (if this View was initialized)
page.container Link to Page HTMLElement
page.from string - direction of where Page comes from. It will be "right" if you load new page, and "left" - if page comes after you click on "Back" button

接着我们继续看一下如何通过一个事件控制器,去控制不同的页面:

  1. $$(document).on('pageInit', function (e) {
  2. var page = e.detail.page;
  3. // Code for About page
  4. if (page.name === 'about') {
  5. // We need to get count GET parameter from URL (about.html?count=10)
  6. var count = page.query.count;
  7. // Now we can generate some dummy list
  8. var listHTML = '<ul>';
  9. for (var i = 0; i < count; i++) {
  10. listHTML += '<li>' + i + '</li>';
  11. }
  12. listHTML += '</ul>';
  13. // And insert generated list to page content
  14. $$(page.container).find('.page-content').append(listHTML);
  15. }
  16. // Code for Services page
  17. if (page.name === 'services') {
  18. myApp.alert('Here comes our services!');
  19. }
  20. });

下一步

下面我们需要了解如何去联接不同的页面联接不同的视图

导航与在framework7中联接不同页面Navigation and linking between pages in Framework7

到目前为止,我们已经为我们的总视图和总页面建立好了应用架构,接下来我们需要进一步了解怎样去创建新的页面和怎样加载到framework7上面去。

下面这一条规则你必须要记住:

framework7中的默认设置,所有的链接都是通过Ajax去进行加载的,除了两种情况:1.链接中加了external class的(<a href="somepage.html" class="external">);2.链接中的href属性没有填入正确的链接地址(当href是空或者是“#”)。
上述的设置可以在初始化应用时通过给ajaxLinks传人参数改变。

所以想在页面中创建链接是十分简单的,如下面的例子,想将about.html文件进行链接,就要使用通常的<a>标签就可以了:

  1. <a href="about.html">Go to About page</a>

这样当我们点击的时候,framework7就会发出一个ajax请求about.html,传人,插入Dom节点,运行动画过渡。

页面的内部文档结构

得益于framework7十分智能的解析器,我们在插入这些内部页面时不需要写完整的HTML结构(HTML HEAD,BODY,VIEWS,和PAGES等可以省略),下面是about.html文件的内部结构代码:

  1. <-- That is all we have in about.html file -->
  2. <div class="page" data-page="about">
  3. ... About page content goes here
  4. </div>

整个过程的关键时,当进行ajax加载页面时,framework7解析器会寻找<div class="page">的元素,以至于我们不需要完整的HTML结构。这不是严格规定,完整的HTML结构也是可以的。

多页面的内部文档结构

下面是一个较为复杂的情况,例如,我们有两个或者更多初始视图带有独立的导航,实例代码如下:

  1. <body>
  2. ...
  3. <!-- Views -->
  4. <div class="views">
  5. <!-- Left view -->
  6. <div class="view view-main left-view">
  7. <!-- Navbar-->
  8. <!-- Pages -->
  9. <a href="about.html"> About </a>
  10. <!-- Toolbar-->
  11. </div>
  12. <!-- Right view -->
  13. <div class="view right-view">
  14. <!-- Navbar-->
  15. <!-- Pages -->
  16. <a href="about.html"> About </a>
  17. <!-- Toolbar-->
  18. </div>
  19. </div>
  20. ...
  21. </body>

在上面的代码中,你看到了两个视图(左视图和右视图),两个视图都有对about.html的链接,同时,在我们点击不同的视图里的这一链接时,会加载不同的内容。

在这样的情况下,about.html要这样写:

  1. <!-- Left view -->
  2. <div class="view view-main left-view">
  3. <div class="page" data-page="about-right">
  4. ... This page will be loaded when you click about.html link from Left view ...
  5. </div>
  6. </div>
  7. <!-- Right view -->
  8. <div class="view right-view">
  9. <div class="page" data-page="about-right">
  10. ... This page will be loaded when you click about.html link from Right view ...
  11. </div>
  12. </div>

关键点是,针对特定视图的页面需要被包含在<div class="view">里面,并像在主布局里面使用相同的class。这会有助于framework7去识别哪个页面加载到哪个视图上面去。

带有动态导航条的页面文件内部结构

就像你在导航条和工具条布局类型章节里面看到,动态导航条需要through-type布局,但这种类型的导航条并不会被加载紧页面里,所以我们需要写成这样:

  1. <div class="navbar">
  2. ... Navbar content goes here
  3. </div>
  4. <div class="page" data-page="about">
  5. ... About page content goes here
  6. </div>

关键一点的是,我们要将导航条和他的内容放在页面附近。如果你有多个页面带有不同的导航条,就将他们两者都包含在相应的视图,就像上面的哪个例子那样。

导航中返回Going back in navigation

到现在,我们已经了解如何去加载页面了,但是我们怎样可以返回到之前的页面呢。

这也是很简单的,只要在链接上加上**back**class,下面就是about.html的文件结构,它将会返回到主页index.html页面:

  1. <div class="page" data-page="about">
  2. <-- Just add additional "back" class to link -->
  3. <a href="index.html" class="back"> Go back to home page </a>
  4. </div>

下面有两条比较重要的规则在我们在返回链接中添加href值时需要紧记:

1.如果页面中是具有导航历史记录的,那么framework7会忽略“href”中的url值的;
2.只有当没有导航历史记录时,(例如,当你在首页页面中有返回链接时),framework7会加载“href”中的url;
这样的设定是不可以被更改的。

“href”值对于返回不是必须的,但加上之后可以保持这个功能。

使用javascript去加载页面

除了使用<a>标签外,我们还可以使用javascript去进行页面加载。在这种情况下,我们需要用到页面方法.loadPage(url):

  1. // Initialize App
  2. var myApp = new Framework7();
  3. // Initialize View
  4. var mainView = myApp.addView('.view-main')
  5. // Load page from about.html file to main View:
  6. mainView.loadPage('about.html');

这种办法只有在视图被初始化才能使用。

使用javascript进行返回

你同样可以使用页面方法.goBack(url)进行返回:

  1. // Initialize App
  2. var myApp = new Framework7();
  3. // Initialize View
  4. var mainView = myApp.addView('.view-main')
  5. // Go back on main View
  6. mainView.goBack();

同样,视图必须被初始化。

结论

你可以看到,在framework7中进行链接和导航是十分简单,以下4点是要记住的:

下一步

接下来我们将学习在framework7中联接不同视图Linking between views in Framework7

在framework7中联接不同视图Linking between views in Framework7

现在我们来学习一点比较复杂的情况

我们有两个已经初始化的视图(左视图和右视图)都具有分开的导航,在这样的情况下,左视图上的链接都会被加载到左视图上,右视图的也是这样。

但是我们现在需要将左视图上的链接加载到右视图上面,这就是我们需要学习的联接不同视图(lingking between views)。我们已经知道怎样通过javascript去实现,使用.loadPage.goBack这两个视图方法。

在framework7的框架下,我们可以不必使用到javascript,我们只需要在HTML上添加data-view属性到链接上就可以达到上述目标。'data-view'必须包含特定页面的CSS选择器:

  1. <body>
  2. ...
  3. <!-- Views -->
  4. <div class="views">
  5. <!-- Left view -->
  6. <div class="view view-main left-view">
  7. <!-- Pages -->
  8. <!-- These links will load pages to this Left view -->
  9. <a href="about.html"> About </a>
  10. <a href="services.html"> Services </a>
  11. <!-- This link will load pages to Right view -->
  12. <a href="products.html" data-view=".right-view"> Products </a>
  13. </div>
  14. <!-- Right view -->
  15. <div class="view right-view">
  16. <!-- Pages -->
  17. <!-- These links will load pages to this Right view -->
  18. <a href="products.html"> Products </a>
  19. <a href="contacts.html"> Contacts </a>
  20. <!-- This link will load pages to Left view -->
  21. <a href="about.html" data-view=".left-view"> About </a>
  22. <a href="services.html" data-view=".left-view"> Services </a>
  23. <!-- This link will trigger Go Back in Left view -->
  24. <a href="#" class="back" data-view=".left-view"> About </a>
  25. </div>
  26. </div>
  27. ...
  28. </body>

这是十分简单的,只要通过CSS选择器添加了data-view属性就可以了。

我们通过这个例子去了解如何通过左视图的底部链接去控制主视图(视图分割案例"Split View Application" example

下一步

到现在为止,我们已经了解了全部关于应用主结构,联接或加载页面的全部知识,下面就是要填充其他部件了。让我们从最重要的部件开始--导航条和工具条Navbars & Toolbars

导航条及工具条布局类型Navbars & Toolbars Layout

在给我们的应用添加导航条和工具条之前,要先确定导航条和工具条的布局类型。

framework7框架允许我们可以很灵活地使用导航条和工具条,根据他们放置在视图/页面的不同位置,可以分为以下三类。

静态布局"Static" Layout

静态布局是最少使用地一种布局方式,在这种类型的布局中,导航条和工具条只是滚动页面内容里的其中一个组成部分,每个页面都有各自的导航条和工具条:

  1. <body>
  2. ...
  3. <div class="views">
  4. <div class="view view-main">
  5. <div class="pages">
  6. <div data-page="index" class="page">
  7. <div class="page-content">
  8. <!-- Top Navbar-->
  9. <div class="navbar">
  10. <div class="navbar-inner">
  11. <div class="center">Awesome App</div>
  12. </div>
  13. </div>
  14. <!-- /End of Top Navbar-->
  15. <p>Other content goes here</p>
  16. ...
  17. <!-- Bottom Toolbar-->
  18. <div class="toolbar">
  19. <div class="toolbar-inner">
  20. Hello
  21. </div>
  22. </div>
  23. <!-- /End of Bottom Toolbar-->
  24. </div>
  25. </div>
  26. </div>
  27. </div>
  28. </div>
  29. ...
  30. </body>

固定布局"Fixed" Layout

在固定布局里,各个页面都有他们自己导航条和工具条,但是他们总是在屏幕中是可见的,他们不会随着页面滚动而滚动:

  1. <body>
  2. ...
  3. <div class="views">
  4. <div class="view view-main">
  5. <div class="pages">
  6. <!-- Now we need additional "navbar-fixed" and "toolbar-fixed" classes on Page -->
  7. <div data-page="index" class="page navbar-fixed toolbar-fixed">
  8. <!-- Top Navbar-->
  9. <div class="navbar">
  10. <div class="navbar-inner">
  11. <div class="center">Awesome App</div>
  12. </div>
  13. </div>
  14. <!-- /End of Top Navbar-->
  15. <div class="page-content">
  16. <p>Other content goes here</p>
  17. ...
  18. </div>
  19. <!-- Bottom Toolbar-->
  20. <div class="toolbar">
  21. <div class="toolbar-inner">
  22. Hello
  23. </div>
  24. </div>
  25. <!-- /End of Bottom Toolbar-->
  26. </div>
  27. </div>
  28. </div>
  29. </div>
  30. ...
  31. </body>

固定布局和静态布局之间的差异如下:

注意:如果你想在一个单一视图中的每个页面都使用固定的布局,你只要在pages(<div class="pages">)这一父节点中使用"navbar-fixed"class和"toolbar-fixed"class,就可以了。

全局布局"Through" Layout

这一种布局是最有趣和用得最多的一种布局,在单一页面中,导航条和工具都是固定在总视图的同一位置。在这种布局中,你要设置为动态导航条Dynamic Naybar,(但要在应用初始化中设置):

  1. <body>
  2. ...
  3. <div class="views">
  4. <div class="view view-main">
  5. <!-- Top Navbar-->
  6. <div class="navbar">
  7. <div class="navbar-inner">
  8. <div class="center">Awesome App</div>
  9. </div>
  10. </div>
  11. <!-- /End of Top Navbar-->
  12. <!-- Now we need additional "navbar-through" and "toolbar-through" classes on Pages -->
  13. <div class="pages navbar-through toolbar-through">
  14. <div data-page="index" class="page">
  15. <div class="page-content">
  16. <p>Other content goes here</p>
  17. ...
  18. </div>
  19. </div>
  20. </div>
  21. <!-- Bottom Toolbar-->
  22. <div class="toolbar">
  23. <div class="toolbar-inner">
  24. Hello
  25. </div>
  26. </div>
  27. <!-- /End of Bottom Toolbar-->
  28. </div>
  29. </div>
  30. ...
  31. </body>

全局布局与静态布局、固定布局的差异在于

混合布局Mixed Layout

针对不同的视图,使用不同的导航条和工具条布局,如:在单一视图中可以使用固定布局或全局布局。不过你也可以在单一视图里混合使用这些布局。例如:你可以设置成全局导航条和固定工具条:

  1. <body>
  2. ...
  3. <div class="views">
  4. <div class="view view-main">
  5. <!-- Top Navbar-->
  6. <div class="navbar">
  7. <div class="navbar-inner">
  8. <div class="center">Awesome App</div>
  9. </div>
  10. </div>
  11. <!-- /End of Top Navbar-->
  12. <!-- Now we need additional "navbar-through" and "toolbar-fixed" classes on Pages -->
  13. <div class="pages navbar-through fixed-through">
  14. <div data-page="index" class="page">
  15. <div class="page-content">
  16. <p>Other content goes here</p>
  17. ...
  18. </div>
  19. <!-- Bottom Toolbar-->
  20. <div class="toolbar">
  21. <div class="toolbar-inner">
  22. Hello
  23. </div>
  24. </div>
  25. <!-- /End of Bottom Toolbar-->
  26. </div>
  27. </div>
  28. </div>
  29. </div>
  30. ...
  31. </body>

### 不带导航条/工具条No Navbar/Toolbar

当然在你的应用中可以完全不使用导航条或工具条,甚至两者都不用,只要在page/pages/view上不添加相应的class就可以了(如"navbar-fixed", "navbar-through", "toolbar-fixed", "toolbar-through")。

### 备忘录Cheat sheet

就如你所见,这些布局都是很容易理解和使用的,他们的不同在相应的父节点和嵌套结构使用不同的class。下面是他们的html结构的备忘录:

静态Static

  1. .view
  2. .pages
  3. .page
  4. .page-content
  5. .navbar
  6. // other page content
  7. .toolbar

固定Fixed

  1. .view
  2. .pages.navbar-fixed.navbar-through
  3. .page
  4. .navbar
  5. .page-content
  6. .toolbar

全局Through

  1. .view
  2. .navbar
  3. .pages.navbar-through.toolbar-through
  4. .page
  5. .page-content
  6. .toolbar

导航条Navbar

导航条是包含了页面的题目和导航元素固定(固定布局和全局中)屏幕最上方。

导航条可以分为左、中、右三个部分,每个部分都可以嵌套进任何的Html元素,不过我们建议按照以下的方式使用:

导航条的布局Navbar Layout

导航条的布局是相当简单的:

  1. <div class="navbar">
  2. <div class="navbar-inner">
  3. <div class="left">Left</div>
  4. <div class="center">Center</div>
  5. <div class="right">Right</div>
  6. </div>
  7. </div>

要注意的是导航条的中间部分,在宽度设置上的权重是最低的,这意味着当窗口调整大小所造成的三个部分在导航条放不下的话,中间部分会被剪裁掉

所以如果你在中间部分使用了过多的文字,当文字被裁减,文字结尾部分会显示成省略号。所以当你在那个部分使用自定义元素时需要十分注意。

如果导航条左部和右部是链接的话,你只需要使用带有linkclass的<a>标签就可以了:

  1. <div class="navbar">
  2. <div class="navbar-inner">
  3. <div class="left">Left</div>
  4. <div class="center">Center</div>
  5. <div class="right">Right</div>
  6. </div>
  7. </div>

使用linkclass不是必须的,但我们推荐这样使用,因为这可以附加上相应的链接样式和透明效果。

没什么额外的知识,只要在相应的部分多加<a class="link"

  1. <div class="navbar">
  2. <div class="navbar-inner">
  3. <div class="left">
  4. <a href="#" class="link">Left 1</a>
  5. <a href="#" class="link">Left 2</a>
  6. </div>
  7. <div class="center">Center</div>
  8. <div class="right">
  9. <a href="#" class="link">Right 1</a>
  10. </div>
  11. </div>
  12. </div>

这样的导航条与之前的有一些不同,在这种情况下,我们需要将文字嵌套在<span>标签里,因为在动画时需要给图标和文字留出足够的空位:

  1. <div class="navbar">
  2. <div class="navbar-inner">
  3. <div class="left">
  4. <a href="#" class="link">
  5. <i class="icon icon-back-blue"></i>
  6. <span>Back</span>
  7. </a>
  8. </div>
  9. <div class="center">Center</div>
  10. <div class="right">
  11. <a href="#" class="link">
  12. <i class="icon icon-bars-blue"></i>
  13. <span>Menu</span>
  14. </a>
  15. </div>
  16. </div>
  17. </div>

如果你的链接只需要图标和不需要文字,我们需要添加额外的"icon-only"class到链接上,在这个class的作用下,图标的大小会呈现成44*44px,这可以避免用户忽略了图标:

  1. <div class="navbar">
  2. <div class="navbar-inner">
  3. <div class="left">
  4. <a href="#" class="link icon-only">
  5. <i class="icon icon-back-blue"></i>
  6. </a>
  7. </div>
  8. <div class="center">Center</div>
  9. <div class="right">
  10. <a href="#" class="link icon-only">
  11. <i class="icon icon-bars-blue"></i>
  12. </a>
  13. </div>
  14. </div>
  15. </div>

相关的视图对象方法Related View methods

我们可以使用以下与导航条相关的视图方法去初始化我们的应用:

view.hideNavbar() Hide navbar in this View
view.showNavbar() Show navbar in this View

以下是相关的代码示例:

  1. var myApp = new Framework7();
  2. var $ = Framework7.$;
  3. var mainView = myApp.addView('.view-main');
  4. $('.hide-navbar').on('click', function () {
  5. mainView.hideNavbar();
  6. });
  7. $('.show-navbar').on('click', function () {
  8. mainView.showNavbar();
  9. });

自动隐藏导航条Hide Navbar automatically

当使用Ajax加载某些不需要导航条页面的时候,Framework7框架可以允许你自动隐藏导航条。当你使用全局布局的时候这是十分有用的。

要使用这种效果的时候,需要给已经加载好的页面添加"no-navbar"class,和使用不带内容的导航条:

  1. <!-- Empty Navbar -->
  2. <div class="navbar">
  3. <div class="navbar-inner">
  4. </div>
  5. </div>
  6. <!-- Page has additional "no-navbar" class -->
  7. <div data-page="about" class="page no-navbar">
  8. <div class="page-content">
  9. <div class="content-block">
  10. <p><a href="#" class="back button">Go Back</a></p>
  11. ...
  12. </div>
  13. </div>
  14. </div>

与导航条相关的应用方法Related App methods

myApp.sizeNavbars(viewContainer)
  • viewContainer - CSS Selector string or HTMLEelement. URL of page to load

Call this method to recalculate positional styles for Navbar in selected View. For example: myApp.sizeNavbars('.view-main')

It could be useful after you change some of Navbar elements dynamically.

动态导航条Dynamic Navbar

iOS7其中一个精彩的特性就是动态导航条。当离开页面的时候导航条会跟随滑动并淡出,当返回页面的时候导航条会重新出现。

  • 动态导航条只能在导航条是全局布局时有效。
  • 动态导航条需要在页面初始设置时转入dynamicNavbar: true参数。

动态导航条布局Dynamic Navbar Layout

动态导航条的布局跟平常的导航条一样,唯一不同点时,可以添加额外的class在相应的导航条部分(左部、中部或者右部),以此来在相应部分添加上相应的过渡效果。

  • 当不添加任何class时,导航条预设有淡出效果。
  • 如果你添加slidingclass,导航条会有滑动效果。
  • 为了统一用户体验,在导航条的相同部分应该固定一种过渡效果

预设(淡化)过渡

  1. <!-- Navbar on index page -->
  2. <div class="navbar">
  3. <div class="navbar-inner">
  4. <div class="left">
  5. <a href="#" class="link">Home Left</a>
  6. </div>
  7. <div class="center">Home</div>
  8. <div class="right">
  9. <a href="#" class="link">Home Right</a>
  10. </div>
  11. </div>
  12. </div>
  13. <!-- Navbar on about page -->
  14. <div class="navbar">
  15. <div class="navbar-inner">
  16. <div class="left">
  17. <a href="#" class="link">About Left</a>
  18. </div>
  19. <div class="center">About</div>
  20. <div class="right">
  21. <a href="#" class="link">About Right</a>
  22. </div>
  23. </div>
  24. </div>

滑动过渡Sliding transition

滑动效果应该使用得更加谨慎,因为他反映出了页面间的链接路径。

  1. <!-- Navbar on index page -->
  2. <div class="navbar">
  3. <div class="navbar-inner">
  4. <!-- Left part doesn't related to other pages, let's fade it out -->
  5. <div class="left">
  6. <a href="#" class="link">Home Left</a>
  7. </div>
  8. <!-- Center and Right parts reflect page title and page links, let's slide them -->
  9. <div class="center sliding">Home</div>
  10. <div class="right sliding">
  11. <a href="about.html" class="link">About</a>
  12. </div>
  13. </div>
  14. </div>
  15. <!-- Navbar on about page -->
  16. <div class="navbar">
  17. <div class="navbar-inner">
  18. <!-- Now, Left and Center parts reflect page title and page links, let's slide them -->
  19. <div class="left sliding">
  20. <a href="#" class="link back">Home</a>
  21. </div>
  22. <div class="center sliding">About</div>
  23. <!-- Right part doesn't related to other pages -->
  24. <div class="right">
  25. <a href="#" class="link icon-only">
  26. <i class="icon icon-bars-blue"></i>
  27. </a>
  28. </div>
  29. </div>
  30. </div>

如果你使用预设的返回链接图标(图标+单词“Back”),你可以在上面添加额外的动画,使得与iOS7更像。要达到这种效果要在应用初始化时,传入animateNavBackIcon: true参数,在导航条的左部使用backclass,在布局上没有其他区别。

工具条Toolbar

toolbar是固定在页面底部(使用固定和全局布局)作为导航元素的部分,工具条内部没有分部分,只是一个个平面排列的链接。

工具条布局Toolbar layout

工具条布局是十分简单的,如下面的示例代码:

  1. <div class="toolbar">
  2. <div class="toolbar-inner">
  3. <a href="#" class="link">Link 1</a>
  4. <a href="#" class="link">Link 2</a>
  5. <a href="#" class="link">Link 3</a>
  6. </div>
  7. </div>

在默认设置中,包含在工具条里的链接没有区分层级,每个链接的间距都是一样的。

相关的视图方法Related View methods

如果你已经初始化视图,可以使用以下的方法对工具条进行控制;

view.hideToolbar() Hide toolbar in this View
view.showToolbar() Show toolbar in this View

以下是相关的示例代码:

  1. var myApp = new Framework7();
  2. var $ = Framework7.$;
  3. var mainView = myApp.addView('.view-main');
  4. $('.hide-toolbar').on('click', function () {
  5. mainView.hideToolbar();
  6. });
  7. $('.show-toolbar').on('click', function () {
  8. mainView.showToolbar();
  9. });

自动隐藏工具条Hide Toolbar automatically

当你使用全局布局时,Framework7可以让你在通过ajax加载时自动隐藏或显示工具条。

要进行这样的设置,你只需在加载的页面上添加"no-toolbar"class(<div class="page no-toolbar">),并且不在视图里设置工具条,示例代码如下:

  1. !-- Page has additional "no-toolbar" class -->
  2. <div data-page="about" class="page no-toolbar">
  3. <div class="page-content">
  4. <div class="content-block">
  5. <p><a href="#" class="back button">Go Back</a></p>
  6. ...
  7. </div>
  8. </div>
  9. </div>

标签条Tab bar

标签条是工具条的一个特殊类型,它包含了图标(有时图标带有标签),而不只是单纯的链接,并使用在tab布局类型上。

标签条布局Tab bar layout

标签条布局基本与工具条布局一致,但带有额外的"tabbar"class:

  1. <div class="toolbar tabbar">
  2. <div class="toolbar-inner">
  3. <a href="#tab1" class="tab-link active">
  4. <i class="icon demo-icon-1"></i>
  5. </a>
  6. <a href="#tab2" class="tab-link">
  7. <i class="icon demo-icon-2"></i>
  8. </a>
  9. <a href="#tab3" class="tab-link">
  10. <i class="icon demo-icon-3"></i>
  11. </a>
  12. <a href="#tab4" class="tab-link">
  13. <i class="icon demo-icon-4"></i>
  14. </a>
  15. </div>
  16. </div>

在默认的设置中,所有的标签条里的内容都是同级的,并且相互间的间距都是一样。但是有以下两点关于链接大小需要注意的事项:

  • 在iPhone上,所有链接的间距都相等,等于[screen width] / [number of links];
  • 在iPad上,所有链接居中分布,并且最小间距为105px;

在图标上添加提示标签Add badges to icons

如果你需要在标签图标上添加提示标签,就要在<span>元素里嵌套<span class="badge">,示例代码如下:

  1. <div class="toolbar tabbar">
  2. <div class="toolbar-inner">
  3. <a href="#tab1" class="tab-link active">
  4. <i class="icon demo-icon-1"></i>
  5. </a>
  6. <a href="#tab2" class="tab-link">
  7. <i class="icon demo-icon-2">
  8. <span class="badge badge-red">5</span>
  9. </i>
  10. </a>
  11. <a href="#tab3" class="tab-link">
  12. <i class="icon demo-icon-3"></i>
  13. </a>
  14. <a href="#tab4" class="tab-link">
  15. <i class="icon demo-icon-4">
  16. <span class="badge badge-green">15</span>
  17. </i>
  18. </a>
  19. </div>
  20. </div>

带有名称的标签条Tab bar with labels

如果需要再加上文字提示需要再添加"tabbar-labels"class,并且需要再链接里嵌套<span class="tabbar-label">:

  1. <div class="toolbar tabbar tabbar-labels">
  2. <div class="toolbar-inner">
  3. <a href="#tab1" class="tab-link active">
  4. <i class="icon demo-icon-1"></i>
  5. <span class="tabbar-label">Label 1</span>
  6. </a>
  7. <a href="#tab2" class="tab-link">
  8. <i class="icon demo-icon-2">
  9. <span class="badge badge-red">5</span>
  10. </i>
  11. <span class="tabbar-label">Label 2</span>
  12. </a>
  13. <a href="#tab3" class="tab-link">
  14. <i class="icon demo-icon-3"></i>
  15. <span class="tabbar-label">Label 3</span>
  16. </a>
  17. <a href="#tab4" class="tab-link">
  18. <i class="icon demo-icon-4"></i>
  19. <span class="tabbar-label">Label 4</span>
  20. </a>
  21. </div>
  22. </div>

注意:如果在标签上加了文字后,标签条的高度会变成55px,而不是原来的44px。

搜索条Search Bar Layout

搜索条应该放置在视图(".page")和视图内容之间(".page-content"):

  1. <div class="page">
  2. <!-- Search bar -->
  3. <form class="searchbar" data-search-list=".list-block-search" data-search-in=".item-title">
  4. <div class="searchbar-input">
  5. <input type="search" placeholder="Search">
  6. <a href="#" class="searchbar-clear"></a>
  7. </div>
  8. <a href="#" class="searchbar-cancel">Cancel</a>
  9. </form>
  10. <!-- Search bar overlay-->
  11. <div class="searchbar-overlay"></div>
  12. <!-- Page content -->
  13. <div class="page-content">
  14. <div class="content-block searchbar-not-found">
  15. Nothing found
  16. </div>
  17. <div class="list-block list-block-search searchbar-found">
  18. <ul>
  19. ... list view items ...
  20. </ul>
  21. </div>
  22. </div>
  23. </div>

相关的class和标签使用如下:

-form class="searchbar" - 意味着这是一个搜索条容器,它不一定要在form元素里使用,但这是推荐的做法;
--div class="searchbar-input" - 搜索区和取消按钮的容器;
---input type="search" - 搜索区;
---a class="searchbar-clear" - 清除输入值或者重置搜索结果按钮,可选项;
--a class="searchbar-cancel" - 搜索条取消按钮,不激活搜索条,重置搜索结果,清除输入内容,可选项;
-data-search-list - 包含搜索列表区的CSS选择符属性,可选项,如果不设置,搜索条会搜索不了结果;
-data-search-in - 包含搜索区域的CSS选择符属性,通常用于搜索元素的标题,可选项,如果不设置,搜索条会搜索不了结果;
-div class="searchbar-overlay" - 在搜索条下面添加这个标签,当搜索条被激活时,页面被覆盖黑色蒙版,可选项;
-"searchbar-found" - 当搜索条根据搜索条件找到相关元素后,在元素上添加该class,可以显示;预设是可见的,可选项;
-"searchbar-not-found" - 当搜索条根据搜索条件找不到相关元素后,在元素上添加该class,可以显示;预设是不可见的,可选项;

搜索条例子Search Bar Example

  1. <div data-page="home" class="page">
  2. <!-- Search bar -->
  3. <form data-search-list=".list-block-search" data-search-in=".item-title" class="searchbar">
  4. <div class="searchbar-input">
  5. <input type="search" placeholder="Search"><a href="#" class="searchbar-clear"></a>
  6. </div><a href="#" class="searchbar-cancel">Cancel</a>
  7. </form>
  8. <!-- Search bar overlay -->
  9. <div class="searchbar-overlay"></div>
  10. <div class="page-content">
  11. <!-- This block will be displayed if nothing found -->
  12. <div class="content-block searchbar-not-found">
  13. <div class="content-block-inner">Nothing found</div>
  14. </div>
  15. <!-- This block will be displayed if anything found, and this list block is used a searbar target -->
  16. <div class="list-block list-block-search searchbar-found">
  17. <ul>
  18. <li class="item-content">
  19. <div class="item-inner">
  20. <div class="item-title">Acura </div>
  21. </div>
  22. </li>
  23. <li class="item-content">
  24. <div class="item-inner">
  25. <div class="item-title">Audi</div>
  26. </div>
  27. </li>
  28. ...
  29. </ul>
  30. </div>
  31. </div>
  32. </div>

搜索条javascript事件Search Bar JavaScript Events

事件 目标 描述
search List View specified in "data-search-list"<div class="list-block"> Event will be triggered during search (search field change). Event detail contains search query (e.detail.query) and array of found HTML elements (e.detail.foundItems)
clearSearch List View specified in "data-search-list"<div class="list-block"> Event will be triggered when user clicks on Search Bar's "clear" element (a href="#" class="searchbar-clear")
enableSearch List View specified in "data-search-list"<div class="list-block"> Event will be triggered when Search Bar becomes active
disableSearch List View specified in "data-search-list"<div class="list-block"> Event will be triggered when Search Bar becomes inactive - when user clicks on "Cancel" button (a href="searchbar-cancel") or on "searchbar-overlay" element

相关方法Related App Methods

myApp.destroySearchbar(searchbarContainer) - detach all search bar events and actions

myApp.initSearchbar(pageContainer) - attach all search bar events and actions again after you destroy them

状态条覆盖Status bar overlay

iOS7可以让你制作全屏应用,但这又要可能会覆盖掉状态条。
不好的示例:
不好的示例

好的示例
好的示例

Framework7可以自动帮你这个问题。它会自动检测你的应用是否全屏应用,如果处于全屏状态,会自动添加"with-statusbar-overlay"class到<html>(当不处于全屏状态时,会移除这个class)。"with-statusbar-overlay"class(当应用是全屏模式时),会在应用头部添加20px的内边距。

如果我们想控制状态条的颜色时,我们要在<body>中添加<div class="statusbar-overlay">,示例代码如下:

  1. ...
  2. <body>
  3. <div class="statusbar-overlay"></div>
  4. ...

这个"statusbar-overlay"的div标签会固定在屏幕的顶端,默认设置是隐藏的,只有当应用是全屏模式和<html>带有"with-statusbar-overlay"class时,才是可见的。

我们可以通过css使得状态条变成粉色:

  1. .statusbar-overlay {
  2. background: pink;
  3. }

通过这样的逻辑,我们可以十分方便地去控制状态条的背景,还可以动态调节它的背景。例如,当我们设置了深色带覆盖效果的左部panel,当panel打开时我们可以让状态条变成黑色:

  1. /* Default Status bar background */
  2. .statusbar-overlay {
  3. background: pink;
  4. /* We can add transition for smooth color animation */
  5. -webkit-transition: 400ms;
  6. transition: 400ms;
  7. }
  8. /* Change Status bar background when panel opened */
  9. body.with-panel-left-cover .statusbar-overlay {
  10. background: #222;
  11. }

注意:1.当应用是主屏幕应用时,它的颜色通常是白色的,所以无需调整;2.在phonegap中它的默认颜色是黑色,并且需要使用插件如cordova-plugin-statusbar去修改。

侧边栏Side Panels

在这章,我们看一下如何添加侧边栏。我们最多可以添加最多两个侧边栏,一个在左边,一个在右边。我们要在body部分一开始就添加侧边栏的html布局:

  1. <body>
  2. <!-- First, we need to add Panel's overlay that will overlays app while panel is opened -->
  3. <div class="panel-overlay"></div>
  4. <!-- Left panel -->
  5. <div class="panel panel-left">
  6. ... panel content goes here ...
  7. </div>
  8. <!-- Right panel -->
  9. <div class="panel panel-right">
  10. ... panel content goes here ...
  11. </div>
  12. ...
  13. </body>

在添加了相关的html标签后,我们要选择侧边栏的打开特效,总共有两个特效可以选择:“Reveal”(侧边栏将整个应用的内容移出),“cover”(侧边栏覆盖在应用内容上)。如果你使用“Reveal”效果,需要添加额外的panel-revealclass到侧边栏上,如果使用“Cover”效果则添加panel-cover

  1. <body>
  2. <!-- First, we need to add Panel's overlay that will overlays app while panel is opened -->
  3. <div class="panel-overlay"></div>
  4. <!-- Left panel, let it be with reveal effect -->
  5. <div class="panel panel-left panel-reveal">
  6. ... panel content goes here ...
  7. </div>
  8. <!-- Right panel, with cover effect -->
  9. <div class="panel panel-right panel-cover">
  10. ... panel content goes here ...
  11. </div>
  12. ...
  13. </body>

打开或关闭侧边栏Open and Close Panels

HTML上操作
当我们在应用上设置了侧边栏之后,我们需要知道如何打开和关闭。

  • 当我们要打开侧边栏,我们需要添加open-panelclass到任何的html元素(推荐是添加到链接上);
  • 当我们要关闭侧边栏,我们需要添加close-panelclass到任何的html元素(推荐是添加到链接上);
  • 如果你设置了两个侧边栏,默认是打开和关闭左边的侧边栏;
  • 当你想控制打/关闭的是哪个侧边栏,可以在控制打开和关闭的元素上添加data-panel="left"属性;

根据上面的规范,相关的示例代码如下:

  1. <body>
  2. <!-- Panels Overlay -->
  3. <div class="panel-overlay"></div>
  4. <!-- Left Panel with Reveal effect -->
  5. <div class="panel panel-left panel-reveal">
  6. <div class="content-block">
  7. <p>Left Panel content here</p>
  8. <!-- Click on link with "close-panel" class will close panel -->
  9. <p><a href="#" class="close-panel">Close me</a></p>
  10. <!-- Click on link with "open-panel" and data-panel="right" attribute will open Right panel -->
  11. <p><a href="#" data-panel="right" class="open-panel">Open Right Panel</a></p>
  12. </div>
  13. </div>
  14. <!-- Right Panel with Cover effect -->
  15. <div class="panel panel-right panel-cover">
  16. <div class="content-block">
  17. <p>Right Panel content here</p>
  18. <!-- Click on link with "close-panel" class will close panel -->
  19. <p><a href="#" class="close-panel">Close me</a></p>
  20. <!-- Click on link with "open-panel" and data-panel="left" attribute will open Left panel -->
  21. <p><a href="#" data-panel="left" class="open-panel">Open Left Panel</a></p>
  22. </div>
  23. </div>
  24. ...
  25. <div class="page-content">
  26. <div class="content-block">
  27. <!-- If no data-panel attribute, Left panel will be opened by default -->
  28. <p><a href="#" class="open-panel">Open Left Panel</a></p>
  29. <!-- Click on link with "open-panel" and data-panel="right" attribute will open Right panel -->
  30. <p><a href="#" data-panel="right" class="open-panel">Open Right Panel</a></p>
  31. </div>
  32. </div>
  33. ...
  34. </body>

使用javascript控制

我们也可以使用javascript通过相关的应用方法进行控制。

myApp.openPanel(position) - open Panel.
- position - string - Position of panel to open: "left" or "right". Required.
myApp.closePanel() - close currently opened Panel.

示例代码如下:

  1. <body>
  2. <div class="panel-overlay"></div>
  3. <div class="panel panel-left panel-reveal">
  4. <div class="content-block">
  5. <p>Left Panel content here</p>
  6. <p><a href="#" class="panel-close">Close me</a></p>
  7. <p><a href="#" class="open-right-panel">Open Right Panel</a></p>
  8. </div>
  9. </div>
  10. <div class="panel panel-right panel-cover">
  11. <div class="content-block">
  12. <p>Right Panel content here</p>
  13. <p><a href="#" class="panel-close">Close me</a></p>
  14. <p><a href="#" class="open-left-panel">Open Left Panel</a></p>
  15. </div>
  16. </div>
  17. ...
  18. <div class="page-content">
  19. <div class="content-block">
  20. <p><a href="#" class="open-left-panel">Open Left Panel</a></p>
  21. <p><a href="#" class="open-right-panel">Open Right Panel</a></p>
  22. </div>
  23. </div>
  24. ...
  25. <script>
  26. var myApp = new Framework7();
  27. var $$ = Framework7.$;
  28. $$('.open-left-panel').on('click', function (e) {
  29. // 'left' position to open Left panel
  30. myApp.openPanel('left');
  31. });
  32. $$('.open-right-panel').on('click', function (e) {
  33. // 'right' position to open Right panel
  34. myApp.openPanel('right');
  35. });
  36. $$('.panel-close').on('click', function (e) {
  37. myApp.closePanel();
  38. });
  39. </script>
  40. </body>

侧边栏事件Panel Events

侧边栏事件可以十分有效地用于检测用户是如何跟你的侧边栏进行交互的,或者在侧边栏处于打开或关闭时使用javascript进行控制。

事件 目标 描述
open Panel Element<div class="panel"> Event will be triggered when Panel starts its opening animation
opened Panel Element<div class="panel"> Event will be triggered after Panel completes its opening animation
close Panel Element<div class="panel"> Event will be triggered when Panel starts its closing animation
closed Panel Element<div class="panel"> Event will be triggered after Panel completes its closing animation

下面是示例代码:

  1. var myApp = new Framework7();
  2. var $$ = Framework7.$;
  3. $$('.panel-left').on('opened', function () {
  4. myApp.alert('Left panel opened!');
  5. });
  6. $$('.panel-left').on('close', function () {
  7. myApp.alert('Left panel is closing!');
  8. });
  9. $$('.panel-right').on('open', function () {
  10. myApp.alert('Right panel is opening!');
  11. });
  12. $$('.panel-right').on('closed', function () {
  13. myApp.alert('Right panel closed!');
  14. });

滑动打开侧边栏

framework7可以让你使用滑动的手势打开侧边栏,限制:只有一个侧边栏可以使用滑动打开(左边或者右边)

要使用这个特性,我们要在应用初始App initialization的时候传入参数:

  1. var myApp = new Framework7({
  2. swipePanel: 'left'
  3. });

监测侧边栏是否打开Panel is Opened?

有时候监测侧边栏是否已经打开是很有用的。这是很简单的一件事情,当侧边栏处于打开状态,<body>会根据以下的规则生成并添加class:with-panel-[position]-[effect]:

你可以使用javascript去监测相关特性:

  1. if ($$('body').hasClass('with-panel-left-cover')) {
  2. console.log('Left Panel is opened')
  3. }

或者在css上添加额外的样式:

  1. /* Change Status Bar background when panel is opened */
  2. body.with-panel-left-cover .statusbar-overlay{
  3. background-color: #333;
  4. }

内容块Content block

内容块是设计(主要)用于添加额外格式和空隔的文本

  1. ...
  2. <div class="page-content">
  3. <p>This paragraph is outside of content block. Not cool, but useful for any custom elements with custom styling.</p>
  4. <!-- Content block -->
  5. <div class="content-block">
  6. <p>Here comes paragraph within content block. Donec et nulla auctor massa pharetra adipiscing ut sit amet sem. Suspendisse molestie velit vitae mattis tincidunt. Ut sit amet quam mollis, vulputate turpis vel, sagittis felis. </p>
  7. </div>
  8. <!-- We can wrap content with additional "content-block-inner" element for additional highlighting -->
  9. <div class="content-block">
  10. <div class="content-block-inner">Here comes another text block additionaly wrapped with "content-block-inner". Praesent nec imperdiet diam. Maecenas vel lectus porttitor, consectetur magna nec, viverra sem. Aliquam sed risus dolor. Morbi tincidunt ut libero id sodales. Integer blandit varius nisi quis consectetur. </div>
  11. </div>
  12. <!-- Add ".content-block-title" to add block's title -->
  13. <div class="content-block-title">Content block title</div>
  14. <div class="content-block">
  15. <p>Donec et nulla auctor massa pharetra adipiscing ut sit amet sem. Suspendisse molestie velit vitae mattis tincidunt. Ut sit amet quam mollis, vulputate turpis vel, sagittis felis. </p>
  16. </div>
  17. <div class="content-block-title">Another ultra long content block title</div>
  18. <div class="content-block">
  19. <div class="content-block-inner">
  20. <p>Donec et nulla auctor massa pharetra adipiscing ut sit amet sem. Suspendisse molestie velit vitae mattis tincidunt. Ut sit amet quam mollis, vulputate turpis vel, sagittis felis. </p>
  21. </div>
  22. </div>
  23. </div>
  24. ...

注意:"content-block-title"只能在"content-block""list-block"之前使用。

布局网格Layout Grid

framew7使用柔性布局,使得你可以按照你需要放置你的内容:

  1. <!-- Each "cells" row should be wrapped with div class="row" -->
  2. <div class="row">
  3. <!-- Each "cell" has col-[widht in percents] class -->
  4. <div class="col-50">50%</div>
  5. <div class="col-50">50%</div>
  6. </div>
  7. <div class="row">
  8. <!-- Each "cell" has col-[widht in percents] class -->
  9. <div class="col-33">33%</div>
  10. <div class="col-33">33%</div>
  11. <div class="col-33">33%</div>
  12. </div>

默认设置的每个“表格”都有15px的间隔,如果你不想带有间隔可以添加使用no-gutterclass到rowclass那:

  1. <!-- Additional "no-gutter" class on row to remove space between cells -->
  2. <div class="row no-gutter">
  3. <!-- Each "cell" has col-[widht in percents] class -->
  4. <div class="col-50">50%</div>
  5. <div class="col-50">50%</div>
  6. </div>
  7. <div class="row">
  8. <!-- Each "cell" has col-[widht in percents] class -->
  9. <div class="col-33">33%</div>
  10. <div class="col-33">33%</div>
  11. <div class="col-33">33%</div>
  12. </div>

下面的表格列出了所有网格可用的参数:

Class Width
col-5 5%
col-10 10%
col-15 15%
col-20 20%
col-25 25%
col-33 33.333333333333336%
col-40 40%
col-50 50%
col-60 60%
col-66 66.66666666666666%
col-75 75%
col-80 80%
col-85 85%
col-90 90%
col-95 95%
col-100 100%

默认设置中的网格是没有样式,我们可以如此添加样式:

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

点击观看具体效果.

模态对话框Modal

模态对话框是一个小型的内容窗口,在它弹出的是时候会覆盖住应用页面的主要内容。模态对话框通常用于从用户上取得信息,或者通知警告用户。模态对话框跟其他覆盖窗口都被称为临时窗口。

模态对话框只能使用javascript打开,下面我们就来看一下相关的应用方法。

预定义的模态对话框Predefined Modals

  • 如果你没有对预定义的模态对话框的题目进行修改,它会使用预定义的题目("Framework7"),要自定义题目可以在应用初始化的时候传入modalTitle参数。
  • 模态对话框的按钮文字(如“ok”和“cancel”)同样是可以修改的,在应用初始化的时候传入modalButtonOkmodalButtonCancel参数。

首先,让我们了解一下在framework7里最经常使用的预测模态对话框:

提醒对话框Alert

打开一个提醒模态对话框,我们需要使用一下其中之一的应用方法
myApp.alert(text, [title, callbackOk])
or
myApp.alert(text, [callbackOk])
- text - 字符串. 提醒的语句。
- title - 字符串. 可选参数. 提醒对话框的题目。
- callbackOk - 函数. 可选参数. 当用户点击了对话框上的“ok”
按钮后,回调函数会被触发。

以上方法会返回一个动态创建的模态对话框的html标签。示例如下:

  1. <body>
  2. ...
  3. <div class="page-content">
  4. <div class="content-block">
  5. <p><a href="#" class="alert-text">Alert With Text</a></p>
  6. <p><a href="#" class="alert-text-title">Alert With Text and Title</a></p>
  7. <p><a href="#" class="alert-text-title-callback">Alert With Text and Title and Callback</a></p>
  8. <p><a href="#" class="alert-text-callback">Alert With Text and Callback</a></p>
  9. </div>
  10. </div>
  11. ...
  12. </body>
  1. var myApp = new Framework7();
  2. var $$ = Framework7.$;
  3. $$('.alert-text').on('click', function () {
  4. myApp.alert('Here goes alert text');
  5. });
  6. $$('.alert-text-title').on('click', function () {
  7. myApp.alert('Here goes alert text', 'Custom Title!');
  8. });
  9. $$('.alert-text-title-callback').on('click', function () {
  10. myApp.alert('Here goes alert text', 'Custom Title!', function () {
  11. myApp.alert('Button clicked!')
  12. });
  13. });
  14. $$('.alert-text-callback').on('click', function () {
  15. myApp.alert('Here goes alert text', function () {
  16. myApp.alert('Button clicked!')
  17. });
  18. });

确认模态对话框Confirm

确认模态对话框用于跟用户确认某些行为。打开确认模态对话框我们需要使用以下相应的应用方法:
myApp.confirm(text, [title, callbackOk, callbackCancel])
or
myApp.confirm(text, [callbackOk, callbackCancel])
- text - 字符串. 确认文本
- title - 字符串. 可选项. 确认模态对话框题目
- callbackOk - 函数. 可选项. 当用户点击了对话框上的“ok”
按钮后,回调函数会被触发。
- callbackCancel - 函数. 可选项.当用户点击了对话框上的“cancel”按钮后(即用户取消相应的行为时),回调函数会被触发。

以上方法会返回一个动态创建的模态对话框的html标签。示例如下:

  1. <body>
  2. ...
  3. <div class="page-content">
  4. <div class="content-block">
  5. <p><a href="#" class="confirm-ok">Confirm with text and Ok callback</a></p>
  6. <p><a href="#" class="confirm-ok-cancel">Confirm with text, Ok and Cancel callbacks</a></p>
  7. <p><a href="#" class="confirm-title-ok">Confirm with text, title and Ok callback</a></p>
  8. <p><a href="#" class="confirm-title-ok-cancel">Confirm with text, title, Ok and Cancel callback</a></p>
  9. </div>
  10. </div>
  11. ...
  12. </body>
  1. $$('.confirm-ok').on('click', function () {
  2. myApp.confirm('Are you sure?', function () {
  3. myApp.alert('You clicked Ok button');
  4. });
  5. });
  6. $$('.confirm-ok-cancel').on('click', function () {
  7. myApp.confirm('Are you sure?',
  8. function () {
  9. myApp.alert('You clicked Ok button');
  10. },
  11. function () {
  12. myApp.alert('You clicked Cancel button');
  13. }
  14. );
  15. });
  16. $$('.confirm-title-ok').on('click', function () {
  17. myApp.confirm('Are you sure?', 'Custom Title', function () {
  18. myApp.alert('You clicked Ok button');
  19. });
  20. });
  21. $$('.confirm-title-ok-cancel').on('click', function () {
  22. myApp.confirm('Are you sure?', 'Custom Title',
  23. function () {
  24. myApp.alert('You clicked Ok button');
  25. },
  26. function () {
  27. myApp.alert('You clicked Cancel button');
  28. }
  29. );
  30. });

对话模态对话框Prompt

对话模态对话框用于跟用户获取数据。打开该对话框可以使用以下应用方法:
myApp.prompt(text, [title, callbackOk, callbackCancel])
or
myApp.prompt(text, [callbackOk, callbackCancel])
- text - 字符串. 提出问题的文本.
- title - 字符串. 可选项. 对话框的题目.
- callbackOk - 函数. 可选项. 当用户点击“ok”按钮时,函数会被触发,并从对话框上取得函数参数.
- callbackCancel - 函数. 可选项. 当用户点击“cancel”按钮时,函数会被触发,并从对话框上取得函数参数.
以上方法会返回一个动态创建的模态对话框的html标签。示例如下:

  1. <body>
  2. ...
  3. <div class="page-content">
  4. <div class="content-block">
  5. <p><a href="#" class="prompt-ok">Prompt with text and Ok callback</a></p>
  6. <p><a href="#" class="prompt-ok-cancel">Prompt with text, Ok and Cancel callbacks</a></p>
  7. <p><a href="#" class="prompt-title-ok">Prompt with text, title and Ok callback</a></p>
  8. <p><a href="#" class="prompt-title-ok-cancel">Prompt with text, title, Ok and Cancel callback</a></p>
  9. </div>
  10. </div>
  11. ...
  12. </body>
  1. $$('.prompt-ok').on('click', function () {
  2. myApp.prompt('What is your name?', function (value) {
  3. myApp.alert('Your name is "' + value + '". You clicked Ok button');
  4. });
  5. });
  6. $$('.prompt-ok-cancel').on('click', function () {
  7. myApp.prompt('What is your name?',
  8. function (value) {
  9. myApp.alert('Your name is "' + value + '". You clicked Ok button');
  10. },
  11. function (value) {
  12. myApp.alert('Your name is "' + value + '". You clicked Cancel button');
  13. }
  14. );
  15. });
  16. $$('.prompt-title-ok').on('click', function () {
  17. myApp.prompt('What is your name?', 'Custom Title', function (value) {
  18. myApp.alert('Your name is "' + value + '". You clicked Ok button');
  19. });
  20. });
  21. $$('.prompt-title-ok-cancel').on('click', function () {
  22. myApp.prompt('What is your name?', 'Custom Title',
  23. function (value) {
  24. myApp.alert('Your name is "' + value + '". You clicked Ok button');
  25. },
  26. function (value) {
  27. myApp.alert('Your name is "' + value + '". You clicked Cancel button');
  28. }
  29. );
  30. });

登陆和密码Login and Password

有以下两种方法取得用户的授权:
1.
myApp.modalLogin(text, [title, callbackOk, callbackCancel])
or
myApp.modalLogin(text, [callbackOk, callbackCancel])
- text - 字符串. 对话框文本
- title - 字符串. 可选项. 对话框题目
- callbackOk - 函数. 可选项. 当用户点击“ok”按钮后,函数被触发. 对话框的输入会被当做用户名和密码传入
- callbackCancel - 函数. 可选项. 当用户点击“cancel”按钮后,函数被触发. 对话框的输入会被当做用户名和密码传入

2.
myApp.modalPassword(text, [title, callbackOk, callbackCancel])
or
myApp.modalPassword(text, [callbackOk, callbackCancel])
- text - 字符串. 对话框文本
- title - 字符串. 可选项. 对话框题目
- callbackOk - 函数. 可选项. 当用户点击“ok”按钮后,函数被触发. 对话框的输入会被当做密码传入
- callbackCancel - 函数. 可选项. 当用户点击“cancel”按钮后,函数被触发. 对话框的输入会被当做密码传入

示例代码:

  1. <div class="page-content">
  2. <div class="content-block">
  3. <p><a href="#" class="login-modal">Login Modal</a></p>
  4. <p><a href="#" class="password-modal">Password Modal</a></p>
  5. </div>
  6. </div>
  1. var myApp = new Framework7();
  2. var $$ = Framework7.$;
  3. $$('.login-modal').on('click', function () {
  4. myApp.modalLogin('Authentication required', function (username, password) {
  5. myApp.alert('Thank you! Username: ' + username + ', Password: ' + password);
  6. });
  7. });
  8. $$('.password-modal').on('click', function () {
  9. myApp.modalPassword('You password please:', function (password) {
  10. myApp.alert('Thank you! Your password is: ' + password);
  11. });
  12. });

嵌套模态对话框Nesting Modals

可能你已经注意到了,模态对话框可以嵌套在回调函数里:

  1. <body>
  2. ...
  3. <div class="page-content">
  4. <div class="content-block">
  5. <p><a href="#" class="name">What is your name?</a></p>
  6. </div>
  7. </div>
  8. ...
  9. </body>
  1. $$('.name').on('click', function () {
  2. myApp.prompt('What is your name?', function (value) {
  3. myApp.confirm('Are you sure that your name is ' + value + '?', function () {
  4. myApp.alert('Ok, your name is "' + value + '"!');
  5. });
  6. });
  7. });

预加载模态对话框Preloader Modal

预加载模态对话框用于作为某些后台行为的指示器(如ajax请求),以此来阻断用户与应用的交互,我们可以用相应的应用方法来打开预加载模态对话框:
myApp.showPreloader([title]) - 显示预加载模态对话框
- title - 字符串. 可选项. 预加载模态对话框题目. 如果没有设定该参数,系统默认显示"Loading",你可以在应用初始化的时候,传入modalPreloaderTitle参数来改变默认设定。

以上方法会返回一个动态创建的模态对话框的html标签。示例如下:

  1. <body>
  2. ...
  3. <div class="page-content">
  4. <div class="content-block">
  5. <p><a href="#" class="open-preloader">Open Preloader</a></p>
  6. <p><a href="#" class="open-preloader-title">Open Preloader with custom title</a></p>
  7. </div>
  8. </div>
  9. ...
  10. </body>
  1. $$('.open-preloader').on('click', function () {
  2. myApp.showPreloader();
  3. setTimeout(function () {
  4. myApp.hidePreloader();
  5. }, 2000);
  6. });
  7. $$('.open-preloader-title').on('click', function () {
  8. myApp.showPreloader('Custom Title')
  9. setTimeout(function () {
  10. myApp.hidePreloader();
  11. }, 2000);
  12. });

指示器Indicator

如果你不需要用到那么大的一个模态对话框如预加载模态对话框来指示活动的进程,你可以使用一个小型简单的指示器:
myApp.showIndicator() - 显示指示器
myApp.hideIndicator() - 关闭隐藏指示器,因为指示器没有按钮,所以它只能通过javascript进行控制

  1. <body>
  2. ...
  3. <div class="page-content">
  4. <div class="content-block">
  5. <p><a href="#" class="open-indicator">Open Indicator</a></p>
  6. </div>
  7. </div>
  8. ...
  9. </body>
  1. $$('.open-indicator').on('click', function () {
  2. myApp.showIndicator();
  3. setTimeout(function () {
  4. myApp.hideIndicator();
  5. }, 2000);
  6. });

自定义模态对话框Custom Modals

所有之前介绍的预设模态对话框只是模态对话框的一个特定部分(就像设置的快捷方式),下面我们来看一下如何去自定义模态对话框:
myApp.modal(parameters) - 显示自定义模态对话框
- parameters - 对象. 模态对话框的参数对象。

下表列出了相关的参数:

Parameter Type Default Description
title string Optional. String with Modal title (could be HTML string)
text string Optional. String with Modal text (could be HTML string)
afterText string Optional. String with text (could be HTML string) that will be placed after "text"
buttons array Optional. Array of buttons. Each button should be presented as Object with button parameters (look below)
onClick function Optional. Callback function that will be executed when user clicks any of Modal's button. As arguments it receives modal (with Modal's HTMLElement) and index (with index number of clicked button)

下表列出了按钮的相关参数:

Parameter Type Default Description
text string String with Button's text (could be HTML string)
bold boolean false Optional. Set to true for bold button text
close boolean true Optional. If "true" then modal will be closed after click on this button
onClick function Optional. Callback function that will be executed when user click this button

通过上面的参数配置,我们可以设置一个柔性的模态对话框,下面是相关示例代码:

  1. <body>
  2. ...
  3. <div class="page-content">
  4. <div class="content-block">
  5. <p><a href="#" class="open-3-modal">Modal With 3 Buttons</a></p>
  6. <p><a href="#" class="open-slider-modal">Modal With Slider</a></p>
  7. <p><a href="#" class="open-tabs-modal">Modal With Tabs</a></p>
  8. </div>
  9. </div>
  10. ...
  11. </body>
  1. $$('.open-3-modal').on('click', function () {
  2. myApp.modal({
  3. title: 'Modal with 3 buttons',
  4. text: 'Vivamus feugiat diam velit. Maecenas aliquet egestas lacus, eget pretium massa mattis non. Donec volutpat euismod nisl in posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae',
  5. buttons: [
  6. {
  7. text: 'B1',
  8. onClick: function() {
  9. myApp.alert('You clicked first button!')
  10. }
  11. },
  12. {
  13. text: 'B2',
  14. onClick: function() {
  15. myApp.alert('You clicked second button!')
  16. }
  17. },
  18. {
  19. text: 'B3',
  20. bold: true,
  21. onClick: function() {
  22. myApp.alert('You clicked third button!')
  23. }
  24. },
  25. ]
  26. })
  27. });
  28. $$('.open-slider-modal').on('click', function () {
  29. var modal = myApp.modal({
  30. title: 'Awesome Photos?',
  31. text: 'What do you think about my photos?',
  32. afterText: '<div class="slider-container" style="width: auto; margin:5px -15px">'+
  33. '<div class="slider-pagination"></div>'+
  34. '<div class="slider-wrapper">'+
  35. '<div class="slider-slide"><img src="http://hhhhold.com/270x150/jpg?1" height="150"></div>' +
  36. '<div class="slider-slide"><img src="http://hhhhold.com/270x150/jpg?2"></div>'+
  37. '</div>'+
  38. '</div>',
  39. buttons: [
  40. {
  41. text: 'Bad :('
  42. },
  43. {
  44. text: 'Awesome!',
  45. bold: true,
  46. onClick: function () {
  47. myApp.alert('Thanks! I know you like it!')
  48. }
  49. },
  50. ]
  51. })
  52. myApp.slider($$(modal).find('.slider-container'), {pagination: '.slider-pagination'});
  53. });
  54. $$('.open-tabs-modal').on('click', function () {
  55. myApp.modal({
  56. title: '<div class="buttons-row">'+
  57. '<a href="#tab1" class="button active tab-link">Tab 1</a>'+
  58. '<a href="#tab2" class="button tab-link">Tab 2</a>'+
  59. '</div>',
  60. text: '<div class="tabs">'+
  61. '<div class="tab active" id="tab1">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam convallis nunc non dolor euismod feugiat. Sed at sapien nisl. Ut et tincidunt metus. Suspendisse nec risus vel sapien placerat tincidunt. Nunc pulvinar urna tortor.</div>'+
  62. '<div class="tab" id="tab2">Vivamus feugiat diam velit. Maecenas aliquet egestas lacus, eget pretium massa mattis non. Donec volutpat euismod nisl in posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae</div>'+
  63. '</div>',
  64. buttons: [
  65. {
  66. text: 'Ok, got it',
  67. bold: true
  68. },
  69. ]
  70. })
  71. });
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注