CSS селектор для помеченной метки переключателя - PullRequest
196 голосов
/ 16 сентября 2009

Можно ли применить стиль css (3) к метке отмеченного переключателя?

У меня есть следующая разметка:

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

Я надеялся, что

label:checked { font-weight: bold; }

что-то сделает, но, увы, нет (как я и ожидал).

Существует ли селектор, который может обеспечить такую ​​функциональность? Вы можете использовать div и т. Д., Если это поможет, но лучшим решением будет использование метки '' for ''.

Следует отметить, что я могу указать браузеры для своего приложения, поэтому, пожалуйста, лучше всего из класса css3 и т. Д.

Ответы [ 6 ]

320 голосов
/ 16 сентября 2009
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>

... и это будет работать для любой структуры, с или без div и т. Д., Пока метка следует за радиовходом.

Пример:

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>
112 голосов
/ 20 июня 2013

Я знаю, что это старый вопрос, но если вы хотите, чтобы <input> был потомком <label> вместо того, чтобы разделять их, вот простой способ CSS, которым вы могли бы это сделать:

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

Затем просто оберните текст <span>:

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

См. На JSFiddle .

18 голосов
/ 31 марта 2017

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

Мы можем не только стилизовать метки, но и стилизовать другой контент, который может быть потомком контейнера-брата по отношению ко всем input s. А теперь, пока вы все этого ждали, JSFIDDLE ! Иди туда, играй с этим, заставь это работать на тебя, выясни, почему это работает, сломай это, сделай то, что ты делаешь!

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

0 голосов
/ 24 мая 2018

Если ваш ввод является дочерним элементом label, и у вас более одного ярлыка, вы можете объединить @ трюк Майка с Flexbox + order.

enter image description here

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.

0 голосов
/ 17 марта 2014

UPDATE:

Это сработало только для меня, потому что наш существующий сгенерированный html был дурацким, генерируя label s вместе с radio s и давая им оба атрибута checked.

Неважно, и большие взлеты за Бриллианта и за то, что он его поднял!

Если ваша метка является родственным элементом флажка (который обычно имеет место), вы можете использовать селектор брата ~ и label[for=your_checkbox_id] для его адреса ... или присвоить метке идентификатор, если у вас есть несколько меток (как в этом примере , где я использую метки для кнопок)


Пришел сюда в поисках того же самого, но в итоге нашел мой ответ в документах .

Элемент

a label с атрибутом checked может быть выбран следующим образом:

label[checked] {
  ...
}

Я знаю, что это старый вопрос, но, может быть, это кому-то поможет :) 1026 *

0 голосов
/ 16 сентября 2009

Вы можете использовать немного jQuery:

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

Вам также необходимо убедиться, что выбранные вами радиокнопки имеют правильный класс при загрузке страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...