LoginSignup
0
1

More than 1 year has passed since last update.

HTMLのラジオボタンをいい感じに自作する。

Last updated at Posted at 2021-10-12

経緯

偉い人「CSSで調整できるラジオボタンが欲しい」
蝦「はい」

作るもの

image.png

HTML

radio.html
<!DOCTYPE html>
<html lang="ja">
  <body>
    <h1>CSSでスタイルを設定できるラジオボタン</h1>
    <div>
      <label class="radio-label" for="radio-1"
        ><input
          type="radio"
          name="choice-1"
          class="radio-none-dsplay"
          id="radio-1"
        /><span class="dummy-radio"
          ><span class="dummy-radio-check"></span></span
        >選択肢1</label
      >
      <label class="radio-label" for="radio-2">
        <input
          type="radio"
          name="choice-1"
          class="radio-none-dsplay"
          id="radio-2"
        /><span class="dummy-radio"
          ><span class="dummy-radio-check"></span></span
        >選択肢2</label
      >
      <label class="radio-label" for="radio-3">
        <input
          type="radio"
          name="choice-1"
          class="radio-none-dsplay"
          id="radio-3"
        /><span class="dummy-radio"
          ><span class="dummy-radio-check"></span></span
        >選択肢3</label
      >
    </div>
  </body>
</html>

以下、重要な点

labelのクリックでinputを選択できるようにする。

input要素のid属性とlabel要素のfor属性を同じにすると、label要素とinput要素を関連付けできる。この場合はlabelをクリックするとinput要素を選択できるようになる。

MDN曰く

label要素 を input要素に関連付けるには、 input要素に id 属性を設定しなければなりません。そして label要素 に for 属性を設定して、値を input要素 の id と同じにします。
他の方法として、 input を直接 label の内側に入れることができますが、この場合は関連付けが明確なので、 for および id 属性は> > 必要ありません。

単に関連付けするだけならどちらかでいい。

ダミーのラジオボタンを作るためのspan要素を作る。

input要素の直後に配置してセレクタで選べるようにする。input要素が外にある場合でもセレクタが変わるだけで同じ。

CSS

style.css
/* HTMLでラジオボタン部分を自作するため隠す。 */
.radio-none-dsplay {
  display: none;
}

/* ラベル本体 */
.radio-label {
  /* 縦に並べてなおかつ中の要素をきれいに中央に配置する */
  display: flex;
  vertical-align: middle;
  align-items: center;
}

/* 代わりに表示するラジオボタン部分 */
.dummy-radio {
  display: inline-block;
  margin-right: 5px;
  height: 18px;
  width: 18px;
  border: solid 1px black;
  position: relative;
  vertical-align: middle;
}

/* ラジオボタンの中に表示するチェック部分 */
/* 非選択時は非表示 */
.dummy-radio-check {
  display: none;
}

/* チェック部分のCSS */
/* 選択時のみチェックを表示する。 */
.radio-none-dsplay:checked + .dummy-radio > .dummy-radio-check {
  bottom: 3px;
  left: 3px;
  display: block;
  position: absolute;
  height: 18px;
  width: 10px;
  border-bottom: solid 5px black;
  border-right: solid 5px black;
  transform: rotate(30deg);
}

以下、重要な点

疑似クラスセレクター

クラスや要素の後ろに:hogeの形で書くあれ。今回はinput要素が選択されているかどうかの判別に使う。

style.css
.radio-none-dsplay:checked{/*ここにスタイル*/}

結合子

今回は+(隣接兄弟結合子)と>(子結合子)を使う
input選択時のみチェック部分を表示したいので
「選択されたinput.radio-none-dsplayの直後(隣接兄弟結合子)にある.dummy-radioの中の(子結合子).dummy-radio-check」
というセレクターを書けばOK

style.css
.radio-none-dsplay:checked+ .dummy-radio > .dummy-radio-check {/*ここにスタイル*/}

おわり

なんかあったらコメントください

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1