スマートセレクト

スマートセレクトを使用すると、通常のフォームのセレクトを、グループ化されたラジオボタンまたはチェックボックスの入力を持つ動的なページに簡単に変換できます。この機能は多くのネイティブiOSアプリで見られます。

スマートセレクトレイアウト

スマートセレクトのレイアウトは非常にシンプルです。これは、<select>を内部に持ち、item-linksmart-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属性を使用することで、スマートセレクトページのリストビュー(オプション)のアイコンを指定できます。

カスタムオプションの色と画像

スマートセレクトページのリストビュー要素の画像または色も指定できます。スマートセレクトの<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セレクタを使用)。閉じるスマートセレクト要素。

メソッドは、スマートセレクトのインスタンスを返します。

スマートセレクトパラメータ

スマートセレクトを作成するために必要な、利用可能なパラメータのリストを見てみましょう。

パラメータタイプデフォルト説明
elHTMLElementスマートセレクト要素。HTMLにスマートセレクト要素がすでにあり、この要素を使用して新しいインスタンスを作成する場合に役立ちます。
viewobjectスマートセレクトが機能するために必要な初期化されたViewインスタンスへのリンク。デフォルトでは、指定されていない場合、親Viewで開かれます。
valueElHTMLElement選択した値を挿入する視覚要素。渡されない場合は、<div class="item-after">要素を探します。
setValueTextbooleantrue有効にすると、スマートセレクトは、"formatValueText"によって返される形式で、指定された"valueEl"に値のテキストを自動的に挿入します。
formatValueTextfunction(values)リストアイテム(<div class="item-after">内)に表示されるスマートセレクトのテキスト値をフォーマットするカスタム関数。valuesは現在の値の配列です。
openInstringpageスマートセレクトを開く方法を定義します。pageまたはpopupまたはpopoverまたはsheetを指定できます。
popupPushbooleanfalseスマートセレクトポップアップを開いたときに、背後のビューをプッシュできるようにします。
popupSwipeToClosebooleanundefinedスワイプでスマートセレクトポップアップを閉じることができるようにします。指定しない場合は、アプリのポップアップのswipeToCloseパラメータを継承します。
sheetPushbooleanfalseスマートセレクトシートを開いたときに、背後のビューをプッシュできるようにします。
sheetSwipeToClosebooleanundefinedスワイプでスマートセレクトシートを閉じることができるようにします。指定しない場合は、アプリのシートのswipeToCloseパラメータを継承します。
sheetBackdropbooleanfalseスマートセレクトシートの背景を有効にします。
pageTitlestringスマートセレクトページのタイトル。渡されない場合は、<div class="item-title">のテキストになります。
pageBackLinkTextstring戻るスマートセレクトページの戻るリンクテキスト。
popupCloseLinkTextstring閉じるスマートセレクトポップアップの閉じるリンクテキスト。
popupTabletFullscreenbooleanfalse有効にすると、スマートセレクトポップアップはタブレットでフルスクリーンとして表示されます。
sheetCloseLinkTextstring完了スマートセレクトシートの閉じるリンクテキスト。
searchbarboolean
object
falseスマートセレクトページで検索バーを有効にします。オブジェクトとして渡された場合は、有効な検索バーのパラメータである必要があります。
searchbarPlaceholderstring検索検索バーのプレースホルダーテキスト。
searchbarDisableTextstringキャンセル検索バーの「キャンセル」リンクテキスト。iOSテーマでのみ有効です。
searchbarSpellcheckbooleanfalse検索バーの入力要素のspellcheck属性の値を設定します。
appendSearchbarNotFoundboolean
string
HTMLElement
false検索バーの結果がない場合に表示されるコンテンツを含むブロックを追加します。

文字列として指定された場合、追加されます

<div class="block searchbar-not-found">{{appendSearchbarNotFound}}</div>

trueとして指定された場合

<div class="block searchbar-not-found">Nothing found</div>

HTMLElementが渡された場合、その要素を追加します。

closeOnSelectbooleanfalse有効にすると、ユーザーがオプションを選択した後、スマートセレクトは自動的に閉じられます。
virtualListbooleanfalseセレクトに多数(数百、数千)のオプションがある場合は、スマートセレクトの仮想リストを有効にします。
virtualListHeightnumber
function
仮想リストのアイテムの高さ。numberの場合、リストアイテムの高さ(px)。functionの場合、関数はアイテムの高さを返す必要があります。
scrollToSelectedItembooleanfalse有効にすると、スマートセレクトのコンテンツを開いたときに最初に選択されたアイテムまでスクロールします。
formColorThemestringスマートセレクトページのフォームカラーテーマ。 デフォルトカラー のいずれか。
navbarColorThemestringスマートセレクトのナビゲーションバーのカラーテーマ。 デフォルトカラー のいずれか。
routableModalsbooleanfalseスマートセレクトモーダル(openInpopuppopover、またはsheetの場合)を開いたときに、ルーターの履歴に追加します。これにより、ルーターの履歴を戻ることでスマートセレクトを閉じることができ、現在のルートをスマートセレクトモーダルに設定できます。
urlstringselect/現在のルートとして設定されるスマートセレクトページ/モーダルのURL
cssClassstringスマートセレクトコンテナ(ページ、ポップアップ、ポップオーバー、またはシート)に設定する追加のCSSクラス名
closeByBackdropClickbooleantrue有効にすると、スマートセレクトモーダル(ポップオーバー、ポップアップ、シート)は背景をクリックすると閉じます
inputIconPositionstring'start'選択オプションのチェックボックスまたはラジオアイコンの位置。'start'または'end'を指定できます。また、data-input-icon-position属性を使用して各オプションに設定することもできます。
optionIconstringすべてのオプションに設定する選択オプションのアイコン。単なる文字列の場合は、このクラスを持つアイコンが作成されます。f7:icon_nameの形式の場合、F7-Iconsアイコンが作成されます。md:icon_nameの形式の場合、Material Iconsアイコンが作成されます。
optionIconIosstringoptionIconと同じですが、iOSテーマがアクティブな場合にのみ適用されます。
optionIconMdstringoptionIconと同じですが、MDテーマがアクティブな場合にのみ適用されます。
レンダリング関数
renderSearchbarfunctionスマートセレクトの検索バーのドロップダウンをレンダリングする関数。検索バーのHTML文字列を返す必要があります。
renderItemfunction(item, index)スマートセレクトのアイテムをレンダリングする関数。アイテムのHTML文字列を返す必要があります。
renderItemsfunction(items)すべてのスマートセレクトアイテムをレンダリングする関数。すべてのアイテムのHTML文字列を返す必要があります。
renderPagefunction(items)スマートセレクトページをレンダリングする関数。ページ全体のHTML文字列を返す必要があります。
renderPopupfunction(items)スマートセレクトポップアップをレンダリングする関数。ポップアップ全体のHTML文字列を返す必要があります。
renderSheetfunction(items)スマートセレクトシートをレンダリングする関数。シート全体のHTML文字列を返す必要があります。
renderPopoverfunction(items)スマートセレクトポップオーバーをレンダリングする関数。ポップオーバー全体のHTML文字列を返す必要があります。
イベント
onobject

イベントハンドラーを持つオブジェクト。例:

var smartSelect = app.smartSelect.create({
  ...
  on: {
    opened: function () {
      console.log('Smart select opened')
    }
  }
})

次のすべてのパラメーターは、グローバルアプリパラメーターの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が付いています。

イベントターゲット引数説明
beforeOpensmartSelect(smartSelect, prevent)スマートセレクトが開く前にトリガーされるイベント。引数として、イベントハンドラーはスマートセレクトインスタンスと、呼び出されたときにスマートセレクトが開くのを防ぐ関数を受け取ります。
smartSelectBeforeOpenapp
opensmartSelect(smartSelect)スマートセレクトが開くアニメーションを開始するときにトリガーされるイベント。引数として、イベントハンドラーはスマートセレクトインスタンスを受け取ります。
smartSelectOpenapp
openedsmartSelect(smartSelect)スマートセレクトが開くアニメーションを完了した後にトリガーされるイベント。引数として、イベントハンドラーはスマートセレクトインスタンスを受け取ります。
smartSelectOpenedapp
closesmartSelect(smartSelect)スマートセレクトが閉じるアニメーションを開始するときにトリガーされるイベント。引数として、イベントハンドラーはスマートセレクトインスタンスを受け取ります。
smartSelectCloseapp
closedsmartSelect(smartSelect)スマートセレクトが閉じるアニメーションを完了した後にトリガーされるイベント。引数として、イベントハンドラーはスマートセレクトインスタンスを受け取ります。
smartSelectClosedapp
beforeDestroysmartSelect(smartSelect)スマートセレクトインスタンスが破棄される直前にトリガーされるイベント。引数として、イベントハンドラーはスマートセレクトインスタンスを受け取ります。
smartSelectBeforeDestroyapp

スマートセレクトの自動初期化

スマートセレクト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);
  */
}

smart-select.html
<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>