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селектор.
Шіме Відас

Якщо я хочу вибрати ні вхід [type = "radio"], ні ввід [type = "checkbox"]. Правильний синтаксис - це робити лише за одним правилом і уникати виконання: input [type = "radio"], input [type = "checkbox"]
fabregas88

@ fabregas88 Ви можете додати до цих елементів клас CSS, а потім.foo { ... }
Šime Vidas

4
Ви щойно вбили доступ до клавіатури! сподіваюся, що всі ваші користувачі працездатні. ... тепер, якщо ви просто утримуєте там перемикач, не користуючись display:none;цим, браузери змусять її добре працювати з клавіатурою.
gcb

1
@gcb Питання полягало в тому, як приховати стандартні радіо кнопки. Я зробив цей прототип jsbin.com/miwati/edit?html,css,output . Перемикачі абсолютно розташовані за мітками. Напевно, не найкращий підхід.
Š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>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.