よく使うフォームデザインの初期化とスタイリング方法

CSS
悩んでいる人
悩んでいる人

・フォームのデザインはどうカスタマイズすればいいの?

・既存のフォームデザインを初期化するには?

・よく使うフォーム要素を知りたい

こんな疑問や悩みに答えます。

そもそもですが、フォームの各要素はブラウザによってデザインが異なります。

初期状態のフォーム要素を「Chrome」と「Safari」と「Firefox」で比較してみました。

ChromeSafariFirefox

ブラウザによって、全てデザインが少しずつ異なるので、コーダーはをできるだけ差異を無くしてコーディングすることが重要です。

この記事では、頻出フォーム要素のデフォルトデザインを初期化して、CSSでスタイリングする方法を紹介していきます。

とらまる
とらまる

自分自身、実践でデフォルトのデザインを初期化してスタイリングするのに苦しめられた経験があります。ぜひ、今回のコードをテンプレとしてコーディング効率化のために使用してください!

各フォーム要素の初期化とCSSスタイリング

各フォーム要素の初期化とCSSのスタイリングを紹介します。

今回のCSSコードをスニペットなどに登録して、すぐに取り出せるようにしておくとさらにコーディングスピードが上がるので、登録しておくことをオススメします!

それでは解説していきます。

テキストフォーム(text, email, telなど)

フォーム要素で一番よく使われるのが、input type=”text” だと思います。

他にも「type=email、type=url、type=tel」なども同様のCSSで初期化・スタイリングすることができます。

HTMLには、それぞれプレイスホルダーを加えておきます。
プレースホルダー(英:placeholder)とは、あとから入力される文字・値の代わりに、仮に入力しておく文字や値のことです。

CSSは、一つ一つのtypeで指定するのがめんどくさければ、classでまとめて指定しても良いと思います。

:focusは、テキスト範囲をクリックした時にスタイルされるCSSになります。

::placeholderは、プレースホルダーに対して色を加えています。
もちろん文字サイズなども変更できます。

<input type="text" name="名前" class="form-text" placeholder="山田太郎" />
<input type="email" name="メール" class="form-text" placeholder="abc@email.com" />
<input type="tel" name="電話" class="form-text" placeholder="090-0000-0000" />
input[type="text"],
input[type="email"],
input[type="tel"] {
	border: 1px solid gray;
  padding: .5em;
}

input[type="text"]:focus,
input[type="email"]:focus,
input[type="tel"]:focus {
	outline: none;
  border: 1px solid black;
  padding: .5em;
}
input::placeholder,
textarea::placeholder {
  font-weight: normal;
  color: gray;
}
デモ

See the Pen Untitled by 森寅治 (@moritoraji) on CodePen.


ラジオボタン

ラジオボタンは、標準であるラジオボタンを消して、擬似要素で新しくデザインを作ります。

HTMLは、inputタグ内のname値を同じ値にする必要があります。
name値を同じにしておくことで、ラジオボタン特有のオン・オフの切り替えができるようになります。

<div class="contact__radio">
  <label class="contact__radio-label">
    <input type="radio" name="ラジオ" />
    <span class="contact__radio-text">ラジオ1</span>
  </label>
  <label class="contact__radio-label">
    <input type="radio" name="ラジオ" />
    <span class="contact__radio-text">ラジオ2</span>
  </label>
  <label class="contact__radio-label">
    <input type="radio" name="ラジオ" />
    <span class="contact__radio-text">ラジオ3</span>
  </label>
</div>

デザイン初期化

以下で標準のデザインを初期化します。

input[type="radio"] {
  position: relative;
  padding: 0;
  margin: 0;
  background: none;
  border: none;
  border-radius: 0;
  outline: none;
  appearance: none;
}

スタイリング

上記の初期化に加えて、擬似要素でラジオボタンを作っています。:checkedでオン・オフを切り替えています。

input[type='radio'] {
  width: 12px;
  height: 12px;
  position: relative;
  padding: 0;
  margin: 0;
  background: none;
  border: none;
  border-radius: 0;
  outline: none;
  appearance: none;

  &::before {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 100%;
    height: 100%;
    content: '';
    background-color: #fff;
    border: 1px solid #a09a9a;
    border-radius: 50%;
    transform: translate(-50%, -50%);
  }

  &::after {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 8px;
    height: 8px;
    content: '';
    background-color: #000;
    border-radius: 50%;
    opacity: 0;
    transform: translate(-50%, -50%);
  }

  &:checked::before {
    background-color: #fff;
    border: 1px solid #000
  }

  &:checked::after {
    opacity: 1;
  }
}

デモ

See the Pen Untitled by 森寅治 (@moritoraji) on CodePen.


チェックボックス

チェックボックスはラジオボタンと同様で、標準であるチェックボックスを消して、擬似要素で新しくデザインを作ります。

<div class="contact__checkbox">
  <label class="contact__checkbox-label">
    <input type="checkbox" name="ボックス" />
    <span class="contact__checkbox-text">ボックス1</span>
  </label>
  <label class="contact__checkbox-label">
    <input type="checkbox" name="ボックス" />
    <span class="contact__checkbox-text">ボックス2</span>
  </label>
  <label class="contact__checkbox-label">
    <input type="checkbox" name="ボックス" />
    <span class="contact__checkbox-text">ボックス3</span>
  </label>
</div>

デザイン初期化

以下で標準のデザインを初期化します。

input[type='checkbox'] {
  position: relative;
  padding: 0;
  margin: 0;
  background: none;
  border: none;
  border-radius: 0;
  outline: none;
  appearance: none;
}

スタイリング

上記の初期化に加えて、擬似要素でチェックボックスを作っています。:checkedでオン・オフを切り替えています。

input[type='checkbox'] {
  width: 12px;
  height: 12px;
  position: relative;
  padding: 0;
  margin: 0;
  background: none;
  border: none;
  border-radius: 0;
  outline: none;
  appearance: none;

  &::before {
    position: absolute;
    left: 0;
    width: 100%;
    height: 100%;
    content: '';
    background-color: #fff;
    border: 1px solid #000;
    border-radius: 2px;
  }

  &::after {
    position: absolute;
    top: 4px;
    left: 2px;
    width: 8px;
    height: 3px;
    content: '';
    border-bottom: 2px solid #000;
    border-left: 2px solid #000;
    opacity: 0;
    transform: rotate(-45deg);
  }

  &:checked::before {
    background-color: #a09a9a;
    border: 1px solid #a09a9a;
  }
  &:checked::after {
    opacity: 1;
  }
}

デモ

See the Pen Untitled by 森寅治 (@moritoraji) on CodePen.


日付(chrome対応のみ)

日付は、chrome対応のみにしています。
ブラウザによって対応するには、datepickerライブラリなどで対応する必要があるそうです。

日付入力フォームのデフォルト設定は、右にカレンダーマークがついています。
カレンダーマークをクリックするとカレンダーが表示され、日付を選択する仕組みです。

そのため、カレンダーマークを初期化して、擬似要素でカレンダーマークを追加します。
また、カレンダーが表示されるクリック範囲を拡大する記述も追加しようと思います。

<input type="date">

デザイン初期化

以下でカレンダーアイコンを初期化します。

input[type="date"]::-webkit-calendar-picker-indicator {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  width: auto;
  height: auto;
  background: transparent;
  z-index: 1;
}

スタイリング

上記の初期化に加えて、擬似要素でカレンダーアイコンを追加しています。

また、input[type=”date”]::-webkit-calendar-picker-indicatorにwidthとheightをauto指定することで、どこをクリックしてもカレンダーが開けるようにしています。

input[type="date"]::-webkit-calendar-picker-indicator {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  width: auto;
  height: auto;
  background: transparent;
  z-index: 1;
}

input[type="date"] {
  width: 132px;
  height: 25px;
  position: relative;
  color: #959595;
  border: solid 1px #959595;
  border-radius: 4px;
}

input[type="date"]::after {
  content: '';
  background-image: url('アイコンのデザイン画像');
  background-repeat: no-repeat;
  background-size: contain;
  background-position: 0 0;
  width: 18px;
  height: 18px;
  position: absolute;
  top: 50%;
  right: 3px;
  transform: translateY(-50%);
}

デモ

See the Pen Untitled by 森寅治 (@moritoraji) on CodePen.


セレクトボックス

セレクトボックスのデフォルト設定は、右に矢印がついています。
セレクトボックスをクリックすると選択の一覧が表示されます。

そのため、矢印を初期化して、擬似要素で矢印を追加します。
また、擬似要素追加する際に注意点もあるのできおつけください。

HTMLで重要な点は、最初に表示される「選択してください」は、クリック後選択できないようにdisabledを設定しています。そして、selectタグの親要素をdivタグ(contact__select-wrap)で囲っておいてください。

<div class="contact__checkbox">
  <select name="セレクト" class="contact__select">
    <option value="" selected disabled>選択してください</option>
    <option value="select1">セレクト1</option>
    <option value="select2">セレクト2</option>
    <option value="select3">セレクト3</option>
    <option value="select4">セレクト4</option>
  </select>
</div>

デザイン初期化

以下で矢印を初期化します。わかりやすくあえて、selectで指定していますが、クラス名で設定しても大丈夫です。

select {
  -moz-appearance: none;
	-webkit-appearance: none;
	appearance: none;
  border: 1px solid #000;
  width: 100%;
  padding: .5em;
  position: relative;
}

スタイリング

上記の初期化に加えて、擬似要素で矢印を追加しています。

先ほど親要素に加えたdivタグ(contact__select-wrap)に対して、擬似要素を指定します。

親要素に指定する理由は、selectタグには擬似要素を設定することができないからです。

select {
  -moz-appearance: none;
	-webkit-appearance: none;
	appearance: none;
  border: 1px solid #000;
  width: 100%;
  padding: .5em;
  position: relative;
}

.contact__checkbox {
  position: relative;
  width: 300px;
}

.contact__checkbox::after {
  position: absolute;
  content: "";
  top: 41%;
  right: 5px;
  width: 13px;
  height: 7px;
  background-image: url('矢印のデザイン画像');
  background-size: 100%;
  background-repeat: no-repeat;
}

デモ

See the Pen セレクトボックス by 森寅治 (@moritoraji) on CodePen.


テキストエリア

テキストエリアのデフォルト設定は、右下に線が入っています。
これは、テキストエリアサイズを調整するものです。

今回は、右下の線を初期化して、テキストエリアのサイズ等を指定していきたいと思います。

<textarea name="問い合わせ" class="contact__textarea"></textarea>

デザイン初期化

以下で右下の線を初期化して、サイズ変更をできないようにします。

textarea {
  resize: none;
}

スタイリング

上記の初期化に加えて、テキストエリアのサイズやフォーカスした際のボーダー色を指定しています。

textarea {
  width: 300px;
  height: 150px;
  padding: .5em;
  resize: none;
  border: solid 1px gray;
}

textarea:focus {
  border: 1px solid #000;
  outline: none;
}

デモ

See the Pen Untitled by 森寅治 (@moritoraji) on CodePen.


ボタン

ボタンは、標準であるボタンデザインを初期化して、新しくデザインを作ります。

デザイン初期化

以下で標準のボタンデザインを初期化します。

input[type="submit"] {
  -moz-appearance: none;
	-webkit-appearance: none;
	appearance: none;
	border: none;
  background-color: transparent;
}

スタイリング

上記の初期化に加えて、ボタンのサイズなどを指定します。

input[type="submit"] {
  -moz-appearance: none;
	-webkit-appearance: none;
	appearance: none;
	border: none;
  width: 80px;
  height: 40px;
  color: #fff;
  background-color: gray;
  transition: .3s;
}

input[type="submit"]:hover {
  opacity: .7;
}

デモ

See the Pen 送信ボタン by 森寅治 (@moritoraji) on CodePen.


初期化・スタイリング後の比較

日付以外、最初の時と見比べてほとんど同じデザインになっているのがわかります。

ChromeSafariFirefox

まとめ

各種フォーム要素の初期化とスタイリングのcssを紹介をしてきました。

実務でフォームをスタイリングすることは多々あります。
自分自身も最初は全然わからず、かなり時間がかかった覚えがあります、、汗

今回の記述をテンプレートなどにして、自身でカスタマイズできるように準備しておくとスムーズに対応できると思います!

ぜひ有効活用してください!

コメント

タイトルとURLをコピーしました