ตัวเลือก CSS สำหรับป้ายกำกับของปุ่มตัวเลือก


221

เป็นไปได้หรือไม่ที่จะใช้สไตล์ css (3) กับป้ายกำกับของปุ่มตัวเลือกที่เลือก?

ฉันมีมาร์กอัปต่อไปนี้:

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

สิ่งที่ฉันหวังคือ

label:checked { font-weight: bold; }

จะทำอะไรบางอย่าง แต่ก็ไม่ใช่ (อย่างที่ฉันคาดไว้)

มีตัวเลือกที่สามารถใช้ฟังก์ชันนี้ได้หรือไม่? คุณอาจล้อมรอบด้วย divs ฯลฯ หากมีสิ่งใดช่วยได้ แต่ทางออกที่ดีที่สุดคือโซลูชันที่ใช้ป้ายกำกับ '' for ''

ควรสังเกตว่าฉันสามารถระบุเบราว์เซอร์สำหรับแอปพลิเคชันของฉันดังนั้นโปรดใช้คลาส css3 และอื่น ๆ

คำตอบ:


362

ลอง+สัญลักษณ์: มันคือ combinator พี่น้องที่อยู่ติดกัน มันรวมสองซีเควนซ์ของซีเลเตอร์เรียบง่ายที่มีพาเรนต์เดียวกันและอันที่สองต้องมาทันทีหลังจากตัวแรก

เช่นนี้:

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>

... และมันจะทำงานสำหรับโครงสร้างใด ๆ ที่มีหรือไม่มี divs ฯลฯ ตราบใดที่ฉลากติดกับอินพุตของวิทยุ

ตัวอย่าง:

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">
นาธานคูป

17
คุณสามารถใช้ tilda ~เพื่อเลือกองค์ประกอบพี่น้องที่ไม่จำเป็นต้องอยู่ติดกัน css-tricks.com/child-and-sibling-selectors
Martin

1
ขอบคุณสิ่งนี้ช่วยฉันในการสร้าง "ปุ่มตัวเลือกรูปภาพ" โดยไม่มี JS
KillerX

9
มันน่าสังเกตว่านี้จะไม่ทำงานใน IE 8 ตั้งแต่:checkedเลือกจะได้รับการสนับสนุน
Mark Amery

2
@ มาร์ตินในกรณีที่คุณสงสัยว่าสิ่งนี้จะไม่ได้ผลในกรณีของคุณเนื่องจากฉลากยังคงต้องติดตามการป้อนข้อมูล ความแตกต่างระหว่าง '+' และ '~' คือว่าป้ายกำกับอยู่ติดกันโดยตรงหรือโดยทั่วไปแล้วไม่ว่า: ป้ายกำกับนั้นเป็นองค์ประกอบถัดไปหรือเป็นองค์ประกอบหนึ่งในองค์ประกอบถัดไป
Njord

128

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ถ้าคุณต้องการมี<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

ดี! ไม่เคยคิดเรื่องนี้
Matthew Dean

สิ่งที่ฉันต้องการ! ขอบคุณ
Ryan

จะทำอย่างไรถ้าคุณต้องการจัดสไตล์: ใช้งานป้ายกำกับด้วย: ทำเครื่องหมายแล้ว? นี่ไม่ใช่ทางออกจริงๆ
Maciej Krawczyk

2
@MaciejKrawczyk มันไม่ได้เป็นทางออกสำหรับคุณเพราะกรณีการใช้ของคุณแตกต่างอย่างสิ้นเชิง หากคุณต้องการรูปแบบ: label:active { font-weight: bold; }ป้ายที่ใช้งานคุณก็สามารถทำได้ ดู: jsfiddle.net/Gbq8Z/608 (ว้าวฉันไม่อยากจะเชื่อเลยว่าซอได้รับการแยก 608 ครั้ง)
Mike

23

ฉันลืมที่ฉันเห็นครั้งแรกที่กล่าวถึง แต่คุณสามารถฝังป้ายกำกับของคุณในภาชนะอื่น ๆ ตราบใดที่คุณมี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>

ต๊าย นั่นเป็นจำนวนมากสำหรับ "ตัวอย่าง" แต่ฉันรู้สึกว่ามันส่งผลและจุดกลับบ้านอย่างแท้จริง: เราสามารถเลือกฉลากสำหรับการควบคุมอินพุตที่ตรวจสอบได้โดยไม่ต้องเป็นพี่น้อง ความลับอยู่ในการรักษาinputแท็กเด็กที่จะเพียง แต่สิ่งที่พวกเขาจะต้อง (ในกรณีนี้ - เพียงbodyองค์ประกอบ)

เนื่องจากlabelองค์ประกอบไม่จริงใช้เลือกหลอกมันไม่สำคัญว่าป้ายจะถูกเก็บไว้ใน:checked headerมันมีประโยชน์เพิ่มเติมที่เนื่องจากheaderเป็นองค์ประกอบพี่น้องเราสามารถใช้~ตัวเลือกพี่น้องทั่วไปเพื่อย้ายจากinput[type=radio]:checkedองค์ประกอบ DOM ไปยังheaderคอนเทนเนอร์แล้วใช้ตัวเลือกลูกหลาน / ลูกหลานเพื่อเข้าถึงlabelตัวเองทำให้พวกเขาสามารถจัดรูปแบบพวกเขาเมื่อพวกเขา กล่องวิทยุที่เกี่ยวข้อง / ช่องทำเครื่องหมายได้รับการคัดเลือก

ไม่เพียง แต่เราสามารถจัดรูปแบบป้าย แต่ยังเนื้อหาอื่น ๆ สไตล์ที่อาจจะเป็นลูกหลานของภาชนะพี่น้องญาติทั้งหมดของinputs และตอนนี้คุณก็รอคอยJSFIDDLE ! ไปที่นั่นเล่นกับมันทำให้มันใช้ได้ผลสำหรับคุณค้นหาสาเหตุที่ใช้งานได้ทำลายมันทำสิ่งที่คุณทำ!

หวังว่าทุกคนจะสมเหตุสมผลและตอบคำถามได้อย่างเต็มที่และอาจมีการติดตามผลใด ๆ ที่อาจทำให้เกิดปัญหา


2
นี่คือคำตอบสำหรับคำถามนี้ อื่น ๆ ในขณะที่ถูกต้องเป็นพื้นฐานขั้นพื้นฐานสุด ในขณะที่การแก้ปัญหาบางอย่างที่ซับซ้อนและน่าสนใจมากขึ้นก็จะถูกล่อลวงที่จะคว้า js สำหรับ
morphles

คำตอบที่ได้รับการยอมรับสำหรับคำถามนี้มี upvotes มากถึง 30 เท่าแม้จะมีข้อ จำกัด ว่าคำตอบนี้จะทำให้เสียชื่อเสียงโดยสิ้นเชิง ซึ่งแตกต่างจากโพสต์ในทำนองเดียวกันหลาย hyped ที่อ้างว่าข้อมูลเหลือเชื่อนี้ส่งมอบจริงในการเรียกร้อง ผลงานยอดเยี่ยมขอบคุณมาก
naughtilus

1
@naughtilus - คำตอบนี้ทั้งหมด obviates ข้อ จำกัด ของคำตอบง่าย ๆ เพราะมันจะกำหนดรูปแบบสำหรับแต่ละตัวเลือกอย่างชัดเจน เช่นเหมืองบังคับให้คุณมีแบบแผนโครงสร้าง อันนี้ จำกัด ให้คุณเขียน CSS สำหรับทุกปุ่มและผลลัพธ์
Stephen

@morphles simple! = "super basic": วิธีนี้ซับซ้อน, น่าสนใจและทรงพลัง - สำหรับรหัสที่แน่นอนนี้; ของฉันจะทำงานในทุกหน้าหลังจากการประชุม 1 ครั้ง
Stephen

2

หากใส่ของคุณเป็นองค์ประกอบลูกของlabelคุณมีมากกว่าหนึ่งป้ายคุณสามารถรวม@ เคล็ดลับของไมค์กับ+Flexboxorder

ป้อนคำอธิบายรูปภาพที่นี่

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 hack


-1

คุณสามารถใช้ jQuery ได้เล็กน้อย:

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

คุณต้องตรวจสอบให้แน่ใจว่าปุ่มตัวเลือกของคุณมีคลาสที่ถูกต้องในการโหลดหน้าเว็บเช่นกัน


3
ใช่ ... เป็นไปได้ที่จะทำเช่นนี้ผ่านทาง javascript (เฟรมเวิร์ค) แต่มันไม่ง่ายอย่างที่คิด จะเกิดอะไรขึ้นหากมีสิ่งอื่นทำเครื่องหมายในช่องแล้ว สคริปต์ใดจะลบคลาสนี้หากเลือกวิทยุอื่นในกลุ่มเดียวกัน มันซับซ้อนเกินไปอย่างรวดเร็วจริงๆ ฉันต้องการใช้ฟังก์ชัน + form css ของเบราว์เซอร์เพราะมันจะทำงานทุกครั้ง
Stephen

4
ตัวเลือกของคุณควรเป็น$('label[for="' + $(this).attr('id') + '"]').toggleClass();
Wesley Murch

-3

UPDATE:

สิ่งนี้ใช้ได้กับฉันเท่านั้นเนื่องจาก html ที่สร้างขึ้นในปัจจุบันของเรานั้นแปลกประหลาดสร้างlabels พร้อมกับradioให้ทั้งสองcheckedคุณลักษณะ

ไม่เป็นไรและอัพครั้งใหญ่สำหรับ Brilliand ที่นำมันขึ้นมา!

หากป้ายกำกับของคุณเป็นพี่น้องของช่องทำเครื่องหมาย (ซึ่งมักจะเป็นกรณี) คุณสามารถใช้~ตัวเลือกพี่น้องและlabel[for=your_checkbox_id]เพื่อรับมือกับมัน ... หรือให้ฉลากรหัสถ้าคุณมีป้ายกำกับหลาย (เช่นในเรื่องนี้เช่นที่ฉัน ใช้ป้ายกำกับสำหรับปุ่ม)


มาที่นี่มองหาเหมือนกัน - แต่จบลงด้วยการหาคำตอบของฉันในเอกสาร

labelองค์ประกอบที่มีcheckedแอตทริบิวต์ที่สามารถเลือกได้เช่นดังนั้น:

label[checked] {
  ...
}

ฉันรู้ว่ามันเป็นคำถามเก่า แต่บางทีมันอาจช่วยใครบางคนที่นั่น :)


5
และควรตรวจสอบฉลากอย่างไร
Brilliand

2
เฮ้จับได้ดี มันไม่ได้ เห็นได้ชัดว่าเรามีรหัสแปลกประหลาดบางอย่างที่สร้างป้ายกำกับพร้อมกับปุ่มตัวเลือกและเพิ่มแอตทริบิวต์ "ตรวจสอบ" ให้กับทั้งสองเมื่อสร้าง html แต่มันไม่ถูกต้องจริงๆ ... ดังนั้นมันจึงใช้ไม่ได้ทั้งหมด ฉันจะแก้ไขคำตอบฉันไม่มีเงื่อนงำว่าทำไมฉันถึงมี upvotes ขอบคุณ!
apprenticeDev
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.