CSSを使用してチェックボックスのスタイルを設定する方法


831

以下を使用してチェックボックスのスタイルを設定しようとしています:

<input type="checkbox" style="border:2px dotted #00f;display:block;background:#ff0000;" />

ただし、スタイルは適用されません。チェックボックスには、デフォルトのスタイルが引き続き表示されます。特定のスタイルを指定するにはどうすればよいですか?



1
私はあなたがこのような何かを探していると思う:asimishaq.com/myfiles/image-checkbox この記事を参照してください:stackoverflow.com/questions/16352864/...
ASIM-イスハーク


1
リンクは上のコメントにあります。とにかく:blog.felixhagspiel.de/index.php/posts/custom-inputs
Felix Hagspiel

1
ワオ。これらのすべての答えを見て、私はただ言わなければなりません、これ
マイケル

回答:


784

更新:

以下の回答は、CSS 3が広く普及する前の状態を参照しています。最近のブラウザー(Internet Explorer 9以降を含む)では、JavaScriptを使用せずに、好みのスタイルでチェックボックスの代わりを作成する方が簡単です。

ここにいくつかの便利なリンクがあります:

基本的な問題が変わっていないことは注目に値します。それでも、スタイル(ボーダーなど)をチェックボックス要素に直接適用して、それらのスタイルをHTMLチェックボックスの表示に影響させることはできません。ただし、変更された点は、実際のチェックボックスを非表示にして、CSSのみを使用して独自のスタイル付き要素に置き換えることができるようになったことです。特に、CSSには広くサポートされている:checkedセレクターが用意されているため、ボックスのチェックステータスを正しく置き換えるように置き換えることができます。


古い回答

チェックボックスのスタイリングに関する役立つ記事を次に示します。基本的に、そのライターはブラウザごとに大幅に変化し、多くのブラウザはどのようにスタイル設定してもデフォルトのチェックボックスを常に表示することを発見しました。だから、本当に簡単な方法はありません。

JavaScriptを使用してチェックボックスに画像をオーバーレイし、その画像をクリックすると実際のチェックボックスがオンになる回避策を想像するのは難しくありません。JavaScriptを使用していないユーザーには、デフォルトのチェックボックスが表示されます。

追加用に編集:これを行うスクリプトは次のとおりです。実際のチェックボックス要素を非表示にし、スタイル付きスパンに置き換え、クリックイベントをリダイレクトします。


34
この答えは古くなっています!プライマリリンクは、IE6とIE7のスタイルを比較するサイトにつながります...
Jonatan Littke

7
公平な点-そして、基本的な点は、最近のブラウザーではもはや真実ではありません。私はいくつかの新しいリンクで更新しましたが、古いブラウザーのリソースとしてオリジナルを残しました。
Jacob Mattison

3
簡単なCSSチェックボックスジェネレーターは、本当に簡単でn00bフレンドリーでした。カスタム作成用のGUIも付属しています。よろしくお願いします。:)
CᴴᴀZ

この機能をIE8 +や他のブラウザー(chrome、firefox、safari)と互換性を持たせたいので、古い答えに興味があります。ただし、私が推奨するプラグインに関するフィードバックはあまりあり
ません

2
これはあまり有用な答えではありません-これは単なる記事のリストであり、そのほとんどは現在非常に古いものです。
スティーブベネット

141

CSSだけを使用してこれを行う方法があります。label代わりに(ab)要素を使用し、その要素にスタイルを設定できます。ただし、これはInternet Explorer 8以前のバージョンでは機能しないことに注意してください。

.myCheckbox input {
  position: relative;
  z-index: -9999;
}

.myCheckbox span {
  width: 20px;
  height: 20px;
  display: block;
  background: url("link_to_image");
}

.myCheckbox input:checked + span {
  background: url("link_to_another_image");
}
<label for="test">Label for my styled "checkbox"</label>
<label class="myCheckbox">
  <input type="checkbox" name="test" />
  <span></span>
</label>


@GandalfStormCrowこれは、IE8でサポートされていない:checked疑似クラスをサポートするすべてのブラウザーで機能します。これがselectivizr.comで機能するかどうかを確認できます。これにより、:checkedや友達のサポートが追加されます。
Blake Pettersson、2012年

つまり、IE9以降のバージョンでは:checkedがサポートされています。
Blake Pettersson、2012年

1
IE8以下にはポリフィルがあります:github.com/rdebeasi/checked-polyfill
Tim

動作していますが、最初はちらつきます。なぜそれが起こっているのですか?
テクノフィル2016年

隠されたinputはキーボードフォーカスを取得することはないので、キーボードからは到達できません。
2016年

139

:afterおよび:before疑似クラスに付属する新しい機能を使用することで、非常にクールなカスタムチェックボックス効果を実現できます。これの利点は、次のとおりです。DOMに何かを追加する必要はなく、標準のチェックボックスを追加するだけです。

これは互換性のあるブラウザでのみ機能することに注意してください。これは、一部のブラウザでは入力要素の設定:after:before入力が許可されていないという事実に関連していると思います。残念ながら、現時点ではWebKitブラウザーのみがサポートされています。Firefox + Internet Explorerは、チェックボックスが機能せず、スタイルが設定されていないだけで、将来的には変更される可能性があります(コードはベンダープレフィックスを使用しません)。

これはWebKitブラウザーソリューションのみです(Chrome、Safari、モバイルブラウザー)

フィドルの例を見る

$(function() {
  $('input').change(function() {
    $('div').html(Math.random());
  });
});
/* Main Classes */
.myinput[type="checkbox"]:before {
  position: relative;
  display: block;
  width: 11px;
  height: 11px;
  border: 1px solid #808080;
  content: "";
  background: #FFF;
}

.myinput[type="checkbox"]:after {
  position: relative;
  display: block;
  left: 2px;
  top: -11px;
  width: 7px;
  height: 7px;
  border-width: 1px;
  border-style: solid;
  border-color: #B3B3B3 #dcddde #dcddde #B3B3B3;
  content: "";
  background-image: linear-gradient(135deg, #B1B6BE 0%, #FFF 100%);
  background-repeat: no-repeat;
  background-position: center;
}

.myinput[type="checkbox"]:checked:after {
  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAQAAABuW59YAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAB2SURBVHjaAGkAlv8A3QDyAP0A/QD+Dam3W+kCAAD8APYAAgTVZaZCGwwA5wr0AvcA+Dh+7UX/x24AqK3Wg/8nt6w4/5q71wAAVP9g/7rTXf9n/+9N+AAAtpJa/zf/S//DhP8H/wAA4gzWj2P4lsf0JP0A/wADAHB0Ngka6UmKAAAAAElFTkSuQmCC'), linear-gradient(135deg, #B1B6BE 0%, #FFF 100%);
}

.myinput[type="checkbox"]:disabled:after {
  -webkit-filter: opacity(0.4);
}

.myinput[type="checkbox"]:not(:disabled):checked:hover:after {
  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAQAAABuW59YAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAB2SURBVHjaAGkAlv8A3QDyAP0A/QD+Dam3W+kCAAD8APYAAgTVZaZCGwwA5wr0AvcA+Dh+7UX/x24AqK3Wg/8nt6w4/5q71wAAVP9g/7rTXf9n/+9N+AAAtpJa/zf/S//DhP8H/wAA4gzWj2P4lsf0JP0A/wADAHB0Ngka6UmKAAAAAElFTkSuQmCC'), linear-gradient(135deg, #8BB0C2 0%, #FFF 100%);
}

.myinput[type="checkbox"]:not(:disabled):hover:after {
  background-image: linear-gradient(135deg, #8BB0C2 0%, #FFF 100%);
  border-color: #85A9BB #92C2DA #92C2DA #85A9BB;
}

.myinput[type="checkbox"]:not(:disabled):hover:before {
  border-color: #3D7591;
}

/* Large checkboxes */
.myinput.large {
  height: 22px;
  width: 22px;
}

.myinput.large[type="checkbox"]:before {
  width: 20px;
  height: 20px;
}

.myinput.large[type="checkbox"]:after {
  top: -20px;
  width: 16px;
  height: 16px;
}

/* Custom checkbox */
.myinput.large.custom[type="checkbox"]:checked:after {
  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGHRFWHRBdXRob3IAbWluZWNyYWZ0aW5mby5jb23fZidLAAAAk0lEQVQ4y2P4//8/AyUYwcAD+OzN/oMwshjRBoA0Gr8+DcbIhhBlAEyz+qZZ/7WPryHNAGTNMOxpJvo/w0/uP0kGgGwGaZbrKgfTGnLc/0nyAgiDbEY2BCRGdCDCnA2yGeYVog0Aae5MV4c7Gzk6CRqAbDM2w/EaQEgzXgPQnU2SAcTYjNMAYm3GaQCxNuM0gFwMAPUKd8XyBVDcAAAAAElFTkSuQmCC'), linear-gradient(135deg, #B1B6BE 0%, #FFF 100%);
}

.myinput.large.custom[type="checkbox"]:not(:disabled):checked:hover:after {
  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGHRFWHRBdXRob3IAbWluZWNyYWZ0aW5mby5jb23fZidLAAAAk0lEQVQ4y2P4//8/AyUYwcAD+OzN/oMwshjRBoA0Gr8+DcbIhhBlAEyz+qZZ/7WPryHNAGTNMOxpJvo/w0/uP0kGgGwGaZbrKgfTGnLc/0nyAgiDbEY2BCRGdCDCnA2yGeYVog0Aae5MV4c7Gzk6CRqAbDM2w/EaQEgzXgPQnU2SAcTYjNMAYm3GaQCxNuM0gFwMAPUKd8XyBVDcAAAAAElFTkSuQmCC'), linear-gradient(135deg, #8BB0C2 0%, #FFF 100%);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<table style="width:100%">
  <tr>
    <td>Normal:</td>
    <td><input type="checkbox" /></td>
    <td><input type="checkbox" checked="checked" /></td>
    <td><input type="checkbox" disabled="disabled" /></td>
    <td><input type="checkbox" disabled="disabled" checked="checked" /></td>
  </tr>
  <tr>
    <td>Small:</td>
    <td><input type="checkbox" class="myinput" /></td>
    <td><input type="checkbox" checked="checked" class="myinput" /></td>
    <td><input type="checkbox" disabled="disabled" class="myinput" /></td>
    <td><input type="checkbox" disabled="disabled" checked="checked" class="myinput" /></td>
  </tr>
  <tr>
    <td>Large:</td>
    <td><input type="checkbox" class="myinput large" /></td>
    <td><input type="checkbox" checked="checked" class="myinput large" /></td>
    <td><input type="checkbox" disabled="disabled" class="myinput large" /></td>
    <td><input type="checkbox" disabled="disabled" checked="checked" class="myinput large" /></td>
  </tr>
  <tr>
    <td>Custom icon:</td>
    <td><input type="checkbox" class="myinput large custom" /></td>
    <td><input type="checkbox" checked="checked" class="myinput large custom" /></td>
    <td><input type="checkbox" disabled="disabled" class="myinput large custom" /></td>
    <td><input type="checkbox" disabled="disabled" checked="checked" class="myinput large custom" /></td>
  </tr>
</table>

ボーナスWebkitスタイルのフリップスイッチフィドル

$(function() {
  var f = function() {
    $(this).next().text($(this).is(':checked') ? ':checked' : ':not(:checked)');
  };
  $('input').change(f).trigger('change');
});
body {
  font-family: arial;
}

.flipswitch {
  position: relative;
  background: white;
  width: 120px;
  height: 40px;
  -webkit-appearance: initial;
  border-radius: 3px;
  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
  outline: none;
  font-size: 14px;
  font-family: Trebuchet, Arial, sans-serif;
  font-weight: bold;
  cursor: pointer;
  border: 1px solid #ddd;
}

.flipswitch:after {
  position: absolute;
  top: 5%;
  display: block;
  line-height: 32px;
  width: 45%;
  height: 90%;
  background: #fff;
  box-sizing: border-box;
  text-align: center;
  transition: all 0.3s ease-in 0s;
  color: black;
  border: #888 1px solid;
  border-radius: 3px;
}

.flipswitch:after {
  left: 2%;
  content: "OFF";
}

.flipswitch:checked:after {
  left: 53%;
  content: "ON";
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>

<h2>Webkit friendly mobile-style checkbox/flipswitch</h2>
<input type="checkbox" class="flipswitch" /> &nbsp;
<span></span>
<br>
<input type="checkbox" checked="checked" class="flipswitch" /> &nbsp;
<span></span>


9
Firefox 33.1 / Linux:フィドルにはデフォルトのチェックボックスのみが表示されます。何も変わらないように見えます。
robsch 2014年

1
@robschこれは元の投稿で明確に指摘されています。FirefoxまたはOSのバージョンは関係ありません。Firefoxでは機能しません。「FF + IEでは、チェックボックスを機能させることができますが、スタイルを解除するだけです...」
Josh Mc

良いアプローチ。しかし、すべてのブラウザがうまくいくわけではありません。私が調べた限り、Chromeだけが最高の出力を持っています。
EA

非常に素晴らしい。ただし、これもIE 5.xのアプローチです。Webkitのみ。それは常にルールに従うとは限らないので...それがwebkitブラウザの全体的な問題です。
Alex

1
最高のソリューション!+1しかし、そのような大きな例を書く理由はわかりません。アイデアを説明する30行で十分です。
Andrii Bogachenko 2017

136

始める前に(2015年1月現在)

元の質問と回答は5年前のものです。そのため、これは少しの更新です。

まず、チェックボックスのスタイルに関しては、いくつかのアプローチがあります。基本的な信条は次のとおりです。

  1. ブラウザでスタイル設定されているデフォルトのチェックボックスコントロールを非表示にする必要があり、CSSを使用して意味のある方法でオーバーライドすることはできません。

  2. コントロールを非表示にしても、チェック状態を検出して切り替えることができる必要があります

  3. チェックボックスのチェック状態は、新しい要素のスタイリングによって反映される必要があります

解決策(原則)

上記はいくつかの方法で実現できます。CSS3疑似要素の使用が正しい方法であるとよく耳にするでしょう。実際には、正しい方法や間違った方法はありません。それは、それを使用するコンテキストに最も適したアプローチによって異なります。

  1. チェックボックスをlabel要素で囲みます。つまり、ラベルが非表示の場合でも、ラベル内のどこかをクリックすると、チェック状態を切り替えることができます。

  2. チェックボックスを隠す

  3. スタイルを付けるチェックボックスの後に新しい要素を追加します。CSSを使用して選択し、:checked状態に応じてスタイルを設定できるように、チェックボックスの後に表示する必要があります。CSSは「後方」を選択できません。

ソリューション(コード内)

絞り込み(アイコンを使用)

でもねえ!あなたが叫ぶのを聞きます。ボックスに小さな目盛りやクロスを表示したい場合はどうなりますか?そして、私は背景画像を使いたくない!

さて、ここでCSS3の疑似要素が機能します。これらは、どちらかの状態を表すUnicodeアイコンcontentを挿入できるプロパティをサポートします。あるいは、font awesomeなどのサードパーティのフォントアイコンソースを使用することもできます(ただし、関連するをに設定するなどしてください)。font-familyFontAwesome

label input {
  display: none; /* Hide the default checkbox */
}

/* Style the artificial checkbox */
label span {
  height: 10px;
  width: 10px;
  border: 1px solid grey;
  display: inline-block;
  position: relative;
}

/* Style its checked state...with a ticked icon */
[type=checkbox]:checked + span:before {
  content: '\2714';
  position: absolute;
  top: -5px;
  left: 0;
}
<label>
  <input type='checkbox'>
  <span></span>
  Checkbox label text
</label>


14
例外:簡略化されたHTML、簡略化されたCSS、詳細な説明。
SW4 2015年

4
@AnthonyHayward-回答が更新されました。これは、コントロールをインスタンス化できないタブ付きのdisplay:noneを使用したことが原因でした。変更しました
SW4

1
チェックボックスがラベルの前後ではなく、ラベルの内側にある例を見つけるのに苦労していました。これは非常によく文書化され説明されたソリューションです。2016
。– Clarus Dignus

1
まだとはタブできませんdisplay: none
2016年

2
それでもタブ操作で問題が発生する場合は、に置き換えvisibility: hidden;opacity: 0 !important;ください。
jabacchetta 2017

40

SW4の回答のアドバイスに従います。チェックボックスを非表示にして、カスタムスパンでカバーし、次のHTMLを提案します。

<label>
  <input type="checkbox">
  <span>send newsletter</span>
</label>

ラベルの折り返しにより、「for-id」属性のリンクを必要とせずに、テキストをクリックすることができます。しかしながら、

visibility: hiddenまたはを使用して非表示にしないでくださいdisplay: none

クリックまたはタップで機能しますが、これはチェックボックスを使用するのが難しい方法です。一部の人々はTab、フォーカスを移動したり、Spaceアクティブにしたりするためにはるかに効果的な方法を使用し、その方法で非表示にすると無効になります。フォームが長い場合は、誰かの手首を使用しtabindexたりaccesskey属性を付けたりする手間が省けます。また、システムのチェックボックスの動作を観察すると、ホバーにまともな影ができます。適切にスタイル設定されたチェックボックスはこの動作に従う必要があります。

cobberboyの回答では、フォントはスケーラブルなベクターであるため、通常ビットマップよりも優れているFont Awesomeを推奨しています。上記のHTMLを使用して、次のCSSルールを提案します。

  1. チェックボックスを隠す

    input[type="checkbox"] {
      position: absolute;
      opacity: 0;
      z-index: -1;
    }

    z-index私の例ではそれを完全にカバーするのに十分な大きさのチェックボックススキンを使用しているので、私は単にネガティブを使用します。left: -999pxすべてのレイアウトで再利用できるわけではないため、お勧めしません。Bushan waghの答えは、それを非表示にし、ブラウザにtabindexを使用するように説得力のある方法を提供するため、優れた代替手段です。とにかく、どちらも単なるハックです。今日の正しい方法はです。Joostの回答をappearance: none参照してください。

    input[type="checkbox"] {
      appearance: none;
      -webkit-appearance: none;
      -moz-appearance: none;
    }
  2. スタイルチェックボックスのラベル

    input[type="checkbox"] + span {
      font: 16pt sans-serif;
      color: #000;
    }
  3. チェックボックススキンを追加する

    input[type="checkbox"] + span:before {
      font: 16pt FontAwesome;
      content: '\00f096';
      display: inline-block;
      width: 16pt;
      padding: 2px 0 0 3px;
      margin-right: 0.5em;
    }

    \00f096Font Awesomeのでありsquare-o、パディングが調整されて、フォーカス上に点線のアウトラインを提供します(以下を参照)。

  4. チェックボックスがチェックされたスキンを追加する

    input[type="checkbox"]:checked + span:before {
      content: '\00f046';
    }

    \00f046Font Awesomeのですcheck-square-o。これはと同じ幅ではありませんsquare-o。これが上記の幅スタイルの理由です。

  5. フォーカスアウトラインを追加

    input[type="checkbox"]:focus + span:before {
      outline: 1px dotted #aaa;
    }

    Safariはこの機能を提供していません(@Jason Sankeyのコメントを参照)。window.navigatorブラウザを検出してSafariの場合はそれをスキップするために使用する必要があります。

  6. 無効なチェックボックスに灰色を設定する

    input[type="checkbox"]:disabled + span {
      color: #999;
    }
  7. 無効になっていないチェックボックスにホバーシャドウを設定する

    input[type="checkbox"]:not(:disabled) + span:hover:before {
      text-shadow: 0 1px 2px #77F;
    }

デモフィドル

チェックボックスの上にマウスを置いてTabShift+ Tabを使用して移動およびSpace切り替えを試みます。


3
フォーカスの問題をカバーすることへの賛成:このようなカスタマイズは基本的な機能を削除するべきではありません。ただし、Safariではチェックボックス(デフォルトのチェックボックスも含む)にキーボードフォーカスが与えられないため、フォーカス処理を含むソリューションを実装するときに一時的に混乱しました。
Jason Sankey、2016

それはそうですスニペット内のチェックボックスはもう働いていないですか?Chromeのウィンドウ10で
フェリックス・ガニオン-グルニエ

1
いい答えだ。私のソリューションの基礎を提供しました-入力後に既存のラベルを使用しましたが、追加のスパンを使用しており、エッジとFFのサポートを受けています。
Jono

2
これらの回答のほとんどは、アクセシビリティを無視しています。私はこの答えがそれをそのままに保つことを愛しています。
maxshuty

1
@maxshuty私もあなたのアプローチが好きです。誰かがライブラリを作成するとき、彼が選んだ母国語で単純なコードを書くことができないということは、しばしば自白です。私見FontAwesomeは、JavaScriptを使用してフォントをロードする無料プランに失敗しましたが、オープンソースと無料ライセンスを維持しているので、私は今でも気に入っています。私は通常、特定のプロジェクトで必要な無料のアイコンのフォントを偽造するサブセットになります(通常は最大5kB)。彼らが私に努力を節約してくれたら喜んで支払いますが、彼らが彼らのプロ計画で提案しているような狂気の年間99ドルは払いません。
JanTuroň

30

label次の例の要素を使用して、ちょっとしたトリックでチェックボックスのスタイルを設定できます。

.checkbox > input[type=checkbox] {
  visibility: hidden;
}

.checkbox {
  position: relative;
  display: block;
  width: 80px;
  height: 26px;
  margin: 0 auto;
  background: #FFF;
  border: 1px solid #2E2E2E;
  border-radius: 2px;
  -webkit-border-radius: 2px;
  -moz-border-radius: 2px;
}

.checkbox:after {
  position: absolute;
  display: inline;
  right: 10px;
  content: 'no';
  color: #E53935;
  font: 12px/26px Arial, sans-serif;
  font-weight: bold;
  text-transform: capitalize;
  z-index: 0;
}

.checkbox:before {
  position: absolute;
  display: inline;
  left: 10px;
  content: 'yes';
  color: #43A047;
  font: 12px/26px Arial, sans-serif;
  font-weight: bold;
  text-transform: capitalize;
  z-index: 0;
}

.checkbox label {
  position: absolute;
  display: block;
  top: 3px;
  left: 3px;
  width: 34px;
  height: 20px;
  background: #2E2E2E;
  cursor: pointer;
  transition: all 0.5s linear;
  -webkit-transition: all 0.5s linear;
  -moz-transition: all 0.5s linear;
  border-radius: 2px;
  -webkit-border-radius: 2px;
  -moz-border-radius: 2px;
  z-index: 1;
}

.checkbox input[type=checkbox]:checked + label {
  left: 43px;
}
<div class="checkbox">
  <input id="checkbox1" type="checkbox" value="1" />
  <label for="checkbox1"></label>
</div>

そしてFIDDLE上記のコードのために。一部のCSSは古いバージョンのブラウザーでは機能しないことに注意してください。ただし、いくつかの派手なJavaScriptの例があるはずです。


28

実装が簡単で、カスタマイズが容易なソリューション

多くの検索とテストの後、実装が簡単でカスタマイズが簡単なこのソリューションを入手しました。このソリューションでは

  1. 外部のライブラリやファイルは必要ありません
  2. ページにHTMLを追加する必要はありません
  3. チェックボックスの名前とIDを変更する必要はありません

フローするCSSをページの上部に配置するだけで、すべてのチェックボックスのスタイルが次のように変わります。

ここに画像の説明を入力してください

input[type=checkbox] {
  transform: scale(1.5);
}

input[type=checkbox] {
  width: 30px;
  height: 30px;
  margin-right: 8px;
  cursor: pointer;
  font-size: 17px;
  visibility: hidden;
}

input[type=checkbox]:after {
  content: " ";
  background-color: #fff;
  display: inline-block;
  margin-left: 10px;
  padding-bottom: 5px;
  color: #00BFF0;
  width: 22px;
  height: 25px;
  visibility: visible;
  border: 1px solid #00BFF0;
  padding-left: 3px;
  border-radius: 5px;
}

input[type=checkbox]:checked:after {
  content: "\2714";
  padding: -5px;
  font-weight: bold;
}

1
シンプルな方が良いです!
Adrian Moisa 2017年

これは素晴らしい答えです。何も追加しなくても動作します
HeavyHead

良い1つで非常にシンプル
khalidh

素晴らしい解決策。しかし、私はそれは、Firefox、IEまたはエッジに取り組んで見ていけない(何のチェックボックスはありません)
城野

20

余分なマークアップを追加することを回避できます。これは、CSSを設定することで、IE for Desktopを除くすべての場所で機能します(ただし、Windows PhoneおよびMicrosoft EdgeのIEでは機能します)appearance

input[type="checkbox"] {
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;

  /* Styling checkbox */
  width: 16px;
  height: 16px;
  background-color: red;
}

input[type="checkbox"]:checked {
  background-color: green;
}
<input type="checkbox" />


3
私はこのアプローチが好きです-CSSで外観を実際に使用するべきではないので少しハックですが、それは前後に使用する他のいくつかの回答よりもはるかにクリーンです。そして、このようなことについては、JavaScriptは完全に行き過ぎだと感じています。
Sprose 2017

18

CSSで簡単に色を変更でき、ピクセル密度の高いデバイスで非常によく拡大縮小できるので、アイコンフォント(FontAwesomeなど)を使用することを好みます。上記と同様の手法を使用した、別の純粋なCSSバリアントを次に示します。

(下は静的な画像なので、結果を視覚化できます。インタラクティブバージョンについてはJSFiddleを参照してください。)

チェックボックスの例

他のソリューションと同様に、label要素を使用します。隣接するものspanはチェックボックス文字を保持します。

span.bigcheck-target {
  font-family: FontAwesome; /* Use an icon font for the checkbox */
}

input[type='checkbox'].bigcheck {
  position: relative;
  left: -999em; /* Hide the real checkbox */
}

input[type='checkbox'].bigcheck + span.bigcheck-target:after {
  content: "\f096"; /* In fontawesome, is an open square (fa-square-o) */
}

input[type='checkbox'].bigcheck:checked + span.bigcheck-target:after {
  content: "\f046"; /* fontawesome checked box (fa-check-square-o) */
}

/* ==== Optional - colors and padding to make it look nice === */
body {
  background-color: #2C3E50;
  color: #D35400;
  font-family: sans-serif;
  font-weight: 500;
  font-size: 4em; /* Set this to whatever size you want */
}

span.bigcheck {
  display: block;
  padding: 0.5em;
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" />

<span class="bigcheck">
  <label class="bigcheck">
    Cheese
    <input type="checkbox" class="bigcheck" name="cheese" value="yes" />
    <span class="bigcheck-target"></span>
  </label>
</span>

これがJSFiddleです。


....説明した内容は、Bhushan wagh、Jake、Jonathan Hodgson、およびBlakeからの以前の回答と同じです;)
SW4

7
@ SW4私はその事実を参照しましたが、この回答ではアイコンフォントを使用しています(以前の回答にはありませんでした)。最初の段落はそれをかなり明確にします。
cobberboy 2015年

新しいバージョンで機能させるにfont-family: FontAwesome;font-family: 'Font Awesome\ 5 Free';、で置き換え、Unicodeコンテンツを更新する必要があります。
SuN

12

最近、この問題に対する非常に興味深い解決策を見つけました。

を使用appearance: none;して、チェックボックスのデフォルトスタイルをオフにしてから、ここで説明するように(例4)独自のスタイルを上書きすることができます。

フィドルの例

残念ながら、ブラウザのサポートはこのappearanceオプションにはかなり悪いです。私の個人的なテストでは、OperaとChromeのみが正常に機能していました。しかし、これは、より良いサポートが来た場合や、Chrome / Operaのみを使用したい場合に、シンプルに保つための方法です。

"使ってもいいですか?" リンク


実際、これappearanceはまさに私たちがこれに必要なものです。「非標準であり、標準化されていない」ことを覚えておいてください。
2016

12

純粋なCSSを使用する:before:after、や、変形などの特別なことは何もありません。デフォルトの外観をオフにして、次の例のようにインライン背景画像でスタイルを設定できます。これは、Chrome、Firefox、Safari、およびEdge(Chromium Edge)で機能します。

INPUT[type=checkbox]:focus
{
    outline: 1px solid rgba(0, 0, 0, 0.2);
}

INPUT[type=checkbox]
{
    background-color: #DDD;
    border-radius: 2px;
    appearance: none;
    -webkit-appearance: none;
    -moz-appearance: none;
    width: 17px;
    height: 17px;
    cursor: pointer;
    position: relative;
    top: 5px;
}

INPUT[type=checkbox]:checked
{
    background-color: #409fd6;
    background: #409fd6 url("data:image/gif;base64,R0lGODlhCwAKAIABAP////3cnSH5BAEKAAEALAAAAAALAAoAAAIUjH+AC73WHIsw0UCjglraO20PNhYAOw==") 3px 3px no-repeat;
}
<form>
  <label><input type="checkbox">I Agree To Terms &amp; Conditions</label>
</form>


1
はい!実際にまともなのは1つだけです。
odinho-ベルモント

10

私の解決策

input[type="checkbox"] {
  cursor: pointer;
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  outline: 0;
  background: lightgray;
  height: 16px;
  width: 16px;
  border: 1px solid white;
}

input[type="checkbox"]:checked {
  background: #2aa1c0;
}

input[type="checkbox"]:hover {
  filter: brightness(90%);
}

input[type="checkbox"]:disabled {
  background: #e6e6e6;
  opacity: 0.6;
  pointer-events: none;
}

input[type="checkbox"]:after {
  content: '';
  position: relative;
  left: 40%;
  top: 20%;
  width: 15%;
  height: 40%;
  border: solid #fff;
  border-width: 0 2px 2px 0;
  transform: rotate(45deg);
  display: none;
}

input[type="checkbox"]:checked:after {
  display: block;
}

input[type="checkbox"]:disabled:after {
  border-color: #7b7b7b;
}
<input type="checkbox"><br>
<input type="checkbox" checked><br>
<input type="checkbox" disabled><br>
<input type="checkbox" disabled checked><br>


誰かが私のテキストが後で整列されない理由をアドバイスできたら、私は知りたいです!CSS初心者はこちら。
アジロー

8

appearance: none最新のブラウザーで簡単に使用できるため、デフォルトのスタイル設定はなく、すべてのスタイルが適切に適用されます。

input[type=checkbox] {
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  display: inline-block;
  width: 2em;
  height: 2em;
  border: 1px solid gray;
  outline: none;
  vertical-align: middle;
}

input[type=checkbox]:checked {
  background-color: blue;
}

1
これは、私のケースでうまくいった、特にミニマリストの手本です、ありがとう!
Jason R Stevens CFA

8

JavaScript、外部ライブラリ、アクセシビリティ準拠、およびチェックボックスとラジオボタンの両方が必要ですか?

私は、スクロールやスクロールとされていますトンこれらの答えのは、単純にドアの外のアクセシビリティを投げるとWCAGに違反する複数の方法で。カスタムチェックボックスを使用しているときはたいてい、カスタムラジオボタンも欲しいので、ラジオボタンを投入しました。

フィドル

パーティーには遅れますが、2019年 2020年にはまだこれが難しいので、アクセス可能簡単に立ち寄れる3つのソリューションを追加しました。

これらはすべてJavaScriptフリー外部ライブラリフリー*、およびアクセス可能です...

これらのいずれかをプラグアンドプレイしたい場合は、フィドルからスタイルシートをコピーし、CSSでカラーコードを編集して必要に応じて作業を進めてください。チェックボックスに必要な場合は、カスタムsvgチェックマークアイコンを追加できます。私はそれらの非CSSの人々にたくさんのコメントを追加しました。

長いテキストまたは小さなコンテナーがあり、チェックボックスまたはラジオボタン入力の下でテキストの折り返しが発生している場合は、次のようにdivに変換しますます。

より長い説明: WCAGに違反せず、JavaScriptまたは外部ライブラリに依存せず、選択するタブまたはスペースバーなどのキーボードナビゲーションを中断せず、フォーカスイベントを許可するソリューションを必要としていました。チェックされているものとされていないものの両方であり、最後に、チェックボックスの外観をカスタマイズできるソリューションですが、background-colorの、border-radiussvg背景など

私はいくつかの組み合わせを使用しました @JanTuroňからこの回答を非常にうまく機能していると思われる独自のソリューションを考え出しました。ラジオボタンでもこれを機能させるために、チェックボックスの同じコードをたくさん使用するラジオボタンのフィドルを作成しました。

私はまだアクセシビリティを学んでいるので、何かを見逃した場合はコメントをドロップしてください。ここでチェックボックスのコード例を示します。

input[type="checkbox"] {
  position: absolute;
  opacity: 0;
  z-index: -1;
}

/* Text color for the label */
input[type="checkbox"]+span {
  cursor: pointer;
  font: 16px sans-serif;
  color: black;
}

/* Checkbox un-checked style */
input[type="checkbox"]+span:before {
  content: '';
  border: 1px solid grey;
  border-radius: 3px;
  display: inline-block;
  width: 16px;
  height: 16px;
  margin-right: 0.5em;
  margin-top: 0.5em;
  vertical-align: -2px;
}

/* Checked checkbox style (in this case the background is red) */
input[type="checkbox"]:checked+span:before {
  /* NOTE: Replace the url with a path to an SVG of a checkmark to get a checkmark icon */
  background-image: url('https://cdnjs.cloudflare.com/ajax/libs/ionicons/4.5.6/collection/build/ionicons/svg/ios-checkmark.svg');
  background-repeat: no-repeat;
  background-position: center;
  /* The size of the checkmark icon, you may/may not need this */
  background-size: 25px;
  border-radius: 2px;
  background-color: #e7ffba;
  color: white;
}

/* Adding a dotted border around the active tabbed-into checkbox */
input[type="checkbox"]:focus+span:before,
input[type="checkbox"]:not(:disabled)+span:hover:before {
  /* Visible in the full-color space */
  box-shadow: 0px 0px 0px 2px rgba(0, 150, 255, 1);

  /* Visible in Windows high-contrast themes
     box-shadow will be hidden in these modes and
     transparency will not be hidden in high-contrast
     thus box-shadow will not show but the outline will
     providing accessibility */
  outline-color: transparent; /*switch to transparent*/
  outline-width: 2px;
  outline-style: dotted;
  }


/* Disabled checkbox styles */
input[type="checkbox"]:disabled+span {
  cursor: default;
  color: black;
  opacity: 0.5;
}

/* Styles specific to this fiddle that you do not need */
body {
  padding: 1em;
}
h1 {
  font-size: 18px;
}
<h1>
  NOTE: Replace the url for the background-image in CSS with a path to an SVG in your solution or CDN. This one was found from a quick google search for a checkmark icon cdn
</h1>

<label>
  <input type="checkbox">
  <span>Try using tab and space</span>
</label>

<br>

<label>
  <input type="checkbox" checked disabled>
  <span>Disabled Checked Checkbox</span>
</label>

<br>

<label>
  <input type="checkbox" disabled>
  <span>Disabled Checkbox</span>
</label>
<br>

<label>
  <input type="checkbox">
  <span>Normal Checkbox</span>
</label>

<br>

<label>
  <input type="checkbox">
  <span>Another Normal Checkbox</span>
</label>


私もここに自分の答えを追加しました。うまくいけば、誰かの助けになるでしょう。私は私のテーマを利用しました。:)うまくいけば誰かがそれを見てください。
ポリワール氏

6

jQueryやJavaScriptコードを含まない簡単なCSSソリューションを次に示します。

私はFontAwseomeアイコンを使用していますが、任意の画像を使用できます

input[type=checkbox] {
  display: inline-block;
  font-family: FontAwesome;
  font-style: normal;
  font-weight: normal;
  line-height: 1;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  visibility: hidden;
  font-size: 14px;
}

input[type=checkbox]:before {
  content: @fa-var-square-o;
  visibility: visible;
  /*font-size: 12px;*/
}

input[type=checkbox]:checked:before {
  content: @fa-var-check-square-o;
}

1
他のほとんどの回答とは異なり、これは追加のlabelまたはspan要素の作成を必要としません。うまくいきます!
カートプレストン2017

このCSSコードが機能する例、デモ、または少なくともHTMLの部分を見せていただけますか?@aWebDeveloper
シャーンドルZuboly

@aWebDeveloperが解答や質問をホームページにぶつけるために狂った編集をすることはルールに反します。
TylerH 2017

@aWebDeveloper非アクティブな質問で古い回答を編集しました。これにより、回答がフロントページに表示され、回答へのリンクが直接提供されます。回答を追加または変更するための関連情報がある場合は、これで問題ありません。あなたがしたことは、あなたの文章の1つを引用ブロックに埋め込むことだけで、誰にとっても役に立ちません。
TylerH 2017

@VadimOvchinnikovは動作するはずです...ここに
Chrome

6

私のグーグルから、これはチェックボックススタイリングの最も簡単な方法です。ただ、追加:afterおよび:checked:afterCSSデザインに基づきます。

body{
  background: #DDD;
}
span{
  margin-left: 30px;
}
input[type=checkbox] {
    cursor: pointer;
    font-size: 17px;
    visibility: hidden;
    position: absolute;
    top: 0;
    left: 0;
    transform: scale(1.5);
}

input[type=checkbox]:after {
    content: " ";
    background-color: #fff;
    display: inline-block;
    color: #00BFF0;
    width: 14px;
    height: 19px;
    visibility: visible;
    border: 1px solid #FFF;
    padding: 0 3px;
    margin: 2px 0;
    border-radius: 8px;
    box-shadow: 0 0 15px 0 rgba(0,0,0,0.08), 0 0 2px 0 rgba(0,0,0,0.16);
}

input[type=checkbox]:checked:after {
    content: "\2714";
    display: unset;
    font-weight: bold;
}
<input type="checkbox"> <span>Select Text</span>


疑似要素をサポートするブラウザのための非常にクールなソリューション。:)
ジャン=フランソワ・ビーチャム

6

プレーンなCSS3でチェックボックスのスタイルを変更します。JS&HTML操作は必要ありません。

.form input[type="checkbox"]:before {
  display: inline-block;
  font: normal normal normal 14px/1 FontAwesome;
  font-size: inherit;
  text-rendering: auto;
  -webkit-font-smoothing: antialiased;
  content: "\f096";
  opacity: 1 !important;
  margin-top: -25px;
  appearance: none;
  background: #fff;
}

.form input[type="checkbox"]:checked:before {
  content: "\f046";
}

.form input[type="checkbox"] {
  font-size: 22px;
  appearance: none;
  -webkit-appearance: none;
  -moz-appearance: none;
}
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" />

<form class="form">
  <input type="checkbox" />
</form>


@VadimOvchinnikov我々はいくつかのHTML構造..次に必要と一つの解決策持ってstackoverflow.com/questions/23305780/...
BEJGAM SHIVAプラサド

4

シンプルで軽量のテンプレート:

input[type=checkbox] {
  cursor: pointer;
}

input[type=checkbox]:checked:before {
  content: "\2713";
  background: #fffed5;
  text-shadow: 1px 1px 1px rgba(0, 0, 0, .2);
  font-size: 20px;
  text-align: center;
  line-height: 8px;
  display: inline-block;
  width: 13px;
  height: 15px;
  color: #00904f;
  border: 1px solid #cdcdcd;
  border-radius: 4px;
  margin: -3px -3px;
  text-indent: 1px;
}

input[type=checkbox]:before {
  content: "\202A";
  background: #ffffff;
  text-shadow: 1px 1px 1px rgba(0, 0, 0, .2);
  font-size: 20px;
  text-align: center;
  line-height: 8px;
  display: inline-block;
  width: 13px;
  height: 15px;
  color: #00904f;
  border: 1px solid #cdcdcd;
  border-radius: 4px;
  margin: -3px -3px;
  text-indent: 1px;
}
<input type="checkbox" checked="checked">checked1<br>
<input type="checkbox">unchecked2<br>
<input type="checkbox" checked="checked" id="id1">
<label for="id1">checked2+label</label><br>
<label for="id2">unchecked2+label+rtl</label>
<input type="checkbox" id="id2">
<br>

https://jsfiddle.net/rvgccn5b/


1
の疑似要素inputはChromeでのみサポートされています。コードはすべてのブラウザで同じように機能するわけではありません。
Vadim Ovchinnikov

4

それを行う最も簡単な方法はlabelcheckbox

HTML

<input type="checkbox" id="first" />
<label for="first">&nbsp;</label>

CSS

checkbox {
  display: none;
}

checkbox + label {
  /* Style for checkbox normal */
  width: 16px;
  height: 16px;
}

checkbox::checked + label,
label.checked {
  /* Style for checkbox checked */
}

checkbox、それが隠されているにもかかわらず、まだアクセスできるようになります、とフォームが送信されたときにその値が送信されます。古いブラウザのためには、クラスを変更する必要がありますlabel私は、Internet Explorerの古いバージョンでは理解してないと思いますので、JavaScriptを使用してチェックすること::checkedcheckbox


4
あなたの答えと私の違いは正確には何ですか?
Blake Pettersson

@BlakePetterssonあなたのものは正しいです、::チェックは間違っています(それが許可されている場合に備えて私も試しました);)
esp

7
これは悪い答えです。(a)::checked間違っている—である必要があります:checked。(b)checkbox間違っている-間違いである[type=checkbox]
Chris Morgan、

4

うわぁ!これらのすべての回避策により、HTMLチェックボックスをスタイル設定したい場合、HTMLチェックボックスはひどいものになるという結論に至りました。

事前警告として、これはCSS実装ではありません。他の誰かが役立つと思う場合に備えて、私が思いついた回避策を共有したいと思いました。


HTML5 canvas要素を使用しました。

これの利点は、外部イメージを使用する必要がなく、おそらく帯域幅を節約できることです。

欠点は、ブラウザが何らかの理由で正しくレンダリングできない場合、フォールバックがないことです。ただし、これが2017年に引き続き問題となるかどうかは議論の余地があります。

更新

古いコードはかなり見苦しいので、書き直すことにしました。

Object.prototype.create = function(args){
    var retobj = Object.create(this);

    retobj.constructor(args || null);

    return retobj;
}

var Checkbox = Object.seal({
    width: 0,
    height: 0,
    state: 0,
    document: null,
    parent: null,
    canvas: null,
    ctx: null,

    /*
     * args:
     * name      default             desc.
     *
     * width     15                  width
     * height    15                  height
     * document  window.document     explicit document reference
     * target    this.document.body  target element to insert checkbox into
     */
    constructor: function(args){
        if(args === null)
            args = {};

        this.width = args.width || 15;
        this.height = args.height || 15;
        this.document = args.document || window.document;
        this.parent = args.target || this.document.body;
        this.canvas = this.document.createElement("canvas");
        this.ctx = this.canvas.getContext('2d');

        this.canvas.width = this.width;
        this.canvas.height = this.height;
        this.canvas.addEventListener("click", this.ev_click(this), false);
        this.parent.appendChild(this.canvas);
        this.draw();
    },

    ev_click: function(self){
        return function(unused){
            self.state = !self.state;
            self.draw();
        }
    },

    draw_rect: function(color, offset){
        this.ctx.fillStyle = color;
        this.ctx.fillRect(offset, offset,
                this.width - offset * 2, this.height - offset * 2);
    },

    draw: function(){
        this.draw_rect("#CCCCCC", 0);
        this.draw_rect("#FFFFFF", 1);

        if(this.is_checked())
            this.draw_rect("#000000", 2);
    },

    is_checked: function(){
        return !!this.state;
    }
});

これが実際のデモです。

新しいバージョンでは、プロトタイプと差分継承を使用して、チェックボックスを作成するための効率的なシステムを作成します。チェックボックスを作成するには:

var my_checkbox = Checkbox.create();

これにより、すぐにチェックボックスがDOMに追加され、イベントがフックされます。チェックボックスがチェックされているかどうかを照会するには:

my_checkbox.is_checked(); // True if checked, else false

注意すべき重要な点は、ループを解消したことです。

アップデート2

前回の更新で言及しなかったのは、キャンバスを使用することには、見た目どおりに見えるチェックボックスを作成することよりも多くの利点があるということです。必要に応じて、マルチステートチェックボックスを作成することもできます。

Object.prototype.create = function(args){
    var retobj = Object.create(this);

    retobj.constructor(args || null);

    return retobj;
}

Object.prototype.extend = function(newobj){
    var oldobj = Object.create(this);

    for(prop in newobj)
        oldobj[prop] = newobj[prop];

    return Object.seal(oldobj);
}

var Checkbox = Object.seal({
    width: 0,
    height: 0,
    state: 0,
    document: null,
    parent: null,
    canvas: null,
    ctx: null,

    /*
     * args:
     * name      default             desc.
     *
     * width     15                  width
     * height    15                  height
     * document  window.document     explicit document reference
     * target    this.document.body  target element to insert checkbox into
     */
    constructor: function(args){
        if(args === null)
            args = {};

        this.width = args.width || 15;
        this.height = args.height || 15;
        this.document = args.document || window.document;
        this.parent = args.target || this.document.body;
        this.canvas = this.document.createElement("canvas");
        this.ctx = this.canvas.getContext('2d');

        this.canvas.width = this.width;
        this.canvas.height = this.height;
        this.canvas.addEventListener("click", this.ev_click(this), false);
        this.parent.appendChild(this.canvas);
        this.draw();
    },

    ev_click: function(self){
        return function(unused){
            self.state = !self.state;
            self.draw();
        }
    },

    draw_rect: function(color, offsetx, offsety){
        this.ctx.fillStyle = color;
        this.ctx.fillRect(offsetx, offsety,
                this.width - offsetx * 2, this.height - offsety * 2);
    },

    draw: function(){
        this.draw_rect("#CCCCCC", 0, 0);
        this.draw_rect("#FFFFFF", 1, 1);
        this.draw_state();
    },

    draw_state: function(){
        if(this.is_checked())
            this.draw_rect("#000000", 2, 2);
    },

    is_checked: function(){
        return this.state == 1;
    }
});

var Checkbox3 = Checkbox.extend({
    ev_click: function(self){
        return function(unused){
            self.state = (self.state + 1) % 3;
            self.draw();
        }
    },

    draw_state: function(){
        if(this.is_checked())
            this.draw_rect("#000000", 2, 2);

        if(this.is_partial())
            this.draw_rect("#000000", 2, (this.height - 2) / 2);
    },

    is_partial: function(){
        return this.state == 2;
    }
});

Checkbox最後のスニペットで使用されているを少し変更して、より一般的なものにし、3つの状態のチェックボックスで「拡張」できるようにしました。こちらがデモです。ご覧のとおり、組み込みのチェックボックスよりも多くの機能がすでに備わっています。

JavaScriptとCSSのどちらを選択するかについて検討する必要があります。

古い、設計が不十分なコード

作業デモ

まず、キャンバスを設定します

var canvas = document.createElement('canvas'),
    ctx = canvas.getContext('2d'),
    checked = 0; // The state of the checkbox
canvas.width = canvas.height = 15; // Set the width and height of the canvas
document.body.appendChild(canvas);
document.body.appendChild(document.createTextNode(' Togglable Option'));

次に、キャンバス自体を更新する方法を考案します。

(function loop(){
  // Draws a border
  ctx.fillStyle = '#ccc';
  ctx.fillRect(0,0,15,15);
  ctx.fillStyle = '#fff';
  ctx.fillRect(1, 1, 13, 13);
  // Fills in canvas if checked
  if(checked){
    ctx.fillStyle = '#000';
    ctx.fillRect(2, 2, 11, 11);
  }
  setTimeout(loop, 1000/10); // Refresh 10 times per second
})();

最後の部分は、インタラクティブにすることです。幸いなことに、それは非常に簡単です。

canvas.onclick = function(){
  checked = !checked;
}

これは、JavaScriptの奇妙なイベント処理モデルのために、IEで問題が発生する可能性がある場所です。


これが誰かに役立つことを願っています。それは間違いなく私のニーズに合いました。


Canvasの実装では、チェックボックスのエミュレーションとして、組み込みのチェックボックスよりも多くの機能を使用できることに注意してください。たとえば、「マルチステート」チェックボックスなどの豪華なもの(つまりunchecked (e.g. unchecked -> checked -> "kinda" checked -> unchecked、ステートは「明示的なfalse」、「explicit true」、「デフォルトの使用」などを表すことができます)。答えに例を追加することを検討しています。
ブレーデンベスト

私の考えではひどい考え。

@ニールは詳しく説明してください
Braden Best

なぜ車輪を再発明するのですか?

@ニール、ホイールを再発明してみませんか?NIHは必ずしも悪いことではありません。特に、既存の技術で実装するのが不可能であるか、または非常に複雑である利点が得られる場合は特にそうです。つまり、組み込みのチェックボックスを処理するかどうかという問題です。また、Webサイトやアプリの視覚的な言語と調和するようにテーマを設定したい場合は、完全に制御したいと考えています。したがって、誰かが軽量で使いやすいスタンドアロンのUIライブラリを作成するまで、私は個人的にはここで開発されたホイールを好みます。他の誰かがそうしないかもしれませんが、それは私の答えを無効にしません。
ブレーデンベスト

3

これは最も簡単な方法であり、このスタイルを与えるチェックボックスを選択できます。

CSS:

.check-box input {
  display: none;
}

.check-box span:before {
  content: ' ';
  width: 20px;
  height: 20px;
  display: inline-block;
  background: url("unchecked.png");
}

.check-box input:checked + span:before {
  background: url("checked.png");
}

HTML:

<label class="check-box">
  <input type="checkbox">
  <span>Check box Text</span>
</label>

3

JavaScriptやjQueryは必要ありません

チェックボックスのスタイルを簡単な方法で変更します。

input[type="checkbox"] {
  display: none;
  border: none !important;
  box-shadow: none !important;
}

input[type="checkbox"] + label span {
  background: url(http://imgh.us/uncheck.png);
  width: 49px;
  height: 49px;
  display: inline-block;
  vertical-align: middle;
}

input[type="checkbox"]:checked + label span {
  background: url(http://imgh.us/check_2.png);
  width: 49px;
  height: 49px;
  vertical-align: middle;
}
<input type="checkbox" id="option" />
<label for="option"> <span></span> Click me </label>

ここにJsFiddleリンクがあります


チェックボックスは表示されません。オンラインで利用できなくなった画像ファイルimgh.us/uncheck.pngおよびimgh.us/check_2.pngへの外部リンクに依存しているためです。
jkdev

2

これはCSS / HTMLのみのバージョンで、jQueryやJavaScriptはまったく必要ありません。シンプルでクリーンなHTMLと、本当にシンプルで短いCSSです。

これがJSFiddleです

http://jsfiddle.net/v71kn3pr/

HTMLは次のとおりです。

<div id="myContainer">
    <input type="checkbox" name="myCheckbox" id="myCheckbox_01_item" value="red" />
    <label for="myCheckbox_01_item" class="box"></label>
    <label for="myCheckbox_01_item" class="text">I accept the Terms of Use.</label>
</div>

ここにCSSがあります

#myContainer {
    outline: black dashed 1px;
    width: 200px;
}
#myContainer input[type="checkbox"][name="myCheckbox"] {
    display: none;
}
#myContainer input[type="checkbox"][name="myCheckbox"]:not(:checked) + label.box {
    display: inline-block;
    width: 25px;
    height: 25px;
    border: black solid 1px;
    background: #FFF ;
    margin: 5px 5px;
}
#myContainer input[type="checkbox"][name="myCheckbox"]:checked + label.box {
    display: inline-block;
    width: 25px;
    height: 25px;
    border: black solid 1px;
    background: #F00;
    margin: 5px 5px;
}
#myContainer input[type="checkbox"][name="myCheckbox"] + label + label.text {
    font: normal 12px arial;
    display: inline-block;
    line-height: 27px;
    vertical-align: top;
    margin: 5px 0px;
}

これは、個々のラジオまたはチェックボックス、チェックボックスのグループ、およびラジオボタンのグループを持つことができるように適合させることができます。

このhtml / cssを使用すると、ラベルのクリックもキャプチャできるため、ラベルをクリックしただけの場合でも、チェックボックスがオンまたはオフになります。

このタイプのチェックボックス/ラジオボタンは、どのフォームでも問題なく機能し、まったく問題ありません。PHP、ASP.NET(.aspx)、JavaServer Faces、およびColdFusionを使用してテストされています。


2
**Custom checkbox with css**  (WebKit browser solution only Chrome, Safari, Mobile browsers)

    <input type="checkbox" id="cardAccptance" name="cardAccptance" value="Yes">
    <label for="cardAccptance" class="bold"> Save Card for Future Use</label>

    /* The checkbox-cu */

    .checkbox-cu {
        display: block;
        position: relative;
        padding-left: 35px;
        margin-bottom: 0;
        cursor: pointer;
        font-size: 16px;
        -webkit-user-select: none;
        -moz-user-select: none;
        -ms-user-select: none;
        user-select: none;
    }


    /* Hide the browser's default checkbox-cu */

    .checkbox-cu input {
        position: absolute;
        opacity: 0;
        cursor: pointer;
        height: 0;
        width: 0;
    }


    /* Create a custom checkbox-cu */

    .checkmark {
        position: absolute;
        top: 4px;
        left: 0;
        height: 20px;
        width: 20px;
        background-color: #eee;
        border: 1px solid #999;
        border-radius: 0;
        box-shadow: none;
    }


    /* On mouse-over, add a grey background color */

    .checkbox-cu:hover input~.checkmark {
        background-color: #ccc;
    }


    /* When the checkbox-cu is checked, add a blue background */

    .checkbox-cu input:checked~.checkmark {
        background-color: transparent;
    }


    /* Create the checkmark/indicator (hidden when not checked) */

    .checkmark:after {
        content: "";
        position: absolute;
        display: none;
    }


    /* Show the checkmark when checked */

    .checkbox-cu input:checked~.checkmark:after {
        display: block;
    }


    /* Style the checkmark/indicator */

    .checkbox-cu .checkmark::after {
        left: 7px;
        top: 3px;
        width: 6px;
        height: 9px;
        border: solid #28a745;
        border-width: 0 2px 2px 0;
        -webkit-transform: rotate(45deg);
        -ms-transform: rotate(45deg);
        transform: rotate(45deg);
        z-index: 100;
    }

1
input[type=checkbox].css-checkbox {
    position: absolute;
    overflow: hidden;
    clip: rect(0 0 0 0);
    height: 1px;
    width: 1px;
    margin: -1px;
    padding: 0;
    border: 0;
}

input[type=checkbox].css-checkbox + label.css-label {
    padding-left: 20px;
    height: 15px;
    display: inline-block;
    line-height: 15px;
    background-repeat: no-repeat;
    background-position: 0 0;
    font-size: 15px;
    vertical-align: middle;
    cursor: pointer;
}

input[type=checkbox].css-checkbox:checked + label.css-label {
    background-position: 0 -15px;
}

.css-label{
    background-image:url(http://csscheckbox.com/checkboxes/dark-check-green.png);
}

説明が正しいでしょう。
Peter Mortensen

1

いいえ、まだチェックボックス自体のスタイルを設定することはできませんが、機能維持しながら錯覚のスタイルを設定する方法を(ついに)見つけましたをクリックする。つまり、カーソルが完全に静止していない場合でも、テキストを選択したり、ドラッグアンドドロップをトリガーしたりせずに切り替えられます。

このソリューションは、おそらくラジオボタンにも適合します。

以下はInternet Explorer 9、Firefox 30.0、Chrome 40.0.2214.91で動作し、基本的な例にすぎません。それでも、背景画像や疑似要素と組み合わせて使用​​できます。

http://jsfiddle.net/o0xo13yL/1/

label {
    display: inline-block;
    position: relative; /* Needed for checkbox absolute positioning */
    background-color: #eee;
    padding: .5rem;
    border: 1px solid #000;
    border-radius: .375rem;
    font-family: "Courier New";
    font-size: 1rem;
    line-height: 1rem;
}

label > input[type="checkbox"] {
    display: block;
    position: absolute; /* Remove it from the flow */
    width: 100%;
    height: 100%;
    margin: -.5rem; /* Negative the padding of label to cover the "button" */
    cursor: pointer;
    opacity: 0; /* Make it transparent */
    z-index: 666; /* Place it on top of everything else */
}

label > input[type="checkbox"] + span {
    display: inline-block;
    width: 1rem;
    height: 1rem;
    border: 1px solid #000;
    margin-right: .5rem;
}

label > input[type="checkbox"]:checked + span {
    background-color: #666;
}

<label>
    <input type="checkbox" />
    <span>&nbsp;</span>Label text
</label>

1

EdgeやFirefoxなどのブラウザはチェックボックスの入力タグで:before:afterをサポートしていないため、これは純粋にHTMLとCSSを使用した代替手段です。もちろん、必要に応じてCSSを編集する必要があります。

次のようにチェックボックスのHTMLを作成します。

<div class='custom-checkbox'>
    <input type='checkbox' />
    <label>
        <span></span>
        Checkbox label
    </label>
</div>

このスタイルをチェックボックスに適用して、色ラベルを変更します

<style>
    .custom-checkbox {
        position: relative;
    }
    .custom-checkbox input{
        position: absolute;
        left: 0;
        top: 0;
        height:15px;
        width: 50px;    /* Expand the checkbox so that it covers */
        z-index : 1;    /* the label and span, increase z-index to bring it over */
        opacity: 0;     /* the label and set opacity to 0 to hide it. */
    }
    .custom-checkbox input+label {
        position: relative;
        left: 0;
        top: 0;
        padding-left: 25px;
        color: black;
    }
    .custom-checkbox input+label span {
        position: absolute;  /* a small box to display as checkbox */
        left: 0;
        top: 0;
        height: 15px;
        width: 15px;
        border-radius: 2px;
        border: 1px solid black;
        background-color: white;
    }
    .custom-checkbox input:checked+label { /* change label color when checked */
        color: orange;
    }
    .custom-checkbox input:checked+label span{ /* change span box color when checked */
        background-color: orange;
        border: 1px solid orange;
    }
</style>

1

CSSのみを使用してチェックボックスの色をグレースケールで変更できるようです。

以下はチェックボックスを黒から灰色に変換します(これは私が欲しかったものです):

input[type="checkbox"] {
    opacity: .5;
}

これにより境界線も明るくなります。また、チェックしても実際には確認できません。
レイチェルS

1

SCSS / SASSの実装

より近代的なアプローチ

SCSSを使用している(または簡単にSASSに変換する)場合は、以下が役立ちます。効果的には、スタイルを設定するチェックボックスの横に要素を作成します。チェックボックスがクリックされると、CSSは姉妹要素のスタイルを変更します(新しいチェック済みスタイルに)。コードは以下の通りです:

label.checkbox {
  input[type="checkbox"] {
    visibility: hidden;
    display: block;
    height: 0;
    width: 0;
    position: absolute;
    overflow: hidden;

    &:checked + span {
      background: $accent;
    }
  }

  span {
    cursor: pointer;
    height: 15px;
    width: 15px;
    border: 1px solid $accent;
    border-radius: 2px;
    display: inline-block;
    transition: all 0.2s $interpol;
  }
}
<label class="checkbox">
    <input type="checkbox" />
    <span></span>
    Label text
</label>


0

警告:執筆時点では次のことが当てはまりましたが、それまでの間、状況は進んでいます。

AFAIKの最新のブラウザは、ネイティブOSコントロールを使用してチェックボックスを表示するため、スタイルを設定する方法はありません。


30
これは'10年には真実だったかもしれませんが、今はそうではありません。この答えを削除する必要があります。
–MichałK 2013

3
それでも真実です-最新のブラウザはすべて、ネイティブのOSコントロールを使用してチェックボックスを表示します。この制限を回避するためのクールな新しいテクニックがいくつかあります。
ギャル

はい、私は「スタイルを設定する方法がない」という部分を参照しました^^
Joril
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.