1.0.0 • Published 4 years ago

html-veil v1.0.0

Weekly downloads
2
License
MIT
Repository
github
Last release
4 years ago

HTML Veil

Drop a veil (or more than one) into HTML that obscures and prevents user interactions with content that is behind the veil (e.g. lightboxes and modals).

Installation

$ npm add html-veil

Basic Usage

var Veil = require('html-veil')
// or
var Veil = window.Veil

var veil = new Veil
veil.inject() // Drop the veil into the DOM.
veil.toggle() // Turn it on and off.

The default z-index is 1000. So position HTML elements accordingly. And note that elements behind the veil are obscured and do not respond to user interactions. If desired, the z-index can be overridden by passing in an option when constructing a veil.

Basic Options

var lightbox_veil = new Veil({
    html_id: 'lightbox-veil',
    color: 'rgba(255, 255, 255, 0.85)',
    z_index: 100,
})

var veil = new Veil (with no options) is the equivalent of:

var veil = new Veil({
    html_id: 'veil',
    color: 'rgba(0, 0, 0, 0.7)',
    z_index: 1000,
})

Even though color can easily be set via CSS, it is simpler to set color in JavaScript when no extra CSS styling is needed.

Full Interface

var Veil = require('html-veil')

// Get the default veil (see "Manipulating an Existing Veil")
Veil.get()

// Destroy the default veil (see "Removing All Traces of a Veil")
Veil.destroy()

// For a veil constructed with { html_id: 'lightbox-veil' }
Veil.get('lightbox-veil')
Veil.destroy('lightbox-veil')

var veil = new Veil
veil.inject() // Drop the veil into the DOM
veil.is_activated()
veil.is_deactivated()
veil.activate()
veil.deactivate()
veil.toggle() // Alternates between veil.activate() and veil.deactivate()
veil.remove() // Only removes the HTML element from the DOM (i.e. veil.inject() would put it back)

Advanced Customization

In JavaScript:
var modal_veil = new Veil({
    html_id: 'modal-veil',
    z_index: 999,
})
modal_veil.inject()

var mobile_nav_veil = new Veil({
    html_id: 'mobile-nav-veil',
    z_index: 998,
})
mobile_nav_veil.inject()
In CSS:
/*
** All Veils
*/
.html-veil {
    transition-property: opacity, transform !important;
    transition-duration: 0.3s !important;
    transition-timing-function: ease !important;
}
.html-veil-activated {
    opacity: 0.7 !important;
}
.html-veil-changing_state {
    /* rules that apply while a veil is in the process of activating or deactivating */
}

/*
** Modal Veil
*/
#modal-veil {
    background-image: url('/images/bg-blur-texture.png');
    transform: scale(0.95); /* slight zoom-in effect */
}
.modal-veil-activated {
    opacity: 0.9 !important;
    transform: scale(1) !important;
}
.modal-veil-changing_state {}

/*
** Mobile Nav Veil
*/
#mobile-nav-veil {
    background-color: #333333;
    transform: translateX(100%); /* animate in from right */
}
.mobile-nav-veil-activated {
    transform: translateX(0) !important;
}
.mobile-nav-veil-changing_state {}

Setting no style rules is the equivalent of:

.html-veil {
    background-color: rgba(0, 0, 0, 0.7);
    position: fixed;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        z-index: -1;
    opacity: 0;
    transition-property: opacity;
    transition-duration: 0.5s;
    transition-timing-function: linear;
    transition-delay: 0s;
}
.html-veil.html-veil-activated {
    z-index: 1000;
    opacity: 1;
}
.html-veil.html-veil-changing_state {
    z-index: 1000;
}

Manipulating an Existing Veil

In index.js
var Veil = require('html-veil')

// Default veil
var veil = new Veil
veil.inject()

var lightbox_veil = new Veil({
    html_id: 'lightbox-veil'
    color: 'rgba(51, 51, 51, 0.8)',
})
lightbox_veil.inject()
In nav.js
var Veil = require('html-veil')

// Default veil
var veil = Veil.get()
var nav_icon = document.getElementById('nav-super-menu-icon')
nav_icon && nav_icon.addEventListener('click', handle_nav_icon_click)

var lightbox_veil = Veil.get('lightbox-veil')
var lightbox_images = document.getElementsByClassName('lightbox')
for (var i = 0, n = lightbox_images.length - 1; i <= n; i++) {
    var image = lightbox_images[i]
    if ('img' === image.tagName.toLowerCase() && image.src) {
        image.addEventListener('click', handle_lightbox_image_click)
    }
}

function handle_nav_icon_click () {
    open_nav_menu()
    veil.toggle({
        deactivator: close_nav_menu,
        // ^ Optionally respond to when the user clicks on the veil itself
    })
}
function handle_lightbox_image_click (click_event) {
    if (lightbox_veil.is_deactivated()) {
        show_lightbox(click_event.target)
        veil.activate({
            deactivator: hide_lightbox,
        })
    } else {
        // Shouldn't happen, but just to be safe:
        hide_lightbox()
        veil.deactivate()
    }
}

function open_nav_menu () {
    // ...
}
function close_nav_menu () {
    // ...
}
function show_lightbox (image_element) {
    // ...
}
function hide_lightbox () {
    // ...
}

With modular JavaScript, it is not always obvious whether an expected veil has been constructed/injected yet. Requiring (as a dependency) the module that injects the expected veil may be necessary to guarantee that the veil exists, and can thus be toggled/(de)activated.

Removing All Traces of a Veil

var Veil = require('html-veil')

// Default veil
var veil = new Veil
veil.inject()

var lightbox_veil = new Veil({ html_id: 'lightbox-veil' })
lightbox_veil.inject()

// Remove the HTML elements and all knowledge of the Veil objects
Veil.destroy() // equivalent to Veil.destroy('veil')
Veil.destroy('lightbox-veil')

// Remove the only remaining references
veil = null
lightbox_veil = null

// Let garbage collection take care of the rest
1.0.0

4 years ago

0.1.2

7 years ago

0.1.1

8 years ago

0.1.0

8 years ago