Кнопка "Показати пароль" на JavaScript + анімація

2023-Feb-03

При введенні пароля легко помилитися, оскільки символи, які вводить користувач - приховані. У цьому уроці додамо кнопку показати пароль для форм введення даних на сайтах, додамо анімацію часу, що залишився до приховання. Технології, які будемо застосовувати – JavaScript, для оформлення – Boostrap. Так виглядатиме результат:

Список тем, які будуть показані:

  • робота з DOM
  • робота з атрибутами
  • робота з інтервалами - таймерами
  • розбір багів під час роботи з інтервалами

Для початку створимо стандартну структуру - папку програми, файл index.html, app.js, app.css, створимо стандартну верстку в html та підключимо javascript та css файли.

Код писатимемо кроками. Для початку виконаємо роботу на кістяку, а потім додамо оформлення. Отже, створимо верстку виду:

<input type="password" id="password" value="qwerty123">
<button type="button" id="show-password-btn">Show</button>

Цього достатньо для початку роботи. Щоб щоразу не вводити пароль – додано value, звичайно ж у реальному проекті це не потрібно. Поставимо завдання – при натисканні кнопки show показувати пароль на якийсь час, а потім приховувати. Логіка коду – змінювати атрибут type="password" на type="text" і через проміжок часу – повертати атрибути у вихідний стан.

Пишемо код JavaScript

Пропишемо необхідні для роботи дані у вигляді констант:

const showPasswordButton = document.querySelector('#show-password-btn');
const passwordInput = document.querySelector('#password');

const TIME_SHOW_PASSWORD = 5000;

де TIME_SHOW_PASSWORD - час, на який показуватимемо пароль.

Тепер необхідно виконати перевірку – якщо константа showPasswordButton не порожня, то додати подію – функцію показати пароль.

if (showPasswordButton && passwordInput) showPasswordButton.addEventListener('click', showPassword);

В даному випадку addEventListener - правильний вибір, оскільки на кнопку можуть додаватися й інші дії кліку.

Реалізуємо функцію showPassword.

function showPassword(){}

Що має виконувати функція? Рахуємо:

  • встановити атрибут type для поля пароля на text
  • через проміжок часу TIME_SHOW_PASSWORD повернути все назад.

Реалізуємо:

function showPassword(){
  passwordInput.setAttribute('type', 'text');
  setInterval(function(){
    passwordInput.setAttribute('type', 'password');
  }, TIME_SHOW_PASSWORD);
}

Код вже працює, проте якщо багато разів натискати кнопку, то стає очевидним, що є проблеми і інтервал не витримується. Давайте додамо візуальне оформлення для наочності бага та виправимо його.

Зробимо анімацію поля input. Найпростіші рішення - зробити смужку за допомогою прогресу нижче, також було б просто якби тег input був парним і вставити в нього елемент, який можна змінювати по ширині. Однак ми не шукаємо легких шляхів і будемо анімувати тег input за допомогою фону. Якщо вам потрібно реалізувати два кольори на фоні - застосуємо градієнт. Зробимо його двоколірним – колір та прозорість. І задамо налаштування для анімації. У CSS пропишіть:

.animate-password {
     background-image: linear-gradient(90deg, #ededed 50%, transparent 50%);
     background-size: 200%;
     background-position-x: 100%;
     transition: all ease 1s;
     animation-name: passwordanimation;
     animation-duration: 5s;
     animation-iteration-count: 1;
     animation-timing-function: linear;
}

важливо зрозуміти перші три рядки. Ми створюємо градієнт із двох кольорів – сірий і повністю прозорий. Без плавного переходу кольору. У початковому положенні потрібно, щоб сірий фон був за межами input, його не було видно, тому ми розтягуємо градієт вдвічі більше ніж input - background-size: 200% і зміщуємо за межі зони видимості background-position-x: 100%. Всі інші властивості – налаштування анімації. Анімуватимемо зміщення фону.

Додамо анімацію, вона дуже проста:

@keyframes passwordanimation {
     0% {background-position-x: 100%;}
     100% {background-position-x: 0;}
}

І внесемо зміну до функції showPassword:

function showPassword(){
  passwordInput.setAttribute('type', 'text');
  passwordInput.classList.add('animate-password');

  setInterval(function(){
      passwordInput.setAttribute('type', 'password');
      passwordInput.classList.remove('animate-password');
  }, TIME_SHOW_PASSWORD);
}

Тепер натискаючи кнопку – отримуємо анімацію поля пароля – зворотний відлік до приховання пароля. І якщо постійно натискати кнопку, то можна побачити проблеми - через якийсь час пароль відображатиметься і ховатиметься з рандомними інтервалами, які явно менші за 5 секунд. У чому проблема? Як виправити баг setInterval?

Виправляти помилку будемо двома шляхами. Перший - додамо перевірку, якщо натиснута кнопка Show і поле пароля містить клас animate-password, то виходитимемо з функції, це дозволить не допустити виконання анімацій та додаткових запусків інтервалів якщо пароль відображається зараз. Друге правило – чистити за собою запущені таймери та інтервали. Реалізуємо:

function showPassword(){
     if (passwordInput.classList.contains('animate-password')) return;
	 passwordInput.setAttribute('type', 'text');
	passwordInput.classList.add('animate-password');

	let interval = setInterval(function(){
		passwordInput.setAttribute('type', 'password');
		passwordInput.classList.remove('animate-password');
		clearInterval(interval);
	}, TIME_SHOW_PASSWORD);
}

Перевіряємо – все працює!

Якщо у вас залишилися питання - перегляньте відео. Зауваження та запитання можна задати у чаті ItGid.info.

Завантажити файл з кодом: Download

Статті

Підсвічуємо НЕ ЛАТИНСЬКІ СИМВОЛИ у коді та тексті
Тотальная інструкція по елементу Select у JavaScript
Задача співбесіди: отримуємо email із рядка