Last active
December 8, 2020 02:03
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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