CSS - วิธีจัดรูปแบบเลเบลปุ่มแบบเรดิโอที่เลือก?


141

ฉันต้องการเพิ่มสไตล์ให้กับป้ายกำกับที่เลือกของปุ่มตัวเลือก:

HTML:

<div class="radio-toolbar">
 <label><input type="radio" value="all" checked>All</label>
 <label><input type="radio" value="false">Open</label>
 <label><input type="radio" value="true">Archived</label>
</div>

CSS

.radio-toolbar input[type="radio"] {display:none;}
.radio-toolbar label {
    background:Red;
    border:1px solid green;
    padding:2px 10px;
}
.radio-toolbar label + input[type="radio"]:checked { 
    background:pink !important;
}

ความคิดใดที่ฉันทำผิด

คำตอบ:


296

.radio-toolbar input[type="radio"] {
  display: none;
}

.radio-toolbar label {
  display: inline-block;
  background-color: #ddd;
  padding: 4px 11px;
  font-family: Arial;
  font-size: 16px;
  cursor: pointer;
}

.radio-toolbar input[type="radio"]:checked+label {
  background-color: #bbb;
}
<div class="radio-toolbar">
  <input type="radio" id="radio1" name="radios" value="all" checked>
  <label for="radio1">All</label>

  <input type="radio" id="radio2" name="radios" value="false">
  <label for="radio2">Open</label>

  <input type="radio" id="radio3" name="radios" value="true">
  <label for="radio3">Archived</label>
</div>

ก่อนอื่นคุณอาจต้องการเพิ่มแอnameททริบิวในปุ่มตัวเลือก ไม่เช่นนั้นจะไม่ได้อยู่ในกลุ่มเดียวกันและสามารถเลือกปุ่มตัวเลือกได้หลายปุ่ม

นอกจากนี้เนื่องจากฉันวางป้ายกำกับเป็นพี่น้อง (ของปุ่มตัวเลือก) ฉันจึงต้องใช้คุณลักษณะidและforเพื่อเชื่อมโยงเข้าด้วยกัน


2
@ Johncl นั่นเป็นเรื่องจริง IE8 ไม่ได้ใช้:checkedตัวเลือก
Šime Vidas

หากฉันต้องการเลือกไม่ใช่อินพุต [type = "radio"] หรืออินพุต [type = "checkbox"] ซึ่งเป็นไวยากรณ์ที่ถูกต้องที่จะทำในกฎเดียวเท่านั้นและหลีกเลี่ยง: input [type = "radio"], input [type = "checkbox"]
fabregas88

@ fabregas88 คุณสามารถเพิ่มคลาส CSS ลงในองค์ประกอบเหล่านั้นได้จากนั้น.foo { ... }
Vidime Vidas

4
คุณเพิ่งฆ่าการเข้าถึงคีย์บอร์ด! หวังว่าผู้ใช้ของคุณทุกคนจะสามารถใช้งานได้ ... ตอนนี้ถ้าคุณเพียงกดปุ่มตัวเลือกไว้ที่นั่นโดยไม่ต้องใช้display:none;เบราว์เซอร์จะทำให้มันใช้งานได้กับคีย์บอร์ด
gcb

1
@gcb คำถามคือวิธีซ่อนปุ่มตัวเลือกมาตรฐาน ฉันสร้างjsbin.com/miwati/edit?html,css,outoutต้นแบบนี้แล้ว ปุ่มตัวเลือกอยู่ในตำแหน่งด้านหลังฉลาก อาจไม่ใช่วิธีที่ดีที่สุดแม้ว่า
Šime Vidas

29

หากคุณต้องการใส่ช่องทำเครื่องหมายภายในป้ายกำกับให้ลองเพิ่มแท็กสแปนเพิ่มเติมเช่น

HTML

<div class="radio-toolbar">
 <label><input type="radio" value="all" checked><span>All</span></label>
 <label><input type="radio" value="false"><span>Open</span></label>
 <label><input type="radio" value="true"><span>Archived</span></label>
</div>

CSS

.radio-toolbar input[type="radio"]:checked ~ * { 
    background:pink !important;
}

ที่จะกำหนดพื้นหลังสำหรับพี่น้องทั้งหมดของปุ่มตัวเลือกที่เลือก


2
ฉันชอบวิธีการนี้ถึงแม้ว่าฉันจะใช้ตัวเลือกที่แตกต่างกัน ('+' ตามที่ระบุไว้ด้านล่างและในคำถามนี้เพราะฉันต้องการสไตล์เพียงรายการที่เลือกนี้ช่วยให้ฉันไม่ต้องกังวลเกี่ยวกับforคุณลักษณะ
brichins

6

คุณกำลังใช้ตัวเลือกพี่น้องที่อยู่ติดกัน ( +) เมื่อองค์ประกอบไม่ใช่พี่น้อง ฉลากเป็นผู้ปกครองของการป้อนข้อมูลที่ไม่ได้มันเป็นพี่น้อง

CSS ไม่มีวิธีในการเลือกองค์ประกอบที่ขึ้นอยู่กับผู้สืบทอด (หรืออะไรก็ตามที่ตามมา)

คุณจะต้องมองหา JavaScript เพื่อแก้ไขปัญหานี้

หรือจัดเรียงมาร์กอัปของคุณใหม่:

<input id="foo"><label for="foo"></label>

1

คุณสามารถเพิ่มช่วงใน html และ css ของคุณ

นี่คือตัวอย่างจากรหัสของฉัน ...

HTML (JSX):

<input type="radio" name="AMPM" id="radiostyle1" value="AM" checked={this.state.AMPM==="AM"} onChange={this.handleChange}/>  
<label for="radiostyle1"><span></span> am  </label>

<input type="radio" name="AMPM" id="radiostyle2" value="PM" checked={this.state.AMPM==="PM"} onChange={this.handleChange}/>
<label for="radiostyle2"><span></span> pm  </label>

CSS เพื่อทำให้ปุ่มตัวเลือกมาตรฐานหายไปบนหน้าจอและวางรูปปุ่มที่กำหนดเองใหม่:

input[type="radio"] {  
    opacity:0;                                      
}

input[type="radio"] + label {
    font-size:1em;
    text-transform: uppercase;
    color: white ;  
    cursor: pointer;
    margin:auto 15px auto auto;                    
}

input[type="radio"] + label span {
    display:inline-block;
    width:30px;
    height:10px;
    margin:1px 0px 0 -30px;                       
    cursor:pointer;
    border-radius: 20%;
}


input[type="radio"] + label span {
    background-color: #FFFFFF 
}


input[type="radio"]:checked + label span{
     background-color: #660006;  
}

0

เนื่องจากขณะนี้ยังไม่มีวิธีแก้ปัญหา CSS เพื่อกำหนดรูปแบบผู้ปกครองฉันใช้ jQuery แบบง่าย ๆ ที่นี่เพื่อเพิ่มคลาสให้กับเลเบลที่มีอินพุตที่ตรวจสอบอยู่ภายใน

$(document).on("change","input", function(){
 $("label").removeClass("checkedlabel");
 if($(this).is(":checked")) $(this).closest("label").addClass("checkedlabel");
});

อย่าลืมที่จะให้ฉลากของอินพุตที่ตรวจสอบล่วงหน้าcheckedlabelด้วยเช่นกัน


0

นี่คือทางออกที่เข้าถึงได้

label {
  position: relative;
}

label input {
  position: absolute;
  opacity: 0;
}

label:focus-within {
  outline: 1px solid orange;
}
<div class="radio-toolbar">
  <label><input type="radio" value="all" checked>All</label>
  <label><input type="radio" value="false">Open</label>
  <label><input type="radio" value="true">Archived</label>
</div>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.