とほほのカスタマイザブルセレクト入門

目次

カスタマイザブルセレクトとは

追加された仕様

下記の要素、値、疑似要素が追加されました。

使用例

基本的な使用例(select, ::picker(select), base-select)

select要素、およびその選択肢である ::picker(select) 疑似要素の appearance プロパティに base-select を指定することで、セレクト部品の外観をOS依存のネイティブスタイルではなく、OSに依存しないCSS標準のベーススタイルにすることができます。

CSS
.base-select, .base-select::picker(select) {
  appearance: base-select;
}
HTML
<select>
  <option>ネイティブスタイルな選択肢#1</option>
  <option>ネイティブスタイルな選択肢#2</option>
  <option>ネイティブスタイルな選択肢#3</option>
</select>
<select class="base-select">
  <option>ベーススタイルな選択肢#1</option>
  <option>ベーススタイルな選択肢#2</option>
  <option>ベーススタイルな選択肢#3</option>
</select>
表示

選択肢に画像を表示する

選択肢に画像を表示することができます。

CSS
.my-image-option {
  option {
    margin: 4px 0;
    img {
      width: 32px;
      border: 1px solid #ccc;
    }
  }
}
HTML
<select class="base-select my-image-option">
  <option><img src="../free/flag-japan.svg" alt=""> 日本</option>
  <option><img src="../free/flag-usa.svg" alt=""> 米国</option>
  <option><img src="../free/flag-germany.svg" alt=""> ドイツ</option>
</select>
表示

選択されたコンテンツをカスタマイズする(<selectedcontent>)

<button><selectedcontent> を記述すると選択されたコンテンツをカスタマイズすることができます。

CSS
.my-selected-content {
  selectedcontent {
    font-weight: bold;
  }
}
HTML
<select class="base-select my-selected-content">
  <button>
    選択:<selectedcontent></selectedcontent>
  </button>
  <option>選択肢#1</option>
  <option>選択肢#2</option>
  <option>選択肢#3</option>
</select>
表示

選択された選択肢(:checked)

:checked で選択された選択肢のスタイルを指定することができます。

CSS
.my-checked {
  option:checked {
    font-weight: bold;
    background-color: pink;
    color: red;
  }
}
HTML
<select class="base-select my-checked">
  <option>選択肢#1</option>
  <option>選択肢#2</option>
  <option>選択肢#3</option>
</select>
表示

ピッカーアイコン(::picker-icon)

セレクトボックスの右端に表示されるピッカーアイコン(▼)は ::picker-icon 疑似要素に対して display: none で非表示にしたり、content: で他のコンテンツに置き換えたり、スタイルを指定することができます。

CSS
.my-picker-icon {
  &::picker-icon {
    content: "⇩";
    color: red;
  }
}
HTML
<select class="base-select my-picker-icon">
  <option>選択肢#1</option>
  <option>選択肢#2</option>
  <option>選択肢#3</option>
</select>
表示

チェックマーク(::checkmark)

選択された選択肢の左に表示されるチェックマーク(✔)は ::checkmark 疑似要素に対して display: none で非表示にしたり、content: で他のコンテンツに置き換えたり、スタイルを指定することができます。

CSS
.my-checkmark {
  option::checkmark {
    /* display: none; */
    content: "●";
    color: red;
  }
}
HTML
<select class="base-select my-checkmark">
  <option>選択肢#1</option>
  <option>選択肢#2</option>
  <option>選択肢#3</option>
</select>
表示

選択肢にフレックスボックスを適用する

選択肢にフレックスボックスを適用することもできます。

CSS
.my-flex {
  display: flex;
  flex-flow: column wrap;
  height: 50px;
  border: 1px solid #ccc;
}
HTML
<select class="base-select">
  <div class="my-flex">
    <option>選択肢#1</option>
    <option>選択肢#2</option>
    <option>選択肢#3</option>
    <option>選択肢#4</option>
  </div>
</select>
表示

選択肢に詳細説明を追加する

選択肢に詳細説明を追加し、選択時に display: none で非表示にすることで、選択肢に詳細説明を追記することができます。未対応ブラウザで表示すると詳細説明も表示されてしまうので注意してください。

CSS
.my-description {
  width: 10rem;
  selectedcontent {
    .description {
      display: none;
    }
  }
  option {
    .option-item {
      padding-bottom: 10px;
      .title {
        font-weight: bold;
      }
      .description {
        font-size: 80%;
        color: #666;
      }
    }
  }
}
HTML
<select class="base-select my-description">
  <button>
    <selectedcontent></selectedcontent>
  </button>
  <option>
    <div class="option-item">
      <div class="title">選択肢#1</div>
      <div class="description">選択肢#1は...</div>
    </div>
  </option>
  <option>
    <div class="option-item">
      <div class="title">選択肢#2</div>
      <div class="description">選択肢#2は...</div>
    </div>
  </option>
  <option>
    <div class="option-item">
      <div class="title">選択肢#3</div>
      <div class="description">選択肢#3は...</div>
    </div>
  </option>
</select>
表示

セレクトボックスにトランジションを適用する

セレクトボックスに選択肢を表示する際にトランジションをかけることができます。

CSS
.my-transition {
  selectedcontent > div {
    transition: transform .2s ease;
    @starting-style {
      transform: translateY(10px);
    }
  }
}
HTML
<select class="base-select my-transition">
  <button>
    <selectedcontent></selectedcontent>
  </button>
  <option><div>選択肢#1</div></option>
  <option><div>選択肢#2</div></option>
  <option><div>選択肢#3</div></option>
</select>
表示