スパイラル

【スパライル】ラジオボタンをカスタマイズしたらrequiredのエラーメッセージが表示されない

記事内に商品プロモーションを含む場合があります

スパイラルでフォームを作成しています。

性別の項目はラジオボタンにしていますが、図の上の性別のようにボタンで表現したいと思っています。

 

ところが、スタイルシートで体裁を整えると、requiredのエラーメッセ―ジが表示されないという現象になってしまいました。

図はEdgeでのValidationエラー画面です。Edgeでは全てのエラーが一度にマークされるんですね。

GoogleChromeでは上の項目から1つずつエラーが表示されます。

 

ラジオボタンのカスタマイズ(元)

元のCSSは以下の通りです。

ラジオボタンは非表示にしてチェックされた時とマウスホバーした時にそれぞれスタイルを適用するようにしています。

/*---------------------------

ラジオボタンの設定

--------------------------- */

/* ラジオボタンは非表示にする */
input[type=radio] {
  display: none; 
}
/* チェックされた時のスタイル */
input[type="radio"]:checked + label {
  background: #FAC090;
  color: #000; 
}
/* マウスオーバーしたときのスタイル */
label.yesno:hover {
  background-color: #FDEADA; 
}
/* lableのスタイル */
label.yesno {
 border: #dddddd solid 3px;
 color: #000;
 display: block;
 font-size: 20px;
 line-height: 60px;
 height: 60px;
 padding-left: 20px;
 padding-right: 20px;
 cursor: pointer; 
 box-sizing: border-box;
 min-width: 106px;
}

/* 選択肢センタリング */
.smp_tmpl dl dd: {
    text-align: center;
}

 

どうしてRequiredが効かないのか?

答えは超シンプルでした!

非表示の<input>要素ではフォームバリデーションが実行されない

↑これだけ!

そうかぁ。。。

非表示にしたらダメなんですね…。

 

ラジオボタンを非表示にせずに非表示風にする方法

ラジオボタンを完全に非表示にするとNGなので、非表示ではなく透明化で対応します。

変更後のCSSです。

/*---------------------------

ラジオボタンの設定

--------------------------- */

/* ラジオボタンは非表示にする */
.oparadio input[type=radio] {
  position: absolute;
  opacity: 0;
  z-index: -1; 
}
/* チェックされた時のスタイル */
input[type="radio"]:checked + label {
  background: #FAC090;
  color: #000; 
}
/* マウスオーバーしたときのスタイル */
label.yesno:hover {
  background-color: #FDEADA; 
}
/* lableのスタイル */
label.yesno {
 border: #dddddd solid 3px;
 color: #000;
 display: block;
 font-size: 20px;
 line-height: 60px;
 height: 60px;
 padding-left: 20px;
 padding-right: 20px;
 cursor: pointer; 
 box-sizing: border-box;
 min-width: 106px;
}

/* 選択肢センタリング */
.smp_tmpl dl dd: {
    text-align: center;
}

htmlソース

上のラジオボタンのみClassを適用してラジオボタンを透明化しました。

     <dl class="cf">
      <dt class="title">
      性別
      </dt><dd class="data multi1">
       <ul class="radio cf oparadio">
        <li><input class="input" type="radio" name="f002088421" value="男性" required id="gender1" $f002088421:rm$><label class="yesno" for="gender1"><span>男性</span></label></li>
        <li><input class="input" type="radio" name="f002088421" value="女性" required id="gender2" $f002088421:rf$><label class="yesno" for="gender2"><span>女性</span></label></li>
       </ul>
       <span class="msg">$error:f002088421$</span>
      </dd>
     </dl>

カスタマイズの結果

EdgeではRequiredは有効になっているものの、赤枠表示はできなかったようです。

GoogleChromeでは、想定の動きをしてくれたのでこれでOKとしました。

最近、スパイラルで作ったフォームをカスタマイズするのが楽しくなってきました!

慣れると非Webエンジニアでもフォームを作れるのでおすすめです。

ABOUT ME
アズビーパートナーズ
プログラマー→社内SE→SIerのお仕事をしています。 メーカー勤務を経て、中小企業の社内SE、フリーランスなど様々な形態で働いてきました。 業務上生まれた困った…を解決してきたTipsを備忘録も兼ねて公開しています。 困っている誰かのお役に立てれば幸いです。