#javascript #html #css
#javascript #HTML #css
Вопрос:
У меня есть текст электронного письма и интервал под ним, когда я фокусируюсь на вводе, интервал увеличивается, и я начинаю печатать, но когда я прекращаю вводить, значение электронного письма все еще там, а интервал текста снова уменьшается, поэтому они перекрывают друг друга
поэтому я хочу, чтобы при вводе текста промежутка все еще отображался, но когда я заканчиваю свое электронное письмо, промежуток исчезает
.SignIn__Form__Email {
margin: auto;
position: relative;
width: 50%;
}
.SignIn__Form__Email .SignIn__Email {
width: 100%;
outline: none;
border: none;
box-shadow: none !important;
}
.SignIn__Form__Email .floating-label {
position: absolute;
pointer-events: none;
top: 5px;
left: 10px;
font-family: 'Baloo Tamma 2',
cursive;
transition: 0.2s ease all;
}
.SignIn__Form__Email input:focus~.floating-label,
.SignIn__Form__Email input:not(:focus):valid~.floating-label {
top: 0px;
left: 10px;
font-size: 13px;
opacity: 1;
}
.SignIn__Email:focus {
font-size: 15px;
padding: 15px 0px 10px 10px;
}
input::placeholder {
font-size: 16px !important;
}
input:focus::placeholder {
color: transparent;
}
<div className="SignIn__Form__Email">
<input
required
className="SignIn__Email"
type="email"
placeholder="Email Address"
></input>
<span className="floating-label">Email Address</span>
</div>
Ответ №1:
Подход, основанный только на CSS
.SignIn__Form__Email {
margin: auto;
position: relative;
width: 50%;
}
.SignIn__Form__Email .SignIn__Email {
width: 100%;
outline: none;
border: none;
box-shadow: none !important;
}
.SignIn__Form__Email .floating-label {
position: absolute;
pointer-events: none;
top: 5px;
left: 10px;
font-family: 'Baloo Tamma 2',
cursive;
transition: 0.2s ease all;
}
.SignIn__Form__Email input:focus~.floating-label,
.SignIn__Form__Email input:not(:focus):valid~.floating-label {
top: 0px;
left: 10px;
font-size: 13px;
opacity: 1;
}
/* added here the :valid selector */
.SignIn__Email:focus,
.SignIn__Email:valid {
font-size: 15px;
padding: 15px 0px 10px 10px;
}
input::placeholder {
font-size: 16px !important;
}
input:focus::placeholder {
color: transparent;
}
<div class="SignIn__Form__Email">
<input
required
class="SignIn__Email"
type="email"
placeholder="Email Address"
></input>
<span class="floating-label">Email Address</span>
</div>
Попробуйте это. Вы можете удалить атрибут `placeholder` из ввода.
Я не сильно изменил ваш код, за исключением атрибута «className» и немного «css». Обратите внимание, что это работает, только если кто-то вводит действительное электронное письмо, и не удается, если есть что-то другое, кроме электронного письма. Если вы хотите проверить не только электронную почту, добавьте pattern=".*S.*"
атрибут в свой ввод. Это просто будет соответствовать чему угодно и предотвратит проверку электронной почты по умолчанию. Итак, в этом случае вам придется прибегнуть к ручной проверке.
Ответ №2:
Если вы хотите удалить диапазон элемента, как только фокус исчезнет, вы можете использовать focusout
событие и удалить элемент из DOM. Кроме того, вы используете className
, но мне интересно, взят ли этот код из компонента React. Выглядит не так.
let email_input = document.querySelector('.SignIn__Email');
if(email_input) {
email_input.addEventListener('focusout', () => {
email_input.parentNode.removeChild(document.querySelector('.floating-label'));
});
}
<div className="SignIn__Form__Email">
<input
required
class="SignIn__Email"
type="email"
placeholder="Email Address"
></input>
<span class="floating-label">Email Address</span>
</div>