チェックされたラジオボタンのラベルのCSSセレクター


221

チェックされたラジオボタンのラベルにcss(3)スタイルを適用することは可能ですか?

次のマークアップがあります。

<input type="radio" id="rad" name="radio"/>
<label for="rad">A Label</label>

私が望んでいたのは

label:checked { font-weight: bold; }

何かをするでしょうが、悲しいかな(私が期待したように)しません。

この種の機能を実現できるセレクターはありますか?それが役立つ場合は、divなどで囲むことができますが、最善の解決策は、ラベルの「for」属性を使用することです。

アプリケーションのブラウザーを指定できるので、クラスcss3などのベストを使用してください。

回答:


361

+シンボルを試してください:隣接する兄弟コンビネーターです。これは、同じ親を持つ単純なセレクタの二つの配列を組み合わせた2つ目は来なければならすぐに最初の後。

など:

input[type="radio"]:checked+label{ font-weight: bold; } 
 //a label that immediately follows an input of type radio that is checked 

次のマークアップに対して非常にうまく機能します:

<input id="rad1" type="radio" name="rad"/><label for="rad1">Radio 1</label>
<input id="rad2" type="radio" name="rad"/><label for="rad2">Radio 2</label>

...ラベルが無線入力に続く限り、divの有無に関係なく、どのような構造でも機能します。

例:

input[type="radio"]:checked+label { font-weight: bold; }
<input id="rad1" type="radio" name="rad"/><label for="rad1">Radio 1</label>
<input id="rad2" type="radio" name="rad"/><label for="rad2">Radio 2</label>


11
とにかくこれを行うことはありますが、ラベルは先行要素EGです:<label for="rad1">Radio 1</label><input id="rad1" type="radio" name="rad">
Nathan Koop 2012

17
ティルダ~を使用して、必ずしも隣接していない兄弟要素を選択できます。css-tricks.com/child-and-sibling-selectors
Martin

1
おかげで、これはJSなしで「イメージラジオボタン」を作成するのに役立ちました。
KillerX 2013年

9
:checkedセレクターがサポートされていないため、これはIE 8では機能しないことに注意してください。
マークアメリー

2
@Martin不思議に思っているかもしれませんが、ラベルはまだ入力に従う必要があるため、これは実際には機能しません。'+'と '〜'の違いは、ラベルが直接隣接しているか、一般に隣接しているか、つまりラベルが次の要素であるか、次の要素の1つだけであるかです
Njord

127

私はこれが古い質問であることを知ってい<input>ますが、<label>別々にするのではなく子にしたい場合は、これを達成するための純粋なCSSの方法を次に示します。

:checked + span { font-weight: bold; }

次に、テキストを<span>:でラップします。

<label>
   <input type="radio" name="test" />
   <span>Radio number one</span>
</label>

JSFiddleで確認してください


優れた。これはのかみそりの状況を処理するときに非常に役立ちます<label>@Html.RadioButtonFor(..) someText<label>。私は<span>「someText」を放り投げましたが、それは魅力のように機能しました。ありがとうございました!
S1r-Lanzelot、2015年

いいね!これを考えていませんでした。
マシューディーン

ちょうど私が必要なもの!ありがとう。
ライアン

:checkedで:active labelをスタイルしたい場合はどうしますか?これは実際には解決策ではありません。
Maciej Krawczyk 2016年

2
@MaciejKrawczyk ユースケースが完全に異なるため、それはあなたのための解決策はありません。:activeラベルのスタイルを設定したい場合は、そのままでかまいませんlabel:active { font-weight: bold; }。参照:jsfiddle.net/Gbq8Z/608(フィドルが608回フォークされたなんて信じられないほどです)。
Mike

22

最初に言及した箇所を忘れてしまいましたが、for=属性を設定していれば、実際にはラベルをコンテナーの他の場所に埋め込むことができます。それでは、SOのサンプルをチェックしてみましょう。

* {
  padding: 0;
  margin: 0;
  background-color: #262626;
  color: white;
}

.radio-button {
  display: none;
}

#filter {
  display: flex;
  justify-content: center;
}

.filter-label {
  display: inline-block;
  border: 4px solid green;
  padding: 10px 20px;
  font-size: 1.4em;
  text-align: center;
  cursor: pointer;
}

main {
  clear: left;
}

.content {
  padding: 3% 10%;
  display: none;
}

h1 {
  font-size: 2em;
}

.date {
  padding: 5px 30px;
  font-style: italic;
}

.filter-label:hover {
  background-color: #505050;
}

#featured-radio:checked~#filter .featured,
#personal-radio:checked~#filter .personal,
#tech-radio:checked~#filter .tech {
  background-color: green;
}

#featured-radio:checked~main .featured {
  display: block;
}

#personal-radio:checked~main .personal {
  display: block;
}

#tech-radio:checked~main .tech {
  display: block;
}
<input type="radio" id="featured-radio" class="radio-button" name="content-filter" checked="checked">
<input type="radio" id="personal-radio" class="radio-button" name="content-filter" value="Personal">
<input type="radio" id="tech-radio" class="radio-button" name="content-filter" value="Tech">

<header id="filter">
  <label for="featured-radio" class="filter-label featured" id="feature-label">Featured</label>
  <label for="personal-radio" class="filter-label personal" id="personal-label">Personal</label>
  <label for="tech-radio" class="filter-label tech" id="tech-label">Tech</label>
</header>

<main>
  <article class="content featured tech">
    <header>
      <h1>Cool Stuff</h1>
      <h3 class="date">Today</h3>
    </header>

    <p>
      I'm showing cool stuff in this article!
    </p>
  </article>

  <article class="content personal">
    <header>
      <h1>Not As Cool</h1>
      <h3 class="date">Tuesday</h3>
    </header>

    <p>
      This stuff isn't nearly as cool for some reason :(;
    </p>
  </article>

  <article class="content tech">
    <header>
      <h1>Cool Tech Article</h1>
      <h3 class="date">Last Monday</h3>
    </header>

    <p>
      This article has awesome stuff all over it!
    </p>
  </article>

  <article class="content featured personal">
    <header>
      <h1>Cool Personal Article</h1>
      <h3 class="date">Two Fridays Ago</h3>
    </header>

    <p>
      This article talks about how I got a job at a cool startup because I rock!
    </p>
  </article>
</main>

ふew。これは「サンプル」にとっては多くのことでしたが、実際に効果と要点を駆り立てると思います。兄弟ではなく、チェックされた入力コントロールのラベルを確実に選択できます。秘密はinputタグを必要なものだけ(この場合はbody要素のみ)の子にすることです。

以来label要素が実際に利用していない:checked擬似セレクタは、ラベルが中に格納されている問題ではありませんheader。これheaderは、兄弟要素であるため、~汎用兄弟セレクターを使用してinput[type=radio]:checkedDOM要素からheaderコンテナーに移動し、子孫/子セレクターを使用してlabel自体にアクセスできるため、それぞれのラジオボックス/チェックボックスが選択されています。

ラベルのスタイルを設定できるだけでなく、すべてのに関連する兄弟コンテナの子孫である可能性のある他のコンテンツのスタイルも設定できますinput。そして今、皆さんが待っていた瞬間、JSFIDDLE!そこに行って、遊んで、あなたのためにそれを機能させ、なぜ機能するのかを見つけ、それを壊し、あなたがしていることをしてください!

うまくいけば、すべてが理にかなっていて完全に質問に答え、おそらくはフォローアップが発生する可能性があります。


2
これがこの質問に対する答えです。正しい他のものは基本的に超基本的です。これはより複雑で興味深いものを解決しますが、それはjsを取得したくなります。
モーフル2017

この質問に対する受け入れられた回答は、この回答が完全に取り除く制限を課しているにもかかわらず、30倍を超える賛成票を持っています。驚くべき情報を主張する多くの同様に宣伝された投稿とは異なり、これは実際に主張を実現します。素晴らしい仕事、本当にありがとう。
naughtilus 2017

1
@naughtilus-この回答は、各オプションのスタイルを明示的に定義しているため、単純な回答の制限を完全に取り除きます。つまり、Mineは構造規則を持つように制限します。これは、すべてのラジオボタンと結果に対してcssを記述することを制限します。
Stephen

@morphles simple!= "super basic":このソリューションはより複雑で、興味深く、強力です-この正確なコードの場合。私の慣習は、1つの慣習
スティーブンの

1

入力がの子要素でありlabel、複数のラベルがある場合は、@ MikeのトリックFlexbox+ と組み合わせることができますorder

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

html
<label class="switchLabel">
  <input type="checkbox" class="switch"/>
  <span class="left">Left</span>
  <span class="right">Right</span>
</label>
CSS
label.switchLabel {
  display: flex;
  justify-content: space-between;
  width: 150px;
}
.switchLabel .left   { order: 1; }
.switchLabel .switch { order: 2; }
.switchLabel .right  { order: 3; }

/* sibling selector ~ */
.switchLabel .switch:not(:checked) ~ span.left { color: lightblue }
.switchLabel .switch:checked ~ span.right { color: lightblue }

JSFiddleで確認してください

注:兄弟セレクターは、同じ親内でのみ機能します。これを回避するには、@ Nathan Blairハックを使用して入力をトップレベルで非表示にすることができます。


-1

あなたは少しjQueryを使うことができます:

$('input:radio').click(function(){
    $('label#' + $(this).attr('id')).toggleClass('checkedClass'); // checkedClass is defined in your CSS
});

チェックされたラジオボタンがページの読み込み時に正しいクラスを持っていることを確認する必要もあります。


3
はい...もちろん、JavaScript(フレームワーク)を使用してこれを行うことは可能ですが、見た目ほど簡単ではありません。他の何かがすでにボックスをチェックしている場合はどうなりますか?同じグループの別のラジオが選択されている場合、どのスクリプトがこのクラスを削除しますか?非常に複雑になります。ブラウザの組み込みform + css機能は毎回動作するため、使用したいと思います。
スティーブン

4
セレクタは$('label[for="' + $(this).attr('id') + '"]').toggleClass();
Wesley Murchが2012

-3

更新:

既存の生成されたhtmlは奇抜で、labelsをsとともに生成radioし、それらに両方のchecked属性を与えるため、これは私にとってのみ機能しました。

気にしないでください、そしてそれを育ててくれたBrilliandのための大物!

ラベルがチェックボックスの兄弟である場合(通常はそうです)、~兄弟セレクターとを使用しlabel[for=your_checkbox_id]てアドレスを指定できます...または、複数のラベルがある場合はラベルにIDを指定します(この例のようにボタンにはラベルを使用してください)


同じことを探してここに来ました-しかし、ドキュメントで私の答えを見つけてしまいました。

属性を持つlabel要素checkedは次のように選択できます:

label[checked] {
  ...
}

私はそれが古い質問であることを知っています、しかしそれは誰かがそこにいるのを助けるかもしれません:)


5
そして、ラベルはどのようにチェックされることになっていますか?
ブリリアント

2
ねえ、良いキャッチ。そうではありません。どうやら、ラジオボタンとともにラベルを生成するかなり奇抜なコードがあり、HTMLを生成するときに両方に "checked"属性を追加しています。しかし、それは本当に有効ではありません...したがって、これは完全に使用できません。答えを編集しますが、なぜ賛成票を獲得したのかわかりません。ありがとう!
apprenticeDev
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.