初心者編|無料コーディング教材|HTML・CSS・jQueryを実践で学ぶ

HTML・CSSでボタンを作る方法|button・aタグの使い分けとデザイン例

HTMLとCSSで作る塗りつぶし、アウトライン、リンク、アイコンのボタンデザイン例

HTMLでボタンを作りたいけれど、buttonタグとaタグのどちらを使えばよいか迷っていませんか? 見た目は同じボタンでも、クリックしたときの目的によって使う要素が変わります。

フォーム送信や画面内の処理にはbutton、別ページへの移動にはaを使うのが基本です。この記事では、変更前のHTMLへCSSを追加し、押しやすくてキーボードでも操作できるボタンを作ります。

HTMLでボタンを作る3つの方法

HTMLでボタンの見た目を作る方法は、主にbuttonタグ、aタグ、inputタグの3つです。先に用途の違いを整理しましょう。

要素主な用途使用例
button処理を実行するフォーム送信、メニュー開閉、ダイアログ表示
a別の場所へ移動する別ページ、ページ内リンク、ファイルへのリンク
inputフォームの操作送信、リセット

JavaScriptのonclickで無理にページ移動させるより、移動には最初からa href="移動先"を使うほうが役割が明確です。新しいタブで開く、リンク先をコピーする、といったブラウザの機能も使えます。

変更前のHTMLで普通のボタンを表示する

最初にindex.htmlを作り、次のコードを保存します。この時点ではブラウザ標準の見た目で表示されます。

<!doctype html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>HTMLボタンの練習</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <main>
    <h1>ボタンのサンプル</h1>

    <button type="button">処理を実行</button>
  </main>
</body>
</html>

type="button"は、フォーム送信ではない通常のボタンであることを表します。button要素はフォーム内でtypeを省略すると送信ボタンとして動作するため、用途を明示しておくと意図しない送信を防げます。

CSSで押しやすいボタンに変更する

HTMLのボタンへbuttonクラスとbutton-primaryクラスを追加します。クラスを分けると、共通の形と色の違いを別々に管理できます。

<button class="button button-primary" type="button">
  処理を実行
</button>

次に、style.cssへ次のCSSを書きます。ボタンの高さは最低44pxを確保し、文字数が増えても崩れにくいよう固定のwidthは指定していません。

* {
  box-sizing: border-box;
}

body {
  margin: 0;
  padding: 40px 16px;
  color: #172033;
  font-family: system-ui, sans-serif;
  background: #f7f9fc;
}

.button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 44px;
  padding: 12px 20px;
  border: 2px solid transparent;
  border-radius: 10px;
  font: inherit;
  font-weight: 700;
  line-height: 1;
  text-decoration: none;
  cursor: pointer;
  transition: background-color 0.2s, transform 0.2s;
}

.button-primary {
  color: #ffffff;
  background: #0f3c78;
}

.button-primary:hover {
  background: #1853a0;
  transform: translateY(-2px);
}

.button-primary:active {
  transform: translateY(0);
}

.button:focus-visible {
  outline: 3px solid #f26b4a;
  outline-offset: 3px;
}

.button:disabled {
  opacity: 0.5;
  cursor: not-allowed;
  transform: none;
}

@media (prefers-reduced-motion: reduce) {
  .button {
    transition: none;
  }
}

inline-flexalign-items: centerで文字を上下中央に配置します。paddingで内側の余白を作り、border-radiusで角を丸くしました。

:hoverはマウスポインターを重ねた状態、:activeは押している状態です。変化を付けると操作できる要素だと伝わりやすくなります。

通常・ホバー・フォーカス・無効状態を確認する

送信ボタンの通常、ホバー、フォーカス、無効状態を日本語で比較した図
通常、ホバー、キーボードフォーカス、無効状態を見分けられるようにします

完成したボタンは、通常時、マウスを重ねたとき、キーボードで選択したとき、操作できないときで見た目が変わります。特に:focus-visibleの輪郭は、Tabキーで移動している場所を示す大切な目印です。

輪郭がデザインに合わない場合も、outline: noneだけで消さないでください。色や太さを調整し、どこへフォーカスしているか分かる状態を残します。

aタグをボタンの見た目にする

お問い合わせページなど、別の場所へ移動する場合はaタグを使います。先ほどのbuttonクラスはaタグにも適用できます。

<a class="button button-outline" href="/contact/">
  お問い合わせへ
</a>
.button-outline {
  border-color: #0f3c78;
  color: #0f3c78;
  background: #ffffff;
}

.button-outline:hover {
  color: #ffffff;
  background: #0f3c78;
}

ボタンリンクの作り方や、abuttonの使い分けをさらに詳しく確認したい場合は、次の記事も参考にしてください。

フォームの送信ボタンを作る

フォームの入力内容を送信するボタンにはtype="submit"を使います。form要素の中へ入力欄と送信ボタンを配置します。

<form action="/send/" method="post">
  <label for="email">メールアドレス</label>
  <input id="email" name="email" type="email" required>

  <button class="button button-primary" type="submit">
    送信する
  </button>
</form>

このHTMLだけではメール送信処理までは行えません。actionで指定した送信先に、PHPなどのサーバー側処理やフォームサービスを用意する必要があります。

buttonのtype属性を使い分ける

button要素のtypeには、次の3種類があります。フォーム内では動作の違いを理解して使いましょう。

type動作主な用途
buttonHTMLだけでは送信しないJavaScriptで処理するボタン
submitフォームを送信する登録、検索、問い合わせ送信
reset入力内容を初期値へ戻す入力のやり直し

resetは誤操作で入力内容を消す可能性があるため、本当に必要か検討してから配置します。入力を取り消せないフォームでは、置かないほうが安全な場合もあります。

inputタグでボタンを作る方法

inputタグでも送信ボタンを作れます。ボタンに表示する文字はvalue属性で指定します。

<input class="button button-primary" type="submit" value="送信する">

inputは終了タグを持たず、中へアイコンや別の要素を入れられません。文字とアイコンを組み合わせたい場合や柔軟に装飾したい場合は、button要素のほうが扱いやすいでしょう。

よく使うボタンデザインを作る

既に作ったbuttonクラスへ追加クラスを組み合わせると、用途ごとにデザインを変えられます。ここでは、丸み、影、円形の3例を見ていきましょう。

角を大きく丸める

border-radiusを大きくすると、カプセルのような形になります。値をボタンの高さ以上にしても、実際の丸みは自然な半円に収まります。

.button-pill {
  border-radius: 999px;
}

影で押せることを伝える

box-shadowで下側へ薄い影を付けると、背景から少し浮いた見た目になります。影を濃くしすぎると文字より目立つため、控えめな色から調整してください。

.button-shadow {
  box-shadow: 0 6px 14px rgb(15 60 120 / 20%);
}

アイコンだけの円形ボタンを作る

アイコンだけでは目的が伝わらない利用者もいるため、aria-labelでボタンの名前を指定します。見た目の記号はaria-hidden="true"にし、同じ内容を二重に読み上げないようにします。

<button class="button button-primary button-icon" type="button" aria-label="お気に入りに追加">
  <span aria-hidden="true">♥</span>
</button>
.button-icon {
  width: 44px;
  min-height: 44px;
  padding: 0;
  border-radius: 50%;
}

スマートフォンでボタンを見やすくする

スマートフォンでは横幅が限られるため、重要な送信ボタンを画面幅いっぱいにすると押しやすくなります。必要なボタンだけへbutton-full-mobileクラスを追加します。

@media (max-width: 48rem) {
  .button-full-mobile {
    width: 100%;
  }
}

すべてのボタンを大きくする必要はありません。主な操作を目立たせ、補助的な操作はアウトラインなど控えめな見た目にすると、優先順位が伝わります。

ボタンを使いやすくする確認項目

  • ボタンの目的が短い言葉で分かる
  • 文字と背景の色に十分な差がある
  • 指でも押しやすい大きさと間隔がある
  • Tabキーで移動し、EnterまたはSpaceキーで操作できる
  • フォーカス位置が輪郭などで見える
  • 無効なボタンは見た目とdisabled属性の両方で示す

「こちら」「クリック」のような曖昧な文言だけでなく、「送信する」「資料をダウンロード」のように、押した後の結果が分かる言葉を使いましょう。

ボタンがうまく表示・動作しないときの確認方法

CSSが反映されない

link要素のファイル名と場所、HTMLのclass名、CSSのセレクターを確認します。button-primarybutton_primaryのような1文字の違いでも適用されません。

フォームを意図せず送信してしまう

フォーム内の通常ボタンへtype="button"があるか確認します。送信ボタンだけをtype="submit"にすると役割を区別できます。

ボタン内の文字が中央にならない

display: inline-flexalign-items: centerjustify-content: centerが指定されているか確認します。固定の高さとline-heightだけで合わせる方法は、文字が折り返すと崩れやすいため注意してください。

クリックしても何も起こらない

button type="button"は、HTMLだけでは独自の処理を実行しません。JavaScriptのイベント処理が必要です。ページ移動が目的なら、aタグへ正しいhrefを設定してください。

HTMLボタンに関するよくある質問

buttonタグの中に画像やアイコンを入れられますか?

入れられます。画像やspan要素を配置できますが、アイコンだけの場合はaria-labelなどでボタンの目的を伝えてください。

リンクをbuttonタグで作ってもよいですか?

ページ移動が目的ならaタグが適しています。見た目はCSSで同じにできるため、デザインではなく動作の目的で要素を選びます。

ボタンの幅は固定したほうがよいですか?

基本は文字数に合わせて広がるよう、左右のpaddingで調整します。同じ役割のボタンを並べるなど、見た目を揃える必要がある場合だけmin-widthを検討しましょう。

まとめ

HTMLで処理を実行するボタンはbuttonタグ、ページ移動はaタグ、フォームの簡単な送信ボタンはinputタグでも作れます。見た目が同じでも、目的に合う要素を選ぶことが大切です。

CSSでは余白、色、角丸、ホバーだけでなく、:focus-visible:disabledも用意しましょう。マウス、キーボード、スマートフォンで操作を確認すれば、初心者でも使いやすいボタンを作れます。