Page
页面是用于显示应用程序内容的主要组件(容器)之一。
Page Layout
<div class="page" data-name="home">
<div class="page-content">
... 可滚动的页面内容放在这里 ...
</div>
</div>
Page Name
正如您可能注意到的,每个页面都有一个带有唯一页面名称的data-name属性。这不是必需的,但在“页面事件”或“页面回调”中可能会有用。它可以帮助我们定义加载和可用的页面,以便您可以对页面进行所需的操作。.
Page Content
所有可视内容(如列表视图、表单等)都应放在<div class="page-content">
中,它应该是<div class="page">
的子元素。这是为了正确的样式、布局和滚动而必需的。
Page Events
现在让我们来看看页面导航中最重要的部分之一,即“页面事件”。页面事件允许我们通过执行特定页面的JavaScript来操作刚加载的页面
事件 | 对象target | 描述 |
---|---|---|
page:mounted | Page Element<div class="page"> | 当新页面插入到DOM中时触发的事件。或者当具有keepAlive路由的页面被挂载/附加到DOM中时触发 |
page:init | Page Element<div class="page"> | 在Framework7初始化所需页面组件和导航栏之后触发的事件。 |
page:reinit | Page Element<div class="page"> | 导航到已经初始化的页面时触发的事件。 |
page:beforein | Page Element<div class="page"> | 在一切都初始化完成并且页面准备好过渡到视图中(到活动/当前位置)时触发的事件。 |
page:afterin | Page Element<div class="page"> | 在页面过渡到视图后触发的事件 |
page:beforeout | Page Element<div class="page"> | 在页面即将过渡出视图之前触发的事件 |
page:afterout | Page Element<div class="page"> | 在页面过渡出视图后触发的事件。 |
page:beforeunmount | Page Element<div class="page"> | 当具有keepAlive路由的页面即将从DOM中卸载/分离时触发的事件。 |
page:beforeremove | Page Element<div class="page"> | 在页面将从DOM中移除之前触发的事件。如果您需要解除一些事件/销毁一些插件以释放内存,这个事件非常有用。对于keepAlive路由,不会触发此事件。 |
page:tabshow | Page Element<div class="page"> | 当页面的父级作为选项卡的视图变为可见时触发的事件。 |
page:tabhide | Page Element<div class="page"> | 当页面的父级作为选项卡的视图变为隐藏时触发的事件 |
让我们看看如何使用这些事件。有两种方法可以添加页面事件处理程序
// Option 1. Using one 'page:init' handler for all pages
$$(document).on('page:init', function (e) {
// Do something here when page loaded and initialized
})
// Option 2. Using live 'page:init' event handlers for each page
$$(document).on('page:init', '.page[data-name="about"]', function (e) {
// Do something here when page with data-name="about" attribute loaded and initialized
})
Page Loading Sequence Classes
当新页面加载并过渡到视图(应用程序的主要可见部分)时,页面元素上会有不同的类。
当我们加载/打开新页面时,会发生以下情况:
- 当前活动页面具有
page-current
样式。 - 如果我们加载的页面不在DOM中(例如通过Ajax加载或使用模板或组件加载),它将被添加到DOM中。
- 我们加载/打开的页面将在其元素上设置额外的page-next类。
- 路由元素(
<div class="view">
)将具有额外的router-transition-forward类,执行以下操作:- 具有page-next(新页面)类的页面移入视图
- 具有page-current(当前页面)类的页面移出视图
- 过渡完成后,我们加载的新页面将具有page-current类
- 之前活动的页面将具有page-previous类
当我们加载/打开上一页(返回)时,会发生以下情况:
- 当前活动页面具有page-current类。
- 如果我们返回的页面不在DOM中(例如通过Ajax加载或使用模板或组件加载),它将被添加到DOM中。
- 我们返回的页面将在其元素上设置额外的
page-previous
类。 - 路由元素(
<div class="view">
)将具有额外的router-transition-backward
类,执行以下操作:- 具有page-previous(我们返回的页面)类的页面移入视图
- 具有page-current(当前页面)类的页面移出视图
- 过渡完成后,我们返回的新页面将具有page-current类
- 之前活动的页面将具有page-next类。如果此页面是动态添加到DOM中的,则会从DOM中删除。
Page Data
如您所见,这很简单,但是当我们只使用一个处理程序时,如何确定加载了哪个页面呢?对于这种情况,我们在事件详细信息中有页面数据:
// 在页面事件中:
$$(document).on('page:init', function (e) {
// 页面数据包含有关加载和初始化页面的所有必需信息
var page = e.detail;
})
或者,如果使用Dom7分配事件处理程序,就像上面的示例一样,它将作为第二个参数传递:
// In page events:
$$(document).on('page:init', function (e, page) {
console.log(page);
})
现在,在上面的示例中,我们在page变量中有页面数据。它是一个具有以下属性的对象:
page.app | object | 已初始化的应用程序实例 |
page.view | object | 包含此页面的视图实例(如果已初始化此视图) |
page.router | object | 包含此页面的路由器实例(如果已初始化此视图)。与page.view.router相同 |
page.name | string | 页面的data-name属性的值 |
page.el | HTMLElement | 页面元素 |
page.$el | object | 带有页面元素的Dom7实例 |
page.from | string | 过渡之前的页面位置或此页面来自的方向。如果加载新页面,则为next;如果返回到此页面,则为previous;如果此页面替换当前活动页面,则为current。 |
page.to | string | 新页面的位置或此页面前往的位置。可以是next、previous或current |
page.position | string | page.from的别名 |
page.direction | string | 页面过渡的方向(如果适用)。可以是forward或backward |
page.route | object | 与此页面关联的路由,包含用于加载此页面的当前路由数据的对象。它具有以下属性:
|
page.pageFrom | object | 当前活动页面在加载此新页面之前的页面数据。 |
Access To Page Data
如果您不使用页面事件/回调,并且需要访问页面数据,可以通过其HTMLElement上的f7Page属性进行访问:
var $$ = Dom7;
var page = $$('.page[data-name="somepage"]')[0].f7Page;
// do something with page data
CSS Variables
Below is the list of related CSS variables (CSS custom properties).
Note that commented variables are not specified by default and their values is what they fallback to in this case.
:root {
--f7-page-master-width: 320px;
--f7-page-master-border-color: rgba(0, 0, 0, 0.1);
--f7-page-master-border-width: 1px;
--f7-page-swipeback-transition-duration: 300ms;
--f7-page-parallax-transition-duration: 500ms;
--f7-page-cover-transition-duration: 450ms;
--f7-page-dive-transition-duration: 500ms;
--f7-page-fade-transition-duration: 500ms;
--f7-page-flip-transition-duration: 700ms;
--f7-page-push-transition-duration: 500ms;
/*
--f7-page-content-extra-padding-top: 0px;
--f7-page-content-extra-padding-bottom: 0px;
*/
--f7-page-title-line-height: 1.2;
--f7-page-title-text-color: inherit;
--f7-page-title-padding-left: 16px;
--f7-page-title-padding-right: 16px;
}
.ios {
--f7-page-transition-duration: 400ms;
--f7-page-title-font-size: 34px;
--f7-page-title-font-weight: 700;
--f7-page-title-letter-spacing: -0.03em;
--f7-page-title-padding-vertical: 6px;
--f7-page-bg-color: #efeff4;
}
.ios .dark,
.ios.dark {
--f7-page-bg-color: #000;
}
.md {
--f7-page-transition-duration: 400ms;
--f7-page-title-font-size: 34px;
--f7-page-title-font-weight: 500;
--f7-page-title-letter-spacing: 0;
--f7-page-title-padding-vertical: 8px;
}
.md,
.md .dark,
.md [class*='color-'] {
--f7-page-bg-color: var(--f7-md-surface);
}
.dark {
--f7-page-master-border-color: rgba(255, 255, 255, 0.2);
}