Open3
WCAG 2.2 達成基準 2.5.8 ターゲットのサイズ(AA)を可視化する
- 基本的に24x24ピクセル以上のサイズが望ましい
- 以下の要素のバウンディングボックスを色付け
a
button
input
select
textarea
label
- 24x24ピクセル以下のものはバウンディングボックスの中心に24x24ピクセルの円を描き、十分な空間があるか確認する
以下をDevToolsのコンソールから実行。もしくはブックマークレットに登録。
const hitEl = [
...document.querySelectorAll(
'a,button,input,select,textarea,label,summary',
),
].filter((el) => !(el.matches('input,select,textarea') && el.closest('label')));
const hits = [...hitEl]
.map((el) => {
const box = el.getBoundingClientRect();
if (box.width < 0 && box.height < 0) {
return null;
}
if (box.width < 24 || box.height < 24) {
return {
type: 'under',
x: box.left + box.width / 2,
y: box.top + box.height / 2,
rect: box,
};
}
return {
type: 'over',
rect: box,
};
})
.filter(Boolean);
const cover = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
const width = document.documentElement.scrollWidth;
const height = document.documentElement.scrollHeight;
cover.viewBox.baseVal.x = 0;
cover.viewBox.baseVal.y = 0;
cover.viewBox.baseVal.width = width;
cover.viewBox.baseVal.height = height;
cover.setAttribute('width', width + 'px');
cover.setAttribute('height', height + 'px');
cover.style.position = 'absolute';
cover.style.top = '0';
cover.style.left = '0';
cover.style.zIndex = '100000';
cover.style.pointerEvents = 'none';
const g = document.createElementNS('http://www.w3.org/2000/svg', 'g');
for (const hit of hits) {
if (hit.type === 'under') {
const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
circle.cx.baseVal.value = hit.x;
circle.cy.baseVal.value = hit.y;
circle.r.baseVal.value = 12;
circle.style.fill = 'rgba(255, 0, 0, 0.5)';
g.append(circle);
}
const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
rect.x.baseVal.value = hit.rect.left;
rect.y.baseVal.value = hit.rect.top;
rect.width.baseVal.value = hit.rect.width;
rect.height.baseVal.value = hit.rect.height;
rect.style.fill = 'rgba(255, 0, 0, 0.5)';
g.append(rect);
}
cover.append(g);
document.body.append(cover);
-
position: fixed
の要素はわりと位置がバグる - IntersectionObserver APIを使った表示をしている要素は当然ズレるので、そういったものがあるページは一度ページ最下部までスクロールしてから行った方が良い。