CSS-Auswahl für die Beschriftung eines aktivierten Optionsfelds

221

Ist es möglich, einen CSS (3) -Stil auf eine Beschriftung eines aktivierten Optionsfelds anzuwenden?

Ich habe das folgende Markup:

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

Was ich gehofft habe ist das

label:checked { font-weight: bold; }

würde etwas tun, aber leider nicht (wie ich erwartet hatte).

Gibt es einen Selektor, der diese Art von Funktionalität erreichen kann? Sie können mit divs usw. umgeben, wenn dies hilft, aber die beste Lösung wäre eine, die das Attribut label '' for '' verwendet.

Es sollte beachtet werden, dass ich Browser für meine Anwendung angeben kann, also bitte die beste Klasse CSS3 usw.

Stephen
quelle

Antworten:

361

Versuchen Sie das +Symbol: Es ist ein benachbarter Geschwisterkombinator. Es kombiniert zwei Sequenzen einfacher Selektoren mit demselben Elternteil und die zweite muss SOFORT nach der ersten kommen.

So wie:

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

funktioniert sehr gut für das folgende Markup:

<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>

... und es funktioniert für jede Struktur, mit oder ohne Divs usw., solange das Etikett dem Radioeingang folgt.

Beispiel:

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>

Stephen
quelle
11
Gibt es sowieso, um dies zu tun, aber mit dem Label als vorherigem Element EG:<label for="rad1">Radio 1</label><input id="rad1" type="radio" name="rad">
Nathan Koop
17
Sie können eine Tilda verwenden ~, um Geschwisterelemente auszuwählen, die nicht unbedingt benachbart sind. css-tricks.com/child-and-sibling-selectors
Martin
1
Vielen Dank, dies hat mir nur geholfen, "Bild-Optionsfelder" ohne JS zu erstellen.
KillerX
9
Es ist erwähnenswert, dass dies in IE 8 nicht funktioniert, da der :checkedSelektor nicht unterstützt wird .
Mark Amery
2
@Martin Nur für den Fall, dass Sie sich fragen, funktioniert dies in Ihrem Fall nicht wirklich, da das Etikett immer noch der Eingabe folgen muss . Der Unterschied zwischen '+' und '~' besteht darin, ob das Etikett direkt benachbart ist oder im Allgemeinen benachbart ist: ob das Etikett das nächste Element oder nur eines der nächsten Elemente ist.
Njord
127

Ich weiß, dass dies eine alte Frage ist, aber wenn Sie möchten, dass Sie <input>ein Kind sind, <label>anstatt sie getrennt zu haben, finden Sie hier eine reine CSS-Methode, mit der Sie dies erreichen können:

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

Dann wickeln Sie den Text einfach mit einem <span>:

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

Sehen Sie es auf JSFiddle .

Mike
quelle
Ausgezeichnet. Dies ist sehr nützlich, wenn es um die Rasiermessersituation <label>@Html.RadioButtonFor(..) someText<label>geht. Ich habe <span>"someText" herumgeworfen und es hat wie ein Zauber funktioniert. Danke dir!
S1r-Lanzelot
Nett! Hatte nicht daran gedacht.
Matthew Dean
Genau das, was ich brauchte! Vielen Dank.
Ryan
Was ist, wenn Sie: aktives Label mit: aktiviert stylen möchten? Dies ist keine wirkliche Lösung.
Maciej Krawczyk
2
@MaciejKrawczyk Es ist keine Lösung für Sie, da Ihr Anwendungsfall völlig anders ist. Wenn Sie ein: active-Label stylen möchten, können Sie dies einfach tun label:active { font-weight: bold; }. Siehe: jsfiddle.net/Gbq8Z/608 (wow, ich kann nicht glauben, dass die Geige 608 Mal gegabelt wurde).
Mike
22

Ich habe vergessen, wo ich es zum ersten Mal erwähnt habe, aber Sie können Ihre Etiketten tatsächlich an anderer Stelle in einen Container einbetten, solange Sie das for=Attribut festgelegt haben. Schauen wir uns also ein Beispiel für SO an:

* {
  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>

Wütend. Das war viel für ein "Sample", aber ich denke, es treibt den Effekt und den Punkt wirklich nach Hause: Wir können sicherlich ein Label für ein geprüftes Eingabesteuerelement auswählen, ohne dass es ein Geschwister ist. Das Geheimnis liegt darin , die inputTags für ein Kind nur so zu halten, wie es sein muss (in diesem Fall nur für das bodyElement) .

Da das labelElement den :checkedPseudo-Selektor nicht verwendet, spielt es keine Rolle, dass die Beschriftungen im gespeichert sind header. Es hat den zusätzlichen Vorteil, dass headerwir , da es sich um ein Geschwisterelement handelt, den ~generischen Geschwister-Selektor verwenden können, um vom input[type=radio]:checkedDOM-Element in den headerContainer zu wechseln, und dann Nachkommen- / Kind-Selektoren verwenden können, um auf die labels selbst zuzugreifen und sie zu formatieren, wenn sie vorhanden sind entsprechende Optionsfelder / Kontrollkästchen sind aktiviert .

Wir können nicht nur die Beschriftungen formatieren, sondern auch andere Inhalte, die möglicherweise Nachkommen eines Geschwistercontainers sind, relativ zu allen inputs. Und jetzt für den Moment, auf den Sie alle gewartet haben, das JSFIDDLE ! Gehen Sie dorthin, spielen Sie damit, lassen Sie es für Sie arbeiten, finden Sie heraus, warum es funktioniert, brechen Sie es, tun Sie, was Sie tun!

Hoffentlich macht das alles Sinn und beantwortet die Frage und möglicherweise alle möglichen Folgemaßnahmen vollständig.

Nathan Blair
quelle
2
Dies ist die Antwort auf diese Frage. Andere sind zwar korrekt, aber im Wesentlichen sehr einfach. Während dies etwas komplizierteres und interessanteres löst, wäre man versucht, sich js zu schnappen.
Morphles
Die akzeptierte Antwort auf diese Frage hat> 30x so viele positive Stimmen, obwohl eine Einschränkung auferlegt wurde, die durch diese Antwort vollständig vermieden wird. Im Gegensatz zu vielen ähnlich gehypten Posts, die atemberaubende Informationen enthalten, wird der Anspruch dadurch tatsächlich erfüllt. Tolle Arbeit, vielen Dank.
Naughtilus
1
@naughtilus - Diese Antwort beseitigt die Einschränkung der einfachen Antwort vollständig, da sie die Stile für jede Option explizit definiert. dh Mine beschränkt Sie auf eine Strukturkonvention; Dieser zwingt Sie dazu, CSS für jedes Optionsfeld und Ergebnis zu schreiben.
Stephen
@morphles simple! = "super basic": Diese Lösung ist komplizierter, interessanter und leistungsfähiger - für genau diesen Code; meins wird auf allen Seiten nach 1 Konvention arbeiten
Stephen
1

Wenn Ihre Eingabe ein untergeordnetes Element von ist labelund Sie mehr als eine Bezeichnung haben, können Sie den Trick von @ Mike mit Flexbox+ kombinieren order.

Geben Sie hier die Bildbeschreibung ein

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 }

Sehen Sie es auf JSFiddle .

Hinweis: Die Geschwisterauswahl funktioniert nur innerhalb desselben übergeordneten Elements. Um dies zu umgehen , können Sie die Eingabe mithilfe des @ Nathan Blair- Hacks auf oberster Ebene ausblenden .

Qwerty
quelle
-1

Sie könnten ein bisschen jQuery verwenden:

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

Sie müssen sicherstellen, dass Ihre aktivierten Optionsfelder auch beim Laden der Seite die richtige Klasse haben.

Dan Herd
quelle
3
Ja ... es ist natürlich möglich, dies über Javascript (Frameworks) zu tun, aber es ist nicht so einfach, wie es scheint. Was passiert, wenn bereits etwas anderes das Kontrollkästchen aktiviert hat? Welches Skript entfernt diese Klasse, wenn ein anderes Radio in derselben Gruppe ausgewählt ist? Es wird sehr schnell zu kompliziert. Ich möchte die in Form + CSS integrierte Funktionalität des Browsers verwenden, da sie jedes Mal funktioniert.
Stephen
4
Ihr Selektor sollte sein$('label[for="' + $(this).attr('id') + '"]').toggleClass();
Wesley Murch
-3

AKTUALISIEREN:

Dies funktionierte nur für mich, weil unser vorhandenes generiertes HTML verrückt war, labels zusammen mit radios generierte und beiden checkedAttributen gab.

Egal, und ein großes Lob für Brilliand, dass er es angesprochen hat!

Wenn Ihr Etikett ein Geschwister eines Kontrollkästchens ist (was normalerweise der Fall ist), können Sie den ~Geschwister-Selektor und a verwenden label[for=your_checkbox_id], um es zu adressieren ... oder dem Etikett eine ID geben, wenn Sie mehrere Etiketten haben (wie in diesem Beispiel, in dem ich Beschriftungen für Schaltflächen verwenden)


Kam hierher, um das Gleiche zu suchen - fand aber meine Antwort in den Dokumenten .

Ein labelElement mit checkedAttribut kann wie folgt ausgewählt werden:

label[checked] {
  ...
}

Ich weiß, dass es eine alte Frage ist, aber vielleicht hilft es jemandem da draußen :)

LehrlingDev
quelle
5
Und wie soll das Etikett überprüft werden?
Brilliand
2
Hey, guter Fang. Das tut es nicht. Anscheinend haben wir einen ziemlich verrückten Code, der Beschriftungen zusammen mit Optionsfeldern generiert und beiden beim Generieren des HTML-Codes ein "geprüftes" Attribut hinzufügt. Aber es ist nicht wirklich gültig ... Das ist also völlig unbrauchbar. Ich werde die Antwort bearbeiten, ich habe keine Ahnung, warum ich die positiven Stimmen dafür bekommen habe. Vielen Dank!
LehrlingDev