Webデザイン

複数のselectで1つを選択したら他の選択をキャンセルする

複数のselectで1つを選択したら他の選択をキャンセルする

どうもこんにちは。
Web/App/UIデザイナーのサトウです。

今回は、複数のselectで1つを選択したら他の選択をキャンセルするコードを紹介します。

タイトル用に短くまとめたのでちょっとわかりづらいんですが、複数あるselectのうち、1つのselectで値を選択したら、それ以外のselectを未選択の状態にリセットする(選択をキャンセルする)という動きです。

具体的にはデモをご覧ください。

デモ

See the Pen
Untitled
by foolishlife (@foolishlife)
on CodePen.

ご覧のとおり、1つのselectに値が入ると他のselectの値がリセットされます。
かつ、影響し合うのは指定したグループ内にあり指定のclassが付いたselectのみです。

html

ポイントは下記2点です。

  • この処理を適用したいselectにclass「only-select」を付けておく。
    →対象を指定。
  • 影響を与え合いたいselectはclass「select-group」を付けた要素で囲んでおく。
    →影響し合う範囲を指定。

もちろん、class名は上記のとおりでなく任意のものでかまいません。

<form action="">
  <h2>グループ01</h2>
  <div class="select-group" id="group01">
    <div>
      <select name="select0101" id="select-01-01" class="only-select">
        <option value="" selected="selected">グループ01のselect01</option>
        <option value="value-01-01-a">選択肢01-01-A</option>
        <option value="value-01-01-b">選択肢01-01-B</option>
        <option value="value-01-01-c">選択肢01-01-C</option>
        <option value="value-01-01-d">選択肢01-01-D</option>
        <option value="value-01-01-e">選択肢01-01-E</option>
      </select>
    </div>
    <div>
      <select name="select0102" id="select-01-02" class="only-select">
        <option value="" selected="selected">グループ01のselect02</option>
        <option value="value-01-02-a">選択肢01-02-A</option>
        <option value="value-01-02-b">選択肢01-02-B</option>
        <option value="value-01-02-c">選択肢01-02-C</option>
        <option value="value-01-02-d">選択肢01-02-D</option>
        <option value="value-01-02-e">選択肢01-02-E</option>
      </select>
    </div>
    <div>
      <select name="select0103" id="select-01-03" class="only-select">
        <option value="" selected="selected">グループ01のselect03</option>
        <option value="value-01-03-a">選択肢01-03-A</option>
        <option value="value-01-03-b">選択肢01-03-B</option>
        <option value="value-01-03-c">選択肢01-03-C</option>
        <option value="value-01-03-d">選択肢01-03-D</option>
        <option value="value-01-03-e">選択肢01-03-E</option>
      </select>
    </div>
  </div>

  <h2>グループ02</h2>
  <div class="select-group" id="group02">
    <div>
      <select name="select0201" id="select-02-01" class="only-select">
        <option value="" selected="selected">グループ02のselect01</option>
        <option value="value-02-01-a">選択肢02-01-A</option>
        <option value="value-02-01-b">選択肢02-01-B</option>
        <option value="value-02-01-c">選択肢02-01-C</option>
        <option value="value-02-01-d">選択肢02-01-D</option>
        <option value="value-02-01-e">選択肢02-01-E</option>
      </select>
    </div>
    <div>
      <select name="select0202" id="select-02-02" class="only-select">
        <option value="" selected="selected">グループ02のselect02</option>
        <option value="value-02-02-a">選択肢02-02-A</option>
        <option value="value-02-02-b">選択肢02-02-B</option>
        <option value="value-02-02-c">選択肢02-02-C</option>
        <option value="value-02-02-d">選択肢02-02-D</option>
        <option value="value-02-02-e">選択肢02-02-E</option>
      </select>
    </div>
  </div>
</form>

jQuery

jQueryの「.val()」を使ってselectの値を取得し、その値次第で振る舞わせます。
jQueryはバージョン1.x以降どのバージョンでも動作します。

$(window).on('load', function () { // ウインドウが読み込まれたら処理開始
  $('.only-select').change(function () { // .only-selectが操作されたら処理開始
    var selectVal = $(this).val(); // 変数 selectVal を定義
    var parentIdValue = $(this).parents('.select-group').attr('id'); // 値が選択されたselectの親の中からclass名「select-group」のついているものを見つけ、そのidの文字列を取得
    var parentId = '#' + parentIdValue; // 取得したid文字列の先頭に「#」を付与
    if (!selectVal == '') { // もし selectVal が空じゃなかったら処理開始
      var others = $(parentId).find('.only-select').not(this); // 「自分以外」を定義
      $(others).css({ // parentIdの中から.only-selectを見つけ、その中のthis以外にcssを適用
        'opacity': 0.3,
      });
      $(others).val(''); // parentIdの中から.only-selectを見つけ、その中のthis以外の値を空にする
      $(this).css('opacity', 1);
    } else { // もし selectVal が空だったら処理開始
      $(parentId).find('.only-select').css({ // parentIdの中にあるすべての.only-selectにcssを適用
        'opacity': 1,
      });
    }
  });
});

UIについて

両立しない2種類の選択を同時に提示するという、あまり見かけないUIです。

こう言ったケースでは、だいたいの場合2段階を踏んで選択させるUIになるかと思います。
が、その場合、選択の操作を2回することになります。

今回の方法では選択の操作が1回で済みます。
が、「どちらのselectのどの値を選ぶか」という2つの選択を同時にすることになり、ユーザーの思考は若干煩雑になります。

基本的には前者の段階を踏んだ選択で良いのだろうと思いますが、今回はクライアントの意向もあったことと、「こういったUIも確かになくはないかなぁ」と思ったこともあり、実装してみました。

さて、今回は、複数のselectで1つを選択したら他の選択をキャンセルするコードを紹介しました。
いかがだったでしょうか?
読んでくださったあなたの参考に少しでもなれば嬉しいです。
それではまた次回。