スマートセレクト
スマートセレクトを使用すると、通常のフォームのセレクトを、グループ化されたラジオボタンまたはチェックボックスの入力を持つ動的なページに簡単に変換できます。この機能は多くのネイティブiOSアプリで見られます。
スマートセレクトレイアウト
スマートセレクトのレイアウトは非常にシンプルです。これは、<select>を内部に持ち、item-linkにsmart-selectクラスを追加した、よく知られているリストビューのリンクです。
<div class="list">
<ul>
<!-- Smart select item -->
<li>
<!-- Additional "smart-select" class -->
<a href="#" class="item-link smart-select">
<!-- select -->
<select name="fruits">
<option value="apple" selected>Apple</option>
<option value="pineapple">Pineapple</option>
...
</select>
<div class="item-content">
<div class="item-inner">
<!-- Select label -->
<div class="item-title">Fruit</div>
<!-- Selected value, not required -->
<div class="item-after">Apple</div>
</div>
</div>
</a>
</li>
<!-- Another smart selects or list view elements -->
...
</ul>
</div>スマートセレクトは、スマートセレクトページをロードしたり、モーダルを開いたりするためにルーターを使用するため、初期化されたビューでのみ機能することに注意してください!
カスタムオプションアイコン
<option>要素にdata-option-icon属性を使用することで、スマートセレクトページのリストビュー(オプション)のアイコンを指定できます。
data-option-icon- 単なる文字列の場合、このクラスを持つアイコンが作成されます。f7:icon_nameの形式の場合、F7-Iconsアイコンが作成されます。md:icon_nameの形式の場合、Material Iconsアイコンが作成されます。data-option-icon-ios-data-option-iconと同じですが、iOSテーマがアクティブな場合にのみ適用されます。data-option-icon-md-data-option-iconと同じですが、MDテーマがアクティブな場合にのみ適用されます。
例
<option data-option-icon="my-icon">は、<i class="icon my-icon"></i>のリストアイテムアイコンを生成します。<option data-option-icon="f7:house_fill">は、<i class="icon f7-icons">house_fill</i>のリストアイテムアイコンを生成します。<option data-option-icon="material:home">は、<i class="icon material-icons">home</i>のリストアイテムアイコンを生成します。<option data-option-icon-ios="f7:house" data-option-icon-md="material:home">は以下を生成します。<i class="icon f7-icons">house</i>- iOSテーマがアクティブな場合<i class="icon material-icons">home</i>- MDテーマがアクティブな場合
カスタムオプションの色と画像
スマートセレクトページのリストビュー要素の画像または色も指定できます。スマートセレクトの<select>にdata-option-image属性を追加するか(すべてのオプションにデフォルトの画像を設定する場合)、<option>に画像やアイコンを単一のオプションに設定する必要があります。
単一のオプションの場合、data-option-color属性とdata-option-class属性を使用して、特定のオプションの色や、追加のスタイリングのためのCSSクラスを追加することもできます。
<li>
<a href="#" class="item-link smart-select">
<select name="fruits">
<option value="apple" selected data-option-image="https://cdn.framework7.io/placeholder/abstract-29x29-1.jpg">Apple</option>
<option value="pineapple" data-option-image="https://cdn.framework7.io/placeholder/abstract-29x29-2.jpg">Pineapple</option>
<option value="pear" data-option-color="orange" data-option-image="https://cdn.framework7.io/placeholder/abstract-29x29-3.jpg">Pear</option>
...
</select>
<div class="item-content">
<div class="item-inner">
<div class="item-title">Fruit</div>
</div>
</div>
</a>
</li>
複数選択と<optgroup>
複数選択と<optgroup>を使用したグループオプションも使用できます。したがって、selectにmultiple属性を追加すると、スマートセレクトページのラジオボタンは自動的にチェックボックスに変換されます。
<li>
<a href="#" class="item-link smart-select">
<!-- "multiple" attribute for multiple select-->
<select name="car" multiple>
<!-- options grouped within "optgroup" tag-->
<optgroup label="Japanese">
<option value="honda" selected>Honda</option>
<option value="lexus">Lexus</option>
...
</optgroup>
<optgroup label="German">
<option value="audi" selected>Audi</option>
<option value="bmw">BMW</option>
...
</optgroup>
<optgroup label="American">
<option value="cadillac">Cadillac</option>
<option value="chrysler">Chrysler</option>
...
</optgroup>
</select>
<div class="item-content">
<div class="item-inner">
<div class="item-title">Car</div>
</div>
</div>
</a>
</li>複数選択とmaxlength
複数選択では、選択可能なアイテム数を制限するためにmaxlength属性を使用することもできます。
<li>
<a href="#" class="item-link smart-select">
<!-- "maxlength" attribute to limit number of possible selected items -->
<!-- we won't allow to select more than 3 items -->
<select name="car" multiple maxlength="3">
<optgroup label="Japanese">
<option value="honda" selected>Honda</option>
<option value="lexus">Lexus</option>
...
</optgroup>
<optgroup label="German">
<option value="audi">Audi</option>
<option value="bmw">BMW</option>
...
</optgroup>
<optgroup label="American">
<option value="cadillac">Cadillac</option>
<option value="chrysler">Chrysler</option>
...
</optgroup>
</select>
<div class="item-content">
<div class="item-inner">
<div class="item-title">Car</div>
</div>
</div>
</a>
</li>異なる表示値
オプションにdata-display-as属性を使用すると、選択された値を別の方法で表示できます。
<li>
<a href="#" class="item-link smart-select">
<select name="days">
<option value="monday" selected data-display-as="Mon">Monday</option>
<option value="tuesday" data-display-as="Tue">Tuesday</option>
<option value="wednesday" data-display-as="Wed">Wednesday</option>
<option value="thursday" data-display-as="Thu">Thursday</option>
<option value="friday" data-display-as="Fri">Friday</option>
<option value="saturday" data-display-as="Sat">Saturday</option>
<option value="sunday" data-display-as="Sun">Sunday</option>
</select>
<div class="item-content">
<div class="item-inner">
<div class="item-title">Day</div>
</div>
</div>
</a>
</li>スマートセレクトアプリのメソッド
スマートセレクトを操作するための関連するアプリメソッドを見てみましょう。
app.smartSelect.create(parameters)- スマートセレクトインスタンスを作成します。
- parameters - object。スマートセレクトのパラメータを持つオブジェクト。
メソッドは、作成されたスマートセレクトのインスタンスを返します。
app.smartSelect.destroy(smartSelectEl)- スマートセレクトインスタンスを破棄します。
- smartSelectEl - HTMLElement または string (CSSセレクタを使用) または object。破棄するスマートセレクト要素またはスマートセレクトインスタンス。
app.smartSelect.get(smartSelectEl)- HTML要素でスマートセレクトインスタンスを取得します。
- smartSelectEl - HTMLElement または string (CSSセレクタを使用)。スマートセレクト要素。
メソッドは、スマートセレクトのインスタンスを返します。
app.smartSelect.open(smartSelectEl)- スマートセレクトを開きます。
- smartSelectEl - HTMLElement または string (CSSセレクタを使用)。開くスマートセレクト要素。
メソッドは、スマートセレクトのインスタンスを返します。
app.smartSelect.close(smartSelectEl)- スマートセレクトを閉じます。
- smartSelectEl - HTMLElement または string (CSSセレクタを使用)。閉じるスマートセレクト要素。
メソッドは、スマートセレクトのインスタンスを返します。
スマートセレクトパラメータ
スマートセレクトを作成するために必要な、利用可能なパラメータのリストを見てみましょう。
| パラメータ | タイプ | デフォルト | 説明 |
|---|---|---|---|
| el | HTMLElement | スマートセレクト要素。HTMLにスマートセレクト要素がすでにあり、この要素を使用して新しいインスタンスを作成する場合に役立ちます。 | |
| view | object | スマートセレクトが機能するために必要な初期化されたViewインスタンスへのリンク。デフォルトでは、指定されていない場合、親Viewで開かれます。 | |
| valueEl | HTMLElement | 選択した値を挿入する視覚要素。渡されない場合は、<div class="item-after">要素を探します。 | |
| setValueText | boolean | true | 有効にすると、スマートセレクトは、"formatValueText"によって返される形式で、指定された"valueEl"に値のテキストを自動的に挿入します。 |
| formatValueText | function(values) | リストアイテム(<div class="item-after">内)に表示されるスマートセレクトのテキスト値をフォーマットするカスタム関数。valuesは現在の値の配列です。 | |
| openIn | string | page | スマートセレクトを開く方法を定義します。pageまたはpopupまたはpopoverまたはsheetを指定できます。 |
| popupPush | boolean | false | スマートセレクトポップアップを開いたときに、背後のビューをプッシュできるようにします。 |
| popupSwipeToClose | boolean | undefined | スワイプでスマートセレクトポップアップを閉じることができるようにします。指定しない場合は、アプリのポップアップのswipeToCloseパラメータを継承します。 |
| sheetPush | boolean | false | スマートセレクトシートを開いたときに、背後のビューをプッシュできるようにします。 |
| sheetSwipeToClose | boolean | undefined | スワイプでスマートセレクトシートを閉じることができるようにします。指定しない場合は、アプリのシートのswipeToCloseパラメータを継承します。 |
| sheetBackdrop | boolean | false | スマートセレクトシートの背景を有効にします。 |
| pageTitle | string | スマートセレクトページのタイトル。渡されない場合は、<div class="item-title">のテキストになります。 | |
| pageBackLinkText | string | 戻る | スマートセレクトページの戻るリンクテキスト。 |
| popupCloseLinkText | string | 閉じる | スマートセレクトポップアップの閉じるリンクテキスト。 |
| popupTabletFullscreen | boolean | false | 有効にすると、スマートセレクトポップアップはタブレットでフルスクリーンとして表示されます。 |
| sheetCloseLinkText | string | 完了 | スマートセレクトシートの閉じるリンクテキスト。 |
| searchbar | boolean object | false | スマートセレクトページで検索バーを有効にします。オブジェクトとして渡された場合は、有効な検索バーのパラメータである必要があります。 |
| searchbarPlaceholder | string | 検索 | 検索バーのプレースホルダーテキスト。 |
| searchbarDisableText | string | キャンセル | 検索バーの「キャンセル」リンクテキスト。iOSテーマでのみ有効です。 |
| searchbarSpellcheck | boolean | false | 検索バーの入力要素のspellcheck属性の値を設定します。 |
| appendSearchbarNotFound | boolean string HTMLElement | false | 検索バーの結果がない場合に表示されるコンテンツを含むブロックを追加します。 文字列として指定された場合、追加されます
|
| closeOnSelect | boolean | false | 有効にすると、ユーザーがオプションを選択した後、スマートセレクトは自動的に閉じられます。 |
| virtualList | boolean | false | セレクトに多数(数百、数千)のオプションがある場合は、スマートセレクトの仮想リストを有効にします。 |
| virtualListHeight | number function | 仮想リストのアイテムの高さ。numberの場合、リストアイテムの高さ(px)。functionの場合、関数はアイテムの高さを返す必要があります。 | |
| scrollToSelectedItem | boolean | false | 有効にすると、スマートセレクトのコンテンツを開いたときに最初に選択されたアイテムまでスクロールします。 |
| formColorTheme | string | スマートセレクトページのフォームカラーテーマ。 デフォルトカラー のいずれか。 | |
| navbarColorTheme | string | スマートセレクトのナビゲーションバーのカラーテーマ。 デフォルトカラー のいずれか。 | |
| routableModals | boolean | false | スマートセレクトモーダル(openInがpopup、popover、またはsheetの場合)を開いたときに、ルーターの履歴に追加します。これにより、ルーターの履歴を戻ることでスマートセレクトを閉じることができ、現在のルートをスマートセレクトモーダルに設定できます。 |
| url | string | select/ | 現在のルートとして設定されるスマートセレクトページ/モーダルのURL |
| cssClass | string | スマートセレクトコンテナ(ページ、ポップアップ、ポップオーバー、またはシート)に設定する追加のCSSクラス名 | |
| closeByBackdropClick | boolean | true | 有効にすると、スマートセレクトモーダル(ポップオーバー、ポップアップ、シート)は背景をクリックすると閉じます |
| inputIconPosition | string | 'start' | 選択オプションのチェックボックスまたはラジオアイコンの位置。'start'または'end'を指定できます。また、data-input-icon-position属性を使用して各オプションに設定することもできます。 |
| optionIcon | string | すべてのオプションに設定する選択オプションのアイコン。単なる文字列の場合は、このクラスを持つアイコンが作成されます。f7:icon_nameの形式の場合、F7-Iconsアイコンが作成されます。md:icon_nameの形式の場合、Material Iconsアイコンが作成されます。 | |
| optionIconIos | string | optionIconと同じですが、iOSテーマがアクティブな場合にのみ適用されます。 | |
| optionIconMd | string | optionIconと同じですが、MDテーマがアクティブな場合にのみ適用されます。 | |
| レンダリング関数 | |||
| renderSearchbar | function | スマートセレクトの検索バーのドロップダウンをレンダリングする関数。検索バーのHTML文字列を返す必要があります。 | |
| renderItem | function(item, index) | スマートセレクトのアイテムをレンダリングする関数。アイテムのHTML文字列を返す必要があります。 | |
| renderItems | function(items) | すべてのスマートセレクトアイテムをレンダリングする関数。すべてのアイテムのHTML文字列を返す必要があります。 | |
| renderPage | function(items) | スマートセレクトページをレンダリングする関数。ページ全体のHTML文字列を返す必要があります。 | |
| renderPopup | function(items) | スマートセレクトポップアップをレンダリングする関数。ポップアップ全体のHTML文字列を返す必要があります。 | |
| renderSheet | function(items) | スマートセレクトシートをレンダリングする関数。シート全体のHTML文字列を返す必要があります。 | |
| renderPopover | function(items) | スマートセレクトポップオーバーをレンダリングする関数。ポップオーバー全体のHTML文字列を返す必要があります。 | |
| イベント | |||
| on | object | イベントハンドラーを持つオブジェクト。例: | |
次のすべてのパラメーターは、グローバルアプリパラメーターのsmartSelectプロパティで、すべてのスマートセレクトのデフォルトを設定するために使用できることに注意してください。例:
var app = new Framework7({
smartSelect: {
pageTitle: 'Select Option',
openIn: 'popup',
}
});スマートセレクトのメソッドとプロパティ
スマートセレクトを作成するには、次のように呼び出す必要があります。
var smartSelect = app.smartSelect.create({ /* parameters */ })その後、便利なメソッドとプロパティを持つ初期化されたインスタンス(上記の例のsmartSelect変数など)があります。
| プロパティ | |
|---|---|
| smartSelect.app | グローバルアプリインスタンスへのリンク |
| smartSelect.el | スマートセレクトのHTML要素 |
| smartSelect.$el | スマートセレクトのHTML要素を持つDom7インスタンス |
| smartSelect.valueEl | 値を表示するために使用されるHTML要素 |
| smartSelect.$valueEl | 値を表示するために使用されるHTML要素を持つDom7インスタンス |
| smartSelect.selectEl | 子要素のselect要素<select> |
| smartSelect.$selectEl | 子要素のselect要素を持つDom7インスタンス |
| smartSelect.url | スマートセレクトのURL(urlパラメーターで渡されたもの) |
| smartSelect.view | スマートセレクトのビュー(viewパラメーターで渡されたもの)、または親ビュー |
| smartSelect.params | スマートセレクトのパラメーター |
| メソッド | |
| smartSelect.open() | スマートセレクトを開く |
| smartSelect.close() | スマートセレクトを閉じる |
| smartSelect.getValue() | スマートセレクトの値を返します。selectがmultipleの場合は、選択された値の配列を返します。 |
| smartSelect.setValue(newValue) | 新しいスマートセレクト値を設定します。selectがmultipleの場合は、新しい値の配列である必要があります。 |
| smartSelect.unsetValue() | スマートセレクトの値を設定解除します |
| smartSelect.scrollToSelectedItem() | (開いたときに)最初に選択された項目までスマートセレクトの内容をスクロールします。 |
| smartSelect.destroy() | スマートセレクトを破棄する |
| smartSelect.on(event, handler) | イベントハンドラーを追加します |
| smartSelect.once(event, handler) | 一度だけ実行され、その後削除されるイベントハンドラーを追加します |
| smartSelect.off(event, handler) | イベントハンドラーを削除します |
| smartSelect.off(event) | 指定されたイベントのすべてのハンドラーを削除します |
| smartSelect.emit(event, ...args) | インスタンスでイベントを発生させる |
スマートセレクトイベント
スマートセレクトは、スマートセレクト要素で次のDOMイベントを発生させ、アプリとスマートセレクトインスタンスでイベントを発生させます。
DOMイベント
| イベント | ターゲット | 説明 |
|---|---|---|
| smartselect:beforeopen | スマートセレクト要素<a class="item-link smart-select"> | スマートセレクトが開く前にトリガーされるイベント。event.detail.preventには、呼び出されたときにスマートセレクトが開くのを防ぐ関数が含まれています。 |
| smartselect:open | スマートセレクト要素<a class="item-link smart-select"> | スマートセレクトページ(またはモーダル)が開くアニメーションを開始するときにトリガーされるイベント |
| smartselect:opened | スマートセレクト要素<a class="item-link smart-select"> | スマートセレクトページ(またはモーダル)が開くアニメーションを完了した後にトリガーされるイベント |
| smartselect:close | スマートセレクト要素<a class="item-link smart-select"> | スマートセレクトページ(またはモーダル)が閉じるアニメーションを開始するときにトリガーされるイベント |
| smartselect:closed | スマートセレクト要素<a class="item-link smart-select"> | スマートセレクトページ(またはモーダル)が閉じるアニメーションを完了した後にトリガーされるイベント |
| smartselect:beforedestroy | スマートセレクト要素<a class="item-link smart-select"> | スマートセレクトインスタンスが破棄される直前にトリガーされるイベント |
アプリとスマートセレクトインスタンスのイベント
スマートセレクトインスタンスは、インスタンス自身とアプリインスタンスの両方でイベントを発生させます。アプリインスタンスのイベントには、同じ名前の前にsmartSelectが付いています。
| イベント | ターゲット | 引数 | 説明 |
|---|---|---|---|
| beforeOpen | smartSelect | (smartSelect, prevent) | スマートセレクトが開く前にトリガーされるイベント。引数として、イベントハンドラーはスマートセレクトインスタンスと、呼び出されたときにスマートセレクトが開くのを防ぐ関数を受け取ります。 |
| smartSelectBeforeOpen | app | ||
| open | smartSelect | (smartSelect) | スマートセレクトが開くアニメーションを開始するときにトリガーされるイベント。引数として、イベントハンドラーはスマートセレクトインスタンスを受け取ります。 |
| smartSelectOpen | app | ||
| opened | smartSelect | (smartSelect) | スマートセレクトが開くアニメーションを完了した後にトリガーされるイベント。引数として、イベントハンドラーはスマートセレクトインスタンスを受け取ります。 |
| smartSelectOpened | app | ||
| close | smartSelect | (smartSelect) | スマートセレクトが閉じるアニメーションを開始するときにトリガーされるイベント。引数として、イベントハンドラーはスマートセレクトインスタンスを受け取ります。 |
| smartSelectClose | app | ||
| closed | smartSelect | (smartSelect) | スマートセレクトが閉じるアニメーションを完了した後にトリガーされるイベント。引数として、イベントハンドラーはスマートセレクトインスタンスを受け取ります。 |
| smartSelectClosed | app | ||
| beforeDestroy | smartSelect | (smartSelect) | スマートセレクトインスタンスが破棄される直前にトリガーされるイベント。引数として、イベントハンドラーはスマートセレクトインスタンスを受け取ります。 |
| smartSelectBeforeDestroy | app |
スマートセレクトの自動初期化
スマートセレクトAPIを使用する必要がなく、スマートセレクトがページの内部にあり、ページ初期化時にDOMに表示されている場合は、追加のsmart-select-initクラスを追加するだけで自動的に初期化できます。
<li>
<!-- Add smart-select-init class -->
<a href="#" class="item-link smart-select smart-select-init">
<!-- select -->
<select name="fruits">
<option value="apple" selected>Apple</option>
<option value="pineapple">Pineapple</option>
...
</select>
<div class="item-content">
<div class="item-inner">
<div class="item-title">Fruit</div>
<div class="item-after">Apple</div>
</div>
</div>
</a>
</li>この場合、作成されたスマートセレクトインスタンスにアクセスする必要がある場合は、app.smartSelect.getアプリメソッドを使用できます。
var smartSelect = app.smartSelect.get('.smart-select');
自動初期化を使用する場合、追加のパラメーターを渡す必要がある場合があります。この場合、スマートセレクト要素のdata-属性を使用してすべての追加パラメーターを渡すことができます。
<li>
<!-- Pass parameters as kebab-case data attributes -->
<a href="#" class="item-link smart-select smart-select-init" data-open-in="popup" data-virtual-list="true" data-page-back-link-text="Go back">
<!-- select -->
<select name="fruits">
<option value="apple" selected>Apple</option>
<option value="pineapple">Pineapple</option>
...
</select>
<div class="item-content">
<div class="item-inner">
<div class="item-title">Fruit</div>
<div class="item-after">Apple</div>
</div>
</div>
</a>
</li>
CSS変数
以下は、関連するCSS変数(CSSカスタムプロパティ)のリストです。
コメントアウトされた変数は、デフォルトでは指定されておらず、その値は、この場合にフォールバックする値であることに注意してください。
:root {
/*
--f7-smart-select-sheet-bg: var(--f7-list-bg-color);
--f7-smart-select-sheet-toolbar-border-color: var(--f7-bars-border-color);
*/
}
例
<div class="page">
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner sliding">
<div class="title">Smart Select</div>
</div>
</div>
<div class="page-content">
<div class="block">
Framework7 allows you to easily convert your usual form selects to dynamic pages with radios:
</div>
<div class="list list-strong-ios list-outline-ios list-dividers-ios">
<ul>
<li>
<a class="item-link smart-select smart-select-init">
<select name="fruits">
<option value="apple" selected>Apple</option>
<option value="pineapple">Pineapple</option>
<option value="pear">Pear</option>
<option value="orange">Orange</option>
<option value="melon">Melon</option>
<option value="peach">Peach</option>
<option value="banana">Banana</option>
</select>
<div class="item-content">
<div class="item-inner">
<div class="item-title">Fruit</div>
</div>
</div>
</a>
</li>
<li>
<a class="item-link smart-select smart-select-init" data-open-in="popup" data-searchbar="true"
data-searchbar-placeholder="Search car">
<select name="car" multiple>
<optgroup label="Japanese">
<option value="honda" selected>Honda</option>
<option value="lexus">Lexus</option>
<option value="mazda">Mazda</option>
<option value="nissan">Nissan</option>
<option value="toyota">Toyota</option>
</optgroup>
<optgroup label="German">
<option value="audi" selected>Audi</option>
<option value="bmw">BMW</option>
<option value="mercedes">Mercedes</option>
<option value="vw">Volkswagen</option>
<option value="volvo">Volvo</option>
</optgroup>
<optgroup label="American">
<option value="cadillac">Cadillac</option>
<option value="chrysler">Chrysler</option>
<option value="dodge">Dodge</option>
<option value="ford" selected>Ford</option>
</optgroup>
</select>
<div class="item-content">
<div class="item-inner">
<div class="item-title">Car</div>
</div>
</div>
</a>
</li>
<li>
<a class="item-link smart-select smart-select-init" data-open-in="sheet">
<select name="mac-windows">
<option value="mac" selected>Mac</option>
<option value="windows">Windows</option>
</select>
<div class="item-content">
<div class="item-inner">
<div class="item-title">Mac or Windows</div>
</div>
</div>
</a>
</li>
<li>
<a class="item-link smart-select smart-select-init" data-open-in="popover">
<select name="superhero" multiple>
<option value="Batman" selected>Batman</option>
<option value="Superman">Superman</option>
<option value="Hulk">Hulk</option>
<option value="Spiderman">Spiderman</option>
<option value="Ironman">Ironman</option>
<option value="Thor">Thor</option>
<option value="Wonder Woman">Wonder Woman</option>
</select>
<div class="item-content">
<div class="item-inner">
<div class="item-title">Super Hero</div>
</div>
</div>
</a>
</li>
</ul>
</div>
</div>
</div>


