DEV Community

Christopher Glikpo  ⭐
Christopher Glikpo ⭐

Posted on

How to Create an Advanced "Show Password" Feature Using HTML, CSS, and JavaScript

In today's web applications, user experience and security are paramount. One small but significant feature that enhances both is the "show password" toggle in password input fields. While it might seem straightforward, implementing an advanced, secure, and accessible "show password" functionality requires careful consideration. In this post, we'll dive deep into creating an advanced "show password" feature using HTML, CSS, and JavaScript, tailored for professional web developers.

Table of Contents

  1. Introduction
  2. Understanding the Basics
  3. Limitations of Basic Implementations
  4. Designing an Advanced Solution
  5. Implementing the Feature
  6. Enhancing Accessibility
  7. Security Considerations
  8. Testing and Optimization
  9. Conclusion
  10. Join Me on YouTube for More Insights

Introduction

The "show password" feature allows users to toggle the visibility of their password input, reducing input errors and enhancing the user experience. However, a naive implementation can introduce security vulnerabilities and accessibility issues. As professional developers, it's crucial to implement this feature thoughtfully, balancing usability with security.

Understanding the Basics

At its core, the "show password" functionality toggles the type attribute of an <input> element between password and text. A basic implementation might look like this:

<input type="password" id="password">
<button onclick="togglePassword()">Show Password</button>

<script>
  function togglePassword() {
    const passwordInput = document.getElementById('password');
    const type = passwordInput.type === 'password' ? 'text' : 'password';
    passwordInput.type = type;
  }
</script>
Enter fullscreen mode Exit fullscreen mode

While this works, it lacks finesse in terms of security, accessibility, and user experience.

Limitations of Basic Implementations

  1. Security Risks: Simply toggling the input type can expose passwords to shoulder surfing or screen recording attacks.
  2. Accessibility Issues: Without proper labels and ARIA attributes, screen readers may not convey the toggle's purpose to visually impaired users.
  3. User Experience: A generic button without visual cues can confuse users. Additionally, not providing feedback or smooth transitions can feel jarring.

Designing an Advanced Solution

To address these limitations, we'll design an advanced "show password" feature that includes:

  • Icon-based Toggle: Using an eye icon that changes state provides an intuitive control.
  • Accessibility Enhancements: Implementing ARIA attributes and ensuring keyboard navigability.
  • Security Measures: Incorporating time-limited visibility and preventing automated scripts from easily accessing the password.
  • User Experience Improvements: Adding smooth transitions and responsive design considerations.

Implementing the Feature

HTML Structure

We'll start by creating a semantic and accessible HTML structure.

<div class="password-field">
  <input type="password" id="password" aria-describedby="togglePassword" autocomplete="current-password">
  <button id="togglePassword" aria-label="Show password" aria-pressed="false">
    <svg width="24" height="24" viewBox="0 0 24 24">
      <!-- Eye icon SVG path -->
    </svg>
  </button>
</div>
Enter fullscreen mode Exit fullscreen mode

Key Points:

  • aria-describedby links the input to the toggle button.
  • autocomplete="current-password" helps browsers manage password autofill securely.
  • SVG Icon: Inline SVG allows for better control over the icon's appearance and accessibility.

CSS Styling

Next, we'll style the components to create a polished look.

.password-field {
  position: relative;
  display: flex;
  align-items: center;
}

.password-field input {
  width: 100%;
  padding-right: 2.5rem; /* Space for the toggle button */
}

.password-field button {
  position: absolute;
  right: 0.5rem;
  background: none;
  border: none;
  cursor: pointer;
  padding: 0;
  display: flex;
  align-items: center;
}

.password-field button svg {
  fill: #6c757d;
  transition: fill 0.2s ease;
}

.password-field button:hover svg {
  fill: #495057;
}
Enter fullscreen mode Exit fullscreen mode

Key Points:

  • Positioning: The toggle button is absolutely positioned inside the relative container.
  • Responsive Design: Ensures the input field is responsive, and the toggle button doesn't overlap text.
  • Visual Feedback: Changes in the icon color on hover improve interactivity.

JavaScript Logic

Now, we'll add the JavaScript to handle the toggle functionality and enhance security.

const passwordInput = document.getElementById('password');
const togglePasswordButton = document.getElementById('togglePassword');
let passwordVisible = false;
let visibilityTimeout;

togglePasswordButton.addEventListener('click', () => {
  passwordVisible = !passwordVisible;
  passwordInput.type = passwordVisible ? 'text' : 'password';
  togglePasswordButton.setAttribute('aria-pressed', passwordVisible);
  togglePasswordButton.setAttribute('aria-label', passwordVisible ? 'Hide password' : 'Show password');

  // Change the icon (assuming we have two SVG paths)
  const eyeIcon = passwordVisible ? eyeOpenIcon : eyeClosedIcon;
  togglePasswordButton.innerHTML = eyeIcon;

  // Security: Hide password after 5 seconds
  if (passwordVisible) {
    visibilityTimeout = setTimeout(() => {
      passwordInput.type = 'password';
      passwordVisible = false;
      togglePasswordButton.setAttribute('aria-pressed', 'false');
      togglePasswordButton.setAttribute('aria-label', 'Show password');
      togglePasswordButton.innerHTML = eyeClosedIcon;
    }, 5000);
  } else {
    clearTimeout(visibilityTimeout);
  }
});
Enter fullscreen mode Exit fullscreen mode

Key Points:

  • State Management: We keep track of the password visibility state.
  • Accessibility Updates: The aria-pressed and aria-label attributes are updated to reflect the current state.
  • Icon Swap: The icon changes to indicate the action (show/hide).
  • Security Timeout: Automatically reverts the password field to type="password" after 5 seconds.

Defining the SVG Icons

For the icon swap to work, we need to define eyeOpenIcon and eyeClosedIcon as strings containing SVG paths.

const eyeOpenIcon = `
  <svg width="24" height="24" viewBox="0 0 24 24">
    <!-- Eye open SVG path -->
  </svg>
`;

const eyeClosedIcon = `
  <svg width="24" height="24" viewBox="0 0 24 24">
    <!-- Eye closed SVG path -->
  </svg>
`;
Enter fullscreen mode Exit fullscreen mode

Ensure that the SVGs are optimized and accessible.

Enhancing Accessibility

Accessibility is critical for inclusivity. Here are the steps we've taken:

  • ARIA Attributes: aria-label provides descriptive text for screen readers. aria-pressed indicates the toggle state.
  • Keyboard Navigation: The toggle button is focusable and operable via keyboard (e.g., pressing Enter or Space).
  • Semantic HTML: Using <button> instead of <div> or <span> ensures proper semantics and built-in accessibility features.

Additional considerations:

  • Focus Indicators: Ensure that focus styles are visible for keyboard users.
.password-field button:focus {
  outline: 2px solid #80bdff;
  outline-offset: 2px;
}
Enter fullscreen mode Exit fullscreen mode

Security Considerations

While improving usability, we must not compromise security.

  • Automatic Reversion: The password visibility reverts after a timeout, reducing the risk of exposure.
  • Preventing Clipboard Access: By keeping the password in an input field (as opposed to copying it to a text area), we prevent users from accidentally copying it to the clipboard.
  • Event Logging: Optionally, log the toggle events to detect suspicious activities (e.g., multiple rapid toggles).
togglePasswordButton.addEventListener('click', () => {
  // Existing logic...

  // Log the event (ensure compliance with privacy policies)
  logPasswordToggleEvent();
});

function logPasswordToggleEvent() {
  // Implement logging logic (e.g., send to server or analytics)
}
Enter fullscreen mode Exit fullscreen mode

Ensure that logging complies with user privacy regulations like GDPR.

Testing and Optimization

Testing is crucial to ensure the feature works as intended across different scenarios.

  • Cross-Browser Compatibility: Test on major browsers (Chrome, Firefox, Safari, Edge) and ensure consistent behavior.
  • Mobile Responsiveness: Verify that the toggle button is accessible and functional on touch devices.
  • Edge Cases: Test with long passwords, different input methods, and in various form contexts.
  • Performance: Optimize the SVGs and minimize JavaScript to reduce load times.

Conclusion

Implementing an advanced "show password" feature involves more than toggling an input's type attribute. By considering security, accessibility, and user experience, we create a robust and professional solution that enhances our web applications.

Key Takeaways:

  • Use semantic HTML and proper ARIA attributes for accessibility.
  • Incorporate security measures like automatic reversion and event logging.
  • Enhance the user experience with intuitive icons, smooth interactions, and responsive design.
  • Test thoroughly across devices and browsers to ensure reliability.

By following these best practices, we can provide users with a feature that is both helpful and secure, reflecting the professionalism expected in modern web development.

Join Me on YouTube for More Insights

If you found this tutorial helpful and want to dive deeper into advanced web development techniques, I invite you to subscribe to my YouTube channel. There, I regularly share in-depth tutorials, tips, and best practices on HTML, CSS, JavaScript, and more.

By joining our growing community of developers, you'll stay up-to-date with the latest trends and gain valuable insights that can elevate your web development skills to the next level. Don't miss out—click here to subscribe now and be part of a network that's passionate about crafting exceptional web experiences.

Further Reading:

Top comments (0)