Skip to content

Instantly share code, notes, and snippets.

@neodigm
Last active December 8, 2020 02:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save neodigm/201188452d4440cf93b92a6ccb101d2d to your computer and use it in GitHub Desktop.
Save neodigm/201188452d4440cf93b92a6ccb101d2d to your computer and use it in GitHub Desktop.
A popover is a transient view that shows on a content screen when a user clicks on a control button or within a defined area.
// A popover is a transient view that shows on a content screen when a user clicks on a control button or within
// a defined area. Declarative implementation.
var oPopOver = (function( _w, _d, _q ){ // Popover UX pattern
let arPops = [], ePos, iOffTop=0, iOffLft=0;
return {
"init": function(){ // wire DOM events
arPops= [].slice.call(_d.querySelectorAll(_q));
_w.addEventListener("resize", oPopOver.closeAll);
_w.addEventListener("scroll", oPopOver.closeAll);
_d.body.addEventListener("click", function( e ){ // Outside Click close
var eTarget = e.target, bInside = false;
while( eTarget.tagName !== "HTML" ){
if( eTarget.dataset.popover ){ bInside = true; break; }
eTarget = eTarget.parentNode;
}
if( !bInside ){
oPopOver.closeAll();
}
}, true);
},
"open": function(id, evPos){
if( arPops.length == 0) return false;
oPopOver.closeAll();
ePos = evPos.currentTarget;
var elPop = arPops.filter(function(el){
return ( el.id == id );
})[0];
iOffTop = Number(elPop.dataset.popoverPos.split("|")[0]);
iOffLft = Number(elPop.dataset.popoverPos.split("|")[1]);
elPop.dataset.popover = "true";
elPop.style.left = oPopOver.position().left+"px";
elPop.style.top = oPopOver.position().top+"px";
},
"closeAll": function(){
if( arPops.length == 0) return false;
arPops.filter(function(el){
el.dataset.popover = "false";
});
},
"position": function(){
var rec = ePos.getBoundingClientRect(),
pxLft = _w.pageXOffset || _d.documentElement.scrollLeft,
pxTop = _w.pageYOffset || _d.documentElement.scrollTop;
return { top: (rec.top + pxTop + iOffTop), left: (rec.left + pxLft + iOffLft) }
}
}
})(window, _d, "[data-popover]");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment