İşaretli bir radyo düğmesinin etiketi için CSS seçici


221

İşaretli bir radyo düğmesinin etiketine css (3) stili uygulamak mümkün müdür?

Aşağıdaki biçimlendirme var:

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

Umduğum şey şu ki

label:checked { font-weight: bold; }

bir şey yapardı, ama ne yazık ki (beklediğim gibi).

Bu tür bir işlevsellik sağlayabilecek bir seçici var mı? Bu yardımcı olursa divs vb. İle çevreleyebilirsiniz, ancak en iyi çözüm '' for '' özelliğini kullanan bir çözüm olacaktır.

Uygulamam için tarayıcıları belirleyebileceğime dikkat etmeliyim, bu yüzden sınıf css3 vb. En iyisi lütfen.

Yanıtlar:


362

şu +sembolü deneyin : Bitişik kardeş birleştirici. Aynı ana öğeye sahip iki basit seçici dizisini birleştirir ve ikincisi HEMEN ilkinden sonra gelmelidir .

Gibi:

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

aşağıdaki biçimlendirme için çok güzel çalışıyor:

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

... etiket radyo girişini takip ettiği sürece div vb. olan veya olmayan herhangi bir yapı için çalışır.

Misal:

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
Bunu yapmak için yine de var mı, ama etiket EG ilk unsuru:<label for="rad1">Radio 1</label><input id="rad1" type="radio" name="rad">
Nathan Koop

17
~Mutlaka bitişik olmayan kardeş öğelerini seçmek için bir tilda kullanabilirsiniz . css-tricks.com/child-and-sibling-selectors
Martin

1
Teşekkürler, bu sadece JS ile "görüntü radyo düğmeleri" oluşturmak için bana yardımcı oldu.
KillerX

9
:checkedSeçici desteklenmediği için IE 8'de bunun işe yaramayacağını belirtmek gerekir .
Mark Amery

2
@Martin Merak ediyorsanız, etiketin yine de girişi takip etmesi gerektiğinden, bu aslında sizin durumunuzda çalışmaz . '+' Ve '~' arasındaki fark, etiketin doğrudan bitişik mi yoksa genel olarak iyi mi olduğudur: etiketin bir sonraki eleman mı yoksa bir sonraki elemanlardan mı biri olduğu .
Njord

128

Bunun eski bir soru olduğunu biliyorum, ama onları ayrı tutmak yerine <input>bir çocuk <label>olmak istiyorsanız, işte bunu başarabileceğiniz saf bir CSS yolu:

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

Ardından metni bir ile sarın <span>:

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

JSFiddle'da görün .


Mükemmel. Bu jilet durumu ile uğraşırken çok yararlı <label>@Html.RadioButtonFor(..) someText<label>, <span>"someText" etrafında attı ve bir cazibe gibi çalıştı. Teşekkür ederim!
S1r-Lanzelot

Güzel! Bunu düşünmemişti.
Matthew Dean

Tam ihtiyacım olan şey! Teşekkürler.
Ryan

Stil: aktif etiketli: işaretlemek istiyorsanız ne olacak? Bu gerçekten bir çözüm değil.
Maciej Krawczyk

2
@MaciejKrawczyk Bu sizin için bir çözüm değildir, çünkü kullanım durumunuz tamamen farklıdır. Aktif bir etiket tarzı yapmak istiyorsanız, bunu yapabilirsiniz label:active { font-weight: bold; }. Bakınız: jsfiddle.net/Gbq8Z/608 (vay kemanın 608 kez çatallandığına inanamıyorum).
Mike

23

Bahsettiğim yeri ilk gördüğüm şeyi unuttum, ancak etiketlerinizi for=öznitelik ayarladığınız sürece başka bir yere başka bir kaba yerleştirebilirsiniz. Öyleyse, SO'daki bir örneği kontrol edelim:

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

Whew. Bu bir "örnek" için çok şeydi ama gerçekten eve etki ve nokta yönlendirir hissediyorum: biz kesinlikle bir kardeşi olmadan kontrol giriş kontrolü için bir etiket seçebilirsiniz. İşin sırrı , inputetiketleri yalnızca olması gereken şeye (bu durumda yalnızca bodyöğe) bir çocuk tutmaktır .

Yana labeleleman aslında kullanmaz :checkedsözde seçici, etiketlerin saklanır fark etmez header. O zamandan beri ekledi yararı var headerkardeş unsurdur kullanabileceğimiz ~taşınmaya jenerik kardeş seçici input[type=radio]:checkedDOM öğesinin headererişmek için soyundan / çocuk seçicileri kullanabilirsiniz ardından konteyner ve labelkendilerini s onları ne zaman stil yeteneğini sağlayan onların ilgili radyo kutuları / onay kutuları seçilir .

Etiketleri yalnızca stil olarak değil, aynı zamanda tüm kardeşlere göre bir kardeş kabının torunları olabilecek diğer içerikleri de stilize edebiliriz input. Ve şimdi beklediğiniz an için JSFIDDLE ! Oraya gidin, onunla oynayın, sizin için çalışmasını sağlayın, neden çalıştığını öğrenin, kırın, ne yaptığınızı yapın!

Umarım herkes mantıklı ve soruyu tamamen cevaplar ve muhtemelen ortaya çıkabilecek herhangi bir takip.


2
Bu sorunun cevabı bu. Diğerleri doğruyken aslında çok basit. Bu daha karmaşık ve ilginç bir şeyi çözse de, js'yi almak için cazip olurdu.
morphles

Bu sorunun kabul edilen cevabı, bu cevabın tamamen ortadan kalktığı bir sınırlama getirmesine rağmen> 30 kat daha fazla oy hakkına sahiptir. Akıllara durgunluk veren bilgileri iddia eden birçok benzer şekilde hiper gönderinin aksine, bu aslında iddiayı gerçekleştirir. Harika iş, çok teşekkürler.
naughtilus

1
@naughtilus - bu cevap basit yanıtın sınırlamasını tamamen ortadan kaldırır, çünkü her seçenek için stilleri açıkça tanımlar. yani Mine sizi bir yapı sözleşmesi yapmakla sınırlar; bu, her radyo düğmesi ve sonucu için css yazmanızı kısıtlar.
Stephen

@morphles simple! = "super basic": bu çözüm daha karmaşık, ilginç ve güçlü - tam olarak bu kod için; mayın 1 kongre sonrasında tüm sayfalarda çalışacak
Stephen

2

Girişiniz alt öğesiyse labelve birden fazla etiketiniz varsa, @ Mike'ın numarasınıFlexbox + ile birleştirebilirsiniz order.

resim açıklamasını buraya girin

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'da görün .

not: kardeş seçici sadece aynı ebeveyn içinde çalışır. Bu sorunu gidermek için @Nathan Blair kesmek kullanarak girdiyi en üst düzeyde gizleyebilirsiniz .


-1

Biraz jQuery kullanabilirsiniz:

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

İşaretli radyo düğmelerinizin sayfa yüklemesinde de doğru sınıfa sahip olduğundan emin olmanız gerekir.


3
Evet ... elbette bunu javascript (çerçeveler) ile yapmak mümkündür, ancak göründüğü kadar basit değildir. Kutuyu başka bir şey işaretlemişse ne olur? Aynı gruptaki başka bir radyo seçilirse bu sınıfı hangi komut dosyası kaldıracaktır? Çok hızlı bir şekilde karmaşıklaşıyor. Her seferinde çalışacağı için tarayıcının yerleşik form + css işlevini kullanmak istiyorum.
Stephen

4
Seçiciniz$('label[for="' + $(this).attr('id') + '"]').toggleClass();
Wesley Murch

-3

GÜNCELLEME:

Bu sadece benim için çalıştı çünkü mevcut oluşturulan html labels ile birlikte radios üreten ve her iki checkedözniteliği tuhaf .

Boş ver, ve Brilliand'ı büyüttüğü için büyük ups!

Etiket (genellikle böyledir) bir onay kutusu bir kardeş ise, kullanabileceğiniz ~kardeş seçici ve label[for=your_checkbox_id]onu ele ... ya da bu gibi (birden çok etiket varsa etiket bir kimlik vermek için örnek nerede düğmeler için etiketler kullanın)


Buraya aynı şeyi aradım - ama dokümanlardaki cevabımı buldum .

özniteliğe labelsahip bir öğe checkedşu şekilde seçilebilir:

label[checked] {
  ...
}

Eski bir soru olduğunu biliyorum, ama belki orada birine yardımcı olur :)


5
Peki etiketin nasıl kontrol edilmesi gerekiyor?
Brilliand

2
Hey, iyi yakaladın. Öyle değil. Görünüşe göre, radyo düğmeleriyle birlikte etiketler üreten ve html oluştururken her ikisine de "kontrol edilen" bir özellik ekleyen oldukça tuhaf bir kodumuz var. Ama bu gerçekten geçerli değil ... Yani bu tamamen kullanılamaz. Cevabı düzenleyeceğim, bunun için neden oyları aldığım hakkında hiçbir fikrim yok. Teşekkürler!
apprenticeDev
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.