normalize viewport and doc height; cache DOM elms; use stopPropagation()