スポンサー
Support Framework7

スマートセレクト

    スマートセレクトを使うと、通常のフォームセレクトを、グループ化されたラジオやチェックボックスの入力を備えたダイナミックなページに簡単に変換することができます。このような機能は、多くのiOSネイティブアプリで見ることができます。

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

    スマートセレクトのレイアウトはとてもシンプルです。よく知られているリストビューリンクの中に<select>を入れ、item-linksmart-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-colordata-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>

    を使って、複数のセレクトやグループオプションを使うこともできます。そこで、セレクトに multiple` 属性を追加すると、スマートセレクトページのラジオボタンが自動的にチェックボックスに変換されます。

    <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を使用した場合)。スマートセレクトの要素を閉じます。

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

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

    ここでは、スマートセレクトを作成する際に必要となる、利用可能なパラメータの一覧を紹介します。

    ParameterTypeDefaultDescription
    elHTMLElementスマートセレクトの要素。すでにHTML内にスマート・セレクト要素があり、この要素を使って新しいインスタンスを作成したい場合に便利です。
    viewobjectスマート・セレクトの動作に必要な、初期化されたビュー・インスタンスへのリンク。デフォルトでは、指定されていない場合は、親ビューで開かれます。
    valueElHTMLElement選択された値を挿入するためのビジュアル要素。指定されていない場合は、<div class="item-after"> 要素を探します。
    setValueTextbooleantrueスマートセレクトを有効にすると、"formatValueText "で返されるフォーマットで、指定された "valueEl "に値のテキストが自動的に挿入されます。
    formatValueTextfunction(values)スマートセレクトで、リストアイテム(
    内)に表示されるテキスト値をフォーマットするカスタム関数です。values` は現在の値の配列です。
    openInstringpageスマートセレクトの開き方を定義します。pagepopuppopoversheet` のいずれかです。
    popupPushbooleanfalseスマートセレクトを開いたときに、ビュー/Sを後ろにプッシュする機能を有効にします。
    popupSwipeToClosebooleanundefinedスワイプでスマートセレクトのポップアップを閉じる機能を有効にします。指定しない場合は、アプリのポップアップの swipeToClose パラメータを継承します。
    sheetPushbooleanfalseスマートセレクトシートを開いた時に、ビューを後ろに押す機能を有効にします。
    sheetSwipeToClosebooleanundefinedスワイプでスマートセレクトシートを閉じる機能を有効にします。指定しない場合は、アプリのSheet swipeToClose パラメータを継承します。
    sheetBackdropbooleanfalseスマートセレクトシートの背景を有効にします。
    pageTitlestringスマートセレクトのページタイトルを指定します。指定されていない場合は、<div class="item-title">のテキストになります。
    pageBackLinkTextstringBackスマートセレクトのページバックリンクのテキスト
    popupCloseLinkTextstringCloseスマートセレクトのポップアップを閉じるためのリンクを設定します。
    popupTabletFullscreenbooleanfalse有効にすると、スマートセレクトのポップアップは、タブレットではフルスクリーンで表示されます。
    sheetCloseLinkTextstringDoneスマートセレクト シートを閉じるリンクテキスト
    searchbarboolean
    object
    falseスマートセレクトのページで検索バーを有効にします。オブジェクトとして渡される場合は、有効なサーチバーのパラメータでなければなりません。
    searchbarPlaceholderstringSearchサーチバーのプレースホルダーテキスト
    searchbarDisableTextstringCancelサーチバーの「キャンセル」リンクのテキスト。iOSテーマでのみ有効です。
    searchbarSpellcheckbooleanfalseSearchbar の input 要素の spellcheck 属性の値を設定します。
    appendSearchbarNotFoundboolean
    string
    HTMLElement
    falseSearchbarの結果が出なかった場合に表示されるコンテンツをブロックに追加します。

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

    <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開いたスマートセレクトのモーダル(openInpopup, popover, sheet の場合)をルーターの履歴に追加します。これにより、ルーターの履歴をさかのぼり、現在のルートをスマートセレクトのモーダルに設定することで、スマートセレクトを閉じることができます。
    urlstringselect/カレントルートとして設定されるスマートセレクトのページ/モーダルのURL
    cssClassstringスマートセレクトのコンテナ(ページ、ポップアップ、ポップオーバー、シート)に設定される追加のCSSクラス名
    Render functions
    renderSearchbarfunctionスマートセレクトのサーチバー・ドロップダウンをレンダリングする関数(サーチバーのHTML文字列を返さなければならない
    renderItemfunction(item, index)スマートセレクトのアイテムをレンダリングする機能は、アイテムのHTML文字列を返す必要があります。
    renderItemsfunction(items)スマートセレクトの全ての項目を表示する機能は、全ての項目のHTML文字列を返さなければなりません。
    renderPagefunction(items)スマートセレクトのページを描画する機能は、フルページを返さなければなりません。
    renderPopupfunction(items)スマートセレクトポップアップを描画する機能は、フルポップアップを返さなければなりません。
    renderSheetfunction(items)スマートセレクトシートを表示する機能は、シート全体を表示する必要があります。
    renderPopoverfunction(items)スマートセレクトポップオーバーをレンダリングする関数は、完全なポップオーバーを返さなければなりません HTML 文字列
    Events
    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 変数)に、便利なメソッドとプロパティが追加されます。

    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イベント

    EventTargetDescription
    smartselect:beforeopenSmart Select Element<a class="item-link smart-select">イベントはスマートセレクトが開く前に発生します。event.detail.prevent` には、呼ばれたときにスマートセレクトが開かないようにする関数が含まれています。
    smartselect:openSmart Select Element<a class="item-link smart-select">スマートセレクトのページ(またはモーダル)がオープニングアニメーションを開始すると、イベントが発生します。
    smartselect:openedSmart Select Element<a class="item-link smart-select">イベントは、スマートセレクトページ(またはモーダル)のオープニングアニメーションが完了した後に発生します。
    smartselect:closeSmart Select Element<a class="item-link smart-select">スマートセレクトのページ(またはモーダル)が閉じるアニメーションを開始したときにイベントが発生します。
    smartselect:closedSmart Select Element<a class="item-link smart-select">スマートセレクトのページ(またはモーダル)が閉じるアニメーションが完了した後にイベントが発生します。
    smartselect:beforedestroySmart Select Element<a class="item-link smart-select">イベントは、スマートセレクトのインスタンスが破壊される直前に発生します。

    アプリとスマートセレクトインスタンスのイベント

    スマートセレクトのインスタンスは、セルフインスタンスとアプリインスタンスの両方でイベントを発行します。アプリのインスタンスのイベントは、同じ名前でプレフィックスが smartSelect となっています。

    EventTargetArgumentsDescription
    beforeOpensmartSelect(smartSelect, prevent)イベントはスマートセレクトが開く前に発生します。イベントハンドラは、引数としてスマートセレクトのインスタンスと、呼ばれたときにスマートセレクトが開かないようにする関数を受け取ります。
    smartSelectBeforeOpenapp
    opensmartSelect(smartSelect)イベントは、スマートセレクトが開くアニメーションを開始したときにトリガーされます。スマートセレクトのインスタンスを受け取るイベントハンドラの引数として
    smartSelectOpenapp
    openedsmartSelect(smartSelect)イベントは、スマートセレクトが開くアニメーションを完了した後に発生します。イベントハンドラがスマートセレクトのインスタンスを受信したときの引数として
    smartSelectOpenedapp
    closesmartSelect(smartSelect)イベントは、スマートセレクトが閉じるアニメーションを開始するときにトリガされます。As an argument event handler receives smart select instance
    smartSelectCloseapp
    closedsmartSelect(smartSelect)スマートセレクトが閉じるアニメーションを完了するとイベントが発生します。As an argument event handler receives smart select instance
    smartSelectClosedapp
    beforeDestroysmartSelect(smartSelect)スマートセレクトのインスタンスが破棄される直前にイベントが発生します。スマートセレクトのインスタンスを受け取るイベントハンドラの引数として
    smartSelectBeforeDestroyapp

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

    スマートセレクト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>