Ответ BoltClock - более семантический и легкий способ достижения этой функциональности.Однако не всегда возможно иметь определенную структуру HTML (особенно для облегчения второстепенной функции, подобной этой), а CSS не имеет возможности пересечь иерархию HTML.Чтобы обойти это, вот две альтернативы.Первый скоро (CSS spec 4), а второй - наш старый помощник Javascript.
Сначала CSS4 :focus-within
псевдо-селектор.Это в точности соответствует тому, что написано для олова (область действия зависит от активного состояния фокуса любого дочернего элемента).Подробнее о спецификации здесь .Таким образом, предполагая, что у вас есть структура HTML:
<div class="input-wrapper">
<label for="elem">Label Text
<input name="elem" id="elem" type="text" />
</label>
</div>
, вы можете ограничить метку 'focussed' просто:
label:focus-within{}
тем же маркером, вы также можете охватить родительский divс:
div.input-wrapper:focus-within{}
Волшебный.Но не для использования сегодня: (
Во-вторых, если вы уже используете механизм выбора JS (например, jQuery, Sizzle и т. Д.), Вы также можете сделать что-то вроде:
$('input').on("focus", function(){
var input = $(this);
// assuming label is the parent, i.e. <label><input /></label>
var label = $(this).parent();
label.addClass('focussed');
input.on("blur", function(){
label.removeClass('focussed');
input.off("blur");
});
});
Это не проверено , но суть того, что это достигается, заключается в использовании класса, а не псевдоселектора :focus
. Таким образом, вы можете добавить свои фокусированные стили к label.focussed{}
. Я добавил(и удалил сам) обработчик размытия, чтобы облегчить удаление класса.