peekaboo.js

A jQuery plugin for showing and hiding content in an accessible way.

Features

Installation

With npm:

npm install --save peekaboo-toggle

With unpkg:

<script src="https://unpkg.com/peekaboo-toggle/lib/index.js"></script>

How to use

By default, a peekaboo toggle will show/hide the next element in the DOM. Let's say we have a button that should show/hide a menu when clicked:

<button class="peekaboo">Menu</button>
<nav>
  <ul>
    <li><a href="breakfast.html">Breakfast</a></li>
    <li><a href="lunch.html">Lunch</a></li>
    <li><a href="dinner.html">Dinner</a></li>
  </ul>
</nav>

We bind peekaboo to the button like this:

// If you're using npm
import $ from 'jquery';
import peekaboo from 'peekaboo-toggle';

$('.peekaboo').peekaboo();

Peekaboo will add the [hidden attribute] to the <nav>. We may have to add some CSS to make sure hidden means hidden:

[hidden] {
  display: none !important;
}

Peekaboo will add the aria-expanded and aria-controls attributes to the <button> and will — since we didn't specify one — generate an ID for the <nav>. The result:

See the Pen Peekaboo: Simple Example by Nadav Spiegelman (@nadavspi) on CodePen.

Toggling some other element

You can specify the ID of the content you'd like to toggle using the data-toggle-target or aria-control attributes. This is useful if the content doesn't immediately follow the toggle button in your document.

<button class="peekaboo" aria-controls="menu">Menu</button>
<h2>We have many beautiful things on our menus.</h2>
<nav id="menu">
  <ul>
    <li><a href="breakfast.html">Breakfast</a></li>
    <li><a href="lunch.html">Lunch</a></li>
    <li><a href="dinner.html">Dinner</a></li>
  </ul>
</nav>

See the Pen Peekaboo: Complex Example by Nadav Spiegelman (@nadavspi) on CodePen.

Options

The following options are available, shown with the default values:

$('.peekaboo').peekaboo({
  // Prefix for generated IDs and namespace the event listener
  namespace: 'peekaboo',

  // Class name(s) added to generated button (if applicable)
  buttonClassname: 'button--transparent',

  // Called after the event.
  // Receives the event object as an argument.
  callback: () => {},

  // When true, the click event will be removed
  // If a <button> was generated, it'll also be removed
  destruct: false
});