• TOP
  • ブログ
  • プロフィール
  • お問い合わせ
  • 【jQuery】selectタグのデザインをカスタマイズ

    【jQuery】selectタグのデザインをカスタマイズ

    フォームをつくるとき、見た目を変えたいことがあるかと思います。
    だいたいの要素はCSSでカスタマイズできますが、selectタグのoption要素にはCSSが効きません。

    そこで、CSSとjQueryでselectタグを操作する方法をまとめました。

    demo

    実装方法

    HTML

    <div id="select">
      <div class="selectBox">
        <div class="selectBox__output"></div>
        <div class="selectBox__selector">
          <div class="selectBox__selectorItem" data-select="cat1">カテゴリ1</div>
          <div class="selectBox__selectorItem" data-select="cat2">カテゴリ2</div>
          <div class="selectBox__selectorItem" data-select="cat3">カテゴリ3</div>
        </div>
        <select name="" id="select01">
          <option value="cat1">カテゴリ1</option>
          <option value="cat2">カテゴリ2</option>
          <option value="cat3">カテゴリ3</option>
        </select>
      </div>
    </div>

    CSS

    *{
      box-sizing: border-box;
    }
    ul,li{
      margin: 0;
      padding: 0;
      list-style: none;
    }
    
    .selectBox{
      position: relative;
      width: 10em;
      height: 60px;
    }
    .selectBox select{
      position: absolute;
      left: 0;
      top: 0;
      width: 100%;
      height: 100%;
    }
    .selectBox__output{
      display: flex;
      align-items: center;
      position: relative;
      width: 100%;
      height: 100%;
      padding: 1em;
      border: 1px solid #ccc;
      background-color: #fff;
      border-radius: 5px;
      z-index: 2;
    }
    .selectBox__output::after{
      display: block;
      position: absolute;
      right: 3%;
      top: 50%;
      font-family: "CONDENSEicon";
      transform: translateY(-50%);
      content: "û";
    }
    .selectBox__output.open::after{
      transform: translateY(-50%) rotate(180deg);
    }
    .selectBox__selector{
      display: none;
      position: absolute;
      left: 0;
      top: calc(100% - 1px);
      width: 100%;
      border: 1px solid #ccc;
      background-color: #fff;
      z-index: 10;
    }
    .selectBox__selectorItem{
      width: 100%;
      padding: .75em;
    }
    .selectBox__selectorItem+.selectBox__selectorItem{
      border-top: 1px solid #ccc;
    }
    .selectBox__selectorItem:hover{
      background-color: #0d61ad;
      color:#fff;
    }

    jQuery

    //初期値
    $('.selectBox__output').each(function () {
      const defaultText = $(this).next('.selectBox__selector').children('.selectBox__selectorItem:first-child').text()
      $(this).text(defaultText);
    })
    
    //出力の枠をクリックした時の動作
    $('.selectBox__output').on('click', function (e) {
      e.stopPropagation();
      if ($(this).hasClass('open')) {
        $(this).next('.selectBox__selector').slideUp();
      } else {
        $(this).next('.selectBox__selector').slideDown();
      }
      $(this).toggleClass('open');
    });
    
    //選択肢をクリックした時の動作
    $('.selectBox__selectorItem').on('click', function () {
      const selectVal = $(this).data('select');
      const selectText = $(this).text();
      $(this).parent('.selectBox__selector').prev('.selectBox__output').text(selectText);
      $(this).parent('.selectBox__selector').slideUp();
      $(this).parents('.selectBox__output').slideDown();
      $(this).parent('.selectBox__selector').next('select').val(selectVal);
    });

    簡単な説明

    空のdivタグ(.selectBox__output)を用意し、そこに選択しているoption要素のテキストをjQueryで取得して出力するようにしています。(jQueryのselectText変数に値が入る)

    また、そのすぐ後に、option要素と同じ選択肢を入れたdivタグ(.selectBox__selector)を用意しています。この選択肢にはdata属性でoption要素のvalueと同じ値を持たせています。
    そうすることで、この選択肢を選択すると、同じ値のoption要素が選ばれた状態にできるようになっています。(jQueryのselectVal変数に選択した値が入る)

    こうして用意した要素はdivタグやspanタグなので、CSSで見た目をカスタマイズすることができます。
    selectタグはCSSで後ろに隠してしまえばOKです。
    (demoではわかりやすいように見える位置においています。)

    まとめ

    form系のタグはブラウザごとに見た目が異なるので、サイトのトンマナに合わせて変更したいということはよくあると思います。
    radioやcheckboxなどはCSSだけでも見た目カスタマイズできるのですが、selectタグはどうにもならず、jQueryでいろいろすることになってしまいました。。。

    もう少し手軽できればなあ、と思うのですが、optionにCSSが効かないのでどうしようもない。。。

    yori3

    2020年2月16日
    【Web】いろいろ試してみた話
    css, html, jQuery
  • 【jQuery】タブで切り替えるコンテンツの実装

    【jQuery】タブで切り替えるコンテンツの実装

    メモもかねてタブで切り替えるコンテンツをjQueryで作る方法を紹介します。

    これを書こうと思いながら改めてブログを振り返ってると以前にも書いてたんですが、id使ってたりちょっとまどろっこしいなと思ったので、もう少しシンプル目なやつにしました。

    demo

    実装方法

    html

    <div id="tab">
      <ul class="tabMenu">
        <li class="tabItem tabItem-current">tab01</li>
        <li class="tabItem">tab02</li>
        <li class="tabItem">tab03</li>
      </ul>
    
      <div class="tabContent">
        <div class="tabBlock tabBlock-show">
          <div class="tabBlock__inner">
            <h3 class="tabBlock__title">コンテンツ01</h3>
            <p class="tabBlock__text">テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
          </div>
        </div>
        <div class="tabBlock">
          <div class="tabBlock__inner">
            <h3 class="tabBlock__title">コンテンツ02</h3>
            <p class="tabBlock__text">テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
          </div>
        </div>
        <div class="tabBlock">
          <div class="tabBlock__inner">
            <h3 class="tabBlock__title">コンテンツ03</h3>
            <p class="tabBlock__text">テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
          </div>
        </div>
      </div>
    </div>

    CSS

    *{
      box-sizing: border-box;
    }
    ul,li{
      margin: 0;
      padding: 0;
      list-style: none;
    }
    #tab{
      max-width: 640px;
      margin: 0 auto;
    }
    
    .tabMenu{
      display: flex;
      justify-content: space-around;
      align-items: flex-end;
      list-style: none;
      border-bottom: 1px solid #ffa594;
    }
    .tabItem{
      display: flex;
      justify-content: center;
      align-items: center;
      height: 60px;
      flex-basis: 32%;
      flex-shrink: 0;
      border-left: 1px solid #ffa594;
      border-right: 1px solid #ffa594;
      border-top: 1px solid #ffa594;
      border-radius: 10px 10px 0 0;
      color: #ffa594;
      font-weight: bold;
      text-align: center;
    }
    .tabItem.tabItem-current{
      background-color: #ffa594;
      color: #fff;
    }
    
    .tabContent{
      position: relative;
      border: 1px solid #ffa594;
    }
    .tabBlock{
      position: absolute;
      left: 0;
      top: 0;
      width: 100%;
      padding: 60px;
      opacity: 0;
      transition: .5s;
    }
    .tabBlock.tabBlock-show{
      position: static;
      opacity: 1;
    }

    jQuery

    const tabLen = $('.tabItem').length;
    for (i = 0; i < tabLen; i++) {
      tabChange(i);
    }
    
    function tabChange(index) {
      $('.tabItem:nth-child(' + (index + 1) + ')').on('click', function (e) {
        e.preventDefault();
        $('.tabItem.tabItem-current').removeClass('tabItem-current');
        $(this).addClass('tabItem-current');
        $('.tabBlock.tabBlock-show').removeClass('tabBlock-show');
        $('.tabBlock:nth-child(' + (index + 1) + ')').addClass('tabBlock-show');
      });
    }

    簡単な説明

    クリックしたタブが何番目かを取得して、それに対応するコンテンツエリアを表示するようにしています。
    htmlとしては共通のクラスをつけるだけなので、更新がとてもシンプルになるかなと思います。
    複数設置する場合はeach構文などを使えばできるかと思います。

    まとめ

    よく使うので、まとめておきました。
    コードまとめておいておくと使うときコピペして、必要なところだけいじれば使えるので、とても便利です。

    また、自分用にメモしてるやつをいくつかブログに出していくようにしたいと思います。

    同じものVue.jsでもつくりました。

    yori3

    2020年2月2日
    【Web】いろいろ試してみた話
    css, html, jQuery

©️ 2024 yori3 All rights reserved.