Code Monkey home page Code Monkey logo

inert's Introduction

Build Status

The inert attribute/property allows web authors to mark parts of the DOM tree as inert:

When a node is inert, then the user agent must act as if the node was absent for the purposes of targeting user interaction events, may ignore the node for the purposes of text search user interfaces (commonly known as "find in page"), and may prevent the user from selecting text in that node.

Furthermore, a node which is inert should also be hidden from assistive technology.

Details

Polyfill

Installation

npm install --save wicg-inert

We recommend only using versions of the polyfill that have been published to npm, rather than cloning the repo and using the source directly. This helps ensure the version you're using is stable and thoroughly tested.

This project provides two versions of the polyfill in package.json.

  • main: Points at dist/inert.js which is transpiled to ES3.
  • module: Points at src/inert.js which is not transpiled and uses modern JavaScript. See #136 if you would like to tell webpack to use the version in main.

If you do want to build from source, make sure you clone the latest tag!

Usage

1. Either import the polyfill, or add the script to your page

import "wicg-inert";

OR…

    ...
    <script src="/node_modules/wicg-inert/dist/inert.min.js"></script>
  </body>
</html>

2. Toggle inert on an element

const el = document.querySelector('#my-element');
el.inert = true; // alternatively, el.setAttribute('inert', '');

Legacy Browser Support

If you want to use inert with an older browser you'll need to include additional polyfills for Map, Set, Element.prototype.matches, and Node.prototype.contains.

In accordance with the W3C's new polyfill guidance, the inert polyfill does not bundle other polyfills.

You can use a service like Polyfill.io to download only the polyfills needed by the current browser. Just add the following line to the start of your page:

<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Map,Set,Element.prototype.matches,Node.prototype.contains"></script>

Strict Content Security Policy

By default, this polyfill will dynamically insert some CSS, which requires the style-src rule of your Content Security Policy to allow 'unsafe-inline'.

It is possible avoid doing so by including those rules from a CSS stylesheet, as follows (the id property is used by the polyfill to know if it needs to dynamically add the missing rules):

<link rel="stylesheet" type="text/css" href="inert.css" id="inert-style" />

The stylesheet should include the following rules:

[inert] {
  pointer-events: none;
  cursor: default;
}

[inert], [inert] * {
  user-select: none;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
}

Performance and gotchas

The polyfill attempts to provide a reasonable fidelity polyfill for the inert attribute, however please note:

  • It relies on mutation observers to detect the addition of the inert attribute, and to detect dynamically added content within inert subtrees. Testing for inert-ness in any way immediately after either type of mutation will therefore give inconsistent results; please allow the current task to end before relying on mutation-related changes to take effect, for example via setTimeout(fn, 0) or Promise.resolve().

    Example:

const newButton = document.createElement('button');
const inertContainer = document.querySelector('[inert]');
inertContainer.appendChild(newButton);
// Wait for the next microtask to allow mutation observers to react to the
// DOM change
Promise.resolve().then(() => {
  expect(isUnfocusable(newButton)).to.equal(true);
});
  • Using the inert property, however, is synchronous.

  • The polyfill will be expensive, performance-wise, compared to a native inert implementation, because it requires a fair amount of tree-walking. To mitigate this, we recommend not using inert during performance sensitive actions (like during animations or scrolling). Instead, wait till these events are complete, or consider using requestIdleCallback to set inert.

Testing

Tests are written using ES5 syntax. This is to avoid needing to transpile them for older browsers. There are a few modern features they rely upon, e.g. Array.from and Promises. These are polyfilled for the tests using Polyfill.io. For a list of polyfilled features, check out the polyfill section in karma.conf.js.

Big Thanks

Cross-browser Testing Platform and Open Source <3 Provided by Sauce Labs

inert's People

Contributors

aomarks avatar bkardell avatar clearlyclaire avatar dependabot[bot] avatar dontcallmedom avatar dpogue avatar francescostella avatar goatandsheep avatar greenkeeper[bot] avatar igoradamenko avatar jakechampion avatar krolow avatar malvoz avatar marcoscaceres avatar martellienrico avatar robdodson avatar saschanaz avatar straker avatar timbomckay avatar valdrinkoshi avatar y-a-v-a avatar yoavweiss avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.