Селектор CSS для мітки перевіреного перемикача


221

Чи можна застосувати стиль css (3) до мітки перевіреного перемикача?

У мене є така розмітка:

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

Я сподівався, що це

label:checked { font-weight: bold; }

щось би зробив, але на жаль, це не так (як я очікував).

Чи є селектор, який може досягти такого роду функціональності? Ви можете оточити діви тощо, якщо це допоможе, але найкращим рішенням буде те, що використовує атрибут label "" для ".

Слід зазначити, що я можу вказати браузери для моєї програми, тому найкраще класу css3 тощо.

Відповіді:


361

спробуйте +символ: Це сусідній комбінатор братів і сестер. Він поєднує в собі дві послідовності простих селекторів, що мають один і той же батьків, а другий повинен надходити негайно після першого.

Як такий:

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>

... і вона буде працювати для будь-якої структури, з дією або без неї тощо, доки ярлик не відповідає радіо вводу.

Приклад:

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">
Nathan Koop

17
Ви можете використовувати тильду ~для вибору елементів братів і сестер, які не обов'язково є суміжними. css-tricks.com/child-and-sibling-selectors
Мартін

1
Дякую, це просто допомогло мені створити "кнопки перемикання зображень" без JS.
KillerX

9
Варто зазначити, що це не буде працювати в IE 8, оскільки :checkedселектор не підтримується .
Марк Амері

2
@Martin Про всяк випадок, коли вам цікаво, це у вашій справі насправді не вийде, оскільки етикетці все ще потрібно слідувати введенню. Різниця між "+" і "~" полягає в тому, чи безпосередньо мітка суміжна, або загалом суміжна: чи мітка є наступним елементом, чи лише одним із наступних елементів.
Njord

127

Я знаю, що це давнє питання, але якщо ви хочете мати <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

Приємно! Не думав про це.
Метью Дін

Тільки те, що мені було потрібно! Дякую.
Райан

Що робити, якщо ви хочете стилізувати: активний ярлик із: позначено? Це насправді не рішення.
Maciej Krawczyk

2
@MaciejKrawczyk Це не для вас рішення, тому що ваш випадок використання зовсім інший. Якщо ви хочете зробити стиль: активний ярлик, ви можете просто зробити label:active { font-weight: bold; }. Дивіться: jsfiddle.net/Gbq8Z/608 (вау, я не можу повірити, що скрипка була роздвоєна 608 разів).
Майк

22

Я забуваю, де я вперше побачив це згадане, але ви фактично можете вставити свої мітки в контейнер в іншому місці, поки у вас є 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самих s, що дозволяє можливість стилізувати їх, коли їх встановлені відповідні радіоботи / прапорці .

Ми можемо не лише розміщувати етикетки, а й стилізувати інший вміст, який може бути нащадком контейнера для братів і сестер відносно всіх inputs. А тепер на хвилину, яку ви всі чекали, JSFIDDLE ! Ідіть туди, пограйте з ним, змусьте це працювати для вас, з’ясуйте, чому це працює, зламайте, робіть те, що ви робите!

Сподіваємось, що все має сенс і повністю відповідає на питання і, можливо, будь-які подальші спостереження, які можуть виникнути.


2
Це відповідь на це питання. Інші в той час як правильні, по суті є супер основними. Хоча це вирішує щось складніше та цікавіше, цього можна було б захопити схопити js.
морфи

Прийнята відповідь на це запитання має більше 30 разів, незважаючи на накладення обмеження, яке ця відповідь повністю ухиляється. На відміну від багатьох аналогічно заблуканих постів, які стверджують, що вражає розумною інформацією, це насправді стосується претензії. Дивовижна робота, велике спасибі
naughtilus

1
@naughtilus - ця відповідь повністю усуває обмеження простої відповіді, оскільки вона чітко визначає стилі кожного варіанту. тобто міна обмежує вас конвенцією про структуру; це обмежує написання css для кожної радіо кнопки та результату.
Стівен

@morphles simple! = "супер базовий": це рішення є складнішим, цікавішим та потужнішим - для цього точного коду; моя працюватиме на всіх сторінках після 1 конвенції
Stephen

1

Якщо ваш вхід є дочірнім елементом labelта у вас є більше однієї мітки, ви можете комбінувати трюк @ Майка з Flexbox+ order.

введіть тут опис зображення

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 .


-1

Ви можете використовувати трохи jQuery:

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

Вам потрібно буде переконатися, що перевірені радіо кнопки також мають відповідний клас завантаження сторінки.


3
Так ... це, звичайно, можна зробити через JavaScript (фреймворки), але це не так просто, як здається. Що станеться, якщо щось інше вже встановлено? Який скрипт буде видаляти цей клас, якщо вибрано інше радіо в тій же групі? Це стає занадто складним дійсно швидко. Я хочу використовувати вбудований у браузер браузер у формі + css функціонал, тому що він буде працювати щоразу.
Стівен

4
Ваш вибір повинен бути$('label[for="' + $(this).attr('id') + '"]').toggleClass();
Веслі Мерч

-3

ОНОВЛЕННЯ:

Це працювало для мене лише тому, що наш існуючий генерований HTML був дурним, генеруючи labels разом із radios та надаючи їм обидва checkedатрибути.

Не забувайте, і великі зйомки для Brilliand за його виховання!

Якщо ваша мітка - це побратим прапорця (як правило, так), ви можете скористатися ~селектором браку та зразка a label[for=your_checkbox_id]для його вирішення ... або надати ідентифікатору ідентифікатор, якщо у вас є кілька міток (наприклад, у цьому прикладі, де я використовувати мітки для кнопок)


Прийшов сюди шукати те саме - але нарешті знайшов свою відповідь у документах .

labelелемент з checkedатрибутом може бути обраний таким чином:

label[checked] {
  ...
}

Я знаю, що це старе питання, але, можливо, це комусь допомагає :)


5
І як належить перевірити етикетку?
Brilliand

2
Гей, хороший улов. Це не так. Мабуть, у нас є досить примхливий код, який генерує мітки разом з перемикачами, і додає атрибут "перевірений" обом при генерації html. Але це насправді не дійсно ... Тож це абсолютно непридатно. Я відредагую відповідь, не маю поняття, чому я отримав нагороди за неї. Дякую!
ученьДев
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.