スマートセレクト
スマートセレクトを使うと、通常のフォームセレクトを、グループ化されたラジオやチェックボックスの入力を備えたダイナミックなページに簡単に変換することができます。このような機能は、多くのiOSネイティブアプリで見ることができます。
スマートセレクトのレイアウト
スマートセレクトのレイアウトはとてもシンプルです。よく知られているリストビューリンクの中に<select>
を入れ、item-link
にsmart-select
クラスを追加したものです。
<div class="list">
<ul>
<!-- スマートセレクトアイテム -->
<li>
<!-- 追加の "smart-select "クラス -->
<a href="#" class="item-link smart-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>
<!-- 他のスマートセレクトやリストビュー要素 -->
...
</ul>
</div>
スマートセレクトは初期化されたViewでのみ動作することに注意してください。スマートセレクトページのロードやモーダルのオープンにRouterを使用したからです
カスタムオプションアイコン
スマートセレクトページのリストビュー(オプション)のアイコンを指定するには、<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 テーマがアクティブな場合にのみ適用されます。data-option-icon-aurora
-data-option-icon
と同じですが、Aurora テーマがアクティブな場合にのみ適用されます。
例:
<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 material-icons">home</i>
のリストアイテムが生成されます。<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>
複数選択とlt;optgroup>
<li>
<a href="#" class="item-link smart-select">
<!-- "multiple" attribute for multiple select-->
<select name="car" multiple>
<!-- optgroup" タグでグループ化されたオプション-->
<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 -->
<!-- 3つ以上のアイテムを選択することはできません。 -->
<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 Selectorを使用). スマートセレクトの要素です。
メソッドは、スマート・セレクトのインスタンスを返します。
app.smartSelect.open(smartSelectEl)- スマートセレクトを開く
- smartSelectEl - HTMLElement または string (with CSS Selector). 開くスマートセレクトの要素です。
メソッドはスマートセレクトのインスタンスを返します。
app.smartSelect.close(smartSelectEl)- スマートセレクトを閉じる
- smartSelectEl - HTMLElement または string (CSS Selectorを使用した場合)。スマートセレクトの要素を閉じます。
メソッドはスマートセレクトのインスタンスを返します
スマートセレクトのパラメータ
ここでは、スマートセレクトを作成する際に必要となる、利用可能なパラメータの一覧を紹介します。
Parameter | Type | Default | Description |
---|---|---|---|
el | HTMLElement | スマートセレクトの要素。すでにHTML内にスマート・セレクト要素があり、この要素を使って新しいインスタンスを作成したい場合に便利です。 | |
view | object | スマート・セレクトの動作に必要な、初期化されたビュー・インスタンスへのリンク。デフォルトでは、指定されていない場合は、親ビューで開かれます。 | |
valueEl | HTMLElement | 選択された値を挿入するためのビジュアル要素。指定されていない場合は、<div class="item-after"> 要素を探します。 | |
setValueText | boolean | true | スマートセレクトを有効にすると、"formatValueText "で返されるフォーマットで、指定された "valueEl "に値のテキストが自動的に挿入されます。 |
formatValueText | function(values) | スマートセレクトで、リストアイテム(内)に表示されるテキスト値をフォーマットするカスタム関数です。 values` は現在の値の配列です。 | |
openIn | string | page | スマートセレクトの開き方を定義します。page、 popup、 popover、 sheet` のいずれかです。 |
popupPush | boolean | false | スマートセレクトを開いたときに、ビュー/Sを後ろにプッシュする機能を有効にします。 |
popupSwipeToClose | boolean | undefined | スワイプでスマートセレクトのポップアップを閉じる機能を有効にします。指定しない場合は、アプリのポップアップの swipeToClose パラメータを継承します。 |
sheetPush | boolean | false | スマートセレクトシートを開いた時に、ビューを後ろに押す機能を有効にします。 |
sheetSwipeToClose | boolean | undefined | スワイプでスマートセレクトシートを閉じる機能を有効にします。指定しない場合は、アプリのSheet swipeToClose パラメータを継承します。 |
sheetBackdrop | boolean | false | スマートセレクトシートの背景を有効にします。 |
pageTitle | string | スマートセレクトのページタイトルを指定します。指定されていない場合は、<div class="item-title"> のテキストになります。 | |
pageBackLinkText | string | Back | スマートセレクトのページバックリンクのテキスト |
popupCloseLinkText | string | Close | スマートセレクトのポップアップを閉じるためのリンクを設定します。 |
popupTabletFullscreen | boolean | false | 有効にすると、スマートセレクトのポップアップは、タブレットではフルスクリーンで表示されます。 |
sheetCloseLinkText | string | Done | スマートセレクト シートを閉じるリンクテキスト |
searchbar | boolean object | false | スマートセレクトのページで検索バーを有効にします。オブジェクトとして渡される場合は、有効なサーチバーのパラメータでなければなりません。 |
searchbarPlaceholder | string | Search | サーチバーのプレースホルダーテキスト |
searchbarDisableText | string | Cancel | サーチバーの「キャンセル」リンクのテキスト。iOSテーマでのみ有効です。 |
searchbarSpellcheck | boolean | false | Searchbar の input 要素の spellcheck 属性の値を設定します。 |
appendSearchbarNotFound | boolean string HTMLElement | false | Searchbarの結果が出なかった場合に表示されるコンテンツをブロックに追加します。 文字列として指定された場合は追加されます。
true`と指定された場合は、次のようになります。
HTMLElement`が指定された場合には、その要素が追加されます。 |
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クラス名 | |
Render functions | |||
renderSearchbar | function | スマートセレクトのサーチバー・ドロップダウンをレンダリングする関数(サーチバーのHTML文字列を返さなければならない | |
renderItem | function(item, index) | スマートセレクトのアイテムをレンダリングする機能は、アイテムのHTML文字列を返す必要があります。 | |
renderItems | function(items) | スマートセレクトの全ての項目を表示する機能は、全ての項目のHTML文字列を返さなければなりません。 | |
renderPage | function(items) | スマートセレクトのページを描画する機能は、フルページを返さなければなりません。 | |
renderPopup | function(items) | スマートセレクトポップアップを描画する機能は、フルポップアップを返さなければなりません。 | |
renderSheet | function(items) | スマートセレクトシートを表示する機能は、シート全体を表示する必要があります。 | |
renderPopover | function(items) | スマートセレクトポップオーバーをレンダリングする関数は、完全なポップオーバーを返さなければなりません HTML 文字列 | |
Events | |||
on | object | イベントハンドラーを持つオブジェクトです。例えば、以下のようになります。
|
以下のすべてのパラメータは、アプリのグローバルパラメータの smartSelect
プロパティで使用でき、すべてのスマートセレクトのデフォルトを設定できることに注意してください。例えば、以下のようになります。
var app = new Framework7({
smartSelect: {
pageTitle: 'Select Option',
openIn: 'popup',
}
});
スマートセレクトのメソッドとプロパティ
スマートセレクトを作成するには、以下のメソッドを呼び出す必要があります。
var smartSelect = app.smartSelect.create({ /* parameters */ })
その後、初期化されたインスタンス(上記の例では smartSelect
変数)に、便利なメソッドとプロパティが追加されます。
Properties | |
---|---|
smartSelect.app | グローバルアプリのインスタンスへのリンク |
smartSelect.el | スマートセレクトのHTML要素 |
smartSelect.$el | スマートセレクトのHTML要素を持つDom7インスタンス |
smartSelect.valueEl | 値を表示するためのHTML要素 |
smartSelect.$valueEl | 値を表示するためのHTML要素を持つDom7インスタンス |
smartSelect.selectEl | 子セレクト要素 <select> について |
smartSelect.$selectEl | 子セレクト要素を持つDom7インスタンス |
smartSelect.url | スマートセレクトのURL(url パラメータで渡されたもの |
smartSelect.view | スマートセレクトのビュー(view パラメータで渡されたもの)、または見つかった親ビュー |
smartSelect.params | スマートセレクトのパラメータ |
Methods | |
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イベント
Event | Target | Description |
---|---|---|
smartselect:beforeopen | Smart Select Element<a class="item-link smart-select"> | イベントはスマートセレクトが開く前に発生します。event.detail.prevent` には、呼ばれたときにスマートセレクトが開かないようにする関数が含まれています。 |
smartselect:open | Smart Select Element<a class="item-link smart-select"> | スマートセレクトのページ(またはモーダル)がオープニングアニメーションを開始すると、イベントが発生します。 |
smartselect:opened | Smart Select Element<a class="item-link smart-select"> | イベントは、スマートセレクトページ(またはモーダル)のオープニングアニメーションが完了した後に発生します。 |
smartselect:close | Smart Select Element<a class="item-link smart-select"> | スマートセレクトのページ(またはモーダル)が閉じるアニメーションを開始したときにイベントが発生します。 |
smartselect:closed | Smart Select Element<a class="item-link smart-select"> | スマートセレクトのページ(またはモーダル)が閉じるアニメーションが完了した後にイベントが発生します。 |
smartselect:beforedestroy | Smart Select Element<a class="item-link smart-select"> | イベントは、スマートセレクトのインスタンスが破壊される直前に発生します。 |
アプリとスマートセレクトインスタンスのイベント
スマートセレクトのインスタンスは、セルフインスタンスとアプリインスタンスの両方でイベントを発行します。アプリのインスタンスのイベントは、同じ名前でプレフィックスが smartSelect
となっています。
Event | Target | Arguments | Description |
---|---|---|---|
beforeOpen | smartSelect | (smartSelect, prevent) | イベントはスマートセレクトが開く前に発生します。イベントハンドラは、引数としてスマートセレクトのインスタンスと、呼ばれたときにスマートセレクトが開かないようにする関数を受け取ります。 |
smartSelectBeforeOpen | app | ||
open | smartSelect | (smartSelect) | イベントは、スマートセレクトが開くアニメーションを開始したときにトリガーされます。スマートセレクトのインスタンスを受け取るイベントハンドラの引数として |
smartSelectOpen | app | ||
opened | smartSelect | (smartSelect) | イベントは、スマートセレクトが開くアニメーションを完了した後に発生します。イベントハンドラがスマートセレクトのインスタンスを受信したときの引数として |
smartSelectOpened | app | ||
close | smartSelect | (smartSelect) | イベントは、スマートセレクトが閉じるアニメーションを開始するときにトリガされます。As an argument event handler receives smart select instance |
smartSelectClose | app | ||
closed | smartSelect | (smartSelect) | スマートセレクトが閉じるアニメーションを完了するとイベントが発生します。As an argument event handler receives smart select instance |
smartSelectClosed | app | ||
beforeDestroy | smartSelect | (smartSelect) | スマートセレクトのインスタンスが破棄される直前にイベントが発生します。スマートセレクトのインスタンスを受け取るイベントハンドラの引数として |
smartSelectBeforeDestroy | app |
スマートセレクトの自動初期化
スマートセレクトAPIを使用せず、スマートセレクトがページ内にあり、ページの初期化時にDOMに表示される場合は、smart-select-init
クラスを追加するだけで、スマートセレクトを自動初期化することができます。
<li>
<!-- smart-select-initクラスの追加 -->
<a href="#" class="item-link smart-select smart-select-init">
<!-- セレクト -->
<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');
自動 init を使用する場合、追加のパラメータを渡す必要があるかもしれません。この場合、スマートセレクト要素の data-
属性ですべての追加パラメータを渡すことができます。
<li>
<!-- パラメータをケバケバのデータ属性で渡す -->
<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 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 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-smart-select-sheet-bg: var(--f7-list-bg-color);
--f7-smart-select-sheet-toolbar-border-color: var(--f7-bars-border-color);
*/
}
Examples
<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="list">
<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>