ダイアログ
ダイアログは、アプリのメインコンテンツの上にポップアップ表示される小さなコンテンツペインです。ダイアログは通常、ユーザーに何かを尋ねたり、ユーザーに通知または警告したりするために使用されます。ダイアログは、他のすべてのモーダルと同様に、いわゆる「一時ビュー」の一部です。
ダイアログは、JavaScriptを使用してのみ開くことができます。それでは、ダイアログを操作するための関連するアプリメソッドを見てみましょう。
ダイアログアプリメソッド
ダイアログを操作するための関連するアプリメソッドを見てみましょう。
app.dialog.create(parameters) - ダイアログインスタンスを作成します。
- parameters - object。ダイアログパラメータを持つオブジェクト。
メソッドは、作成されたダイアログのインスタンスを返します。
app.dialog.destroy(el) - ダイアログインスタンスを破棄します。
- el - HTMLElement または string (CSSセレクター付き)または object。破棄するダイアログ要素またはダイアログインスタンス。
app.dialog.get(el) - HTML要素からダイアログインスタンスを取得します。
- el - HTMLElement または string (CSSセレクター付き)。ダイアログ要素。
メソッドは、ダイアログのインスタンスを返します。
app.dialog.open(el, animate) - ダイアログを開きます。
- el - HTMLElement または string (CSSセレクター付き)。開くダイアログ要素。
- animate - boolean。アニメーション付きでダイアログを開きます。
メソッドは、ダイアログのインスタンスを返します。
app.dialog.close(el, animate) - ダイアログを閉じます。
- el - HTMLElement または string (CSSセレクター付き)。閉じるダイアログ要素。
- animate - boolean。アニメーション付きでダイアログを閉じます。
メソッドは、ダイアログのインスタンスを返します。
ダイアログパラメータ
ダイアログを作成するために必要な利用可能なパラメータのリストを見てみましょう。
パラメータ | タイプ | デフォルト | 説明 |
---|---|---|---|
el | HTMLElement string | ダイアログ要素。すでにHTMLにダイアログ要素があり、この要素を使用して新しいインスタンスを作成したい場合に役立ちます。 | |
containerEl | HTMLElement string | アプリのルート要素(app.el )ではなく、カスタム要素にダイアログをマウントできます。 | |
backdrop | boolean | true | ダイアログの背景(背後の暗い半透明のレイヤー)を有効にします。 |
closeByBackdropClick | boolean | false | 有効にすると、背景をクリックするとダイアログが閉じます。 |
animate | boolean | true | ダイアログをアニメーション付きで開閉するかどうか。.open() および.close() メソッドで上書きできます。 |
title | string | ダイアログタイトル | |
text | string | ダイアログの内部テキスト | |
content | string | ダイアログテキストに続くカスタムダイアログコンテンツ。任意のHTMLコンテンツを受け入れることができます。 | |
buttons | array | [] | ダイアログボタンの配列。各ボタンは、ボタンパラメータを持つオブジェクトです。 |
verticalButtons | boolean | false | 垂直ボタンレイアウトを有効にします。 |
destroyOnClose | boolean | false | 有効にすると、ダイアログが閉じると自動的に破棄されます。 |
onClick | function(dialog, index) | ダイアログボタンのクリック後に実行されるコールバック関数。引数として、ダイアログインスタンスとクリックされたボタンのインデックス番号を受け取ります。 | |
cssClass | string | 追加する追加のCSSクラス | |
on | object | イベントハンドラーを持つオブジェクト。例:
|
ボタンパラメータ
buttons
配列の各ボタンは、ボタンパラメータを持つオブジェクトとして表す必要があります。
パラメータ | タイプ | デフォルト | 説明 |
---|---|---|---|
text | string | ボタンのテキストを含む文字列(HTML文字列でも可) | |
strong | boolean | false | ボタンテキストを太字にします。 |
color | string | ボタンの色。デフォルトの色のいずれか。 | |
close | boolean | true | 有効にすると、ボタンをクリックするとダイアログが閉じます。 |
cssClass | string | 追加のボタンCSSクラス | |
keyCodes | array | [] | ボタンのクリックをトリガーするために使用されるキーボードキーコードの配列。たとえば、キーコード13 は、Enterキーを押すとボタンのクリックがトリガーされることを意味します。 |
onClick | function(dialog, e) | このボタンをクリックした後に実行されるコールバック関数。 |
ダイアログメソッドとプロパティ
ダイアログを作成するには、次のコードを呼び出す必要があります。
var dialog = app.dialog.create({ /* parameters */ })
その後、便利なメソッドとプロパティを持つ初期化されたインスタンス(上記の例のdialog
変数など)があります。
プロパティ | |
---|---|
dialog.app | グローバルアプリインスタンスへのリンク |
dialog.el | ダイアログHTML要素 |
dialog.$el | ダイアログHTML要素を持つDom7インスタンス |
dialog.backdropEl | 背景HTML要素 |
dialog.$backdropEl | 背景HTML要素を持つDom7インスタンス |
dialog.params | ダイアログパラメータ |
dialog.opened | ダイアログが開いているかどうかを示すブール値のプロパティ |
メソッド | |
dialog.open(animate) | ダイアログを開きます。ここで
|
dialog.close(animate) | ダイアログを閉じます。ここで
|
dialog.setProgress(progress, duration) | ダイアログの進捗状況を、ダイアログ進捗状況ショートカットを使用している場合に設定します。
|
dialog.setTitle(title) | ダイアログのタイトルを設定します。
|
dialog.setText(text) | ダイアログのテキストを設定します。
|
dialog.destroy() | ダイアログを破棄します。 |
dialog.on(event, handler) | イベントハンドラーを追加します。 |
dialog.once(event, handler) | 発生後に削除されるイベントハンドラーを追加します。 |
dialog.off(event, handler) | イベントハンドラーを削除します。 |
dialog.off(event) | 指定されたイベントのすべてのハンドラーを削除します。 |
dialog.emit(event, ...args) | インスタンスでイベントを発生させます。 |
ダイアログイベント
ダイアログは、ダイアログ要素で次のDOMイベントを発生させ、アプリとダイアログインスタンスでイベントを発生させます。
DOMイベント
イベント | ターゲット | 説明 |
---|---|---|
dialog:open | ダイアログ要素<div class="dialog"> | ダイアログが開くアニメーションを開始したときにイベントがトリガーされます。 |
dialog:opened | ダイアログ要素<div class="dialog"> | ダイアログが開くアニメーションを完了した後にイベントがトリガーされます。 |
dialog:close | ダイアログ要素<div class="dialog"> | ダイアログが閉じるアニメーションを開始したときにイベントがトリガーされます。 |
dialog:closed | ダイアログ要素<div class="dialog"> | ダイアログが閉じるアニメーションを完了した後にイベントがトリガーされます。 |
dialog:beforedestroy | ダイアログ要素<div class="dialog"> | ダイアログインスタンスが破棄される直前にイベントがトリガーされます。 |
アプリとダイアログインスタンスイベント
ダイアログインスタンスは、自身のインスタンスとアプリインスタンスの両方でイベントを発生させます。アプリインスタンスイベントには、dialog
で始まる同じ名前が付けられています。
イベント | 引数 | ターゲット | 説明 |
---|---|---|---|
open | dialog | dialog | ダイアログが開くアニメーションを開始したときにイベントがトリガーされます。引数として、イベントハンドラーはダイアログインスタンスを受け取ります。 |
dialogOpen | dialog | app | |
opened | dialog | dialog | ダイアログが開くアニメーションを完了した後にイベントがトリガーされます。引数として、イベントハンドラーはダイアログインスタンスを受け取ります。 |
dialogOpened | dialog | app | |
close | dialog | dialog | ダイアログが閉じるアニメーションを開始したときにイベントがトリガーされます。引数として、イベントハンドラーはダイアログインスタンスを受け取ります。 |
dialogClose | dialog | app | |
closed | dialog | dialog | ダイアログが閉じるアニメーションを完了した後にイベントがトリガーされます。引数として、イベントハンドラーはダイアログインスタンスを受け取ります。 |
dialogClosed | dialog | app | |
beforeDestroy | dialog | dialog | ダイアログインスタンスが破棄される直前にイベントがトリガーされます。引数として、イベントハンドラーはダイアログインスタンスを受け取ります。 |
dialogBeforeDestroy | dialog | app |
ダイアログショートカット
ダイアログの作成をはるかに簡単にするいくつかのショートカットメソッドがあります。
最初に、そのようなショートカットを構成し、ローカライズ目的にも使用されるグローバルアプリパラメータを確認しましょう。
ダイアログショートカットパラメータ
次のグローバルダイアログショートカットパラメータは、アプリの初期化のdialog
プロパティの下に渡すことができます。
var app = new Framework7({
dialog: {
// set default title for all dialog shortcuts
title: 'My App',
// change default "OK" button text
buttonOk: 'Done',
...
}
});
パラメータ | タイプ | デフォルト | 説明 |
---|---|---|---|
title | string | デフォルトのダイアログショートカットタイトル。指定しない場合、app.name と同じになります。 | |
buttonOk | string | OK | デフォルトの「OK」ボタンテキスト |
buttonCancel | string | キャンセル | デフォルトの「キャンセル」ボタンテキスト |
usernamePlaceholder | string | ユーザー名 | ログインダイアログのデフォルトのユーザー名フィールドプレースホルダー |
passwordPlaceholder | string | パスワード | ログイン&パスワードダイアログのデフォルトパスワードフィールドのプレースホルダー |
preloaderTitle | string | 読み込み中... | プリローダーダイアログのデフォルトタイトル |
progressTitle | string | 読み込み中... | プログレスダイアログのデフォルトタイトル |
destroyPredefinedDialogs | boolean | true | クローズ時に、定義済みのすべてのダイアログ(アラート、確認、プロンプトなど)を自動的に破棄します。 |
keyboardActions | boolean | true | 定義済みのダイアログ(アラート、確認、プロンプト、ログイン、パスワード)の「OK」ボタンと「キャンセル」ボタンに対して、キーボードショートカット(EnterキーとEscキー)を有効にします。 |
autoFocus | boolean | true | 有効にすると、ダイアログを開いたときにダイアログの入力を自動的にフォーカスします。プロンプト、ログイン、パスワードなどの入力がある定義済みダイアログでのみ有効です。 |
それでは、利用可能なダイアログのショートカットを見ていきましょう
アラート
アラートダイアログを作成するには、次のアプリメソッドを使用する必要があります
app.dialog.alert(text, title, callback) - アラートダイアログを作成して開きます
- text - string. アラートダイアログのテキスト
- title - string. アラートダイアログのタイトル
- callback - function. オプション。ユーザーがアラートボタンをクリックした後に実行されるコールバック関数
メソッドは、作成されたダイアログのインスタンスを返します。
app.dialog.alert(text, callback) - デフォルトタイトルでアラートダイアログを作成して開きます
メソッドは、作成されたダイアログのインスタンスを返します。
確認
確認ダイアログは、通常、何らかのアクションを確認する必要がある場合に使用されます。確認モーダルを開くには、次のアプリメソッドのいずれかを呼び出す必要があります。
app.dialog.confirm(text, title, callbackOk, callbackCancel) - 確認ダイアログを作成して開きます
- text - string. 確認ダイアログのテキスト
- title - string. 確認ダイアログのタイトル
- callbackOk - function. オプション。ユーザーが確認ダイアログの「OK」ボタンをクリックしたとき(ユーザーがアクションを確認したとき)に実行されるコールバック関数
- callbackCancel - function. オプション。ユーザーが確認ダイアログの「キャンセル」ボタンをクリックしたとき(ユーザーがアクションを破棄したとき)に実行されるコールバック関数
メソッドは、作成されたダイアログのインスタンスを返します。
app.dialog.confirm(text, callbackOk, callbackCancel) - デフォルトタイトルで確認ダイアログを作成して開きます
メソッドは、作成されたダイアログのインスタンスを返します。
プロンプト
プロンプトダイアログは、ユーザーから何らかのデータ/回答を取得する必要がある場合に使用されます。プロンプトダイアログを開くには、次のアプリメソッドのいずれかを呼び出す必要があります。
app.dialog.prompt(text, title, callbackOk, callbackCancel, defaultValue) - プロンプトダイアログを作成して開きます
- text - string. プロンプトダイアログのテキスト
- title - string. プロンプトダイアログのタイトル
- callbackOk - function(value). オプション。ユーザーがプロンプトダイアログの「OK」ボタンをクリックしたときに実行されるコールバック関数。引数として、テキスト入力の値を受け取ります
- callbackCancel - function(value). オプション。ユーザーがプロンプトダイアログの「キャンセル」ボタンをクリックしたときに実行されるコールバック関数。引数として、テキスト入力の値を受け取ります
- defaultValue - string. オプション。プロンプト入力のデフォルト値
app.dialog.prompt(text, callbackOk, callbackCancel, defaultValue) - デフォルトタイトルでプロンプトダイアログを作成して開きます
メソッドは、作成されたダイアログのインスタンスを返します。
ログイン
app.dialog.login(text, title, callbackOk, callbackCancel) - ログインダイアログを作成して開きます
- text - string. ログインダイアログのテキスト
- title - string. ログインダイアログのタイトル
- callbackOk - function(username, password). オプション。ユーザーがログインダイアログの「OK」ボタンをクリックしたときに実行されるコールバック関数。引数として、ユーザー名とパスワードの値を受け取ります
- callbackCancel - function(username, password). オプション。ユーザーがログインダイアログの「キャンセル」ボタンをクリックしたときに実行されるコールバック関数。引数として、ユーザー名とパスワードの値を受け取ります
app.dialog.login(text, callbackOk, callbackCancel) - デフォルトタイトルでログインダイアログを作成して開きます
メソッドは、作成されたダイアログのインスタンスを返します。
パスワード
パスワードダイアログは、パスワードのみを要求する必要がある場合に便利です。
app.dialog.password(text, title, callbackOk, callbackCancel) - パスワードダイアログを作成して開きます
- text - string. パスワードダイアログのテキスト
- title - string. パスワードダイアログのタイトル
- callbackOk - function(password). オプション。ユーザーがパスワードダイアログの「OK」ボタンをクリックしたときに実行されるコールバック関数。引数として、パスワードの値を受け取ります
- callbackCancel - function(password). オプション。ユーザーがパスワードダイアログの「キャンセル」ボタンをクリックしたときに実行されるコールバック関数。引数として、パスワードの値を受け取ります
app.dialog.password(text, callbackOk, callbackCancel) - デフォルトタイトルでパスワードダイアログを作成して開きます
メソッドは、作成されたダイアログのインスタンスを返します。
プリローダー
プリローダーダイアログは、(Ajaxリクエストなどの)バックグラウンドアクティビティを示し、このアクティビティ中のユーザー操作をブロックするために使用されます。プリローダーダイアログを開くには、適切なアプリメソッドを呼び出す必要があります。
app.dialog.preloader(title, color) - プリローダーダイアログを作成して開きます
- title - string. オプション。プリローダーダイアログのタイトル
- color - string. オプション。プリローダーの色。デフォルトカラーのいずれか
メソッドは、作成されたダイアログのインスタンスを返します。
プログレス
プリローダーダイアログと同じですが、プリローダーの代わりにプログレスバーを使用します。
app.dialog.progress(title, progress, color) - プログレスダイアログを作成して開きます
- title - string. オプション。プログレスダイアログのタイトル
- progress - number. オプション。プログレスバーの進捗状況(0〜100)。
number
が渡されない場合は、無限プログレスバーになります。 - color - string. オプション。プログレスバーの色。デフォルトカラーのいずれか
メソッドは、作成されたダイアログのインスタンスを返します。
CSS 変数
以下は、関連するCSS変数(CSSカスタムプロパティ)のリストです。
:root {
--f7-dialog-button-text-color: var(--f7-theme-color);
--f7-dialog-button-text-align: center;
}
.ios {
--f7-dialog-width: 270px;
--f7-dialog-inner-padding: 16px;
--f7-dialog-border-radius: 13px;
--f7-dialog-text-align: center;
--f7-dialog-font-size: 14px;
--f7-dialog-title-text-color: inherit;
--f7-dialog-title-font-size: 18px;
--f7-dialog-title-font-weight: 600;
--f7-dialog-title-line-height: inherit;
--f7-dialog-button-font-size: 17px;
--f7-dialog-button-height: 44px;
--f7-dialog-button-letter-spacing: 0;
--f7-dialog-button-font-weight: 400;
--f7-dialog-button-text-transform: none;
--f7-dialog-button-strong-bg-color: transparent;
--f7-dialog-button-strong-text-color: var(--f7-theme-color);
--f7-dialog-button-strong-font-weight: 500;
--f7-dialog-input-border-radius: 4px;
--f7-dialog-input-font-size: 14px;
--f7-dialog-input-height: 32px;
--f7-dialog-input-border-width: 1px;
--f7-dialog-input-placeholder-color: #a9a9a9;
--f7-dialog-preloader-size: 34px;
--f7-dialog-input-bg-color: #fff;
--f7-dialog-bg-color: rgba(255, 255, 255, 0.95);
--f7-dialog-bg-color-rgb: 255, 255, 255;
--f7-dialog-text-color: #000;
--f7-dialog-button-pressed-bg-color: rgba(0, 0, 0, 0.1);
--f7-dialog-button-strong-pressed-bg-color: rgba(0, 0, 0, 0.1);
--f7-dialog-input-border-color: rgba(0, 0, 0, 0.3);
--f7-dialog-border-divider-color: rgba(0, 0, 0, 0.2);
}
.ios .dark,
.ios.dark {
--f7-dialog-text-color: #fff;
--f7-dialog-bg-color: rgba(45, 45, 45, 0.95);
--f7-dialog-bg-color-rgb: 45, 45, 45;
--f7-dialog-button-pressed-bg-color: rgba(0, 0, 0, 0.2);
--f7-dialog-button-strong-pressed-bg-color: rgba(0, 0, 0, 0.2);
--f7-dialog-border-divider-color: rgba(255, 255, 255, 0.15);
--f7-dialog-input-border-color: rgba(255, 255, 255, 0.15);
--f7-dialog-input-bg-color: rgba(0, 0, 0, 0.5);
}
.md {
--f7-dialog-width: 280px;
--f7-dialog-inner-padding: 24px;
--f7-dialog-border-radius: 28px;
--f7-dialog-text-align: left;
--f7-dialog-font-size: 14px;
--f7-dialog-title-font-size: 24px;
--f7-dialog-title-font-weight: 400;
--f7-dialog-title-line-height: 1.3;
--f7-dialog-button-font-size: 14px;
--f7-dialog-button-height: 40px;
--f7-dialog-button-letter-spacing: normal;
--f7-dialog-button-font-weight: 500;
--f7-dialog-button-text-transform: none;
--f7-dialog-button-strong-font-weight: 500;
--f7-dialog-input-border-radius: 0px;
--f7-dialog-input-font-size: 16px;
--f7-dialog-input-height: 36px;
--f7-dialog-input-border-color: transparent;
--f7-dialog-input-border-width: 0px;
--f7-dialog-preloader-size: 32px;
--f7-dialog-input-bg-color: transparent;
}
.md,
.md .dark,
.md [class*='color-'] {
--f7-dialog-button-pressed-bg-color: transparent;
--f7-dialog-button-strong-bg-color: var(--f7-theme-color);
--f7-dialog-button-strong-text-color: var(--f7-md-on-primary);
--f7-dialog-button-strong-pressed-bg-color: transparent;
--f7-dialog-bg-color: var(--f7-md-surface-3);
--f7-dialog-input-placeholder-color: var(--f7-md-on-surface-variant);
--f7-dialog-text-color: var(--f7-md-on-surface-variant);
--f7-dialog-title-text-color: var(--f7-md-on-surface);
}
例
<template>
<div class="page">
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner sliding">
<div class="title">Dialog</div>
</div>
</div>
<div class="page-content">
<div class="block block-strong-ios block-outline-ios">
<p>There are 1:1 replacements of native Alert, Prompt and Confirm modals. They support callbacks, have very easy
api and can be combined with each other. Check these examples:</p>
<p class="grid grid-cols-3 grid-gap">
<button class="button button-fill" @click=${openAlert}>Alert</button>
<button class="button button-fill" @click=${openConfirm}>Confirm</button>
<button class="button button-fill" @click=${openPrompt}>Prompt</button>
</p>
<p class="grid grid-cols-2 grid-gap">
<button class="button button-fill" @click=${openLogin}>Login</button>
<button class="button button-fill" @click=${openPassword}>Password</button>
</p>
</div>
<div class="block-title">Vertical Buttons</div>
<div class="block block-strong-ios block-outline-ios">
<p>
<button class="button button-fill" @click=${openVerticalButtons}>Vertical Buttons</button>
</p>
</div>
<div class="block-title">Preloader Dialog</div>
<div class="block block-strong-ios block-outline-ios">
<p class="grid grid-cols-2 grid-gap">
<button class="button button-fill" @click=${openPreloader}>Preloader</button>
<button class="button button-fill" @click=${openCustomPreloader}>Custom Text</button>
</p>
</div>
<div class="block-title">Progress Dialog</div>
<div class="block block-strong-ios block-outline-ios">
<p class="grid grid-cols-2 grid-gap">
<button class="button button-fill" @click=${openInfiniteProgress}>Infinite</button>
<button class="button button-fill" @click=${openDeterminedProgress}>Determined</button>
</p>
</div>
<div class="block-title">Dialogs Stack</div>
<div class="block block-strong-ios block-outline-ios">
<p>This feature doesn't allow to open multiple dialogs at the same time, and will automatically open next dialog
when you close the current one. Such behavior is similar to browser native dialogs: </p>
<p>
<button class="button button-fill" @click=${openAlerts}>Open Multiple Alerts</button>
</p>
</div>
</div>
</div>
</template>
<script>
export default (props, { $f7 }) => {
const openAlert = () => {
$f7.dialog.alert('Hello!');
}
const openConfirm = () => {
$f7.dialog.confirm('Are you feel good today?', function () {
$f7.dialog.alert('Great!');
});
}
const openPrompt = () => {
$f7.dialog.prompt('What is your name?', function (name) {
$f7.dialog.confirm('Are you sure that your name is ' + name + '?', function () {
$f7.dialog.alert('Ok, your name is ' + name);
});
});
}
const openLogin = () => {
$f7.dialog.login('Enter your username and password', function (username, password) {
$f7.dialog.alert('Thank you!<br />Username:' + username + '<br />Password:' + password);
});
}
const openPassword = () => {
$f7.dialog.password('Enter your password', function (password) {
$f7.dialog.alert('Thank you!<br />Password:' + password);
});
}
const openAlerts = () => {
$f7.dialog.alert('Alert 1');
$f7.dialog.alert('Alert 2');
$f7.dialog.alert('Alert 3');
$f7.dialog.alert('Alert 4');
$f7.dialog.alert('Alert 5');
}
const openVerticalButtons = () => {
$f7.dialog.create({
title: 'Vertical Buttons',
buttons: [
{
text: 'Button 1',
},
{
text: 'Button 2',
},
{
text: 'Button 3',
},
],
verticalButtons: true,
}).open();
}
const openPreloader = () => {
$f7.dialog.preloader();
setTimeout(function () {
$f7.dialog.close();
}, 3000);
}
const openCustomPreloader = () => {
$f7.dialog.preloader('My text...');
setTimeout(function () {
$f7.dialog.close();
}, 3000);
}
const openInfiniteProgress = () => {
$f7.dialog.progress();
setTimeout(function () {
$f7.dialog.close();
}, 3000);
}
const openDeterminedProgress = () => {
var progress = 0;
var dialog = $f7.dialog.progress('Loading assets', progress);
dialog.setText('Image 1 of 10');
var interval = setInterval(function () {
progress += 10;
dialog.setProgress(progress);
dialog.setText('Image ' + ((progress) / 10) + ' of 10');
if (progress === 100) {
clearInterval(interval);
dialog.close();
}
}, 300)
}
return $render;
};
</script>