ページ
ページは、アプリのコンテンツを表示するために使用される主要なコンポーネント(コンテナ)の1つです。
ページレイアウト
<div class="page" data-name="home">
<div class="page-content">
... scrollable page content goes here ...
</div>
</div>
ページ名
お気づきかもしれませんが、各ページには一意のページ名を持つdata-name
属性があります。必須ではありませんが、「ページイベント」または「ページコールバック」内で役立つ場合があります。これにより、どのページがロードされて利用可能であるかを定義できるため、ページに必要な操作を行うことができます。
ページコンテンツ
すべての視覚コンテンツ(リストビュー、フォームなど)は、<div class="page">
の子である<div class="page-content">
内に入れる必要があります。これは、正しいスタイリング、レイアウト、スクロールのために必要です。
ページイベント
次に、ページナビゲーションの最も重要な部分の1つである「ページイベント」を見てみましょう。ページイベントを使用すると、特定のページのJavaScriptを実行することで、ロードされたばかりのページを操作できます。
イベント | ターゲット | 説明 |
---|---|---|
page:mounted | ページ要素<div class="page"> | 新しいページがDOMに挿入されたときにイベントがトリガーされます。または、keepAlive ルートを持つページがDOMにマウント/アタッチされたときにもトリガーされます |
page:init | ページ要素<div class="page"> | Framework7が必要なページのコンポーネントとナビバーを初期化した後にイベントがトリガーされます |
page:reinit | ページ要素<div class="page"> | このイベントは、既に初期化されているページに移動した場合にトリガーされます。 |
page:beforein | ページ要素<div class="page"> | すべてが初期化され、ページがビューに遷移(アクティブ/現在の位置へ)する準備ができたときにイベントがトリガーされます |
page:afterin | ページ要素<div class="page"> | ページがビューに遷移した後にイベントがトリガーされます |
page:beforeout | ページ要素<div class="page"> | ページがビューから遷移する直前にイベントがトリガーされます |
page:afterout | ページ要素<div class="page"> | ページがビューから遷移した後にイベントがトリガーされます |
page:beforeunmount | ページ要素<div class="page"> | keepAlive ルートを持つページがDOMからアンマウント/デタッチされるときにイベントがトリガーされます |
page:beforeremove | ページ要素<div class="page"> | ページがDOMから削除される直前にイベントがトリガーされます。このイベントは、メモリを解放するために一部のイベントをデタッチしたり、一部のプラグインを破棄する必要がある場合に非常に役立ちます。このイベントは、keepAlive ルートではトリガーされません。 |
page:tabshow | ページ要素<div class="page"> | ページの親であるタブとしてのViewが表示されるときにイベントがトリガーされます |
page:tabhide | ページ要素<div class="page"> | ページの親であるタブとしてのViewが非表示になるときにイベントがトリガーされます |
これらのイベントをどのように使用できるかを見てみましょう。ページイベントハンドラーを追加する方法は2つあります。
// 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-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から削除されます。
ページデータ
おわかりのように、非常に簡単ですが、1つのハンドラーのみを使用する場合、どのページがロードされているかをどのように判断しますか?この場合、イベントの詳細にページデータがあります。
// In page events:
$$(document).on('page:init', function (e) {
// Page Data contains all required information about loaded and initialized page
var page = e.detail;
})
または、上記の例のようにDom7を使用してイベントハンドラーが割り当てられている場合は、2番目の引数で渡されます。
// In page events:
$$(document).on('page:init', function (e, page) {
console.log(page);
})
上記の例では、page
変数にページデータがあります。これは、次のプロパティを持つオブジェクトです
page.app | オブジェクト | 初期化されたアプリインスタンス |
page.view | オブジェクト | このページを含むViewインスタンス(このViewが初期化されている場合) |
page.router | オブジェクト | このページを含むルーターインスタンス(このViewが初期化されている場合)。page.view.router と同じ |
page.name | 文字列 | ページのdata-name 属性の値 |
page.el | HTMLElement | ページ要素 |
page.$el | オブジェクト | ページ要素を持つDom7インスタンス |
page.from | 文字列 | 遷移前のページの位置、またはこのページがどこから来たかの方向。新しいページをロードする場合はnext 、このページに戻る場合はprevious 、またはこのページが現在アクティブなページを置き換える場合はcurrent になります。 |
page.to | 文字列 | 新しいページの位置、またはこのページがどこに行くか。同じnext 、previous 、またはcurrent になる可能性があります |
page.position | 文字列 | page.from のエイリアス |
page.direction | 文字列 | ページ遷移の方向(該当する場合)。forward またはbackward になります |
page.route | オブジェクト | このページに関連付けられたルート。このページをロードするために使用された現在のルートデータを含むオブジェクト。次のプロパティがあります。
|
page.pageFrom | オブジェクト | この新しいページの前で現在アクティブだったページのページデータ。 |
ページデータへのアクセス
ページイベント/コールバックを使用せず、ページデータにアクセスする必要がある場合は、HTMLElementのf7Page
プロパティからアクセスできます
var $$ = Dom7;
var page = $$('.page[data-name="somepage"]')[0].f7Page;
// do something with page data
CSS変数
以下は、関連するCSS変数(CSSカスタムプロパティ)のリストです。
コメントアウトされた変数はデフォルトでは指定されておらず、その値は、この場合、フォールバックするものです。
: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);
}