Wenn Sie daran interessiert sind, vom Benutzer sichtbar zu sein:
function isVisible(elem) {
if (!(elem instanceof Element)) throw Error('DomUtil: elem ist kein Element.');
const style = getComputedStyle(elem);
if (style.display === 'none') return false;
if (style.visibility !== 'visible') return false;
if (style.opacity < 0.1) return false;
if (elem.offsetWidth + elem.offsetHeight + elem.getBoundingClientRect().height +
elem.getBoundingClientRect().width === 0) {
return false;
}
const elemCenter = {
x: elem.getBoundingClientRect().left + elem.offsetWidth / 2,
y: elem.getBoundingClientRect().top + elem.offsetHeight / 2
};
if (elemCenter.x < 0) return false;
if (elemCenter.x > (document.documentElement.clientWidth || window.innerWidth)) return false;
if (elemCenter.y < 0) return false;
if (elemCenter.y > (document.documentElement.clientHeight || window.innerHeight)) return false;
let pointContainer = document.elementFromPoint(elemCenter.x, elemCenter.y);
do {
if (pointContainer === elem) return true;
} while (pointContainer = pointContainer.parentNode);
return false;
}
Geprüft auf (mit Mocha Terminologie):
describe.only('Sichtbarkeit', function () {
let div, sichtbar, nichtSichtbar, imViewport, linksVomViewport, rechtsVomViewport, überViewport,
unterViewport, nichtAngezeigt, nullOpazität, zIndex1, zIndex2;
before(() => {
div = document.createElement('div');
document.querySelector('body').appendChild(div);
div.appendChild(sichtbar = document.createElement('div'));
sichtbar.style = 'border: 1px solid black; margin: 5px; display: inline-block;';
sichtbar.textContent = 'sichtbar';
div.appendChild(imViewport = sichtbar.cloneNode(false));
imViewport.textContent = 'imViewport';
div.appendChild(nichtAngezeigt = sichtbar.cloneNode(false));
nichtAngezeigt.style.display = 'none';
nichtAngezeigt.textContent = 'nichtAngezeigt';
div.appendChild(nichtSichtbar = sichtbar.cloneNode(false));
nichtSichtbar.style.visibility = 'hidden';
nichtSichtbar.textContent = 'nichtSichtbar';
div.appendChild(linksVomViewport = sichtbar.cloneNode(false));
linksVomViewport.style.position = 'absolute';
linksVomViewport.style.right = '100000px';
linksVomViewport.textContent = 'linksVomViewport';
div.appendChild(rechtsVomViewport = linksVomViewport.cloneNode(false));
rechtsVomViewport.style.right = '0';
rechtsVomViewport.style.left = '100000px';
rechtsVomViewport.textContent = 'rechtsVomViewport';
div.appendChild(überViewport = linksVomViewport.cloneNode(false));
überViewport.style.right = '0';
überViewport.style.bottom = '100000px';
überViewport.textContent = 'überViewport';
div.appendChild(unterViewport = linksVomViewport.cloneNode(false));
unterViewport.style.right = '0';
unterViewport.style.top = '100000px';
unterViewport.textContent = 'unterViewport';
div.appendChild(nullOpazität = sichtbar.cloneNode(false));
nullOpazität.textContent = 'nullOpazität';
nullOpazität.style.opacity = '0';
div.appendChild(zIndex1 = sichtbar.cloneNode(false));
zIndex1.textContent = 'zIndex1';
zIndex1.style.position = 'absolute';
zIndex1.style.left = zIndex1.style.top = zIndex1.style.width = zIndex1.style.height = '100px';
zIndex1.style.zIndex = '1';
div.appendChild(zIndex2 = zIndex1.cloneNode(false));
zIndex2.textContent = 'zIndex2';
zIndex2.style.left = zIndex2.style.top = '90px';
zIndex2.style.width = zIndex2.style.height = '120px';
zIndex2.style.backgroundColor = 'red';
zIndex2.style.zIndex = '2';
});
after(() => {
div.parentNode.removeChild(div);
});
it('isVisible = true', () => {
expect(isVisible(div)).to.be.true;
expect(isVisible(sichtbar)).to.be.true;
expect(isVisible(imViewport)).to.be.true;
expect(isVisible(zIndex2)).to.be.true;
});
it('isVisible = false', () => {
expect(isVisible(nichtAngezeigt)).to.be.false;
expect(isVisible(nichtSichtbar)).to.be.false;
expect(isVisible(document.createElement('div'))).to.be.false;
expect(isVisible(zIndex1)).to.be.false;
expect(isVisible(nullOpazität)).to.be.false;
expect(isVisible(linksVomViewport)).to.be.false;
expect(isVisible(rechtsVomViewport)).to.be.false;
expect(isVisible(überViewport)).to.be.false;
expect(isVisible(unterViewport)).to.be.false;
});
});