I’m trying to create the ‘floating labels’ effect for my fields. However, I’m having difficulties because the HTML code is structured in such a way that prevents it from being achieved using only CSS as there is no way to use CSS combinators (>
,+
,~
) and I do not have the ability to change the HTML code.
My code:
label {display: block; position: absolute; margin: 15px 0 0 12px; color: #606060; font-family: "Arial";}
input {display: block; padding: 15px 12px; border: 1px solid #bbb; border-radius: 5px; width: 300px;}
<p class="container">
<label for="input">
Label
</label>
<span class="input-wrapper">
<input type="input-text" class="input" name="input" id="input" placeholder="">
</span>
</p>
But I believe it would be possible if I was able to give the container
a CSS class based on the field’s input/state. I would like to give the container
the display-floating-label
class if the value of the input
is greater than 0 ( > 0 ). And maybe when the input
is focused as well. Is that possible with JavaScript?
I’ve tried:
$(document).ready(function() {
var formFields = $('.container');
formFields.each(function() {
var field = $(this);
var input = field.find('input');
var label = field.find('label');
function checkInput() {
var valueLength = input.val().length;
if (valueLength > 0 ) {
label.addClass('display-floating-label')
} else {
label.removeClass('display-floating-label')
}
}
input.change(function() {
checkInput()
})
});
});
But it didn’t work. I’m not very familiar with JavaScript so I would really appreciate if someone could help me out.
Here’s what I’m trying to achieve:
*I can not change the structure of the HTML code, I can only work with what I have.
Advertisement
Answer
Try the below snippet.
$(document).ready(function() {
$('.input').each(function(){
if( $(this).val() !='' ){
$(this).closest('.container').addClass('display-floating-label');
}
});
$('.input').on('input', function() {
var valueLength = $(this).val().length;
if (valueLength > 0 ) {
$(this).closest('.container').addClass('display-floating-label');
} else {
$(this).closest('.container').removeClass('display-floating-label');
}
});
});
label {position: absolute;margin: 15px 0 0 12px;}
.display-floating-label label {position: absolute; margin: 10px 0 0 12px; color: #606060; font-family: "Arial";font-size:10px;}
input {display: block; padding: 18px 12px 12px 12px; border: 1px solid #bbb; border-radius: 5px; width: 300px;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p class="container">
<label for="input">
Label
</label>
<span class="input-wrapper">
<input type="input-text" class="input" name="input" id="input" placeholder="">
</span>
</p>
<p class="container">
<label for="input">
Label
</label>
<span class="input-wrapper">
<input type="input-text" class="input" name="input2" id="input2" placeholder="" value="Prefill">
</span>
</p>