#javascript #html #css #transition #appendchild
#javascript #HTML #css #переход #дочерний элемент приложения
Вопрос:
Я написал этот код, который показывает сообщение об ошибке, пока электронное письмо не будет написано правильно. Я хотел бы сделать так, чтобы сообщение отображалось плавно, и также плавно перемещать элементы, которые в нем есть, вверх и вниз (плавная высота от 0 до высоты по умолчанию) с помощью javascript или css или обоих, но я не знаю как. Я не знаю, хорошо ли я объясняю себя…
const email = document.querySelector('#email');
eventListeners();
function eventListeners() {
email.addEventListener('keyup', validateEmail);
}
function validateEmail() {
const email = document.querySelector('.email'),
inputEmail = document.querySelector('#email'),
formatEmail = /^(([^<>()[]\.,;:s@"] (.[^<>()[]\.,;:s@"] )*)|(". "))@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}])|(([a-zA-Z-0-9] .) [a-zA-Z]{2,}))$/;
if (inputEmail.value.match(formatEmail)) {
email.removeChild(document.querySelector('.error'));
} else {
if (!document.querySelector('.error')) {
const errorMessage = document.createElement('div');
errorMessage.setAttribute('class', 'error');
errorMessage.innerHTML = `<div class="showerror"><p>error</p></div>`;
email.appendChild(errorMessage);
} else if (inputEmail.value === "") {
email.removeChild(document.querySelector('.error'));
}
}
}
.error {
border: 1px solid black;
width: 200px;
text-align: center;
}
<div class="name">
<label for="name">Name:</label>
<input type="text" id="name" name="name" placeholder="Name">
</div>
<div class="email">
<label for="email">Email:</label>
<input type="email" id="email" name="email" placeholder="Email">
</div>
<div class="password">
<label for="password">Password:</label>
<input type="password" id="password" name="password" placeholder="Password">
</div>
Ответ №1:
Используйте переходы CSS, такие как
* {
-webkit-transition: all ease-in-out 0.5s;
-moz-transition: all ease-in-out 0.5s;
-ms-transition: all ease-in-out 0.5s;
-o-transition: all ease-in-out 0.5s;
transition: all ease-in-out 0.5s;
}
Этот пример применяется ко всем элементам. Если вам нужен только один, лучше написать конкретный селектор вместо ‘*’.
Вы можете изменить эффект, используя различные задержки и стили анимации, подробнее читайте в w3schools: https://www.w3schools.com/css/css3_transitions.asp
Комментарии:
1. Я полагаю, что это должно быть сделано с помощью переходов, и я знаю, как работают переходы, но я не знаю, как применить это в конкретном случае, который я показываю. Я был бы очень признателен, если бы вы могли мне помочь.
2. В этом случае я бы на самом деле предложил добавить ошибку div в html и установить его высоту в 0, затем в вашей функции JS вместо создания элемента заполните его содержимым и увеличьте высоту.
3. Привет, Мари, я переписываю код с предложенными изменениями, и он работает, но теперь содержимое ошибки остается. Как я мог его удалить?
4. Вы можете настроить таргетинг на свой div с ошибкой с помощью javascript и переключить содержимое с помощью функции innerHTML
Ответ №2:
Это новый код с предлагаемыми изменениями, но теперь содержимое ошибки остается. Как я мог его удалить?
const email = document.querySelector('#email');
eventListeners();
function eventListeners() {
email.addEventListener('keyup', validateEmail);
}
function validateEmail() {
const email = document.querySelector('.email'),
error = document.querySelector('.error'),
inputEmail = document.querySelector('#email'),
formatEmail = /^(([^<>()[]\.,;:s@"] (.[^<>()[]\.,;:s@"] )*)|(". "))@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}])|(([a-zA-Z-0-9] .) [a-zA-Z]{2,}))$/;
if (inputEmail.value.match(formatEmail)) {
error.classList.remove("show-error")
} else {
if (inputEmail.value !== "") {
error.innerHTML = `<p>error</p>`;
error.classList.add("show-error")
} else {
error.classList.remove("show-error")
}
}
}
.error {
width: 200px;
max-height: 0;
transition: max-height 1s ease-out;
overflow: hidden;
background: #d5d5d5;
text-align: center;
}
.show-error {
max-height: 100px;
transition: max-height 1s ease-in;
}
<div class="name">
<label for="name">Name:</label>
<input type="text" id="name" name="name" placeholder="Name">
</div>
<div class="email">
<label for="email">Email:</label>
<input type="email" id="email" name="email" placeholder="Email">
<div class="error"></div>
</div>
<div class="password">
<label for="password">Password:</label>
<input type="password" id="password" name="password" placeholder="Password">
</div>