Defining custom attributes that provide rich mixin behavior
Branch: master
Clone or download
matthewp Merge pull request #21 from FredKSchott/pika-pack
use @pika/pack to build ESM, UMD
Latest commit 561c6ec Feb 5, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
src use @pika/pack to build Jan 30, 2019
test use @pika/pack to build Jan 30, 2019
.travis.yml bump travis node version Feb 1, 2019
Makefile Add a build that allows for ES module use Jan 31, 2017 use @pika/pack to build Jan 30, 2019
bower.json 1.1.3 May 1, 2017
package.json use @pika/pack to build Jan 30, 2019

Build Status npm version


Define custom attributes in the same way you can define custom elements, which allows for rich mixin types of behaviors on elements.


npm install custom-attributes --save

Add as a script tag:

<script src="node_modules/custom-attributes/attr.js" defer></script>

Or import as an ES module:

import customAttributes from 'custom-attributes';

Or you can just import the CustomAttributeRegistry and create your own instance:

import {CustomAttributeRegistry} from 'custom-attributes';

const customAttributes = new CustomAttributeRegistry(document);


<article bg-color="green">
  <p>This will be shown in a green background!</p>
class BgColor {
  connectedCallback() {

  disconnectedCallback() {
    // cleanup here!

  // Called whenever the attribute's value changes
  changedCallback() {

  setColor() { = this.value;

customAttributes.default.define('bg-color', BgColor);


custom-attributes follows a very similar API as v1 custom elements, but rather than a class instance representing the host element, the class instance is meant to represent the attribute.

Lifecycle callbacks


This is called when the attribute is first connected to the document. If the host element is already in the DOM, and the attribute is set, connectedCallback will be called as all registered attributes are upgraded.

If the host element is already in the DOM and the attribute is programmatically added via setAttribute, then connectedCallback will be called asynchronously after.

If the host element is being programmatically created and the attribute is set before the element is inserted into the DOM, connectedCallback will only call when the host element is inserted.


Called when the attribute is no longer part of the host element, or the host document. This callback should be used if any cleanup is needed.

If the attribute is removed via removeAttribute, then disconnectedCallback will be called asynchronously after this change. If the host element is removed from the DOM, disconnectedCallback will be called asynchronously after as well.


Called any time the attribute's value changes, after connected. Useful if you need to perform work based on the attribute value such as the example given in this readme.



this.ownerElement refers to the element which the attribute is attached.


The attribute's name. Since multiple class definitions can be used for multiple attribute names, is useful if you need to know what the attribute is being referred to as.


The current value of the attribute (the string value) is available as this.value.


BSD 2 Clause