Я пытаюсь настроить таргетинг на этикетку с помощью .closest('label'), .next('label') для таргетинга на label. Что мне не хватает?
$('input').on('focus', function() {
$(this).parent().addClass('textblock');
$(this).next('label').css('top', '-27px');
console.info('hello');
});
$('input').on('blur', function() {
if ($(this).val() == '')
$(this).parent().removeClass('textblock');
$(this).next('label').css('top', '11px');
});<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class = "form-group col-md-6">
<input type = "text" class = "form-control not-required" name = "portfolio_link" value = "">
<span class = "bar"></span>
<label for = "portfolio_link" class = "input-empty">Portfolio Link</label>
</div>
next() будет нацелен на следующего брата, поэтому
Ты можешь использовать:
$(this).parent().find('label');
Кроме того, вы можете настроить таргетинг напрямую:
$('.input-empty').css('top', '-27px');
$('input').on('focus', function() {
$(this).parent().addClass('textblock');
$(this).parent().find('label').css('top', '-27px');
console.info('hello');
});
$('input').on('blur', function() {
if ($(this).val() == '')
$(this).parent().removeClass('textblock');
$(this).parent().find('label').css('top', '11px');
});<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class = "form-group col-md-6">
<input type = "text" class = "form-control not-required" name = "portfolio_link" value = "">
<span class = "bar"></span>
<label for = "portfolio_link" class = "input-empty">Portfolio Link</label>
</div>next() не будет работать, потому что он нацелен на следующего брата, но следующий за ним брат input в вашем примере - это span. Вместо этого вы можете использовать siblings():
$('input').on('focus', function() {
$(this).parent().addClass('textblock');
$(this).siblings('label').css('top', '-27px');
console.info('hello');
});
$('input').on('blur', function() {
if ($(this).val() == '')
$(this).parent().removeClass('textblock');
$(this).siblings('label').css('top', '11px');
});.form-group {
margin-top:30px;
}
label {
position:relative;
}<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class = "form-group col-md-6">
<input type = "text" class = "form-control not-required" name = "portfolio_link" value = "">
<span class = "bar"></span>
<label for = "portfolio_link" class = "input-empty">Portfolio Link</label>
</div>@cale_b Мой ответ предлагает использовать siblings(), а не parent(). Даже при использовании closest() javascript может сломаться, если структура DOM изменится (например, при перемещении метки за пределы div, содержащего ввод).
Привет, мои искренние извинения. Я думал, что размещаю этот комментарий против вопрос, а не против вашего ответа. Ваш ответ отличный.
Если вы хотите всегда настраивать таргетинг на соответствующий label для input, вы можете запросить его через атрибут name затронутого элемента input:
$('input').on('focus', function() {
$(this).parent().addClass('textblock');
$('label[for = "' + $(this).attr('name') + '"]').css('top', '-27px');
console.info('hello');
});
$('input').on('blur', function() {
if ($(this).val() === '')
$(this).parent().removeClass('textblock');
$('label[for = "' + $(this).attr('name') + '"]').css('top', '11px');
});<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class = "form-group col-md-6">
<input type = "text" class = "form-control not-required" name = "portfolio_link" value = "">
<span class = "bar"></span>
<label for = "portfolio_link" class = "input-empty">Portfolio Link</label>
</div>
Как правило, я сильно избегаю использования
.parentв пользу.closest. Намного более терпим к изменениям DOM ....