미디어위키:Responsive-arrow.js: 두 판 사이의 차이
편집 요약 없음 태그: 수동 되돌리기 |
(완성) |
||
| 1번째 줄: | 1번째 줄: | ||
// [[틀:반응형 화살표]] | |||
{ | { | ||
document.querySelectorAll('.arrow-dataset').forEach((element) => { | |||
const arrowBox = element.parentElement; | |||
const arrowPoint = element.nextElementSibling; | |||
const arrowBox = | |||
const arrowPoint = | |||
const arrowShaft = arrowPoint.nextElementSibling; | const arrowShaft = arrowPoint.nextElementSibling; | ||
const errorMsg = (message) => { | |||
arrowBox.outerHTML = `<span>${message}</span>`; | |||
console.log(message, element); | |||
}; | |||
const dataSet = element.dataset; | |||
const data = Object.create(dataSet); | |||
data.length = Number(dataSet.length); | |||
data.thick = Number(dataSet.thick); | |||
data.pointLength = Number(dataSet.pointLength); | |||
data.pointDeg = Number(dataSet.pointDeg); | |||
if (Number.isNaN(data.length)) { | |||
errorMsg(`length is not a number`); | |||
return; | |||
} | |||
if (Number.isNaN(data.thick)) { | |||
errorMsg(`thick is not a number`); | |||
return; | |||
} | |||
if (Number.isNaN(data.pointLength)) { | |||
errorMsg(`pointLength is not a number`); | |||
return; | |||
} | |||
if (Number.isNaN(data.pointDeg)) { | |||
errorMsg(`pointDeg is not a number`); | |||
return; | |||
} | |||
if (!['left', 'right', 'up', 'down'].includes(data.direction)) { | |||
errorMsg(`direction is invalid`); | |||
return; | |||
} | |||
if (!['left', 'right', 'both'].includes(data.pointDirection)) { | |||
errorMsg(`pointDirection is invalid`); | |||
return; | |||
} | |||
arrowPoint.style.position = arrowShaft.style.position = 'absolute'; | arrowPoint.style.position = arrowShaft.style.position = 'absolute'; | ||
arrowPoint.style.borderRadius = arrowShaft.style.borderRadius = '100px'; | arrowPoint.style.borderRadius = arrowShaft.style.borderRadius = '100px'; | ||
arrowPoint.style.transformBox = 'fill-box'; | arrowPoint.style.transformBox = 'fill-box'; | ||
arrowPoint.style.borderWidth = | |||
arrowShaft.style.borderWidth = `${data.thick}px`; | |||
if (data.color) | |||
arrowPoint.style.background = | |||
arrowPoint.style.borderColor = | |||
arrowShaft.style.background = | |||
arrowShaft.style.borderColor = | |||
data.color; | |||
switch (data.direction) { | switch (data.direction) { | ||
case 'left': | case 'left': | ||
arrowBox.style.alignItems = | |||
data.pointDirection === 'right' ? 'flex-end' : 'flex-start'; | |||
arrowPoint.style.transformOrigin = 'left'; | arrowPoint.style.transformOrigin = 'left'; | ||
arrowPoint.style.left = | arrowPoint.style.left = '0px'; | ||
break; | break; | ||
case 'right': | case 'right': | ||
arrowBox.style.alignItems = | |||
data.pointDirection === 'right' ? 'flex-start' : 'flex-end'; | |||
arrowPoint.style.transformOrigin = 'right'; | arrowPoint.style.transformOrigin = 'right'; | ||
arrowPoint.style.right = | arrowPoint.style.right = '0px'; | ||
break; | break; | ||
case 'up': | case 'up': | ||
arrowBox.style.justifyContent = | |||
data.pointDirection === 'right' ? 'flex-start' : 'flex-end'; | |||
arrowPoint.style.transformOrigin = 'top'; | arrowPoint.style.transformOrigin = 'top'; | ||
arrowPoint.style.top = | arrowPoint.style.top = '0px'; | ||
break; | break; | ||
case 'down': | case 'down': | ||
arrowBox.style.justifyContent = | |||
data.pointDirection === 'right' ? 'flex-end' : 'flex-start'; | |||
arrowPoint.style.transformOrigin = 'bottom'; | arrowPoint.style.transformOrigin = 'bottom'; | ||
arrowPoint.style.bottom = | arrowPoint.style.bottom = '0px'; | ||
break; | break; | ||
default: | default: | ||
| 67번째 줄: | 81번째 줄: | ||
case 'left': | case 'left': | ||
case 'right': | case 'right': | ||
arrowPoint.style.width = `${data.pointLength}px`; | arrowPoint.style.width = `${data.pointLength}px`; | ||
arrowPoint.style.height = '0px'; | |||
arrowShaft.style.left = arrowShaft.style.right = '0px'; | |||
arrowBox.style.minHeight = `${data.pointLength * | arrowBox.style.minHeight = `${data.pointLength * | ||
Math.sin((data.pointDeg * Math.PI) / 180) * | Math.sin((data.pointDeg * Math.PI) / 180) * | ||
| 74번째 줄: | 89번째 줄: | ||
data.thick + | data.thick + | ||
1}px`; | 1}px`; | ||
arrowBox.style.width = data.length ? `${data.length}px` : | arrowBox.style.width = data.length ? `${data.length}px` : ''; | ||
break; | break; | ||
case 'up': | case 'up': | ||
case 'down': | case 'down': | ||
arrowPoint.style.width = | arrowPoint.style.width = '0px'; | ||
arrowPoint.style.height = `${data.pointLength}px`; | arrowPoint.style.height = `${data.pointLength}px`; | ||
arrowShaft.style.top = arrowShaft.style.bottom = '0px'; | |||
arrowBox.style.minWidth = `${data.pointLength * | arrowBox.style.minWidth = `${data.pointLength * | ||
Math.sin((data.pointDeg * Math.PI) / 180) * | Math.sin((data.pointDeg * Math.PI) / 180) * | ||
| 87번째 줄: | 102번째 줄: | ||
1}px`; | 1}px`; | ||
arrowBox.style.height = `${data.length || 100}px`; | arrowBox.style.height = `${data.length || 100}px`; | ||
break; | break; | ||
} | } | ||
| 101번째 줄: | 115번째 줄: | ||
const arrowPoint2 = arrowPoint.cloneNode(true); | const arrowPoint2 = arrowPoint.cloneNode(true); | ||
arrowPoint2.style.rotate = `${-data.pointDeg}deg`; | arrowPoint2.style.rotate = `${-data.pointDeg}deg`; | ||
arrowBox.appendChild(arrowPoint2); | |||
arrowBox.style.alignItems = 'center'; | arrowBox.style.alignItems = 'center'; | ||
arrowBox.style.justifyContent = 'center'; | arrowBox.style.justifyContent = 'center'; | ||
break; | break; | ||
} | } | ||
} | } | ||
} | }); | ||
} | } | ||
2025년 8월 7일 (목) 15:11 기준 최신판
// [[틀:반응형 화살표]]
{
document.querySelectorAll('.arrow-dataset').forEach((element) => {
const arrowBox = element.parentElement;
const arrowPoint = element.nextElementSibling;
const arrowShaft = arrowPoint.nextElementSibling;
const errorMsg = (message) => {
arrowBox.outerHTML = `<span>${message}</span>`;
console.log(message, element);
};
const dataSet = element.dataset;
const data = Object.create(dataSet);
data.length = Number(dataSet.length);
data.thick = Number(dataSet.thick);
data.pointLength = Number(dataSet.pointLength);
data.pointDeg = Number(dataSet.pointDeg);
if (Number.isNaN(data.length)) {
errorMsg(`length is not a number`);
return;
}
if (Number.isNaN(data.thick)) {
errorMsg(`thick is not a number`);
return;
}
if (Number.isNaN(data.pointLength)) {
errorMsg(`pointLength is not a number`);
return;
}
if (Number.isNaN(data.pointDeg)) {
errorMsg(`pointDeg is not a number`);
return;
}
if (!['left', 'right', 'up', 'down'].includes(data.direction)) {
errorMsg(`direction is invalid`);
return;
}
if (!['left', 'right', 'both'].includes(data.pointDirection)) {
errorMsg(`pointDirection is invalid`);
return;
}
arrowPoint.style.position = arrowShaft.style.position = 'absolute';
arrowPoint.style.borderRadius = arrowShaft.style.borderRadius = '100px';
arrowPoint.style.transformBox = 'fill-box';
arrowPoint.style.borderWidth =
arrowShaft.style.borderWidth = `${data.thick}px`;
if (data.color)
arrowPoint.style.background =
arrowPoint.style.borderColor =
arrowShaft.style.background =
arrowShaft.style.borderColor =
data.color;
switch (data.direction) {
case 'left':
arrowBox.style.alignItems =
data.pointDirection === 'right' ? 'flex-end' : 'flex-start';
arrowPoint.style.transformOrigin = 'left';
arrowPoint.style.left = '0px';
break;
case 'right':
arrowBox.style.alignItems =
data.pointDirection === 'right' ? 'flex-start' : 'flex-end';
arrowPoint.style.transformOrigin = 'right';
arrowPoint.style.right = '0px';
break;
case 'up':
arrowBox.style.justifyContent =
data.pointDirection === 'right' ? 'flex-start' : 'flex-end';
arrowPoint.style.transformOrigin = 'top';
arrowPoint.style.top = '0px';
break;
case 'down':
arrowBox.style.justifyContent =
data.pointDirection === 'right' ? 'flex-end' : 'flex-start';
arrowPoint.style.transformOrigin = 'bottom';
arrowPoint.style.bottom = '0px';
break;
default:
break;
}
switch (data.direction) {
case 'left':
case 'right':
arrowPoint.style.width = `${data.pointLength}px`;
arrowPoint.style.height = '0px';
arrowShaft.style.left = arrowShaft.style.right = '0px';
arrowBox.style.minHeight = `${data.pointLength *
Math.sin((data.pointDeg * Math.PI) / 180) *
(data.pointDirection === 'both' ? 2 : 1) +
data.thick +
1}px`;
arrowBox.style.width = data.length ? `${data.length}px` : '';
break;
case 'up':
case 'down':
arrowPoint.style.width = '0px';
arrowPoint.style.height = `${data.pointLength}px`;
arrowShaft.style.top = arrowShaft.style.bottom = '0px';
arrowBox.style.minWidth = `${data.pointLength *
Math.sin((data.pointDeg * Math.PI) / 180) *
(data.pointDirection === 'both' ? 2 : 1) +
data.thick +
1}px`;
arrowBox.style.height = `${data.length || 100}px`;
break;
}
switch (data.pointDirection) {
case 'left':
arrowPoint.style.rotate = `${data.pointDeg}deg`;
break;
case 'right':
arrowPoint.style.rotate = `${-data.pointDeg}deg`;
break;
case 'both': {
arrowPoint.style.rotate = `${data.pointDeg}deg`;
const arrowPoint2 = arrowPoint.cloneNode(true);
arrowPoint2.style.rotate = `${-data.pointDeg}deg`;
arrowBox.appendChild(arrowPoint2);
arrowBox.style.alignItems = 'center';
arrowBox.style.justifyContent = 'center';
break;
}
}
});
}