Sha256: 3b8eab04a88713ddc8bccfd5a8021686f210708196ac1195ccada2db2de8a6e2

Contents?: true

Size: 1.91 KB

Versions: 104

Compression:

Stored size: 1.91 KB

Contents

/* global dom */
/* eslint complexity: ["error",17] */

/**
 * Checks whether a parent element visually contains its child, either directly or via scrolling.
 * Assumes that |parent| is an ancestor of |node|.
 * @method visuallyContains
 * @memberof axe.commons.dom
 * @instance
 * @param {Element} node
 * @param {Element} parent
 * @return {boolean} True if node is visually contained within parent
 */
dom.visuallyContains = function(node, parent) {
	var rectBound = node.getBoundingClientRect();
	var margin = 0.01;
	var rect = {
		top: rectBound.top + margin,
		bottom: rectBound.bottom - margin,
		left: rectBound.left + margin,
		right: rectBound.right - margin
	};
	var parentRect = parent.getBoundingClientRect();
	var parentTop = parentRect.top;
	var parentLeft = parentRect.left;
	var parentScrollArea = {
		top: parentTop - parent.scrollTop,
		bottom: parentTop - parent.scrollTop + parent.scrollHeight,
		left: parentLeft - parent.scrollLeft,
		right: parentLeft - parent.scrollLeft + parent.scrollWidth
	};

	var style = window.getComputedStyle(parent);

	// if parent element is inline, scrollArea will be too unpredictable
	if (style.getPropertyValue('display') === 'inline') {
		return true;
	}

	//In theory, we should just be able to look at the scroll area as a superset of the parentRect,
	//but that's not true in Firefox
	if (
		(rect.left < parentScrollArea.left && rect.left < parentRect.left) ||
		(rect.top < parentScrollArea.top && rect.top < parentRect.top) ||
		(rect.right > parentScrollArea.right && rect.right > parentRect.right) ||
		(rect.bottom > parentScrollArea.bottom && rect.bottom > parentRect.bottom)
	) {
		return false;
	}

	if (rect.right > parentRect.right || rect.bottom > parentRect.bottom) {
		return (
			style.overflow === 'scroll' ||
			style.overflow === 'auto' ||
			style.overflow === 'hidden' ||
			parent instanceof HTMLBodyElement ||
			parent instanceof HTMLHtmlElement
		);
	}

	return true;
};

Version data entries

104 entries across 104 versions & 1 rubygems

Version Path
govuk_publishing_components-21.16.3 node_modules/axe-core/lib/commons/dom/visually-contains.js
govuk_publishing_components-21.16.2 node_modules/axe-core/lib/commons/dom/visually-contains.js
govuk_publishing_components-21.16.1 node_modules/axe-core/lib/commons/dom/visually-contains.js
govuk_publishing_components-21.16.0 node_modules/axe-core/lib/commons/dom/visually-contains.js
govuk_publishing_components-21.15.2 node_modules/axe-core/lib/commons/dom/visually-contains.js
govuk_publishing_components-21.15.1 node_modules/axe-core/lib/commons/dom/visually-contains.js
govuk_publishing_components-21.15.0 node_modules/axe-core/lib/commons/dom/visually-contains.js
govuk_publishing_components-21.14.0 node_modules/axe-core/lib/commons/dom/visually-contains.js
govuk_publishing_components-21.13.5 node_modules/axe-core/lib/commons/dom/visually-contains.js
govuk_publishing_components-21.13.4 node_modules/axe-core/lib/commons/dom/visually-contains.js
govuk_publishing_components-21.13.3 node_modules/axe-core/lib/commons/dom/visually-contains.js
govuk_publishing_components-21.13.2 node_modules/axe-core/lib/commons/dom/visually-contains.js
govuk_publishing_components-21.13.1 node_modules/axe-core/lib/commons/dom/visually-contains.js
govuk_publishing_components-21.13.0 node_modules/axe-core/lib/commons/dom/visually-contains.js
govuk_publishing_components-21.12.0 node_modules/axe-core/lib/commons/dom/visually-contains.js
govuk_publishing_components-21.11.0 node_modules/axe-core/lib/commons/dom/visually-contains.js
govuk_publishing_components-21.10.0 node_modules/axe-core/lib/commons/dom/visually-contains.js
govuk_publishing_components-21.9.0 node_modules/axe-core/lib/commons/dom/visually-contains.js
govuk_publishing_components-21.8.1 node_modules/axe-core/lib/commons/dom/visually-contains.js
govuk_publishing_components-21.8.0 node_modules/axe-core/lib/commons/dom/visually-contains.js