Odo Responsive Attributes
Parse data attributes with respect to their breakpoints.
Support
IE9+ with matchMedia
polyfill.
Dependencies
Odo Base Component, native matchMedia
(IE10+)
Setup
Imagine you're building a component which clamps multi-line text differently per breakpoint.
<div id="clamper" data-responsive.xs="2" data-responsive.md="3"></div>
This component will parse those attributs into the following object:
{xs: "2", sm: "2", md: "3", lg: "3"}
Notice the sm
breakpoint was not specified, but it has a value. It gets this value from the last value. xs
=> sm
=> md
=> lg
.
You can also provide a default value which will take precendence over the “last value”.
<div id="clamper" data-responsive="2" data-responsive.md="4"></div>
{xs: "2", sm: "2", md: "4", lg: "2"}
Now initialize the responsive attributes component:
const clamper = new OdoResponsiveAttributes(document.getElementById('clamper'));
console.log(clamper.values); // Object with `xs`, `sm`, `md`, and `lg` keys.
console.log(clamper.currentValue); // Value based on the current breakpoint.
Custom Attribute Name
The second parameter in the constructor is a string for the name of the attribute.
<div id="clamper" data-clamp.xs="2" data-clamp.md="3"></div>
const clamper = new OdoResponsiveAttributes(document.getElementById('clamper'), 'clamp');
Updating
OdoResponsiveAttributes instances do not update themselves when the browser is resized. This forces you to do it, but allows for better performance because you can batch your reads (this component) and your writes (whatever you do with this information).
You could call instance.update
on the window resize event, or if you’re using OdoBaseComponent
, it can be done inside the onMediaQueryChange()
method.
class Clamper extends OdoBaseComponent {
constructor(element) {
super(element, true);
this.attributes = new OdoResponsiveAttributes(element, 'clamp');
this.doClamp(this.attributes.currentValue);
}
onMediaQueryChange() {
let linesToClamp = this.attributes.update().currentValue;
this.doClamp(linesToClamp);
}
doClamp(linesToClamp) {
console.log('lines to clamp:', linesToClamp);
}
dispose() {
this.attributes.dispose();
super.dispose();
}
}
new Clamper(document.getElementById('clamper'));
Breakpoint Delimiter
By default, the delimiter for the responsive key suffix is a period .
. It would be awesome to use @
as the delimiter, but although getAttribute()
reads @
as expected, using @
inside setAttribute()
throws an error. You can change the delimiter by updating OdoResponsiveAttributes.BREAKPOINT_DELIMITER
.